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