/**
*
*/
package org.hyperdata.scute.toolbars.source;
import java.awt.Event;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.Document;
import javax.swing.undo.UndoManager;
// import org.hdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.*;
import org.jdesktop.swingx.action.*;
import org.jdesktop.swingx.MultiSplitLayout.*;
import org.hyperdata.resources.general.GeneralIcons;
import org.hyperdata.scute.source.EditorPane;
import org.hyperdata.scute.system.Log;
/**
* @author danny
*
*/
public class EditorToolbar extends JPanel {
/**
* Listener for the edits on the current document.
*/
public UndoableEditListener undoHandler;
/** UndoManager that we add edits to. */
public UndoManager undoManager = new UndoManager();
private JButton undoButton;
private JButton redoButton;
private JButton findButton;
private JButton zoomIn;
private JButton zoomOut;
private Frame frame = null;
private Map<Document, UndoHandler> undoHandlerMap = new HashMap<Document, UndoHandler>();
private PropertyChangeListener undoActionChangeListener;
private PropertyChangeListener redoActionChangeListener;
private JMenu editMenu;
private JMenuItem undoMenuItem;
private JMenuItem redoMenuItem;
private JMenuItem findMenuItem;
private JMenuItem zoomInMenuItem;
private JMenuItem zoomOutMenuItem;
public EditorToolbar(Frame frame) {
this.frame = frame;
init();
}
private void init() {
editMenu = new JMenu("Edit");
editMenu.setMnemonic(KeyEvent.VK_E);
undoMenuItem = new JMenuItem();
undoMenuItem.setMnemonic(KeyEvent.VK_U);
editMenu.add(undoMenuItem);
undoButton = new JButton();
undoButton.setIcon(GeneralIcons.undoIcon);
undoButton.setHideActionText(true);
undoButton.setToolTipText("Undo edit");
undoActionChangeListener = new ActionChangedListener(undoButton);
add(undoButton);
redoMenuItem = new JMenuItem();
redoMenuItem.setMnemonic(KeyEvent.VK_R);
editMenu.add(redoMenuItem);
redoButton = new JButton();
redoButton.setIcon(GeneralIcons.redoIcon);
redoButton.setHideActionText(true);
redoButton.setToolTipText("Redo edit");
redoActionChangeListener = new ActionChangedListener(redoButton);
add(redoButton);
findMenuItem = new JMenuItem();
findMenuItem.setMnemonic(KeyEvent.VK_F);
editMenu.add(findMenuItem);
findButton = new JButton();
findButton.setIcon(GeneralIcons.findIcon);
findButton.setHideActionText(true);
findButton.setToolTipText("Find in text..");
add(findButton);
zoomInMenuItem = new JMenuItem();
// zoomInMenuItem.setMnemonic(KeyEvent.VK_Z); // ??
editMenu.add(zoomInMenuItem);
zoomIn = new JButton();
zoomIn.setIcon(GeneralIcons.zoomInIcon);
zoomIn.setHideActionText(true);
zoomIn.setToolTipText("Zoom in");
add(zoomIn);
zoomOutMenuItem = new JMenuItem();
// zoomInMenuItem.setMnemonic(KeyEvent.VK_Z); // ??
editMenu.add(zoomOutMenuItem);
zoomOut = new JButton();
zoomOut.setIcon(GeneralIcons.zoomOutIcon);
zoomOut.setHideActionText(true);
zoomOut.setToolTipText("Zoom out");
add(zoomOut);
}
private void refreshButtons() {
undoButton.setIcon(GeneralIcons.undoIcon);
undoButton.setHideActionText(true);
undoButton.setToolTipText("Undo edit");
redoButton.setIcon(GeneralIcons.redoIcon);
redoButton.setHideActionText(true);
redoButton.setToolTipText("Redo edit");
findButton.setIcon(GeneralIcons.findIcon);
findButton.setHideActionText(true);
findButton.setToolTipText("Find in text..");
zoomIn.setIcon(GeneralIcons.zoomInIcon);
zoomIn.setHideActionText(true);
zoomIn.setToolTipText("Zoom in");
zoomOut.setIcon(GeneralIcons.zoomOutIcon);
zoomOut.setHideActionText(true);
zoomOut.setToolTipText("Zoom out");
}
/**
* @param source
*/
public void setEditorPane(EditorPane targetPane) {
Document doc = targetPane.getDocument();
if (undoHandlerMap.get(doc) == null) {
undoHandler = new UndoHandler(targetPane);
doc.addUndoableEditListener(undoHandler);
}
Action undoAction = targetPane.getUndoAction();
undoButton.setAction(undoAction);
undoAction.addPropertyChangeListener(undoActionChangeListener);
undoMenuItem.setAction(undoAction);
KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK);
targetPane.getInputMap().put(key, undoAction);
Action redoAction = targetPane.getRedoAction();
redoButton.setAction(redoAction);
redoAction.addPropertyChangeListener(redoActionChangeListener);
redoMenuItem.setAction(redoAction);
key = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK);
targetPane.getInputMap().put(key, redoAction);
Action findAction = new FindAction(frame, targetPane);
findButton.setAction(findAction);
findMenuItem.setAction(findAction);
key = KeyStroke.getKeyStroke(KeyEvent.VK_F, Event.CTRL_MASK);
targetPane.getInputMap().put(key, findAction);
ZoomAction zoomInAction = new ZoomAction(targetPane, "+", 1.1);
zoomIn.setAction(zoomInAction);
zoomInMenuItem.setAction(zoomInAction);
key = KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, Event.CTRL_MASK);
targetPane.getInputMap().put(key, zoomInAction);
ZoomAction zoomOutAction = new ZoomAction(targetPane, "-", 1 / 1.1);
zoomOut.setAction(zoomOutAction);
zoomOutMenuItem.setAction(zoomOutAction);
key = KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, Event.CTRL_MASK);
targetPane.getInputMap().put(key, zoomOutAction);
refreshButtons(); // a pain, but seems necessary
}
public void findOnly() {
undoButton.setEnabled(false);
redoButton.setEnabled(false);
findButton.setEnabled(true);
zoomIn.setEnabled(false);
zoomOut.setEnabled(false);
}
public void enableAll() {
undoButton.setEnabled(true);
redoButton.setEnabled(true);
findButton.setEnabled(true);
zoomIn.setEnabled(true);
zoomOut.setEnabled(true);
}
/**
* @return
*/
public JMenu getMenu() {
return editMenu;
}
}