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> ")
- .replaceAll("\t", " ")
- .replaceAll("\r", "<br> ");
-
- 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> ")
+ .replaceAll("\t", " ")
+ .replaceAll("\r", "<br> ");
+
+ 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) {