isac-java/src/java/isac/gui/mawen/editor/EventUtil.scala
author mmahringer <s1520454056@students.fh-hagenberg.at>
Tue, 12 Sep 2017 10:13:45 +0200
changeset 5206 766b810ae181
parent 5205 db502ee98055
child 5212 51971c00458f
permissions -rw-r--r--
fix problem with setting a cursor
     1 package isac.gui.mawen.editor
     2 
     3 import java.awt.Graphics
     4 import java.awt.Point
     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
    20 
    21 /**
    22  * Event handler for <code>AstComponent</code>
    23  */
    24 object EventUtil {
    25   
    26   var foreachBoxFunction : (Graphics, DrawBox) => Unit = null
    27 
    28   def drawBoxAt(p: Point) = {
    29     foreachBoxFunction = EventUtil.doInBox(p, (g, box) => {
    30         Box.draw(box, g, false)
    31       }
    32     )
    33   }
    34   /*
    35    * return-value is stored in <code>foreachBoxFunction</code>
    36    */
    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)
    46   	    f(g, box)
    47 	  }
    48 	}
    49   //TODOWN unused
    50   def CreateMouseMotionHandler(c: AstContainer) : MouseMotionListener = new MouseMotionListener() {
    51     def mouseDragged(e:MouseEvent) {}
    52   	def mouseMoved(e: MouseEvent ) {}
    53   }
    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;
    59         } else {
    60           Settings.zoom += 0.1f;
    61         }
    62         if (Settings.zoom < 0.01f) {
    63           Settings.zoom = 0.01f;
    64         }
    65       }
    66       c.repaint()
    67     }
    68   }
    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)
    73       }
    74     }
    75     def keyReleased(event: KeyEvent): Unit = {
    76       if (AstInfoUtil.hasBox(c.getAst())) {
    77         
    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)
    86          }
    87         EditorListenerHandler.fireNotifysBraille(c, AstInfoUtil.FindBox(c.getAst()))
    88       } else if (AstInfoUtil.hasCursor(c.getAst())) {
    89         EditingUtil.parse(c, -event.getKeyCode)
    90       }
    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))
   103     	  }
   104     	  val cursorAst : Ast = AstInfoUtil.FindCursor(c.getAst())
   105     	  if (cursorAst != null) {
   106       	  c.setAst(TransformAstUtil.Update(c.getAst(), cursorAst , TransformAstUtil.CursorToAst))
   107     	  }
   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)
   117       }
   118       else if (
   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()))
   125       } else if (
   126           event.getKeyCode == KeyEvent.VK_ENTER || 
   127           event.getKeyCode == KeyEvent.VK_DELETE || 
   128           event.getKeyCode == KeyEvent.VK_F2) {
   129         EditingUtil.parse(c, -event.getKeyCode)
   130       }
   131       if (event.getKeyCode == KeyEvent.VK_ENTER)
   132         println(c.getAst()) // Output ast on key enter
   133     }
   134     def keyTyped(event: KeyEvent): Unit = {}
   135   } //CreateKeyEventHandler
   136 }