From: <iam...@us...> - 2010-03-15 15:12:45
|
Revision: 1312 http://eulergui.svn.sourceforge.net/eulergui/?rev=1312&view=rev Author: iamlolive Date: 2010-03-15 15:12:39 +0000 (Mon, 15 Mar 2010) Log Message: ----------- Tooltip for error now displays the error message of parser4j. But this message is quite imprecise. Q: How to improve its relevancy? Modified Paths: -------------- trunk/eulergui/src/main/java/eulergui/gui/view/TextEditor.java Modified: trunk/eulergui/src/main/java/eulergui/gui/view/TextEditor.java =================================================================== --- trunk/eulergui/src/main/java/eulergui/gui/view/TextEditor.java 2010-03-15 14:43:59 UTC (rev 1311) +++ trunk/eulergui/src/main/java/eulergui/gui/view/TextEditor.java 2010-03-15 15:12:39 UTC (rev 1312) @@ -38,89 +38,94 @@ import eulergui.gui.actions.Statistics; import eulergui.project.N3Source; -/** a Text Editor factory, mainly for N3; - * if the buffer has been modified, it proposes to save before leaving; - * TODO show modified status; - * wrap class JEditTextArea with an interface, as it may not stay -*/ +/** + * a Text Editor factory, mainly for N3; + * if the buffer has been modified, it proposes to save before leaving; + * TODO show modified status; + * wrap class JEditTextArea with an interface, as it may not stay + */ public class TextEditor { - private static Map<String, TokenMarker> suffix2syntax - = new HashMap<String, TokenMarker>(); - private DocumentListener listener; - private N3Source n3; - private boolean edited; - private JEditTextArea jedit; + private static Map<String, TokenMarker> suffix2syntax + = new HashMap<String, TokenMarker>(); + private DocumentListener listener; + private N3Source n3; + private boolean edited; + private JEditTextArea jedit; - static { - suffix2syntax.put("n3", new N3TokenMarker() ); - suffix2syntax.put("ttl", new N3TokenMarker() ); - suffix2syntax.put("nt", new N3TokenMarker() ); - suffix2syntax.put("sparql", new N3TokenMarker() ); - suffix2syntax.put("xml", new XMLTokenMarker() ); - suffix2syntax.put("xsd", new XMLTokenMarker() ); - suffix2syntax.put("rdf", new XMLTokenMarker() ); - suffix2syntax.put("owl", new XMLTokenMarker() ); - suffix2syntax.put("uml", new XMLTokenMarker() ); - suffix2syntax.put("xmi", new XMLTokenMarker() ); - suffix2syntax.put("ecore", new XMLTokenMarker() ); - suffix2syntax.put("mof", new XMLTokenMarker() ); - suffix2syntax.put("emof", new XMLTokenMarker() ); - suffix2syntax.put("cmof", new XMLTokenMarker() ); - suffix2syntax.put("umlt", new ShellScriptTokenMarker() ); - } - - /** display N3 Editor in a new Window, with save As and Statistics in File menu */ - public void displayEditor( ProjectGUI projectGUI, N3Source n3 ) { - try { - JFrame jf = new JFrame( - EditorManagement.fileToOpen(n3) ); - JComponent embededEditor = embedEditor( n3 ); - - JMenuBar menuBar = new JMenuBar(); - jf.setJMenuBar(menuBar); - JMenu file = new JMenu("File"); - menuBar.add( file ); - SaveAs saveAs = new SaveAs( this, projectGUI, - (JEditTextArea)embededEditor ); - Save save = new Save((JEditTextArea)embededEditor, this ); - file.add(save); - file.add(saveAs); - file.add(new Statistics(n3, (JEditTextArea)embededEditor)); + static { + suffix2syntax.put("n3", new N3TokenMarker()); + suffix2syntax.put("ttl", new N3TokenMarker()); + suffix2syntax.put("nt", new N3TokenMarker()); + suffix2syntax.put("sparql", new N3TokenMarker()); + suffix2syntax.put("xml", new XMLTokenMarker()); + suffix2syntax.put("xsd", new XMLTokenMarker()); + suffix2syntax.put("rdf", new XMLTokenMarker()); + suffix2syntax.put("owl", new XMLTokenMarker()); + suffix2syntax.put("uml", new XMLTokenMarker()); + suffix2syntax.put("xmi", new XMLTokenMarker()); + suffix2syntax.put("ecore", new XMLTokenMarker()); + suffix2syntax.put("mof", new XMLTokenMarker()); + suffix2syntax.put("emof", new XMLTokenMarker()); + suffix2syntax.put("cmof", new XMLTokenMarker()); + suffix2syntax.put("umlt", new ShellScriptTokenMarker()); + } - jf.getContentPane().add( embededEditor ); - jf.setSize(800, 600); - jf.setTitle( n3.showShortName() ); - jf.setVisible(true); - ProjectGUI.setEulerGUIIcon(jf); - - jf.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE ); - listener = new DocumentListener(); - jf.addWindowListener(listener); - } catch (HeadlessException e) { - e.printStackTrace(); - } - } - - /** embed N3 Editor in a JComponent */ - public JComponent embedEditor( N3Source n3 ) { - this.n3 = n3; - jedit = new JEditTextArea(); - String toOpen = EditorManagement.fileToOpen(n3); - insertFileOrURL(toOpen); - applySyntax( n3.uri() ); - return jedit; - } + /** + * display N3 Editor in a new Window, with save As and Statistics in File menu + */ + public void displayEditor(ProjectGUI projectGUI, N3Source n3) { + try { + JFrame jf = new JFrame( + EditorManagement.fileToOpen(n3)); + JComponent embededEditor = embedEditor(n3); - public void setCaretPosition(int line, int col){ - if(line>=1) + JMenuBar menuBar = new JMenuBar(); + jf.setJMenuBar(menuBar); + JMenu file = new JMenu("File"); + menuBar.add(file); + SaveAs saveAs = new SaveAs(this, projectGUI, + (JEditTextArea) embededEditor); + Save save = new Save((JEditTextArea) embededEditor, this); + file.add(save); + file.add(saveAs); + file.add(new Statistics(n3, (JEditTextArea) embededEditor)); + + jf.getContentPane().add(embededEditor); + jf.setSize(800, 600); + jf.setTitle(n3.showShortName()); + jf.setVisible(true); + ProjectGUI.setEulerGUIIcon(jf); + + jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + listener = new DocumentListener(); + jf.addWindowListener(listener); + } catch (HeadlessException e) { + e.printStackTrace(); + } + } + + /** + * embed N3 Editor in a JComponent + */ + public JComponent embedEditor(N3Source n3) { + this.n3 = n3; + jedit = new JEditTextArea(); + String toOpen = EditorManagement.fileToOpen(n3); + insertFileOrURL(toOpen); + applySyntax(n3.uri()); + return jedit; + } + + public void setCaretPosition(int line, int col) { + if (line >= 1) line--; - if(col>=1) + if (col >= 1) col--; - + int position = jedit.getLineStartOffset(line) + col; //TODO the parser erroneously places the end of line errors. They are placed at the beginning of the next line. We correct that behaviour (on purpose?) - if(col==0) + if (col == 0) position--; setCaretPosition(position); } @@ -132,12 +137,14 @@ } - public int getCaretPosition(){ + public int getCaretPosition() { return jedit.getCaretPosition(); } - public void setToolTipText(String text){ - jedit.getPainter().addCustomHighlight(new TextAreaPainter.Highlight(){ + public void setToolTipText(String text) { + final String toolTipText = (text == null ? null : "<HTML>" + text.replace("\n", "<br/>") + "</HTML>"); + final TextAreaPainter textAreaPainter = jedit.getPainter(); + textAreaPainter.addCustomHighlight(new TextAreaPainter.Highlight() { @Override public void init(JEditTextArea textArea, TextAreaPainter.Highlight next) { @@ -146,181 +153,214 @@ @Override public void paintHighlight(Graphics gfx, int line, int y) { - //To change body of implemented methods use File | Settings | File Templates. } - @Override public String getToolTipText(MouseEvent evt) { - return "toto"; //To change body of implemented methods use File | Settings | File Templates. + return toolTipText; } }); + + removeTooltipOnNextEdit(); } - public String getToolTipText(){ - return jedit.getToolTipText(); + private void removeTooltipOnNextEdit() { + final DocumentListener tooltipRemover = new DocumentListener() { + @Override + public void removeUpdate(DocumentEvent e) { + //TODO how to remove our custom Highlight instead of this quick hack ? + setToolTipText(null); + jedit.getDocument().removeDocumentListener(this); + } + + @Override + public void insertUpdate(DocumentEvent e) { + //TODO how to remove our custom Highlight instead of this quick hack ? + setToolTipText(null); + jedit.getDocument().removeDocumentListener(this); + } + + @Override + public void changedUpdate(DocumentEvent e) { + //TODO how to remove our custom Highlight instead of this quick hack ? + setToolTipText(null); + jedit.getDocument().removeDocumentListener(this); + } + + @Override + public void windowClosing(WindowEvent e) { + //super.windowClosing(e); //To change body of overridden methods use File | Settings | File Templates. + } + }; + jedit.getDocument().addDocumentListener(tooltipRemover); } - + /** + * display Editor in a new Window, with save As in File menu + */ + public void displayEditor(ProjectGUI projectGUI, String toOpen) { + JFrame jf = new JFrame(); - /** display Editor in a new Window, with save As in File menu */ - public void displayEditor( ProjectGUI projectGUI, String toOpen ) { - JFrame jf = new JFrame( ); - - JComponent embededEditor = insertFileOrURL( toOpen ); - applySyntax(toOpen); - JMenuBar menuBar = new JMenuBar(); - jf.setJMenuBar(menuBar); - JMenu file = new JMenu("File"); - menuBar.add( file ); - SaveAs saveAs = new SaveAs( this, projectGUI, - (JEditTextArea)embededEditor ); - Save save = new Save((JEditTextArea)embededEditor, this ); - file.add(save); - file.add(saveAs); + JComponent embededEditor = insertFileOrURL(toOpen); + applySyntax(toOpen); + JMenuBar menuBar = new JMenuBar(); + jf.setJMenuBar(menuBar); + JMenu file = new JMenu("File"); + menuBar.add(file); + SaveAs saveAs = new SaveAs(this, projectGUI, + (JEditTextArea) embededEditor); + Save save = new Save((JEditTextArea) embededEditor, this); + file.add(save); + file.add(saveAs); - jf.getContentPane().add( embededEditor ); - jf.setSize(800, 600); - jf.setTitle( toOpen ); - jf.setVisible(true); - ProjectGUI.setEulerGUIIcon(jf); - - jf.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE ); - listener = new DocumentListener(); - jf.addWindowListener(listener); - } + jf.getContentPane().add(embededEditor); + jf.setSize(800, 600); + jf.setTitle(toOpen); + jf.setVisible(true); + ProjectGUI.setEulerGUIIcon(jf); - private JComponent insertFileOrURL(String toOpen) { - jedit = new JEditTextArea(); + jf.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + listener = new DocumentListener(); + jf.addWindowListener(listener); + } - InputStream is = null; - try { - if( toOpen .startsWith( "file:") - || toOpen.startsWith( "http:") - || toOpen.startsWith( "https:") // TODO there is a handy URL method - || toOpen.startsWith( "ftp:") - ) { - is = (InputStream) new URL(toOpen).getContent(); - } else { - if( new File(toOpen).exists() ) { - is = new FileInputStream(toOpen); } - } - if( is != null ) { - BufferedReader reader = new BufferedReader( - new InputStreamReader(is, "UTF8")); - String line; - StringBuilder builder = new StringBuilder(); - while( (line = reader.readLine()) != null ) { - builder.append(line).append('\n'); - } - String text = builder.toString(); - reader.close(); - SyntaxDocument document = new N3SyntaxDocument(); - jedit.setDocument( document ); - jedit.setText(text); - document.addDocumentListener( listener ); - // need to reset edited, because calling setText() has already - // set edited = true - edited = false; - } - jedit.scrollTo( 0, 0); - - } catch (IOException e) { - e.printStackTrace(); - jedit.setText( e.getLocalizedMessage() ); - } - return jedit; - } + private JComponent insertFileOrURL(String toOpen) { + jedit = new JEditTextArea(); - private void applySyntax(String toOpen) { - String suffix = toOpen.substring( - toOpen.lastIndexOf( '.' ) + 1 ); - TokenMarker syntax = suffix2syntax.get( suffix ); - jedit.setTokenMarker(syntax); - } - - /** records the first modification, to prevent unsaved edits - * TODO upon Save actions, reset {@link #edited} to false */ - class DocumentListener extends WindowAdapter - implements javax.swing.event.DocumentListener - , WindowListener + InputStream is = null; + try { + if (toOpen.startsWith("file:") + || toOpen.startsWith("http:") + || toOpen.startsWith("https:") // TODO there is a handy URL method + || toOpen.startsWith("ftp:") + ) { + is = (InputStream) new URL(toOpen).getContent(); + } else { + if (new File(toOpen).exists()) { + is = new FileInputStream(toOpen); + } + } + if (is != null) { + BufferedReader reader = new BufferedReader( + new InputStreamReader(is, "UTF8")); + String line; + StringBuilder builder = new StringBuilder(); + while ((line = reader.readLine()) != null) { + builder.append(line).append('\n'); + } + String text = builder.toString(); + reader.close(); + SyntaxDocument document = new N3SyntaxDocument(); + jedit.setDocument(document); + jedit.setText(text); + document.addDocumentListener(listener); + // need to reset edited, because calling setText() has already + // set edited = true + edited = false; + } + jedit.scrollTo(0, 0); + + } catch (IOException e) { + e.printStackTrace(); + jedit.setText(e.getLocalizedMessage()); + } + return jedit; + } + + private void applySyntax(String toOpen) { + String suffix = toOpen.substring( + toOpen.lastIndexOf('.') + 1); + TokenMarker syntax = suffix2syntax.get(suffix); + jedit.setTokenMarker(syntax); + } + + /** + * records the first modification, to prevent unsaved edits + * TODO upon Save actions, reset {@link #edited} to false + */ + class DocumentListener extends WindowAdapter + implements javax.swing.event.DocumentListener + , WindowListener // , WindowStateListener - { - @Override - /** PENDING these 3 methods are apparently not called; - * beginCompoundEdit does the job - */ - public void removeUpdate(DocumentEvent e) { - edited = true; - } - - @Override - public void insertUpdate(DocumentEvent e) { - edited = true; - } - - @Override - public void changedUpdate(DocumentEvent e) { - edited = true; - } + { + @Override + /** PENDING these 3 methods are apparently not called; + * beginCompoundEdit does the job + */ + public void removeUpdate(DocumentEvent e) { + edited = true; + } - @Override - public void windowClosing(WindowEvent e) { - if( e.getID() == WindowEvent.WINDOW_CLOSING ) { - if( edited ) { - System.err.println( "The document \"" - + n3.getFileName() - + "\" has been edited, you must save it first."); - // TODO it should not close, but it does !!! - } else { - ((Window)e.getSource()).dispose(); - } - } - } - } - - class N3SyntaxDocument extends SyntaxDocument { - private static final long serialVersionUID = 1L; - @Override - public void beginCompoundEdit() { - if( ! edited ) { - if( n3 != null ) { - System.out.println( "First edit " + n3.showShortName() ); - } - edited = true; - } - } - } + @Override + public void insertUpdate(DocumentEvent e) { + edited = true; + } - public N3Source get3NSource() { - return n3; - } + @Override + public void changedUpdate(DocumentEvent e) { + edited = true; + } - /** call this notify that the file has been saved */ - public void setSaved() { - edited = false; - } - - public void setText(String text) { - jedit.setText(text); - } + @Override + public void windowClosing(WindowEvent e) { + if (e.getID() == WindowEvent.WINDOW_CLOSING) { + if (edited) { + System.err.println("The document \"" + + n3.getFileName() + + "\" has been edited, you must save it first."); + // TODO it should not close, but it does !!! + } else { + ((Window) e.getSource()).dispose(); + } + } + } + } - public JComponent getComponent() { - if( jedit == null ) { - embedEditor( new N3Source("") ); + class N3SyntaxDocument extends SyntaxDocument { + private static final long serialVersionUID = 1L; + + @Override + public void beginCompoundEdit() { + if (!edited) { + if (n3 != null) { + System.out.println("First edit " + n3.showShortName()); + } + edited = true; + } + } + } + + public N3Source get3NSource() { + return n3; + } + + /** + * call this notify that the file has been saved + */ + public void setSaved() { + edited = false; + } + + public void setText(String text) { + jedit.setText(text); + } + + public JComponent getComponent() { + if (jedit == null) { + embedEditor(new N3Source("")); + } + return jedit; + } + + public void insertStringAtPaneEnd(String message) { + int offs = jedit.getDocument().getEndPosition().getOffset(); + try { + jedit.getDocument().insertString(offs, message, null); + jedit.setCaretPosition( + jedit.getDocument().getEndPosition().getOffset() - 1); + } catch (BadLocationException e) { + // Auto-generated catch block + e.printStackTrace(); } - return jedit; - } - - public void insertStringAtPaneEnd(String message) { - int offs = jedit.getDocument().getEndPosition().getOffset(); - try { - jedit.getDocument().insertString( offs, message, null); - jedit.setCaretPosition( - jedit.getDocument().getEndPosition().getOffset() - 1 ); - } catch (BadLocationException e) { - // Auto-generated catch block - e.printStackTrace(); - } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |