package views;
import java.awt.BorderLayout;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Enumeration;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
import misc.ResultTreeNode;
import model.Model;
import application.Application;
public class TextPanel extends JPanel implements PropertyChangeListener{
// Reference to the Model
Model model;
private JPanel jPanelButtons = null;
private JScrollPane jScrollPaneText = null;
private JTextArea jTextArea = null;
private JButton jButtonLoad = null;
private JButton jButtonSave = null;
private DefaultHighlighter highlighter = null;
private DefaultHighlightPainter highlightPainter = null;
public TextPanel(Model model) {
super();
this.model = model;
model.addPropertyChangeListener(this);
initialize();
}
/**
* This method initializes this
*
*/
private void initialize() {
this.setLayout(new BorderLayout());
this.setSize(new java.awt.Dimension(400,400));
this.setBorder(BorderFactory.createTitledBorder(Application.messages.getString("TITLE_TEXT")));
this.add(getJPanelButtons(), java.awt.BorderLayout.NORTH);
this.add(getJScrollPaneText(), java.awt.BorderLayout.CENTER);
}
/**
* This method initializes jPanelButtons
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelButtons() {
if (jPanelButtons == null) {
jPanelButtons = new JPanel();
jPanelButtons.setLayout(null);
jPanelButtons.setPreferredSize(new java.awt.Dimension(1,35));
jPanelButtons.setName("jPanelButtons");
jPanelButtons.add(getJButtonLoad(), null);
jPanelButtons.add(getJButtonSave(), null);
}
return jPanelButtons;
}
/**
* This method initializes jScrollPaneText
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPaneText() {
if (jScrollPaneText == null) {
jScrollPaneText = new JScrollPane();
jScrollPaneText.setName("jScrollPaneText");
jScrollPaneText.setViewportView(getJTextArea());
}
return jScrollPaneText;
}
/**
* This method initializes jTextArea
*
* @return javax.swing.JTextArea
*/
private JTextArea getJTextArea() {
if (jTextArea == null) {
jTextArea = new JTextArea();
jTextArea.setLineWrap(true);
highlightPainter = new DefaultHighlightPainter(new Color(214, 186, 255));
highlighter = new DefaultHighlighter();
jTextArea.setHighlighter(highlighter);
jTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent e) {
onTextChange();
}
});
}
return jTextArea;
}
/**
* This method initializes jButtonLoad
*
* @return javax.swing.JButton
*/
private JButton getJButtonLoad() {
if (jButtonLoad == null) {
jButtonLoad = new JButton();
jButtonLoad.setText(Application.messages.getString("BUTTON_LOAD"));
jButtonLoad.setBounds(new java.awt.Rectangle(10,5,90,25));
jButtonLoad.setName("jButtonLoad");
jButtonLoad.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
openTextFile();
}
});
}
return jButtonLoad;
}
/**
* This method initializes jButtonSave
*
* @return javax.swing.JButton
*/
private JButton getJButtonSave() {
if (jButtonSave == null) {
jButtonSave = new JButton();
jButtonSave.setText(Application.messages.getString("BUTTON_SAVE"));
jButtonSave.setBounds(new java.awt.Rectangle(105,5,90,25));
jButtonSave.setName("jButtonSave");
jButtonSave.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
saveTextFile();
}
});
}
return jButtonSave;
}
/**
* openTextFile loads a new file
*/
private void openTextFile() {
model.openTextFile();
}
/**
* saveTextFile saves a file
*/
private void saveTextFile() {
model.saveTextFile();
}
/**
* onTextChange calls the model
*/
private void onTextChange() {
model.setText(jTextArea.getText());
}
/**
* highlightText highlights text with the matches informations stored in the resultTree
* @param matches
*/
private void highlightText(ResultTreeNode matches) {
ResultTreeNode node;
highlighter.removeAllHighlights();
for (Enumeration e = matches.depthFirstEnumeration(); e.hasMoreElements() ;) {
try {
node = (ResultTreeNode)e.nextElement();
highlighter.addHighlight(node.getIndexStart(), node.getIndexEnd(), highlightPainter);
}
catch (Exception evt) { evt.printStackTrace(); }
}
}
/**
* When the resultTree is changed, then the highlight process is called to update the text area
*/
public void propertyChange(PropertyChangeEvent arg0) {
if (arg0.getPropertyName() == "resultTree" || arg0.getPropertyName() == "resultMatch") {
highlightText((ResultTreeNode)arg0.getNewValue());
}
if (arg0.getPropertyName() == "inputText") {
if(((String)arg0.getNewValue()).compareTo(jTextArea.getText()) != 0)
jTextArea.setText((String)arg0.getNewValue());
}
}
}