Syntax Highlighting w/ Swing Text Package

I have a question for you that I hope ever so much that you could answer just in the most abstract sense, I will figure out the code from what you have said hopefully. Any relavent parts that you think I should know, please point out.
My question is, I'm trying to implement Syntax Highlighting for a code editor in Java (yes I know, like everyone else. It would REALLY be helpful if you did an updated Demo of a SyntaxEditor for JDK 1.4 BTW) anyway, I have already implemented Syntax Highlighting by overriding the PlainView and changing its drawLine method to parse the line, find the key words then draw them accordingly. However I cannot get over the sinking feeling that there is a better way to do this in JDK 1.4, I'm not worried about backward compatability. I'm only interested in the "sexiest" way to do this with Java. I started looking into the GlyphView, and that seems more of what I want, it has more control over the text elements and strong drawing abilities, I also noticed the GlyphPainter1 and GlyphPainter2, I tried to extend GlyphPainter2 and use it with my extended GlyphView and just change its paint method to parse the lines, but the class complains about not being public, even though in the source its class definition is "public class GlyphPainer2 extends GlyphView.GlyphPainter" which confused me.
But at any rate, my basic question is how would YOU, implement Syntax Highlighting (code coloring) if you could do it from scratch with all the facilities of the 1.4 JDK. ALso, should I look into the Java2D API or is this over kill for what I'm doing? I just need a basic code color'er, nothing fancy. But I need the fonts and styles to be able to change, that's all. And international support would be nice.
The type of answer I'm hoping for is something like "Create a new editor kit and then extend the GlyphView class and override its XYZ method to do your line parsing and then override the ABC method to do the actual painting of the line, this is the best way to do this in java"
Best wishes,
-rsk123

