package org.ripple.power.ui.editor; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; import org.ripple.power.ui.UIRes; import org.ripple.power.ui.graphics.LColor; public class ROCScriptEditor extends JPanel { public final static ROCFileFilter FILTER = new ROCFileFilter(); private static class ROCFileFilter extends FileFilter { public boolean accept(File f) { if (f.isDirectory()) { return true; } return f.getName().endsWith(".txt") || f.getName().endsWith(".roc") || f.getName().endsWith(".script"); } public String getDescription() { return ".txt|.roc|.script"; } } /** * */ private static final long serialVersionUID = 1L; private ROCFileListener _listener = null; public boolean _isEdited = false; public boolean _isSaved = true; private SourcePaper _textEdit = new SourcePaper(); private JScrollPane _jScrollPanel = new JScrollPane(); private BorderLayout _borderLayout = new BorderLayout(); private String fileName = ""; private File file = null; private UndoManager manager = new UndoManager(); public void setText(String str) { _textEdit.setText(str); } public SourcePaper getROC() { return _textEdit; } public String getText() { return _textEdit.getText(); } public ROCScriptEditor() { try { this.setLayout(_borderLayout); this.add(_jScrollPanel, java.awt.BorderLayout.CENTER); _jScrollPanel.getViewport().add(_textEdit); _jScrollPanel.setBackground(new Color(70, 70, 70)); _jScrollPanel.setForeground(Color.WHITE); _jScrollPanel.setBorder(BorderFactory .createLineBorder(LColor.black)); _textEdit.setDocument(new SourceDocument()); _textEdit.getDocument().addDocumentListener( new ROCEditor_Edit_documentAdapter(this)); _textEdit.getDocument().addUndoableEditListener( new ROCEditorListener(manager)); this.getActionMap().put("ctrl_s", new AbstractAction("ctrl_s") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent evt) { if (_isEdited()) { saveFile(); } else { saveAs(); } } }); this.getInputMap().put(KeyStroke.getKeyStroke("control S"), "ctrl_s"); _textEdit.getActionMap().put("ctrl_s", new AbstractAction("ctrl_s") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent evt) { if (file == null) { saveAs(); } else { saveFile(); } } }); _textEdit.getInputMap().put(KeyStroke.getKeyStroke("control S"), "ctrl_s"); this.getActionMap().put("ctrl_o", new AbstractAction("ctrl_o") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent evt) { openNew(); } }); this.getInputMap().put(KeyStroke.getKeyStroke("control O"), "ctrl_o"); _textEdit.getActionMap().put("ctrl_o", new AbstractAction("ctrl_o") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent evt) { openNew(); } }); _textEdit.getInputMap().put(KeyStroke.getKeyStroke("control O"), "ctrl_o"); _textEdit.setCaretPosition(0); _textEdit.getInputMap().put(KeyStroke.getKeyStroke("control Z"), "ctrl_z"); _textEdit.getActionMap().put("ctrl_z", new AbstractAction("ctrl_z") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { undo(); } }); _textEdit.getInputMap().put(KeyStroke.getKeyStroke("control Y"), "ctrl_y"); _textEdit.getActionMap().put("ctrl_y", new AbstractAction("ctrl_y") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { redo(); } }); _textEdit.getInputMap().put( KeyStroke.getKeyStroke("control shift Z"), "ctrl_shift_z"); _textEdit.getActionMap().put("ctrl_shift_z", new AbstractAction("ctrl_shift_z") { /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { redo(); } }); _textEdit.setText("#ROC Script\n"); } catch (Exception e) { e.printStackTrace(); } } public File getFile() { return file; } public String getFileName() { return fileName; } public void setFileName(String filename) { this.fileName = filename; } public void setFile(File file) { this.file = file; setFileName(file.getName()); _isSaved = true; _isEdited = false; } public boolean _isEdited() { return this._isEdited; } public void openFile() { try { _textEdit.setText(readFile(file)); _textEdit.setCaretPosition(0); _isSaved = true; _isEdited = false; } catch (IOException ex) { } } public boolean close() { boolean savedSuccessfully = true; if (_isEdited) { if (UIRes.showConfirmMessage(this.getParent().getParent(),"Confirm", "Do you want to save changes to the current file?", "YES","NO") == 0) { savedSuccessfully = this.saveFile(); } } if (savedSuccessfully) { setFileName(""); file = null; _textEdit.setText(""); _isSaved = true; _isEdited = false; return true; } return false; } private boolean saveAs() { if (_listener != null) { return _listener.doSave(); } return false; } private void openNew() { if (_listener != null) { _listener.doLoad(); } } private String readFile(File file) throws IOException { StringBuffer fileBuffer; String fileString = null; String line; try { FileReader in = new FileReader(file); BufferedReader dis = new BufferedReader(in); fileBuffer = new StringBuffer(); while ((line = dis.readLine()) != null) { fileBuffer.append(line + "\n"); } in.close(); fileString = fileBuffer.toString(); } catch (IOException e) { throw e; } return fileString; } public boolean saveFile() { try { if (file != null) { PrintWriter out = new PrintWriter(new BufferedWriter( new FileWriter(file))); out.print(_textEdit.getText()); out.flush(); out.close(); _isSaved = true; _isEdited = false; return true; } return saveAs(); } catch (IOException e) { return false; } } void edit_Performed() { _isEdited = true; _isSaved = false; if (_listener != null) { _listener.setButtons(); } } public void undo() { try { manager.undo(); } catch (CannotUndoException e) { } } public void redo() { try { manager.redo(); } catch (CannotRedoException e) { } } public ROCFileListener getListener() { return _listener; } public void setListener(ROCFileListener l) { this._listener = l; } public boolean isEdited() { return _isEdited; } public void setEdited(boolean e) { this._isEdited = e; } public boolean isSaved() { return _isSaved; } public void setSaved(boolean s) { this._isSaved = s; } } class ROCEditor_Edit_documentAdapter implements DocumentListener { ROCScriptEditor adaptee; public ROCEditor_Edit_documentAdapter(ROCScriptEditor adaptee) { this.adaptee = adaptee; } @Override public void insertUpdate(DocumentEvent evt) { adaptee.edit_Performed(); } @Override public void removeUpdate(DocumentEvent evt) { adaptee.edit_Performed(); } @Override public void changedUpdate(DocumentEvent evt) { adaptee.edit_Performed(); } }