1 package net.sourceforge.pmd.util.viewer.gui;
2
3
4 import net.sourceforge.pmd.ast.SimpleNode;
5 import net.sourceforge.pmd.util.viewer.model.ViewerModel;
6 import net.sourceforge.pmd.util.viewer.model.ViewerModelEvent;
7 import net.sourceforge.pmd.util.viewer.model.ViewerModelListener;
8 import net.sourceforge.pmd.util.viewer.util.NLS;
9
10 import javax.swing.*;
11 import javax.swing.text.BadLocationException;
12 import javax.swing.text.DefaultHighlighter;
13 import java.awt.BorderLayout;
14 import java.awt.Color;
15
16
17 /***
18 * source code panel
19 *
20 * @author Boris Gruschko ( boris at gruschko.org )
21 * @version $Id: SourceCodePanel.java,v 1.9 2005/09/02 19:36:22 tomcopeland Exp $
22 */
23
24 public class SourceCodePanel
25
26 extends JPanel
27
28 implements ViewerModelListener {
29
30 private ViewerModel model;
31
32 private JTextArea sourceCodeArea;
33
34
35 public SourceCodePanel(ViewerModel model) {
36
37 this.model = model;
38
39
40 init();
41
42 }
43
44
45 private void init() {
46
47 model.addViewerModelListener(this);
48
49
50 setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), NLS.nls("SOURCE.PANEL.TITLE")));
51
52
53 setLayout(new BorderLayout());
54
55
56 sourceCodeArea = new JTextArea();
57
58
59 add(new JScrollPane(sourceCodeArea), BorderLayout.CENTER);
60
61 }
62
63
64 /***
65 * retrieves the string representation of the source code
66 *
67 * @return source code's string representation
68 */
69
70 public String getSourceCode() {
71
72 return sourceCodeArea.getText();
73
74 }
75
76
77 /***
78 * @see ViewerModelListener#viewerModelChanged(ViewerModelEvent)
79 */
80
81 public void viewerModelChanged(ViewerModelEvent e) {
82
83 if (e.getReason() == ViewerModelEvent.NODE_SELECTED) {
84
85 final SimpleNode node = (SimpleNode) e.getParameter();
86
87
88 SwingUtilities.invokeLater(new Runnable() {
89
90 public void run() {
91
92 try {
93
94 sourceCodeArea.getHighlighter().removeAllHighlights();
95
96
97 if (node == null) {
98
99 return;
100
101 }
102
103
104 int startOffset =
105
106 (sourceCodeArea.getLineStartOffset(node.getBeginLine() - 1) +
107
108 node.getBeginColumn()) - 1;
109
110
111 int end =
112
113 (sourceCodeArea.getLineStartOffset(node.getEndLine() - 1) +
114
115 node.getEndColumn());
116
117
118 sourceCodeArea.getHighlighter().addHighlight(startOffset, end,
119
120 new DefaultHighlighter.DefaultHighlightPainter(new Color(79, 237, 111)));
121
122
123 sourceCodeArea.moveCaretPosition(startOffset);
124
125 } catch (BadLocationException exc) {
126
127 throw new IllegalStateException(exc.getMessage());
128
129 }
130
131 }
132
133 });
134
135 }
136
137 }
138
139 }
140