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.11 2006/02/10 14:15:31 tomcopeland Exp $
22 */
23
24 public class SourceCodePanel
25 extends JPanel
26 implements ViewerModelListener {
27 private ViewerModel model;
28 private JTextArea sourceCodeArea;
29
30 public SourceCodePanel(ViewerModel model) {
31 this.model = model;
32 init();
33 }
34
35 private void init() {
36 model.addViewerModelListener(this);
37 setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), NLS.nls("SOURCE.PANEL.TITLE")));
38 setLayout(new BorderLayout());
39 sourceCodeArea = new JTextArea();
40 add(new JScrollPane(sourceCodeArea), BorderLayout.CENTER);
41 }
42
43 /***
44 * retrieves the string representation of the source code
45 *
46 * @return source code's string representation
47 */
48 public String getSourceCode() {
49 return sourceCodeArea.getText();
50 }
51
52 /***
53 * @see ViewerModelListener#viewerModelChanged(ViewerModelEvent)
54 */
55 public void viewerModelChanged(ViewerModelEvent e) {
56 if (e.getReason() == ViewerModelEvent.NODE_SELECTED) {
57 final SimpleNode node = (SimpleNode) e.getParameter();
58 SwingUtilities.invokeLater(new Runnable() {
59 public void run() {
60 try {
61 sourceCodeArea.getHighlighter().removeAllHighlights();
62 if (node == null) {
63 return;
64 }
65 int startOffset =
66 (sourceCodeArea.getLineStartOffset(node.getBeginLine() - 1) +
67 node.getBeginColumn()) - 1;
68 int end =
69 (sourceCodeArea.getLineStartOffset(node.getEndLine() - 1) +
70 node.getEndColumn());
71 sourceCodeArea.getHighlighter().addHighlight(startOffset, end,
72 new DefaultHighlighter.DefaultHighlightPainter(new Color(79, 237, 111)));
73 sourceCodeArea.moveCaretPosition(startOffset);
74 } catch (BadLocationException exc) {
75 throw new IllegalStateException(exc.getMessage());
76 }
77 }
78 });
79 }
80 }
81 }
82