1 19 20 package edu.umd.cs.findbugs.sourceViewer; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Color ; 24 import java.awt.Dimension ; 25 import java.awt.Font ; 26 import java.awt.FontMetrics ; 27 import java.awt.Graphics ; 28 import java.awt.Toolkit ; 29 import java.awt.event.ActionEvent ; 30 import java.awt.event.ActionListener ; 31 import java.io.FileReader ; 32 import java.io.IOException ; 33 import java.io.Reader ; 34 import java.io.StringReader ; 35 36 import javax.swing.JComponent ; 37 import javax.swing.JEditorPane ; 38 import javax.swing.JFrame ; 39 import javax.swing.JPanel ; 40 import javax.swing.JScrollPane ; 41 import javax.swing.text.BadLocationException ; 42 import javax.swing.text.DefaultStyledDocument ; 43 import javax.swing.text.Document ; 44 import javax.swing.text.Element ; 45 import javax.swing.text.SimpleAttributeSet ; 46 import javax.swing.text.Style ; 47 import javax.swing.text.StyleConstants ; 48 import javax.swing.text.StyleContext ; 49 import javax.swing.text.StyledDocument ; 50 import javax.swing.text.TabSet ; 51 import javax.swing.text.TabStop ; 52 53 import edu.umd.cs.findbugs.gui2.Debug; 54 import edu.umd.cs.findbugs.gui2.Driver; 55 import edu.umd.cs.findbugs.ba.SourceFile; 56 57 public class JavaSourceDocument { 58 59 static final SimpleAttributeSet commentAttributes = new SimpleAttributeSet (); 60 61 static final SimpleAttributeSet javadocAttributes = new SimpleAttributeSet (); 62 63 static final SimpleAttributeSet quotesAttributes = new SimpleAttributeSet (); 64 65 static final SimpleAttributeSet keywordsAttributes = new SimpleAttributeSet (); 66 67 static final SimpleAttributeSet whiteAttributes = new SimpleAttributeSet (); 68 69 static Font sourceFont = new Font ("Monospaced", Font.PLAIN, (int)Driver.getFontSize()); 70 final static Color HIGHLIGHT_COLOR = new Color (1f, 1f, .3f); 71 TabSet TAB_SET; 72 static { 73 commentAttributes.addAttribute(StyleConstants.Foreground, new Color ( 74 0.0f, 0.5f, 0.0f)); 75 javadocAttributes.addAttribute(StyleConstants.Foreground, new Color ( 76 0.25f, 0.37f, 0.75f)); 77 quotesAttributes.addAttribute(StyleConstants.Foreground, new Color ( 78 0.0f, 0.0f, 1.0f)); 79 keywordsAttributes.addAttribute(StyleConstants.Foreground, new Color ( 80 0.5f, 0.0f, 0.5f)); 81 keywordsAttributes.addAttribute(StyleConstants.Bold, true); 82 83 } 84 85 86 final HighlightInformation highlights = new HighlightInformation(); 87 final NumberedEditorKit dek = new NumberedEditorKit(highlights); 88 89 final StyleContext styleContext = new StyleContext (); 90 91 final Element root; 92 93 final DefaultStyledDocument doc; 94 95 final SourceFile sourceFile; 96 97 public HighlightInformation getHighlightInformation() { 98 return highlights; 99 } 100 public StyledDocument getDocument() { 101 return doc; 102 } 103 public NumberedEditorKit getEditorKit() { 104 return dek; 105 } 106 private final String title; 107 public String getTitle() { 108 return title; 109 } 110 111 public SourceFile getSourceFile() { 112 return sourceFile; 113 } 114 115 public JavaSourceDocument(String title, Reader in, SourceFile theSource) throws IOException { 116 doc = new DefaultStyledDocument (); 117 this.title = title; 118 this.sourceFile = theSource; 119 Debug.println("Created JavaSourceDocument for " + title); 120 try { 121 dek.read(in, doc, 0); 122 } catch (BadLocationException e) { 123 throw new RuntimeException (e); 124 } 125 in.close(); 126 doc.putProperty(Document.TitleProperty, title); 127 root = doc.getDefaultRootElement(); 128 Toolkit toolkit = Toolkit.getDefaultToolkit(); 129 FontMetrics fontMetrics = toolkit.getFontMetrics(sourceFont); 130 TabStop [] tabs = new TabStop [50]; 131 float width = fontMetrics.stringWidth(" "); 132 133 for (int i = 0; i < tabs.length; i++) 134 tabs[i] = new TabStop (width * (4 + 4 * i)); 135 TAB_SET = new TabSet (tabs); 136 StyleConstants.setTabSet(commentAttributes, TAB_SET); 137 StyleConstants.setTabSet(javadocAttributes, TAB_SET); 138 139 StyleConstants.setTabSet(quotesAttributes, TAB_SET); 140 141 StyleConstants.setTabSet(keywordsAttributes, TAB_SET); 142 143 StyleConstants.setTabSet(commentAttributes, TAB_SET); 144 145 StyleConstants.setTabSet(whiteAttributes, TAB_SET); 146 StyleConstants.setFontFamily(whiteAttributes, sourceFont.getFamily()); 147 StyleConstants.setFontSize(whiteAttributes, sourceFont.getSize()); 148 StyleConstants.setLeftIndent(whiteAttributes, NumberedParagraphView.NUMBERS_WIDTH); 149 150 doc.setParagraphAttributes(0, doc.getLength(), whiteAttributes, true); 151 JavaScanner parser = new JavaScanner(new DocumentCharacterIterator(doc)); 152 while (parser.next() != JavaScanner.EOF) { 153 int kind = parser.getKind(); 154 switch (kind) { 155 case JavaScanner.COMMENT: 156 doc.setCharacterAttributes(parser.getStartPosition(), parser 157 .getLength(), commentAttributes, true); 158 159 break; 160 case JavaScanner.KEYWORD: 161 doc.setCharacterAttributes(parser.getStartPosition(), parser 162 .getLength(), keywordsAttributes, true); 163 164 break; 165 case JavaScanner.JAVADOC: 166 doc.setCharacterAttributes(parser.getStartPosition(), parser 167 .getLength(), javadocAttributes, true); 168 169 break; 170 case JavaScanner.QUOTE: 171 doc.setCharacterAttributes(parser.getStartPosition(), parser 172 .getLength(), quotesAttributes, true); 173 174 break; 175 } 176 177 } 178 179 } 180 private static final long serialVersionUID = 0L; 181 public static final JavaSourceDocument UNKNOWNSOURCE; 182 static { 183 try { 184 UNKNOWNSOURCE= new JavaSourceDocument("Unknown source", new StringReader ("Unable to find source"), null); 185 } catch (IOException e) { 186 throw new RuntimeException (e); 187 } 188 } 189 190 } | Popular Tags |