Author: aadamchik
Date: Thu May 14 13:35:49 2009
New Revision: 774761

URL: http://svn.apache.org/viewvc?rev=774761&view=rev
Log:
CAY-1164 Implement EJBQL query support in the Modeler

a patch by Olga Tkachova implementing validation in a thread.

i changed the naming a bit and also added thread name and daemon status

Modified:
    
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java
    
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java

Modified: 
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java?rev=774761&r1=774760&r2=774761&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java
 Thu May 14 13:35:49 2009
@@ -19,6 +19,8 @@
 package org.apache.cayenne.modeler.editor;
 
 import java.awt.BorderLayout;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 
@@ -27,6 +29,7 @@
 import javax.swing.event.DocumentListener;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
+
 import org.apache.cayenne.map.event.QueryEvent;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
@@ -87,6 +90,20 @@
             }
         });
 
+        scriptArea.getPane().addFocusListener(new FocusListener() {
+
+            EJBQLValidationThread thread;
+
+            public void focusGained(FocusEvent e) {
+                thread = new EJBQLValidationThread();
+                thread.start();
+            }
+
+            public void focusLost(FocusEvent e) {
+                thread.terminate();
+            }
+        });
+
         scriptArea.getPane().addKeyListener(new KeyListener() {
 
             boolean pasteOrCut;
@@ -194,7 +211,6 @@
     }
 
     void validateEJBQL() {
-
         PositionException positionException = 
ejbqlQueryValidator.validateEJBQL(
                 getQuery(),
                 mediator.getCurrentDataDomain());
@@ -213,4 +229,47 @@
             }
         }
     }
+
+    class EJBQLValidationThread extends Thread {
+
+        boolean running;
+        Object timer = new Object();
+        int previousCaretPosition;
+        int validateCaretPosition;
+
+        static final int DELAY = 500;
+
+        EJBQLValidationThread() {
+            super("ejbql-validation-thread");
+            setDaemon(true);
+        }
+        
+        public void run() {
+            running = true;
+            while (running) {
+                int caretPosition = scriptArea.getCaretPosition();
+                if (previousCaretPosition != 0
+                        && previousCaretPosition == caretPosition
+                        && validateCaretPosition != previousCaretPosition) {
+                    validateEJBQL();
+                    validateCaretPosition = caretPosition;
+                }
+                previousCaretPosition = caretPosition;
+                synchronized (timer) {
+                    try {
+                        timer.wait(DELAY);
+                    }
+                    catch (InterruptedException e) {
+                    }
+                }
+            }
+        }
+
+        public void terminate() {
+            synchronized (timer) {
+                running = false;
+                timer.notify();
+            }
+        }
+    }
 }

Modified: 
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java?rev=774761&r1=774760&r2=774761&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java
 Thu May 14 13:35:49 2009
@@ -8,8 +8,6 @@
 import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 import java.awt.event.MouseEvent;
 
 import javax.swing.BorderFactory;
@@ -70,7 +68,7 @@
     public Component getPane() {
         return pane;
     }
-    
+
     public int getStartPositionInDocument() {
         return pane.viewToModel(scrollPane.getViewport().getViewPosition());
         // starting pos
@@ -134,7 +132,6 @@
         }
         return position + posInLine;
     }
-    
 
     public JCayenneTextPane(SyntaxConstant syntaxConstant) {
         super();
@@ -186,8 +183,8 @@
             public void changedUpdate(DocumentEvent evt) {
             }
 
-        });        
-       
+        });
+
     }
 
     public void setHighlightText(int lastIndex, int endIndex) throws 
BadLocationException {
@@ -263,25 +260,24 @@
 
     public String getToolTipText(MouseEvent e) {
 
-        
-            if (e.getPoint().y > endYPositionToolTip
-                    && e.getPoint().y < startYPositionToolTip 
-                    && imageError) {
-                setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-                String htmlText = getTooltipTextError()
-                        .replaceAll("\n", "<br>&nbsp;")
-                        .replaceAll("\t", "&nbsp;")
-                        .replaceAll("\r", "<br>&nbsp;");
-
-                return "<HTML>"
-                        + "<body bgcolor='#FFEBCD' text='black'>"
-                        + htmlText
-                        + "</body>";
-            }
-            else {
-                setCursor(Cursor.getDefaultCursor());
-                return null;
-            }
+        if (e.getPoint().y > endYPositionToolTip
+                && e.getPoint().y < startYPositionToolTip
+                && imageError) {
+            setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+            String htmlText = getTooltipTextError()
+                    .replaceAll("\n", "<br>&nbsp;")
+                    .replaceAll("\t", "&nbsp;")
+                    .replaceAll("\r", "<br>&nbsp;");
+
+            return "<HTML>"
+                    + "<body bgcolor='#FFEBCD' text='black'>"
+                    + htmlText
+                    + "</body>";
+        }
+        else {
+            setCursor(Cursor.getDefaultCursor());
+            return null;
+        }
     }
 
     public void removeHighlightText() {
@@ -289,6 +285,10 @@
         Highlighter highlighter = pane.getHighlighter();
         removeHighlightText(highlighter);
     }
+    
+    public int getCaretPosition() {
+        return pane.getCaretPosition();        
+    }
 
     public void paint(Graphics g) {
 


Reply via email to