View Javadoc

1   package net.sourceforge.pmd.util.designer;
2   
3   import java.awt.event.ActionEvent;
4   import java.awt.event.ActionListener;
5   import java.io.BufferedReader;
6   import java.io.File;
7   import java.io.FileReader;
8   import java.io.FileWriter;
9   import java.io.IOException;
10  import java.util.StringTokenizer;
11  
12  import javax.swing.JTextPane;
13  
14  import net.sourceforge.pmd.ast.SimpleNode;
15  import net.sourceforge.pmd.util.LineGetter;
16  
17  public class CodeEditorTextPane extends JTextPane implements LineGetter, ActionListener {
18  
19      private static final String SETTINGS_FILE_NAME = System.getProperty("user.home") + System.getProperty("file.separator") + ".pmd_designer";
20      private static final String LINE_SEPARATOR = System.getProperty("line.separator");
21  
22      public CodeEditorTextPane() {
23          setText(loadCode());
24      }
25  
26      public String getLine(int number) {
27          int count = 1;
28          for (StringTokenizer st = new StringTokenizer(getText(), "\n"); st.hasMoreTokens();) {
29              String tok = st.nextToken();
30              if (count == number) {
31                  return tok;
32              }
33              count++;
34          }
35          throw new RuntimeException("Line number " + number + " not found");
36      }
37  
38      private int getPosition(String[] lines, int line, int column) {
39          int pos = 0;
40          for (int count = 0; count < lines.length;) {
41              String tok = lines[count++];
42              if (count == line) {
43                  int linePos = 0;
44                  int i;
45                  for (i = 0; linePos < column; i++) {
46                      linePos++;
47                      if (tok.charAt(i) == '\t') {
48                          linePos--;
49                          linePos += (8 - (linePos & 07));
50                      }
51                  }
52  
53                  return pos + i - 1;
54              }
55              pos += tok.length() + 1;
56          }
57          throw new RuntimeException("Line " + line + " not found");
58      }
59  
60      public void select(SimpleNode node) {
61          String[] lines = getText().split(LINE_SEPARATOR);
62          setSelectionStart(getPosition(lines, node.getBeginLine(), node.getBeginColumn()));
63          setSelectionEnd(getPosition(lines, node.getEndLine(), node.getEndColumn())+1);
64          requestFocus();
65      }
66  
67      public void actionPerformed(ActionEvent ae) {
68          FileWriter fw = null;
69          try {
70              fw = new FileWriter(new File(SETTINGS_FILE_NAME));
71              fw.write(getText());
72          } catch (IOException ioe) {
73          } finally {
74              try {
75                  if (fw != null)
76                      fw.close();
77              } catch (IOException ioe) {
78                  ioe.printStackTrace();
79              }
80          }
81      }
82  
83      private String loadCode() {
84          BufferedReader br = null;
85          try {
86              br = new BufferedReader(new FileReader(new File(SETTINGS_FILE_NAME)));
87              StringBuffer text = new StringBuffer();
88              String hold;
89              while ((hold = br.readLine()) != null) {
90                  text.append(hold).append(LINE_SEPARATOR);
91              }
92              return text.toString();
93          } catch (IOException e) {
94              e.printStackTrace();
95              return "";
96          } finally {
97              try {
98                  if (br != null) br.close();
99              } catch (IOException e) {
100                 e.printStackTrace();
101             }
102         }
103     }
104 }