1 package isac.gui.mawen.editor
3 import java.awt.Graphics
5 import java.util.ArrayList
6 import java.awt.event.KeyListener
7 import java.awt.event.KeyEvent
8 import isac.gui.mawen.syntax.Ast
9 import java.awt.event.MouseWheelListener
10 import java.awt.event.MouseWheelEvent
11 import java.awt.event.MouseMotionListener
12 import java.awt.event.MouseEvent
13 import isac.gui.mawen.editor.Box._
14 import javafx.scene.input.KeyCode
15 import java.awt.Toolkit
16 import isac.gui.mawen.syntax.Ast.Variable
17 import java.awt.datatransfer.DataFlavor
18 import isac.gui.mawen.syntax.Ast._
19 import java.awt.datatransfer.StringSelection
22 * Event handler for <code>AstComponent</code>
26 var foreachBoxFunction : (Graphics, DrawBox) => Unit = null
28 def drawBoxAt(p: Point) = {
29 foreachBoxFunction = EventUtil.doInBox(p, (g, box) => {
30 Box.draw(box, g, false)
35 * return-value is stored in <code>foreachBoxFunction</code>
37 def doInBox(mousePos: Point, f: (Graphics, DrawBox) => Unit) :
38 (Graphics, DrawBox) => Unit = {
39 (g: Graphics, box: DrawBox) => {
40 val xfrom = box.x * Settings.zoom + Settings.translateX
41 val xto = box.x * Settings.zoom + Settings.translateX + box.width * Settings.zoom
42 val yfrom = box.y * Settings.zoom + Settings.translateY - box.height * Settings.zoom
43 val yto = box.y * Settings.zoom + Settings.translateY
44 if (xfrom < mousePos.x && xto > mousePos.x &&
45 yfrom < mousePos.y && yto > mousePos.y)
50 def CreateMouseMotionHandler(c: AstContainer) : MouseMotionListener = new MouseMotionListener() {
51 def mouseDragged(e:MouseEvent) {}
52 def mouseMoved(e: MouseEvent ) {}
54 def CreateMouseWheelHandler(c: AstContainer) : MouseWheelListener = new MouseWheelListener() {
55 def mouseWheelMoved(e: MouseWheelEvent): Unit = {
56 if (Settings.isZoomAllowed) {
57 if (e.getPreciseWheelRotation() < 0) {
58 Settings.zoom -= 0.1f;
60 Settings.zoom += 0.1f;
62 if (Settings.zoom < 0.01f) {
63 Settings.zoom = 0.01f;
69 def CreateKeyEventHandler(c: AstContainer) : KeyListener = new KeyListener () {
70 def keyPressed(event: KeyEvent): Unit = {
71 if (event.getKeyCode == KeyEvent.VK_BACK_SPACE) {
72 EditingUtil.parse(c, -event.getKeyCode)
75 def keyReleased(event: KeyEvent): Unit = {
76 if (AstInfoUtil.hasBox(c.getAst())) {
78 if (event.getKeyCode == KeyEvent.VK_DOWN) {
79 TransformAstUtil.BoxChild(c)
80 }else if (event.getKeyCode == KeyEvent.VK_RIGHT) {
81 TransformAstUtil.BoxPrevChild(c)
82 }else if (event.getKeyCode == KeyEvent.VK_LEFT) {
83 TransformAstUtil.BoxNextChild(c)
84 }else if (event.getKeyCode == KeyEvent.VK_UP) {
85 TransformAstUtil.BoxParent(c)
87 EditorListenerHandler.fireNotifysBraille(c, AstInfoUtil.FindBox(c.getAst()))
88 } else if (AstInfoUtil.hasCursor(c.getAst())) {
89 EditingUtil.parse(c, -event.getKeyCode)
91 if (event.getKeyCode == KeyEvent.VK_DOWN) {
92 TransformAstUtil.CursorChild(c)
93 } else if (event.getKeyCode == KeyEvent.VK_RIGHT) {
94 TransformAstUtil.CursorPrevChild(c)
95 } else if (event.getKeyCode == KeyEvent.VK_LEFT) {
96 TransformAstUtil.CursorNextChild(c)
97 }else if (event.getKeyCode == KeyEvent.VK_UP) {
98 TransformAstUtil.CursorParent(c)
99 }else if (event.isControlDown() && event.getKeyCode == KeyEvent.VK_ENTER) {
100 val boxAst : Ast = AstInfoUtil.FindBox(c.getAst())
101 if (boxAst != null) {
102 c.setAst(TransformAstUtil.Update(c.getAst(), boxAst, TransformAstUtil.UnBox))
104 val cursorAst : Ast = AstInfoUtil.FindCursor(c.getAst())
105 if (cursorAst != null) {
106 c.setAst(TransformAstUtil.Update(c.getAst(), cursorAst , TransformAstUtil.CursorToAst))
108 EditorListenerHandler.fireNotifyIsaCheck(c)
109 }else if (event.isControlDown() && event.getKeyCode == KeyEvent.VK_V) {
110 // !!!! Dirty Code !!!!
111 c.setAst(Variable(Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor).asInstanceOf[String]))
112 EditorListenerHandler.fireNotifyIsaCheck(c)
113 }else if (event.isControlDown() && event.getKeyCode == KeyEvent.VK_C) {
114 val astString = new StringSelection(Ast.math_string_of(c.getAst()))
115 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(astString, null)
116 EditorListenerHandler.fireNotifyIsaCheck(c)
119 (event.getKeyChar >= '0' && event.getKeyChar <= '9')
120 || (event.getKeyChar >= 'a' && event.getKeyChar <= 'z')
121 || (event.getKeyChar >= 'A' && event.getKeyChar <= 'Z')
122 || List('+', '-', '*', '/', '(', '=').contains(event.getKeyChar)) {
123 EditingUtil.parse(c, event.getKeyChar.toInt)
124 //EditorListenerHandler.fireNotifysBraille(c, AstInfoUtil.FindBox(c.getAst()))
126 event.getKeyCode == KeyEvent.VK_ENTER ||
127 event.getKeyCode == KeyEvent.VK_DELETE ||
128 event.getKeyCode == KeyEvent.VK_F2) {
129 EditingUtil.parse(c, -event.getKeyCode)
131 if (event.getKeyCode == KeyEvent.VK_ENTER)
132 println(c.getAst()) // Output ast on key enter
134 def keyTyped(event: KeyEvent): Unit = {}
135 } //CreateKeyEventHandler