You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/04/10 11:57:32 UTC

svn commit: r763899 - in /cayenne/main/trunk/framework/cayenne-modeler/src/main: java/org/apache/cayenne/modeler/editor/ java/org/apache/cayenne/swing/components/textpane/ resources/org/apache/cayenne/modeler/images/

Author: aadamchik
Date: Fri Apr 10 09:57:32 2009
New Revision: 763899

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

more visual error reporting

Added:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/LineNumberedBorder.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/error.gif
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=763899&r1=763898&r2=763899&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 Fri Apr 10 09:57:32 2009
@@ -19,15 +19,11 @@
 package org.apache.cayenne.modeler.editor;
 
 import java.awt.BorderLayout;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-
 import javax.swing.JPanel;
 import javax.swing.event.DocumentEvent;
 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;
@@ -60,17 +56,6 @@
 
         scriptArea = CayenneWidgetFactory.createJEJBQLTextPane();
         scriptArea.getDocument().addDocumentListener(this);
-        scriptArea.addFocusListener(new FocusListener() {
-
-            public void focusGained(FocusEvent e) {
-                validateEJBQL();
-            }
-
-            public void focusLost(FocusEvent e) {
-                validateEJBQL();
-            }
-
-        });
 
         scriptArea.getDocument().addDocumentListener(new DocumentListener() {
 
@@ -91,17 +76,17 @@
                 catch (BadLocationException e1) {
                     e1.printStackTrace();
                 }
+
             }
 
             public void removeUpdate(DocumentEvent e) {
                 getQuery().setEjbqlStatement(scriptArea.getText());
-                scriptArea.removeHighlightText();
                 validateEJBQL();
             }
         });
         setLayout(new BorderLayout());
         add(scriptArea, BorderLayout.WEST);
-        add(scriptArea.scrollPane, BorderLayout.CENTER);
+        add(scriptArea.getScrollPane(), BorderLayout.CENTER);
         setVisible(true);
     }
 
@@ -172,20 +157,26 @@
     }
 
     void validateEJBQL() {
+
         PositionException positionException = ejbqlQueryValidator.validateEJBQL(
                 getQuery(),
                 mediator.getCurrentDataDomain());
+
         if (positionException != null) {
             if (positionException.getBeginLine() != null
                     || positionException.getBeginColumn() != null
                     || positionException.getLength() != null) {
-                
+
                 scriptArea.setHighlightText(
                         positionException.getBeginLine(),
                         positionException.getBeginColumn(),
                         positionException.getLength(),
                         positionException.getMessage());
             }
+            else {
+                scriptArea.removeHighlightText();
+            }
         }
+
     }
 }

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=763899&r1=763898&r2=763899&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 Fri Apr 10 09:57:32 2009
@@ -3,13 +3,13 @@
 import java.awt.Color;
 import java.awt.Cursor;
 import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
 import java.awt.Graphics;
+import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.event.MouseEvent;
 
+import javax.swing.BorderFactory;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextPane;
@@ -21,6 +21,7 @@
 import javax.swing.text.Highlighter;
 
 import org.apache.cayenne.modeler.Main;
+import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.swing.components.textpane.syntax.SQLSyntaxConstants;
 import org.apache.cayenne.swing.components.textpane.syntax.SyntaxConstant;
 import org.apache.commons.logging.Log;
@@ -30,14 +31,19 @@
 
     protected Highlighter.HighlightPainter painter;
     private JTextPaneScrollable pane;
-    public JScrollPane scrollPane;
+    private JScrollPane scrollPane;
 
+    private boolean imageError;
     private String tooltipTextError;
     private int startYPositionToolTip;
     private int endYPositionToolTip;
 
     public boolean repaint;
 
+    public JScrollPane getScrollPane() {
+        return scrollPane;
+    }
+
     public String getTooltipTextError() {
         return tooltipTextError;
     }
@@ -68,6 +74,10 @@
                 + pane.getHeight()));
     }
 
