SourceCodePanel.java
01 package net.sourceforge.pmd.util.viewer.gui;
02 
03 
04 import java.awt.BorderLayout;
05 import java.awt.Color;
06 
07 import javax.swing.BorderFactory;
08 import javax.swing.JPanel;
09 import javax.swing.JScrollPane;
10 import javax.swing.JTextArea;
11 import javax.swing.SwingUtilities;
12 import javax.swing.text.BadLocationException;
13 import javax.swing.text.DefaultHighlighter;
14 
15 import net.sourceforge.pmd.lang.ast.Node;
16 import net.sourceforge.pmd.util.viewer.model.ViewerModel;
17 import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent;
18 import net.sourceforge.pmd.util.viewer.model.ViewerModelListener;
19 import net.sourceforge.pmd.util.viewer.util.NLS;
20 
21 
22 /**
23  * source code panel
24  *
25  @author Boris Gruschko ( boris at gruschko.org )
26  @version $Id: SourceCodePanel.java 6305 2008-06-30 06:28:58Z rgustav $
27  */
28 
29 public class SourceCodePanel extends JPanel implements ViewerModelListener {
30   
31     private ViewerModel model;
32     private JTextArea sourceCodeArea;
33 
34     private static final Color HIGHLIGHT_COLOR = new Color(79237111);
35     
36     public SourceCodePanel(ViewerModel model) {
37         this.model = model;
38         init();
39     }
40 
41     private void init() {
42         model.addViewerModelListener(this);
43         setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), NLS.nls("SOURCE.PANEL.TITLE")));
44         setLayout(new BorderLayout());
45         sourceCodeArea = new JTextArea();
46         add(new JScrollPane(sourceCodeArea), BorderLayout.CENTER);
47     }
48 
49     /**
50      * retrieves the string representation of the source code
51      *
52      @return source code's string representation
53      */
54     public String getSourceCode() {
55         return sourceCodeArea.getText();
56     }
57 
58     /**
59      @see ViewerModelListener#viewerModelChanged(ViewerModelEvent)
60      */
61     public void viewerModelChanged(ViewerModelEvent e) {
62         if (e.getReason() == ViewerModelEvent.NODE_SELECTED) {
63             final Node node = (Nodee.getParameter();
64             SwingUtilities.invokeLater(new Runnable() {
65                 public void run() {
66                     try {
67                         sourceCodeArea.getHighlighter().removeAllHighlights();
68                         if (node == null) {
69                             return;
70                         }
71                         int startOffset =
72                                 sourceCodeArea.getLineStartOffset(node.getBeginLine() 1+
73                                 node.getBeginColumn() 1;
74                         int end =
75                                 sourceCodeArea.getLineStartOffset(node.getEndLine() 1+
76                                 node.getEndColumn();
77                         sourceCodeArea.getHighlighter().addHighlight(startOffset, end,
78                                 new DefaultHighlighter.DefaultHighlightPainter(HIGHLIGHT_COLOR));
79                         sourceCodeArea.moveCaretPosition(startOffset);
80                     catch (BadLocationException exc) {
81                         throw new IllegalStateException(exc.getMessage());
82                     }
83                 }
84             });
85         }
86     }
87 }