I am searching for text highlighting code in java during 7 days.
And I also agree with Mr. rsk123 's thought.
I want to make editor to highlight code using java's general text package.
But I can't find good source or class to satisfy me.
Some code run well but it's not use the original java text package.
Some code was made by using java text package but have a bug and not run pefectly.
Now, I must choice a code for text highlighting.
But until now I can't find a free code or comecial code for it.
Anyway, I summarize my suffing result until now.
** I have stuied,
. About java's text package in Swing Connection site.
It's useful a little to understand the text package structure.
(http://java.sun.com/products/jfc/tsc/articles/index.html)
. How to make own EditorKit in 'Java Swing' book chapter 24.
I think it's good. But difficult to read.
(published by O'REILLY. Robert Eckstein)
** I have found program and have tested.
1) JEdit (http://www.jedit.org)
2) Jext(http://www.jext.org)
3) Sun's sample using the JavaEditorKit
(http://java.sun.com/products/jfc/tsc/articles/text/editor_kit/index.html)
4) Ostermiller's Syntax editor (http://ostermiller.org/syntax/editor.html)
5) j (http://armedbear-j.sourceforge.net/)
6) je 1.66 (http://mathsrv.ku-eichstaett.de/MGF/homes/grothmann/je/)
*** Detail descriptions of the test
1. May be run well but not use java text package.
==> JEdit (http://www.jedit.org), Jext(http://www.jext.org)
- I executed JEdit and Jext program. it works very well.
I think It's greate programs.
- The editor class for these programs are
org.gjt.sp.jedit.textarea.JEditTextArea class.
The JEditTextArea class extends JComponent, not java text component.
- JEditTextArea class started from 'jedit syntax package project'.
You can download the syntax package if you only use syntax highlighting
from http://syntax.jedit.org/ .
- JEdit and Jext use for editor 'jedit syntax package' but have upgrade that
package their own effort(may be)
- For me, It's an only product run well without error.
But unfortunately it's not use java text component.
So I hesitane to use it.
Because I should make almost code to support general editor function which
supported in JTextComponent.
2. Provided by Sun's developer site.
==> JavaEditorKit (http://java.sun.com/products/jfc/tsc/articles/text/editor_kit/index.html)
- It's made using JEditorPane. Great!!
And have a good architecture. (I think)
- But It use Scanner class which located in tools.jar package and
have a bug which not supporting well comment syntax /* */.
(Refer to http://developer.java.sun.com/developer/bugParade/bugs/4323090.html)
Futhermore it display terrible exception message when typed "/*" string
in the end position of java file. (I tested it)
- I heard in the forum, someone made the own scanner class.
(http://forum.java.sun.com/thread.jsp?thread=120564&forum=57&message=316083)
He said,(he = rofshi)
I wrote for my purposes a scanner based on the StreamTokenizer
cl*** and set a corresponding object in the JavaView cl*** of
the JavaKitTest.
Then I placed the method of my Scanner cl*** that parses the
given string and paints tokens in the method drawUnselected
Text (instead of previous code).
Of course, I erased all of the previous code related to the
java Scanner.
- For me, I like this style code and want to use it.
But Scanner class have some bug and I can't cure that bug. Terrible...
3. using JTextPane
==> http://ostermiller.org/syntax/editor.html
- At first it's too slow.
My computer is PentiumIII 350MHz Ram:256M Windows2000Por
But when I press pgDown key quickly the display couldn't follow it.
- And may be not support unicode.
When I typed international code, exceptions displayed.
(too much exceptios. may be caused repeating by thread.)
(ArrayIndexOutOfBoundsException in JavaLexer.java 1022 ?)
- For me, supporting international code is essential.
So I can't use it.
4. Do work well. But it use not understandable code for me.
(not use general java text package)
1)http://armedbear-j.sourceforge.net/
2)http://www.rene-grothmann.de
*** Finally, I have plan to make my own code using Mr rsk123's idea.
(using GlyphView in jdk1.3 or jdk1.4)
*** If you have a good information for text highliting of free code or
comecial code pleas notify me.
My address is [email protected]

Similar Messages

  • Using of javax.swing.text package

    Where can I find any resources devoted to using javax.swing.text package?

    At the end of the API documentation for that package you may notice this:
    <quote>
    Related Documentation
    For overviews, tutorials, examples, guides, and tool documentation, please see:
    Using Text Components, a section in The Java Tutorial.
    </quote>

  • Would like to use syntax highlighting in body text for code snippets

    I have a feeling this isn't actually possible without a whole lot of manual work, but I want to preserve syntax highlighting in code examples in my online help. Like this:
    All I can do is black text. |:^(
    I am using Robohelp 7, generating to WebHelp.
    Thanks for any help anyone can pass on!

    Hi all
    I'm not sure if it's a feasible solution for you, but what about displaying the code (complete with color coding - oops, that's colour coding for you English chaps) in whatever application you use. Then grab a screen capture of the relevant area and insert as an image in RoboHelp.
    My thought here is that you could maintain the code in the other app in case you need to change it at some point. Then if it does change, just snag another image.
    Cheers... Rick
    Helpful and Handy Links
    RoboHelp Wish Form/Bug Reporting Form
    Begin learning RoboHelp HTML 7 or 8 within the day - $24.95!
    Adobe Certified RoboHelp HTML Training
    SorcerStone Blog
    RoboHelp eBooks

  • Where to learn swing text package

    Hello.
    I have been programming in java for a few year. I haven't made any real project (I am a college student). However, I have learnt lots of java stuff. I have used most of swing component. I even implements my own Renderer, Model, and Component. However I found it very hard to me to start learning about JTextPane and JEditorPane. I need to make my own TextPane to display text getting from my custom Object.
    can anyone tell me place to learn about the JTextPane and its StyleDocuments and those stuffs. I found sun tutorial but did not help much. Thanks in advance.

    Try this Sun's Java Swing Tutorial site:
    http://java.sun.com/docs/books/tutorial/uiswing/index.html

  • Swing text wrapping

    Hello,
    I have an app thats makes use of an extended WrappedPlainView to add syntax highlighting. Everything works great except when I use bold fonts in random spots. When WrappedPlainView is asked to draw the text
    swing does not allow enough room for the line with bold words.With bold words the line needs to be a bit
    wider at times to not cut off any letters. Any ideas on how I can fix this ? On a side note , works fine
    with fixed width fonts..
    Thanks,
    jd

    I've actually done this before. Instead of subclassing WrappedPlainView though, I subclassed BoxView (WrappedPlainView's parent class). This had to be done because WrappedPlainView has too much data hidden via package private/private methods, to the point where you cannot modify it for your multi-font needs. Besides, WrappedPlainView states in its documentation that it only supports rendering a single font. Hacking it to support multiple fonts (plain, bold, italic) may have unforseen consequences. Subclass BoxView instead.
    It's a lot of work to do what you want to do, probably more than you realize. You have to write code to calculate where the wrapped lines should be broken apart (must be fast too), override modelToView/viewToModel to take into account different fonts, etc. Use WrappedPlainView as a guide, but change the parts that do things such as compute break locations, model-to-view translations, etc. to handle your font size data.
    But in all seriousness, you probably should use JEditorPane for this. Here's my attempt to talk you into using one :)
    mohadib_ wrote:
    Also JEditorPaneWhat are you using to render a multi-font view, if not JEditorPane? JTextArea? You do realize that JTextArea and its associated views are designed to render only 1 font? While this can be done, it's not simple, as several parts of JTextArea and its associated views make assumptions about using a single font for performance reasons. You'll have to seriously study the Swing text package code, and make your own View subclasses for JTextArea that handle rendering multiple fonts, computing text widths, etc.
    is horribly slowOf course it's slower than rendering a single font with JTextArea. Again, that's because JTextArea can take advantage of the fact that it's using a single font, which allows it to greatly speed up modelToView/viewToModel calculations, rendering, etc. JEditorPane is not slow because it's poorly designed or inefficient; rather, it's slow because of the extra work it's doing. It's mature enough to the point where it's probably difficult to make it faster without a redesign. Do you honestly think you can create a Swing text component that has all of the features of JEditorPane, but performs better?
    and eats memeory.It consumes more memory than, say, JTextArea, because it's caching the fonts/colors used to render its document. If you want to support multiple fonts and syntax highlighting, you'll have to do the same thing. Can you cache this information in a more efficient way than JEditorPane does? Have you tried using JEditorPane and run into memory problems?
    Again, this can be done, but really shouldn't. The perceived benefits don't really pan out, especially when weighed against the development and maintenance costs. More code => more bugs. Why not use the support already provided to you in the JDK?

  • Javax.swing.text complexity?

    Hello,
    does someone know how complex the javax.swing.text package is?
    Perhaps someone knows of how many rows and/or functions the package consists?
    thanks
    kbj

    Hello,
    does someone know how complex the javax.swing.text
    package is?
    Perhaps someone knows of how many rows and/or
    functions the package consists?
    thanks
    kbjDidnt count yet, but if somebody could tell me how to get all classes from a package i could easily calculate method-number.
    Besides why do you want to know it ??
    regards,
    Tim

  • About Swing.text Question

    I am new in swing. In javax.swing.text package is there a AbstractDocument class. If I have created that object, how can I move the contents of that object to RTF file? This mind come up because I want to save styled text into RTF file. Is that possible? Please give me some ideas. Thank you.

    Look into RtfToolkit in the API maybe that will help.

  • Syntax Highlighting and Undo Problem

    Hello Guys. I am working ona very simple type of Java Code Editor with syntax highlighting feature. It works fine as far as the syntax highlighting, cut, copy, paste etc are concerned but when I added Undo, Redo feature, it was not working as Undo Redo should. The UndoManager first removes the text attributes and finally the main Undo job. For example if I paste word public , the UndoManager will first remove the attributes and after about third or fouth click on the Undo button removes the pasted word.
    Please Help.

    Here's the complete demo code.
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.text.*;
    import javax.swing.event.*;
    import javax.swing.text.rtf.*;
    import javax.swing.undo.*;
    class ColorTextInTextPane extends JFrame implements UndoableEditListener
         private Hashtable keywords,impclasses;
         JEditorPane edit;
         UndoManager undo;
         JButton undoIt, redoIt;
         JPanel southButtonPanel;
         MyDocument doc = new MyDocument();
         public ColorTextInTextPane()
              super("ColorTextInTextPane");
              this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              edit = new JEditorPane();
              edit.setEditorKit(new StyledEditorKit());
              edit.setEditable(true);
              doc.addUndoableEditListener(this);
              edit.setDocument(doc);
              JScrollPane scroll=new JScrollPane(edit);
              undo = new UndoManager();
              undoIt = new JButton("Undo");
              undoIt.addActionListener(new ActionListener()
                public void actionPerformed(ActionEvent ae)
                    undoAction(ae);
              redoIt = new JButton("Redo");
              redoIt.addActionListener(new ActionListener()
                public void actionPerformed(ActionEvent ae)
                    redoAction(ae);
              southButtonPanel = new JPanel();
              southButtonPanel.add(undoIt);
              southButtonPanel.add(redoIt);
              getContentPane().add(scroll);
              getContentPane().add(southButtonPanel, BorderLayout.SOUTH);
              setSize(300,300);
              setVisible(true);
              Object dummyObject = new Object();
              keywords = new Hashtable();
              keywords.put( "abstract", dummyObject );
              keywords.put( "boolean", dummyObject );
              keywords.put( "break", dummyObject );
              keywords.put( "byte", dummyObject );
              keywords.put( "byvalue", dummyObject );
              keywords.put( "case", dummyObject );
              keywords.put( "cast", dummyObject );
              keywords.put( "catch", dummyObject );
              keywords.put( "char", dummyObject );
              keywords.put( "class", dummyObject );
              keywords.put( "const", dummyObject );
              keywords.put( "continue", dummyObject );
              keywords.put( "default", dummyObject );
              keywords.put( "do", dummyObject );
              keywords.put( "double", dummyObject );
              keywords.put( "else", dummyObject );
              keywords.put( "extends", dummyObject );
              keywords.put( "false", dummyObject );
              keywords.put( "final", dummyObject );
              keywords.put( "finally", dummyObject );
              keywords.put( "float", dummyObject );
              keywords.put( "for", dummyObject );
              keywords.put( "future", dummyObject );
              keywords.put( "generic", dummyObject );
              keywords.put( "goto", dummyObject );
              keywords.put( "if", dummyObject );
              keywords.put( "implements", dummyObject );
              keywords.put( "import", dummyObject );
              keywords.put( "inner", dummyObject );
              keywords.put( "instanceof", dummyObject );
              keywords.put( "int", dummyObject );
              keywords.put( "interface", dummyObject );
              keywords.put( "long", dummyObject );
              keywords.put( "native", dummyObject );
              keywords.put( "new", dummyObject );
              keywords.put( "null", dummyObject );
              keywords.put( "operator", dummyObject );
              keywords.put( "outer", dummyObject );
              keywords.put( "package", dummyObject );
              keywords.put( "private", dummyObject );
              keywords.put( "protected", dummyObject );
              keywords.put( "public", dummyObject );
              keywords.put( "rest", dummyObject );
              keywords.put( "return", dummyObject );
              keywords.put( "short", dummyObject );
              keywords.put( "static", dummyObject );
              keywords.put( "super", dummyObject );
              keywords.put( "switch", dummyObject );
              keywords.put( "synchronized", dummyObject );
              keywords.put( "this", dummyObject );
              keywords.put( "throw", dummyObject );
              keywords.put( "throws", dummyObject );
              keywords.put( "transient", dummyObject );
              keywords.put( "true", dummyObject );
              keywords.put( "try", dummyObject );
              keywords.put( "var", dummyObject );
              keywords.put( "void", dummyObject );
              keywords.put( "volatile", dummyObject );
              keywords.put( "while", dummyObject );
              Object dummyObject1 = new Object();
              impclasses = new Hashtable();
              impclasses.put( "JFrame", dummyObject1);
              impclasses.put( "Applet", dummyObject1);
                    impclasses.put( "JApplet", dummyObject1);
                    impclasses.put( "JTextField", dummyObject1);
                    impclasses.put( "JLabel", dummyObject1);
                    impclasses.put( "JPanel", dummyObject1);
                    impclasses.put( "JButton", dummyObject1);
         public void undoableEditHappened(UndoableEditEvent ev) {
        undo.addEdit(ev.getEdit());
        updateMenu();
      void undoAction(ActionEvent e) {
        try {
          if (undo.canUndo())
            undo.undo();
          updateMenu();
        catch (CannotRedoException cre) {
      void redoAction(ActionEvent e)
        try {
          if (undo.canRedo())
            undo.redo();
          updateMenu();
        catch (CannotRedoException cre) {
      public void updateMenu()
        undoIt.setEnabled(undo.canUndo());
        redoIt.setEnabled(undo.canRedo());
         public static void main(String a[])
              new ColorTextInTextPane();
         class MyDocument extends DefaultStyledDocument
              DefaultStyledDocument doc;
              MutableAttributeSet normal;
              MutableAttributeSet keyword;
              MutableAttributeSet comment;
              MutableAttributeSet quote;
              MutableAttributeSet impclasses1;
              public MyDocument()
                   doc = this;
                   putProperty( DefaultEditorKit.EndOfLineStringProperty, "\n" );
                   normal = new SimpleAttributeSet();
                   StyleConstants.setForeground(normal, Color.black);
                   comment = new SimpleAttributeSet();
                   StyleConstants.setForeground(comment, Color.green);
                   StyleConstants.setItalic(comment, true);
                   keyword = new SimpleAttributeSet();
                   StyleConstants.setForeground(keyword, Color.blue);
                   StyleConstants.setBold(keyword, true);
                   quote = new SimpleAttributeSet();
                   StyleConstants.setForeground(quote, Color.red);
                   StyleConstants.setBold(quote, true);
                   impclasses1 = new SimpleAttributeSet();
                   StyleConstants.setForeground(impclasses1, Color.magenta);
                   StyleConstants.setBold(impclasses1, true);
              public void insertString(int offset, String str, AttributeSet a) throws BadLocationException
                   super.insertString(offset, str, a);
                   processChangedLines(offset, str.length());
              public void remove(int offset, int length) throws BadLocationException
                   super.remove(offset, length);
                   processChangedLines(offset, 0);
              public void processChangedLines(int offset, int length) throws BadLocationException
                   String content = doc.getText(0, doc.getLength());
                   Element root = doc.getDefaultRootElement();
                   int startLine = root.getElementIndex( offset );
                   int endLine = root.getElementIndex( offset + length );
                   for (int i = startLine; i <= endLine; i++)
                        int startOffset = root.getElement( i ).getStartOffset();
                        int endOffset = root.getElement( i ).getEndOffset();
                        applyHighlighting(content, startOffset, endOffset - 1);
              public void applyHighlighting(String content, int startOffset, int endOffset)
                   throws BadLocationException
                   int index;
                   int lineLength = endOffset - startOffset;
                   int contentLength = content.length();
                   if (endOffset >= contentLength)
                        endOffset = contentLength - 1;
                   //  set normal attributes for the line
                   doc.setCharacterAttributes(startOffset, lineLength, normal, true);
                   //  check for multi line comment
                   String multiLineStartDelimiter = "/*";
                   String multiLineEndDelimiter = "*/";
                   index = content.lastIndexOf( multiLineStartDelimiter, endOffset );
                   if (index > -1)
                        int index2 = content.indexOf( multiLineEndDelimiter, index );
                        if ( (index2 == -1) || (index2 > endOffset) )
                             doc.setCharacterAttributes(index, endOffset - index + 1, comment, false);
                             return;
                        else
                        if (index2 >= startOffset)
                             doc.setCharacterAttributes(index, index2 + 2 - index, comment, false);
                             return;
                   //  check for single line comment
                   String singleLineDelimiter = "//";
                   index = content.indexOf( singleLineDelimiter, startOffset );
                   if ( (index > -1) && (index < endOffset) )
                        doc.setCharacterAttributes(index, endOffset - index + 1, comment, false);
                        endOffset = index - 1;
                   //  check for tokens
                   checkForTokens(content, startOffset, endOffset);
              private void checkForTokens(String content, int startOffset, int endOffset)
                   while (startOffset <= endOffset)
                        //  find the start of a new token
                        while ( isDelimiter( content.substring(startOffset, startOffset + 1) ) )
                             if (startOffset < endOffset)
                                  startOffset++;
                             else
                                  return;
                        if ( isQuoteDelimiter( content.substring(startOffset, startOffset + 1) ) )
                             startOffset = getQuoteToken(content, startOffset, endOffset);
                        else
                             startOffset = getOtherToken(content, startOffset, endOffset);
              private boolean isDelimiter(String character)
                   String operands = ";:{}()[]+-/%<=>!&|^~*";
                 if (Character.isWhitespace( character.charAt(0) ) ||
                      operands.indexOf(character) != -1 )
                      return true;
                 else
                      return false;
              private boolean isQuoteDelimiter(String character)
                   String quoteDelimiters = "\"'";
                   if (quoteDelimiters.indexOf(character) == -1)
                      return false;
                 else
                      return true;
              private boolean isKeyword(String token)
                   Object o = keywords.get( token );
                   return o == null ? false : true;
              private boolean isimpclasses1(String token)
                   Object o = impclasses.get( token );
                   return o == null ? false : true;
              private int getQuoteToken(String content, int startOffset, int endOffset)
                   String quoteDelimiter = content.substring(startOffset, startOffset + 1);
                   String escapedDelimiter = "\\" + quoteDelimiter;
                   int index;
                   int endOfQuote = startOffset;
                   //  skip over the escaped quotes in this quote
                   index = content.indexOf(escapedDelimiter, endOfQuote + 1);
                   while ( (index > -1) && (index < endOffset) )
                        endOfQuote = index + 1;
                        index = content.indexOf(escapedDelimiter, endOfQuote);
                   // now find the matching delimiter
                   index = content.indexOf(quoteDelimiter, endOfQuote + 1);
                   if ( (index == -1) || (index > endOffset) )
                        endOfQuote = endOffset;
                   else
                        endOfQuote = index;
                   doc.setCharacterAttributes(startOffset, endOfQuote - startOffset + 1, quote, false);
                            //String token = content.substring(startOffset, endOfQuote + 1);
                            //System.out.println( "quote: " + token );
                   return endOfQuote + 1;
              private int getOtherToken(String content, int startOffset, int endOffset)
                 int endOfToken = startOffset + 1;
                   while ( endOfToken <= endOffset )
                        if ( isDelimiter( content.substring(endOfToken, endOfToken + 1) ) )
                             break;
                        endOfToken++;
                   String token = content.substring(startOffset, endOfToken);
                            //System.out.println( "found: " + token );
                   if ( isKeyword( token ) )
                        doc.setCharacterAttributes(startOffset, endOfToken - startOffset, keyword, false);
                   if(isimpclasses1 ( token) )
                        doc.setCharacterAttributes(startOffset, endOfToken - startOffset, impclasses1, false);
                   return endOfToken + 1;
    }

  • Syntax Highlight in a JTextPane

    How can I create syntax highlight in a JTextPane?

    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.Color;
    public class MultiColouredText extends JFrame {
       public MultiColouredText() {
          StyledDocument doc = new DefaultStyledDocument();
          JTextPane pane = new JTextPane(doc);
          pane.setEditable(false);
          pane.setFont(new java.awt.Font("Verdana", 0 , 16));
          MutableAttributeSet mas = new SimpleAttributeSet();
             try {
                StyleConstants.setForeground(mas, Color.yellow);
                StyleConstants.setBackground(mas, Color.blue);
                doc.insertString(doc.getLength(), " Hello ", mas);
                StyleConstants.setForeground(mas, Color.red);
                StyleConstants.setBackground(mas, Color.lightGray);
                doc.insertString(doc.getLength(), " World ", mas);
             catch (Exception ignore) {}
          getContentPane().add(pane);
          setSize(150,56);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
       public static void main(String[] args) {
          new MultiColouredText().show();
    }

  • Different Styles in PlainView - Syntax Highlighting?

    Hi,
    I've managed to extend PlainView and looking at old JEdit code I have the syntax highlighting working for the most part. However, at certain times while typing the cursor starts to get way ahead of the text it's typing. And as I backspace on the line the cursor eventually gets closer to the character the closer it gets to the start of the line.
    I'm overridding the "drawUnselectedText()" method in PlainView to do the coloring.
    Here's the code, you can see the call to SyntaxUtilities.paintSyntaxLine() which is JEdit's class to do the drawing.
             * Renders the given range in the model as normal unselected text. This
             * is implemented to paint colors based upon the token-to-color
             * translations. To reduce the number of calls to the Graphics object,
             * text is batched up until a color change is detected or the entire
             * requested range has been reached.
             * @param g
             *            the graphics context
             * @param x
             *            the starting X coordinate
             * @param y
             *            the starting Y coordinate
             * @param p0
             *            the beginning position in the model
             * @param p1
             *            the ending position in the model
             * @returns the location of the end of the range
             * @exception BadLocationException
             *                if the range is invalid
            protected int drawUnselectedText(Graphics g, int x, int y, int p0, int p1) throws BadLocationException {
                System.out.println("p0: " + p0 + " p1: " + p1 + " x: " + x + " y: " + y);
                // Get the start of the element
                int lineIndex = doc.getDefaultRootElement().getElementIndex(p0);
                // Get the element for the line
                Element elem = doc.getDefaultRootElement().getElement(lineIndex);
                System.out.println("lineIndex: " + lineIndex + " elemStartIDX: " + elem.getStartOffset() + " elemEndIDX: " + elem.getEndOffset());
                // Get the line text
                doc.getText(p0, p1 - p0, currentLineText);
                // If highlighting, mark the tokens
                if (marker != null) {
                    Token t = marker.markTokens(currentLineText, lineIndex);
                    x = SyntaxUtilities.paintSyntaxLine(currentLineText, t, styles, this, g, x, y, p0, p1);
                    System.out.println("Painted line at: " + x);
                } else {
                    // No highlighting requested, draw normal text
                    Font defaultFont = g.getFont();
                    Color defaultColor = styles[0].getColor(); // Default color of text
                    g.setFont(defaultFont);
                    g.setColor(defaultColor);
                    x = Utilities.drawTabbedText(currentLineText, x, y, g, this, p0);
                // Set the last line processed
                lastLine  = lineIndex;
                return x;
    Here is the code from the paintSyntaxLine() method:
         * Paints the specified line onto the graphics context. Note that this
         * method munges the offset and count values of the segment.
         * @param line
         *            The line segment
         * @param tokens
         *            The token list for the line
         * @param styles
         *            The syntax style list
         * @param expander
         *            The tab expander used to determine tab stops. May be null
         * @param gfx
         *            The graphics context
         * @param x
         *            The x co-ordinate
         * @param y
         *            The y co-ordinate
         * @return The x co-ordinate, plus the width of the painted string
        public static int paintSyntaxLine(Segment line, Token tokens, SyntaxStyle[] styles, TabExpander expander, Graphics gfx, int x, int y, int p0, int p1) {
            Font defaultFont = gfx.getFont();
            Color defaultColor = Color.black;
            FontMetrics fm = gfx.getFontMetrics(defaultFont);
            int offset = 0;
            while (tokens != null && tokens.id != Token.END) {
                int length = tokens.length;
                if (tokens.id == Token.NULL) {
                    if (!defaultColor.equals(gfx.getColor()))
                        gfx.setColor(defaultColor);
                    if (!defaultFont.equals(gfx.getFont()))
                        gfx.setFont(defaultFont);
                } else {
                    styles[tokens.id].setGraphicsFlags(gfx, defaultFont);
    //                fm = gfx.getFontMetrics();//[tokens.id].getStyledFont(defaultFont);
    //                FontMetrics dfm = Toolkit.getDefaultToolkit().getFontMetrics(defaultFont);
    //                System.out.println("Font Info: CharWidth[" + fm.charWidth(line.array[p1])+"], Max Advance[" + fm.getMaxAdvance()+"]");
    //                System.out.println("Default Font Info: CharWidth[" + dfm.charWidth(line.array[p1])+"], DMax Advance[" + dfm.getMaxAdvance()+"]");
    ////                x = fm.charsWidth(line.array, p0, length);
                line.count = length;
                x = Utilities.drawTabbedText(line, x, y, gfx, expander, p0);
                line.offset += length;
                offset += length;
                tokens = tokens.next;
            return x;
    I'm not sure what the problem is..i thought it might be an issue with the View and drawing multiple font styles. Since plain view only deals with a single font color and size. I tried using LabelView but that seems to need a StyledDocument and I had problems when I tried to use DefaultStyledDocument for my syntaxdocument. I was getting strange offset issues when using the Segment class.
    Here's what I posted: http://forum.java.sun.com/thread.jspa?threadID=780801
    I am using PlainDocument because that seemed to be what everyone was using for a syntax editor..since the structure of the document in a Plain Document is less complex.
    I orginally started out using the setCharacterAttributes() method on the DefaultStyledDocument and letting the views draw the text. That all seemed to work except for the "segment offset" issue. And I wasn't sure where the best spot to get the document to redraw subsequent lines in the case of changing a multiline comment, etc.
    So, everything I read about others attempts for syntax highlighters seems to use either StyledEditorKit with a fixed language set with custom parsing and using the setCharacterAttributes method. Or they use the plaindocument approach with a custom view..(which no one seems to share the source) or the project just simply uses the JEditTextArea directly (which we can't do in our product).
    We don't need multiple fonts per-line.. The document will always use one font face (Arial, Helvetica, etc) but may use different styles per word (bold, italic, etc).
    I thought I'd need to use FontMetrics to get the size of the font and such. But there didn't seem to be a difference in measurements based on the style of the font. (i.,e A bold font has the same charWidth('m') size as a regular style.
    At least that's what my test program showed..
    The other thing I noticed is that when the document is successfully colored and I use the mouse to select a region of text, the style of the text reverts back to normal. I'm sure that's because I only override the drawUnselectedText() method.
    Any ideas? Is there anyone who has successfully done this?
    Thanks,
    - Tim

    I just tried using a proportional font in my editor, and now I'm seeing your runaway-caret problem. Specifically, the caret remains in sync with the text as long as no bold characters are encountered, but it gets noticeably farther out of whack with each bold character it passes. I suspect that, when you measured the charWidth, your FontMetrics object wasn't really based on a bold font, because bold versions of proportional fonts are larger. And of course, the model/view conversion methods assume that the same style of the same font is used throughout the document. I've never had to deal with that problem, since I've always used monospaced fonts by preference, and bold versions of monospaced fonts really are the same size as the non-bold versions. I suggest you do the same, because getting this to work with proportional fonts look like a major hassle.

  • How to enable syntax highlighting for jspf files on Dreamweaver CS5.5 on Mac

    I ran into an issue where I couldn't get the color coding (color coding style) for java server pages fragments (.jspf) files to show syntax highliting.
    I followed the adobe instructions on Changing and adding file extensions recognized by Dreamweaver without any luck.
    Here is the solution that worked for me:
    On a Mac:
    1. Edit the /Users/YOUR USER/Library/Application Support/Adobe/Dreamweaver CS5.5/en_US/Configuration/DocumentTypes/MMDocumetTypes.xml
    Note: the Adobe instructions tell you to edit /Applications/Adobe Dreamweaver CS5.5/Configuration/DocumentTypes/MMDocumetTypes.xml (Editing this file didn't do anything for me, so you need to change the file above instead)
    Find,
    <documenttype id="JSP" servermodel="JSP" internaltype="Dynamic" winfileextension="jsp,jst" macfileextension="jsp,jst" file="Default.jsp" writebyteordermark="false" mimetype="text/html">
    Replace with,
    <documenttype id="JSP" servermodel="JSP" internaltype="Dynamic" winfileextension="jsp,jst,jspf" macfileextension="jsp,jst,jspf" file="Default.jsp" writebyteordermark="false" mimetype="text/html">
    2. Edit the /Users/YOUR USER/Library/Application Support/Adobe/Dreamweaver CS5.5/en_US/Configuration/Extensions.txt
    In the All: section on top add the jspf extention right after jsp in my example it looked like this
    HTM,HTML,SHTM,SHTML,HTA,HTC,XHTML,STM,SSI,JS,JSON,AS,ASC,ASR,XML,XSL,XSD,DTD,XSLT,RSS,RDF, LBI,DWT,ASP,ASA,ASPX,ASCX,ASMX,CONFIG,CS,CSS,CFM,CFML,CFC,TLD,TXT,PHP,PHP3,PHP4,PHP5,PHP-D IST,PHTML,JSP,WML,TPL,LASSO,JSF,VB,VBS,VTM,VTML,INC,SQL,JAVA,EDML,MASTER,INFO,INSTALL,THEME,CONFIG,MODU LE,PROFILE,ENGINE,SVG:All
    and I added the jspf and it looks like this now,
    HTM,HTML,SHTM,SHTML,HTA,HTC,XHTML,STM,SSI,JS,JSON,AS,ASC,ASR,XML,XSL,XSD,DTD,XSLT,RSS,RDF, LBI,DWT,ASP,ASA,ASPX,ASCX,ASMX,CONFIG,CS,CSS,CFM,CFML,CFC,TLD,TXT,PHP,PHP3,PHP4,PHP5,PHP-D IST,PHTML,JSP,JSPF,WML,TPL,LASSO,JSF,VB,VBS,VTM,VTML,INC,SQL,JAVA,EDML,MASTER,INFO,INSTALL,THEME,CONFIG,MODU LE,PROFILE,ENGINE,SVG:All
    That's it, Quit Dreamweaver and open it up again. Open the .jspf file and see the color coding (syntax highlighting)
    Hope this helps you and seves you time figuring it out. If this helped, do a good thing, next time you figure something out, tell others about it to save their time too, like I did. Enjoy.

    TheGrandNabib wrote:
    I don't seem to have a user Library folder, my only Library folder is on the same level as my Users folder.
    From Locating your personal configuration folder in the Dreamweaver FAQ:
    In Mac OS X (Lion and Mountain Lion), open Finder and press Shift-Cmd-Go. Type ~/Library/Application Support in the dialog box, and click Go. You should then be able to find the configuration folder.

  • Syntax highlighted program code in keynote?

    Is there any easy way insert programming code (in my case Ruby code) into a slide so it shows up with syntax highlighting and formating suitable for the code?
    I.E. so it looks like the highlighted code in Textmate or other gui editors?

    TextWrangler (and thus presumably BBEdit) do preserve their syntax colouring when PDFed, as does Taco HTML Edit. My guess is that this is capability is an app-by-app feature.
    If you were desperate for a PDF output to Keynote, you could always copy the text from Textmate and paste it into the freeware TextWrangler. You would likely have to adjust the default syntax colouring to match Textmate, but that would be relatively straightforward.

  • Pacman.conf file syntax highlighting for nano

    Hi, here is pacman.conf file syntax highlighting for nano. It may be useful for those who edit their pacman.conf regularly.
    Just put this lines in the end of your /etc/nanorc or ~/.nanorc file:
    # syntax highlithing in pacman.conf
    syntax "pacman.conf" "pacman\.conf$"
    color brightwhite start="\[" end="\]"
    color brightyellow ".*="
    color brightred "=.*"
    color white "="
    color brightblue "\[|\]"
    color brightcyan start="/|http|ftp" end=".*"
    color green "#.*"
    In this thread you can find rc.conf file syntax highlighting.

    thank you! i always accidentally open up nano, find out text is practically unreadable with its default colours, close it and then wait the horrific 4 seconds it takes for emacs to spring to life.

  • Rc.conf file syntax highlighting for nano

    Hey, here is rc.conf file syntax highlighting for nano. It may be useful for those who edit their rc.conf regularly.
    # syntax highlithing in rc.conf
    syntax "rc.conf" "rc\.conf$"
    color brightwhite ""(\\.|[^\"])*""
    color brightwhite "\((\\.|[^\"])*\)"
    color brightred "![^> ]+"
    color brightcyan "@[^> ]+"
    color brightyellow ".*="
    color white "="
    color brightblue ""|\(|\)"
    color green "#.*"
    Put this lines into /etc/nanorc or ~/.nanorc

    thank you! i always accidentally open up nano, find out text is practically unreadable with its default colours, close it and then wait the horrific 4 seconds it takes for emacs to spring to life.

  • Syntax highlighting using JTextPane

    Hello,
    Does somebody know how to achieve quick, efficient syntax highlighting using JTextPane. I have tried it out by actually removing and reinserting the colored text, but it is way too slow. It is worse if I do it in a thread. It will be a great help if somebody bails me out of this problem.
    S. Senthil kumar

    Let me see if I understand your problem...you are attempting to open a fairly large file and then highlight certain portions of the text. You're asking for help on how to efficiently do this and several people gave you links on how to highlight text which leads to your last question about the files taking too long to load. How big are these files you're talking about and how long does it take for them to load? What time is acceptable? Remember, all commercially available document display programs have a certain load time which grows larger as the document it is attempting to display grows in size.
    -Kevin

Maybe you are looking for

  • How to find out all the OKCODEs for a particular screen?

    I am working on t-code CL20N and trying to record with t-code SHDB, in the second screen when I press enter it is coming out, but when I run CL20N without SHDB it is going through all the screens perfectly, SHDB is not working for CL20N. Is there any

  • Cubes - how to extract a single dimension and save it in a table

    Hi, I am new to the cubes concept, although I've used it several times in the past to analyse the data but never explored options beyond that. using excel, I can get different dimentions from the cube such as customer information, location, etc. is t

  • NPE when edit a business rule

    I got this error message when try to create a rule for a new ruleset in a newly created Business Rule. This Business Rule has no input/outout, it gave another NPE when Create Business Rules with input/output. oracle.tip.tools.ide.rules.sdkmodel.SDKMo

  • Set Caption as File Name?

    Sometimes people send me photos I want in my library, and those images are named with a string of text that would be a suitable caption. I've got a fair number of these images now, and I'd like to know if there is a batch way of changing the caption

  • Surveys in Marketing Campaigns

    Hi All When we send out surveys in Marketing Campaigns, we can insert tracking for tracking responses. How can we just track that how many BPs opened the survey. Means they clicked on the link ...irrespective of how many did actually respond. Just th