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 }