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
31 def drawBoxAt(p: Point) = {
32 foreachBoxFunction = EventUtil.doInBox(p, (g, box) => {
33 Box.draw(box, g, false)
42 * return-value is stored in <code>foreachBoxFunction</code>
44 def doInBox(mousePos: Point, f: (Graphics, DrawBox) => Unit) :
45 (Graphics, DrawBox) => Unit = {
46 (g: Graphics, box: DrawBox) => {
47 val xfrom = box.x * Settings.zoom + Settings.translateX
48 val xto = box.x * Settings.zoom + Settings.translateX
49 + box.width * Settings.zoom
50 val yfrom = box.y * Settings.zoom + Settings.translateY
51 - box.height * Settings.zoom
52 val yto = box.y * Settings.zoom + Settings.translateY
53 if (xfrom < mousePos.x && xto > mousePos.x &&
54 yfrom < mousePos.y && yto > mousePos.y)
60 def CreateMouseMotionHandler(c: AstContainer) : MouseMotionListener = new MouseMotionListener() {
61 def mouseDragged(e:MouseEvent) {
65 def mouseMoved(e: MouseEvent ) {
71 def CreateMouseWheelHandler(c: AstContainer) : MouseWheelListener = new MouseWheelListener() {
72 def mouseWheelMoved(e: MouseWheelEvent): Unit = {
73 if (Settings.isZoomAllowed) {
74 if (e.getPreciseWheelRotation() < 0) {
75 Settings.zoom -= 0.1f;
77 Settings.zoom += 0.1f;
79 if (Settings.zoom < 0.01f) {
80 Settings.zoom = 0.01f;
88 def CreateKeyEventHandler(c: AstContainer) : KeyListener = new KeyListener () {
91 def keyPressed(event: KeyEvent): Unit = {
92 if (event.getKeyCode == KeyEvent.VK_BACK_SPACE) {
93 EditingUtil.parse(c, -event.getKeyCode)
98 def keyReleased(event: KeyEvent): Unit = {
100 if (AstInfoUtil.hasBox(c.getAst())) {
102 if (event.getKeyCode == KeyEvent.VK_DOWN) {
103 TransformAstUtil.BoxChild(c)
104 }else if (event.getKeyCode == KeyEvent.VK_RIGHT) {
105 TransformAstUtil.BoxPrevChild(c)
106 }else if (event.getKeyCode == KeyEvent.VK_LEFT) {
107 TransformAstUtil.BoxNextChild(c)
108 }else if (event.getKeyCode == KeyEvent.VK_UP) {
109 TransformAstUtil.BoxParent(c)
111 EditorListenerHandler.fireNotifysBraille(c, AstInfoUtil.FindBox(c.getAst()))
112 } else if (AstInfoUtil.hasCursor(c.getAst())) {
113 println("has Cursor")
114 EditingUtil.parse(c, -event.getKeyCode)
117 if (event.getKeyCode == KeyEvent.VK_DOWN) {
118 TransformAstUtil.CursorChild(c)
119 } else if (event.getKeyCode == KeyEvent.VK_RIGHT) {
120 TransformAstUtil.CursorPrevChild(c)
121 } else if (event.getKeyCode == KeyEvent.VK_LEFT) {
122 TransformAstUtil.CursorNextChild(c)
123 }else if (event.getKeyCode == KeyEvent.VK_UP) {
124 TransformAstUtil.CursorParent(c)
125 }else if (event.isControlDown() && event.getKeyCode == KeyEvent.VK_ENTER) {
126 val boxAst : Ast = AstInfoUtil.FindBox(c.getAst())
127 if (boxAst != null) {
128 c.setAst(TransformAstUtil.Update(c.getAst(), boxAst, TransformAstUtil.UnBox))
130 val cursorAst : Ast = AstInfoUtil.FindCursor(c.getAst())
131 if (cursorAst != null) {
132 c.setAst(TransformAstUtil.Update(c.getAst(), cursorAst , TransformAstUtil.CursorToAst))
134 EditorListenerHandler.fireNotifyIsaCheck(c)
135 }else if (event.isControlDown() && event.getKeyCode == KeyEvent.VK_V) {
136 // !!!! Dirty Code !!!!
137 c.setAst(Variable(Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor).asInstanceOf[String]))
138 EditorListenerHandler.fireNotifyIsaCheck(c)
139 }else if (event.isControlDown() && event.getKeyCode == KeyEvent.VK_C) {
140 val astString = new StringSelection(Ast.math_string_of(c.getAst()))
141 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(astString, null)
142 EditorListenerHandler.fireNotifyIsaCheck(c)
146 (event.getKeyChar >= '0' && event.getKeyChar <= '9')
147 || (event.getKeyChar >= 'a' && event.getKeyChar <= 'z')
148 || (event.getKeyChar >= 'A' && event.getKeyChar <= 'Z')
149 || List('+', '-', '*', '/', '(', '=').contains(event.getKeyChar)) {
150 EditingUtil.parse(c, event.getKeyChar.toInt)
151 EditorListenerHandler.fireNotifysBraille(c, AstInfoUtil.FindBox(c.getAst()))
153 event.getKeyCode == KeyEvent.VK_ENTER ||
154 event.getKeyCode == KeyEvent.VK_DELETE ||
155 event.getKeyCode == KeyEvent.VK_F2) {
156 EditingUtil.parse(c, -event.getKeyCode)
159 if (event.getKeyCode == KeyEvent.VK_ENTER)
160 println(c.getAst()) // Output ast on key enter
164 def keyTyped(event: KeyEvent): Unit = {