+    public void repaintPane() {
+        pane.repaint();
+    }
+
     /**
      * Return an int containing the wrapped line index at the given position
      * 
@@ -119,11 +129,13 @@
     public JCayenneTextPane(SyntaxConstant syntaxConstant) {
         super();
 
-        setMinimumSize(new Dimension(30, 30));
-        setPreferredSize(new Dimension(30, 30));
-        setMinimumSize(new Dimension(30, 30));
+        Dimension dimention = new Dimension(15, 15);
+        setMinimumSize(dimention);
+        setPreferredSize(dimention);
+        setMinimumSize(dimention);
         setBackground(new Color(245, 238, 238));
         setBorder(null);
+
         pane = new JTextPaneScrollable(new EditorKit(syntaxConstant)) {
 
             public void paint(Graphics g) {
@@ -133,9 +145,10 @@
         };
 
         pane.setFont(SQLSyntaxConstants.DEFAULT_FONT);
+        pane.setBorder(new LineNumberedBorder(this));
 
         scrollPane = new JScrollPane(pane);
-
+        scrollPane.setBorder(BorderFactory.createLineBorder(new Color(115, 115, 115)));
         this.painter = new UnderlineHighlighterForText.UnderlineHighlightPainter(
                 Color.red);
 
@@ -144,13 +157,13 @@
             public void insertUpdate(DocumentEvent evt) {
                 try {
                     String text = pane.getText(evt.getOffset(), 1).toString();
-                    if (!(text.equals(" ") || text.equals("\n") || text.equals("\t"))) {
-                        removeHighlightText();
-                    }
                     if (text.equals("/") || text.equals("*")) {
                         removeHighlightText();
                         pane.repaint();
                     }
+                    if (text.equals(" ") || text.equals("\t") || text.equals("\n")) {
+                        pane.repaint();
+                    }
                 }
                 catch (Exception e) {
                     logObj.warn("Error: ", e);
@@ -182,17 +195,22 @@
      */
 
     public void setHighlightText(int line, int lastIndex, int size, String message) {
-        try {
-
-            int position = getPosition(line, lastIndex);
-            int positionEnd = position + size;
-            Highlighter highlighter = pane.getHighlighter();
-            removeHighlightText(highlighter);
-            highlighter.addHighlight(position, positionEnd, painter);
-            setToolTipPosition(line, message);
+        Highlighter highlighter = pane.getHighlighter();
+        removeHighlightText(highlighter);
+        if (getText().length() > 0) {
+            try {
+                int position = getPosition(line, lastIndex);
+                int positionEnd = position + size;
+                highlighter.addHighlight(position, positionEnd, painter);
+                setToolTipPosition(line, message);
+                repaintPane();
+            }
+            catch (BadLocationException e) {
+                logObj.warn("Error: ", e);
+            }
         }
-        catch (BadLocationException e) {
-            logObj.warn("Error: ", e);
+        else {
+            setToolTipPosition(0, "");
         }
     }
 
@@ -209,12 +227,26 @@
 
     public void setToolTipPosition(int line, String string) {
 
-        int height = pane.getFontMetrics(pane.getFont()).getHeight();
-        int start = (line - 1) * height;
-        this.endYPositionToolTip = start;
-        this.startYPositionToolTip = start + height;
-        setTooltipTextError(string);
-        setToolTipText("");
+        if (line != 0) {
+            int height = pane.getFontMetrics(pane.getFont()).getHeight();
+            int start = (line - 1) * height;
+            this.endYPositionToolTip = start;
+            this.startYPositionToolTip = start + height;
+            setTooltipTextError(string);
+            if (string != "") {
+                imageError = true;
+            }
+            else {
+                imageError = false;
+            }
+            setToolTipText("");
+        }
+        else {
+            this.endYPositionToolTip = 0;
+            this.startYPositionToolTip = 0;
+            setTooltipTextError(string);
+            imageError = false;
+        }
     }
 
     public String getToolTipText(MouseEvent e) {
@@ -239,6 +271,7 @@
     }
 
     public void removeHighlightText() {
+        imageError = false;
         Highlighter highlighter = pane.getHighlighter();
         removeHighlightText(highlighter);
     }
@@ -278,18 +311,17 @@
         for (int line = startline, y = starting_y; line <= endline; y += fontHeight, line++) {
             Color color = g.getColor();
 
-            Font f2 = SQLSyntaxConstants.DEFAULT_FONT;
-            FontMetrics fm2 = getFontMetrics(f2);
-            g.setFont(f2);
             if (line - 1 == doc.getDefaultRootElement().getElementIndex(
                     pane.getCaretPosition())) {
                 g.setColor(new Color(224, 224, 255));
                 g.fillRect(0, y - fontHeight + 3, 30, fontHeight + 1);
             }
 
-            g.setColor(Color.gray);
-            g.drawString(Integer.toString(line), (30 - fm2.stringWidth(Integer
-                    .toString(line))) / 2, y);
+            if (imageError) {
+                Image img = ModelerUtil.buildIcon("error.gif").getImage();
+                g.drawImage(img, 0, endYPositionToolTip, this);
+            }
+
             g.setColor(color);
         }
 

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/LineNumberedBorder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/LineNumberedBorder.java?rev=763899&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/LineNumberedBorder.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/LineNumberedBorder.java Fri Apr 10 09:57:32 2009
@@ -0,0 +1,106 @@
+package org.apache.cayenne.swing.components.textpane;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Insets;
+import javax.swing.JTextPane;
+import javax.swing.border.AbstractBorder;
+import javax.swing.text.Document;
+
+public class LineNumberedBorder extends AbstractBorder {
+	private int etalon;
+	private int lineNumberWidth;
+	private JCayenneTextPane pane;
+
+	public LineNumberedBorder(JCayenneTextPane pane) {
+		setEtalon(10);
+		this.pane = pane;
+	}
+
+	public Insets getBorderInsets(Component c) {
+		return getBorderInsets(c, new Insets(0, 0, 0, 0));
+	}
+
+	public Insets getBorderInsets(Component c, Insets insets) {
+		if (c instanceof JTextPane) {
+			int width = lineNumberWidth((JTextPane) c);
+			insets.left = width;
+		}
+		return insets;
+	}
+
+	/**
+	 * Returns the width, in pixels
+	 */
+	private int lineNumberWidth(JTextPane textPane) {
+		int lineCount = getEtalon();
+		setLineNumberWidth(textPane.getFontMetrics(textPane.getFont())
+				.stringWidth(lineCount + " "));
+		return getLineNumberWidth();
+	}
+
+	public void paintBorder(Component c, Graphics g, int x, int y, int width,
+			int height) {
+
+		java.awt.Rectangle clip = g.getClipBounds();
+
+		FontMetrics fm = g.getFontMetrics();
+		int fontHeight = fm.getHeight();
+		int ybaseline = y + fm.getAscent();
+
+		int startingLineNumber = (clip.y / fontHeight) + 1;
+
+		if (ybaseline < clip.y) {
+			ybaseline = y + startingLineNumber * fontHeight
+					- (fontHeight - fm.getAscent());
+		}
+
+
+		int yend = ybaseline + height;
+		if (yend > (y + height)) {
+			yend = y + height;
+		}
+
+		int lnxstart = x;
+		int widhtBorder = getLineNumberWidth() - 2;
+
+		g.setColor(new Color(255, 255, 224));
+		g.fillRect(lnxstart, 0, lnxstart + widhtBorder, yend);
+		g.setColor(new Color(214, 214, 214));
+		g.drawRect(lnxstart - 1, -1, lnxstart + widhtBorder, yend + 1);
+
+		int end = pane.getEndPositionInDocument();
+		Document doc = pane.getDocument();
+		int endline = doc.getDefaultRootElement().getElementIndex(end) + 1;
+			
+		while (startingLineNumber <= endline) {
+			g.setColor(Color.gray);
+			g.drawString(startingLineNumber + " ", lnxstart + 1, ybaseline);
+			ybaseline += fontHeight;
+			startingLineNumber++;
+		}
+
+		setEtalon(startingLineNumber-1);
+	}
+
+	public int getEtalon() {
+		return etalon;
+	}
+
+	public void setEtalon(int etalon) {
+		if(etalon<10){
+			etalon = 10;
+		}
+		this.etalon = etalon;
+	}
+
+	public int getLineNumberWidth() {
+		return lineNumberWidth;
+	}
+
+	public void setLineNumberWidth(int lineNumberWidth) {
+		this.lineNumberWidth = lineNumberWidth;
+	}
+}

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/error.gif
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/error.gif?rev=763899&view=auto
==============================================================================
Files cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/error.gif (added) and cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/error.gif Fri Apr 10 09:57:32 2009 differ