/*
* Copyright (C) 2011 Alasdair C. Hamilton
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package ketUI;
import java.awt.event.*;
import javax.swing.*;
import ket.MathCollection;
import ket.Selection;
import ket.Undo;
import ket.display.*;
import ket.math.*;
import ketUI.chord.Chord;
import ketUI.chord.KeyboardEventHandler;
import ketUI.modes.*;
import ketUI.panel.KetPanel;
import ketUI.tutorial.Tutorial;
public class MenuEventHandler implements ActionListener {
final Document document;
final JMenuBar menuBar;
final JMenu fileMenu;
final JMenu editMenu;
final JMenu viewMenu;
final JMenu colourScheme;
final JMenu display;
final JMenu updateMenu;
final JMenu deleteMenu;
final JMenu pasteMenu;
final JMenu reference;
final JMenu helpMenu;
final JMenu tutorialsMenu;
final JMenuItem clear;
final JMenuItem newDocument;
final JMenuItem open;
final JMenuItem save;
final JMenuItem saveAs;
final JMenuItem exportHTML;
final JMenuItem exportLatex;
final JMenuItem exportClojure;
final JMenuItem imageSaving;
final JMenuItem exit;
final JMenuItem derivatives;
final JMenuItem fourierTransforms;
final JMenuItem integrals;
final JMenuItem trigIdentities;
final JMenuItem vectorIdentities;
final JMenuItem contourIntegrals;
final JMenuItem laplace;
final JMenuItem constants;
final JMenuItem stats;
final JMenuItem simple;
final JMenuItem diffEq;
final JMenuItem physics;
final JMenuItem undo;
final JMenuItem redo;
final JMenuItem zoomIn;
final JMenuItem zoomOut;
final JRadioButtonMenuItem singleEquation;
final JRadioButtonMenuItem columnDisplay;
final JRadioButtonMenuItem listDisplay;
final JRadioButtonMenuItem networkDisplay;
final JRadioButtonMenuItem graphDisplay;
final JRadioButtonMenuItem perspectiveDisplay;
final JRadioButtonMenuItem scatterDisplay;
final JCheckBoxMenuItem showBackground;
final JMenuItem replaceBranch;
final JMenuItem replaceText;
final JMenuItem substitutePurpose;
final JMenuItem addParent;
final JMenuItem editBranch;
final JMenuItem editPurpose;
final JMenuItem substitute;
final JMenuItem invertInequality;
final JMenuItem expand;
final JMenuItem toGrandparent;
final JMenuItem fullScreen;
final JRadioButtonMenuItem blackboard;
final JRadioButtonMenuItem gold;
final JRadioButtonMenuItem whiteboard;
final JRadioButtonMenuItem plain;
final JRadioButtonMenuItem mint;
final JRadioButtonMenuItem rain;
final JRadioButtonMenuItem darklight;
final JRadioButtonMenuItem bright;
final JRadioButtonMenuItem sharp;
final JRadioButtonMenuItem sky;
final JRadioButtonMenuItem sandstone;
final JRadioButtonMenuItem mist;
final JMenuItem pageUp;
final JMenuItem scrollUp;
final JMenuItem scrollDown;
final JMenuItem pageDown;
final JMenuItem viewFromTop;
final JMenuItem viewFromCentre;
final JMenuItem viewFromBottom;
final JMenuItem foldDown;
final JMenuItem foldUp;
final JMenuItem unfold;
final JMenuItem deleteEquation;
final JMenuItem deleteTrace;
final JMenuItem deleteBranch;
final JMenuItem deleteCurrent;
final JMenuItem deleteParent;
final JMenuItem yank;
final JMenuItem copy;
final JMenuItem paste;
final JMenuItem pasteText;
final JMenuItem pasteBranch;
final JMenuItem pasteParent;
final JMenuItem pasteSubstitution;
final JMenuItem pasteEquation;
final JMenuItem setRegister;
final JMenuItem tour;
final JMenuItem overview;
final JMenuItem tutorial;
final JMenuItem editing;
final JMenuItem atanDash;
final JMenuItem kepler;
final JMenuItem maxwell;
final JMenuItem commands;
final JMenuItem functions;
final JMenuItem symbols;
final JMenuItem about;
public MenuEventHandler(Document document) {
this.document = document;
fileMenu = new JMenu("File");
editMenu = new JMenu("Edit");
viewMenu = new JMenu("View");
colourScheme = new JMenu("Colour Scheme");
display = new JMenu("Display");
updateMenu = new JMenu("Update");
deleteMenu = new JMenu("Delete");
pasteMenu = new JMenu("Clipboard");
reference = new JMenu("Reference");
helpMenu = new JMenu("Help");
tutorialsMenu = new JMenu("Tutorials");
menuBar = new JMenuBar();
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(viewMenu);
menuBar.add(updateMenu);
menuBar.add(deleteMenu);
menuBar.add(pasteMenu);
menuBar.add(reference);
menuBar.add(helpMenu);
fileMenu.setMnemonic('f');
editMenu.setMnemonic('e');
viewMenu.setMnemonic('v');
updateMenu.setMnemonic('u');
deleteMenu.setMnemonic('d');
pasteMenu.setMnemonic('c');
reference.setMnemonic('r');
helpMenu.setMnemonic('h');
clear = addTo(fileMenu, "Clear", 'c');
newDocument = addTo(fileMenu, "New, <Ctrl-w> n", 'n');
open = addTo(fileMenu, "Open", 'o');
save = addTo(fileMenu, "Save", 's');
saveAs = addTo(fileMenu, "Save As", 'a');
fileMenu.addSeparator();
exportHTML = addTo(fileMenu, "Export to HTML", 'h');
exportLatex = addTo(fileMenu, "Export to LaTeX", 'l');
exportClojure = addTo(fileMenu, "Export to Clojure", 'j');
imageSaving = addTo(fileMenu, SAVE_IMAGES, 'i');
fileMenu.addSeparator();
exit = addTo(fileMenu, "Exit, 'ZZ' or 'ZQ'", 'x');
derivatives = addTo(reference, "Derivative identities", 'd');
fourierTransforms = addTo(reference, "Fourier transforms", 'f');
integrals = addTo(reference, "Integral identities", 'i');
trigIdentities = addTo(reference, "Trigonometric identities", 't');
vectorIdentities = addTo(reference, "Vector identities", 'v');
contourIntegrals = addTo(reference, "Contour integrals", 'c');
laplace = addTo(reference, "Laplace transforms", 'l');
constants = addTo(reference, "Constants", 'o');
stats = addTo(reference, "Statistics", 's');
simple = addTo(reference, "Simple", 'm');
diffEq = addTo(reference, "Differential Equations", 'e');
physics = addTo(reference, "Physics", 'p');
undo = addTo(editMenu, "Undo, 'u'", 'u');
redo = addTo(editMenu, "Redo, 'Ctrl-R'", null);
editMenu.addSeparator();
zoomIn = addTo(editMenu, "Zoom in, '+'", 'i');
zoomOut = addTo(editMenu, "Zoom out, '-'", 'z');
replaceBranch = addTo(updateMenu, "Replace with maths... 'r'", 'r');
replaceText = addTo(updateMenu, "Replace with text... 'Ctrl-r'", 't');
substitutePurpose = addTo(updateMenu, "Repurpose... 's'", 's');
addParent = addTo(updateMenu, "Composition... 'S'", 'p');
editBranch = addTo(updateMenu, "Change... 'c'", 'c');
editPurpose = addTo(updateMenu, "Edit Purpose... 'gc'", null);
substitute = addTo(updateMenu, "Substitute (e.g. \"x=y\")... 'R'", null);
updateMenu.addSeparator();
invertInequality = addTo(updateMenu, "Solve relative to <BackQuote>", 'o');
expand = addTo(updateMenu, "Expand relative to <Quote>", 'e');
toGrandparent = addTo(updateMenu, "Expand 'out' g<Quote>", 'g');
editMenu.addSeparator();
editMenu.add(colourScheme);
colourScheme.setMnemonic('o');
editMenu.add(display);
display.setMnemonic('d');
ButtonGroup displayGroup = new ButtonGroup();
listDisplay = makeRadioButton("List display 'zl'", true, 'l', display, displayGroup);
networkDisplay = makeRadioButton("Network display 'zn'", false, 'n', display, displayGroup);
singleEquation = makeRadioButton("Single display 'za'", false, 'a', display, displayGroup);
columnDisplay = makeRadioButton("Column display 'zc'", false, 'c', display, displayGroup);
graphDisplay = makeRadioButton("Tree display 'zr'", false, 't', display, displayGroup);
perspectiveDisplay = makeRadioButton("Perspective display", false, 'p', display, displayGroup);
scatterDisplay = makeRadioButton("Scatter display, 'zs'", false, 's', display, displayGroup);
editMenu.addSeparator();
fullScreen = addTo(viewMenu, "Full Screen 'F11'", 'f');
showBackground = makeCheckbox("Background pattern", true, 'b');
viewMenu.addSeparator();
ButtonGroup colourGroup = new ButtonGroup();
whiteboard = makeRadioButton("Whiteboard", true, 'w', colourScheme, colourGroup);
blackboard = makeRadioButton("Blackboard", false, 'b', colourScheme, colourGroup);
gold = makeRadioButton("Gold", false, 'g', colourScheme, colourGroup);
plain = makeRadioButton("Plain", false, 'p', colourScheme, colourGroup);
mint = makeRadioButton("Mint", false, 'm', colourScheme, colourGroup);
rain = makeRadioButton("Rain", false, 'r', colourScheme, colourGroup);
darklight = makeRadioButton("Darklight", false, 'd', colourScheme, colourGroup);
bright = makeRadioButton("Bright", false, 'i', colourScheme, colourGroup);
sharp = makeRadioButton("Sharp", false, 'h', colourScheme, colourGroup);
sky = makeRadioButton("Sky", false, 's', colourScheme, colourGroup);
sandstone = makeRadioButton("Sandstone", false, 'a', colourScheme, colourGroup);
mist = makeRadioButton("Mist", false, 't', colourScheme, colourGroup);
viewFromTop = addTo(viewMenu, "View from top...'zt'", 't');
viewFromCentre = addTo(viewMenu, "View from centre...'zz'", 'c');
viewFromBottom = addTo(viewMenu, "View from bottom...'zb'", 'b');
viewMenu.addSeparator();
foldDown = addTo(viewMenu, "Fold down...'zf'", 'f');
foldUp = addTo(viewMenu, "Fold up...'zF'", 'z');
unfold = addTo(viewMenu, "Unfold...'zo'", 'o');
viewMenu.addSeparator();
pageUp = addTo(viewMenu, "Page up...'Ctrl-b'", 'b');
scrollUp = addTo(viewMenu, "Scroll up...'Ctrl-y'", 'y');
scrollDown = addTo(viewMenu, "Scroll down...'Ctrl-e'", 'e');
pageDown = addTo(viewMenu, "Page down...'Ctrl-f'", 'd');
deleteEquation = addTo(deleteMenu, "Equation, 'de'", 'e');
deleteTrace = addTo(deleteMenu, "Delete, 'D'", 't');
deleteBranch = addTo(deleteMenu, "Extract, 'x'", 'b');
deleteCurrent = addTo(deleteMenu, "Intermediate '<'", 'c');
deleteParent = addTo(deleteMenu, "Parent, 'X'", 'p');
yank = addTo(pasteMenu, "Copy, 'y'", 'y');
setRegister = addTo(pasteMenu, "Select register, '%'", 'l');
pasteMenu.addSeparator();
pasteBranch = addTo(pasteMenu, "Replace, 'pr'", 'r');
pasteSubstitution = addTo(pasteMenu, "Substitute \"y=f(x)\", 'P'", 's');
pasteParent = addTo(pasteMenu, "Composition, 'pp'", 'p');
pasteEquation = addTo(pasteMenu, "Equation, 'pe'", 'e');
pasteMenu.addSeparator();
copy = addTo(pasteMenu, "Copy (System) '%*y'", 'c');
paste = addTo(pasteMenu, "Replace (System) '%*pr'", 'a');
pasteText = addTo(pasteMenu, "Paste as Text (System) '%*pt'", 't');
tour = addTo(helpMenu, "Interactive tutorial", 'u');
overview = addTo(helpMenu, "Overview <F1>", 'o');
helpMenu.add(tutorialsMenu);
tutorialsMenu.setMnemonic('t');
tutorial = addTo(tutorialsMenu, "Introduction", 'i');
editing = addTo(tutorialsMenu, "Advanced editing", 'e');
atanDash = addTo(tutorialsMenu, "Atan derivative example", 'a');
kepler = addTo(tutorialsMenu, "Kepler example", 'k');
maxwell = addTo(tutorialsMenu, "Maxwell example", 'm');
helpMenu.addSeparator();
commands = addTo(helpMenu, "List of Commands", 'c');
functions = addTo(helpMenu, "List of Functions", 'f');
symbols = addTo(helpMenu, "List of Symbols", 's');
helpMenu.addSeparator();
about = addTo(helpMenu, "About", 'a');
}
private JCheckBoxMenuItem makeCheckbox(String label, boolean state, char mnemonic) {
JCheckBoxMenuItem item = new JCheckBoxMenuItem(label);
item.setState(state);
editMenu.add(item);
item.setMnemonic(mnemonic);
item.addActionListener(this);
return item;
}
private JRadioButtonMenuItem makeRadioButton(String label, boolean state, char mnemonic, JMenu menu, ButtonGroup buttonGroup) {
JRadioButtonMenuItem item = new JRadioButtonMenuItem(label);
item.setSelected(state);
menu.add(item);
item.setMnemonic(mnemonic);
item.addActionListener(this);
buttonGroup.add(item);
return item;
}
private JMenuItem addTo(JMenu menu, String name, Character mnemonic) {
JMenuItem menuItem = new JMenuItem(name);
menu.add(menuItem);
if (mnemonic!=null) {
menuItem.setMnemonic(mnemonic);
}
menuItem.addActionListener(this);
return menuItem;
}
private PasteMode getPasteMode() {
return document.getModes().getPasteMode();
}
private NormalMode getNormalMode() {
return document.getModes().getNormalMode();
}
private DeleteMode getDeleteMode() {
return document.getModes().getDeleteMode();
}
@Override
public void actionPerformed(ActionEvent ae) {
NormalMode normalMode = getNormalMode();
DeleteMode deleteMode = getDeleteMode();
if (ae.getSource()==clear) {
document.getFrameManager().clear();
} else if (ae.getSource()==newDocument) {
normalMode.openDocument(null);
} else if (ae.getSource()==open) {
document.getFrameManager().open();
} else if (ae.getSource()==save) {
document.getFrameManager().save(false);
} else if (ae.getSource()==saveAs) {
document.getFrameManager().save(true);
} else if (ae.getSource()==exportHTML) {
document.getFrameManager().exportToHTML();
} else if (ae.getSource()==imageSaving) {
document.getFrameManager().toggleSavingImages();
//- document.getFrameManager().startSavingImages();
//stopSavingImages()
document.getKeyboardEventHandler().setToInitialState();
} else if (ae.getSource()==exportLatex) {
document.getFrameManager().exportToLatex();
} else if (ae.getSource()==exportClojure) {
document.getFrameManager().exportToClojure();
} else if (ae.getSource()==exit) {
document.getFrameManager().confirmDispose();
} else if (ae.getSource()==vectorIdentities) {
normalMode.openDocument(NormalMode.VECTOR_FILE);
} else if (ae.getSource()==contourIntegrals) {
normalMode.openDocument(NormalMode.CONTOUR_INTEGRAL_FILE);
} else if (ae.getSource()==laplace) {
normalMode.openDocument(NormalMode.LAPLACE_FILE);
} else if (ae.getSource()==constants) {
normalMode.openDocument(NormalMode.CONSTANTS_FILE);
} else if (ae.getSource()==stats) {
normalMode.openDocument(NormalMode.STATS_FILE);
} else if (ae.getSource()==simple) {
normalMode.openDocument(NormalMode.SIMPLE_FILE);
} else if (ae.getSource()==derivatives) {
normalMode.openDocument(NormalMode.DERIVATIVES_FILE);
} else if (ae.getSource()==fourierTransforms) {
normalMode.openDocument(NormalMode.FOURIER_TRANSFORMS_FILE);
} else if (ae.getSource()==integrals) {
normalMode.openDocument(NormalMode.INTEGRALS_FILE);
} else if (ae.getSource()==trigIdentities) {
normalMode.openDocument(NormalMode.TRIG_IDENTITIES_FILE);
} else if (ae.getSource()==diffEq) {
normalMode.openDocument(NormalMode.DE_FILE);
} else if (ae.getSource()==physics) {
normalMode.openDocument(NormalMode.PHYSICS_FILE);
} else if (ae.getSource()==zoomIn) {
prepareToEdit(false);
document.increaseBoxFontSize();
propagateEdit(null);
} else if (ae.getSource()==zoomOut) {
prepareToEdit(false);
getKetPanel().moveViewPageUp();
document.decreaseBoxFontSize();
propagateEdit(null);
} else if (ae.getSource()==redo) {
document.getKeyboardEventHandler().setToInitialState();
getMathCollection().redo();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==undo) {
document.getKeyboardEventHandler().setToInitialState();
getMathCollection().undo();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==fullScreen) {
document.getKeyboardEventHandler().setToInitialState();
document.getFrameManager().toggleFullScreen();
getModes().echo(" !!! To exit full screen, press F11 !!! ");
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==listDisplay) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.toggleListDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==networkDisplay) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.toggleNetworkDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==singleEquation) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.toggleAnimatedDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==columnDisplay) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.toggleGridDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==graphDisplay) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.toggleGraphDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==perspectiveDisplay) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.togglePerspectiveDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==scatterDisplay) {
document.getKeyboardEventHandler().setToInitialState();
normalMode.toggleScatterDisplay();
document.getKeyboardEventHandler().setToInitialState();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==showBackground) {
document.getKetPanel().toggleShowBackground();
document.getKetPanel().updateAndRepaint();
} else if (ae.getSource()==copy) {
getPasteMode().copyToClipboard();
} else if (ae.getSource()==tour) {
Tutorial.gui(); // Rename to Tour?
} else if (ae.getSource()==overview) {
normalMode.openDocument(NormalMode.OVERVIEW_FILE);
} else if (ae.getSource()==tutorial) {
normalMode.openDocument(NormalMode.TUTORIAL_FILE);
} else if (ae.getSource()==editing) {
normalMode.openDocument(NormalMode.EDITING_FILE);
} else if (ae.getSource()==atanDash) {
normalMode.openDocument(NormalMode.ATAN_DASH_FILE);
} else if (ae.getSource()==kepler) {
normalMode.openDocument(NormalMode.KEPLER_FILE);
} else if (ae.getSource()==maxwell) {
normalMode.openDocument(NormalMode.MAXWELL_FILE);
} else if (ae.getSource()==blackboard) {
setColourScheme(ColourScheme.BLACKBOARD);
} else if (ae.getSource()==gold) {
setColourScheme(ColourScheme.GOLD);
} else if (ae.getSource()==whiteboard) {
setColourScheme(ColourScheme.WHITEBOARD);
} else if (ae.getSource()==plain) {
setColourScheme(ColourScheme.PLAIN);
} else if (ae.getSource()==mint) {
setColourScheme(ColourScheme.MINT);
} else if (ae.getSource()==rain) {
setColourScheme(ColourScheme.RAIN);
} else if (ae.getSource()==darklight) {
setColourScheme(ColourScheme.DARKLIGHT);
} else if (ae.getSource()==bright) {
setColourScheme(ColourScheme.BRIGHT);
} else if (ae.getSource()==sharp) {
setColourScheme(ColourScheme.SHARP);
} else if (ae.getSource()==sky) {
setColourScheme(ColourScheme.SKY);
} else if (ae.getSource()==sandstone) {
setColourScheme(ColourScheme.SANDSTONE);
} else if (ae.getSource()==mist) {
setColourScheme(ColourScheme.MIST);
} else if (ae.getSource()==pageUp) {
prepareToEdit(false);
getKetPanel().moveViewPageUp();
propagateEdit(null);
} else if (ae.getSource()==scrollUp) {
prepareToEdit(false);
getKetPanel().moveViewUp();
propagateEdit(null);
} else if (ae.getSource()==scrollDown) {
prepareToEdit(false);
getKetPanel().moveViewDown();
propagateEdit(null);
} else if (ae.getSource()==pageDown) {
prepareToEdit(false);
getKetPanel().moveViewPageDown();
propagateEdit(null);
} else if (ae.getSource()==viewFromTop) { // zt
prepareToEdit(false);
getKetPanel().fromTop(getCurrentEquation().getEquationIndex());
propagateEdit(null);
} else if (ae.getSource()==viewFromCentre) {
prepareToEdit(false);
getKetPanel().fromMiddle(getCurrentEquation().getEquationIndex());
propagateEdit(null);
} else if (ae.getSource()==viewFromBottom) {
prepareToEdit(false);
getKetPanel().fromBottom(getCurrentEquation().getEquationIndex());
propagateEdit(null);
} else if (ae.getSource()==foldDown) {
prepareToEdit(false);
getNormalMode().closeDescendentFold();
propagateEdit(null);
} else if (ae.getSource()==foldUp) {
prepareToEdit(false);
getNormalMode().closeAncestorFold();
propagateEdit(null);
} else if (ae.getSource()==unfold) {
prepareToEdit(false);
getNormalMode().openFold();
propagateEdit(null);
} else if (ae.getSource()==addParent) {
Argument clone = prepareToEdit(true);
document.getModes().getAddMode().appendPurpose(getChord());
propagateEdit(clone);
} else if (ae.getSource()==deleteEquation) {
// TODO: Using chord methods would allow '.' and '@' playback, but would require artificial keypress arguments pushed to a new chord.
Argument clone = prepareToEdit(true);
getSelection().deleteCurrentEquation();
propagateEdit(clone);
} else if (ae.getSource()==deleteTrace) {
Argument clone = prepareToEdit(true);
getSelection().deleteTrace();
propagateEdit(clone);
} else if (ae.getSource()==deleteBranch) {
Argument clone = prepareToEdit(true);
deleteMode.remove();
propagateEdit(clone);
} else if (ae.getSource()==deleteCurrent) {
Argument clone = prepareToEdit(true);
deleteMode.deleteIntermediate();
propagateEdit(clone);
} else if (ae.getSource()==deleteParent) {
Argument clone = prepareToEdit(true);
deleteMode.deleteParent();
propagateEdit(clone);
} else if (ae.getSource()==paste) {
getPasteMode().pasteFromClipboard();
document.getKeyboardEventHandler().setToInitialState();
getKetPanel().updateAndRepaint();
} else if (ae.getSource()==pasteText) {
getPasteMode().pasteTextFromClipboard();
document.getKeyboardEventHandler().setToInitialState();
getKetPanel().updateAndRepaint();
} else if (ae.getSource()==replaceBranch) { // TODO: The language used in the user interface has signficantly diverged from that of methods names: fix.
Argument clone = prepareToEdit(true);
getNormalMode().replaceCurrentArgument(getChord());
propagateEdit(clone);
} else if (ae.getSource()==replaceText) {
Argument clone = prepareToEdit(true);
//- getNormalMode().replaceCurrentArgument(getChord());
document.getModes().getAddMode().replaceSelectionWithText(getChord());
propagateEdit(clone);
} else if (ae.getSource()==substitutePurpose) {
Argument clone = prepareToEdit(true);
getNormalMode().substitutePurpose(getChord());
propagateEdit(clone);
} else if (ae.getSource()==editBranch) {
Argument clone = prepareToEdit(true);
getNormalMode().editCurrentArgument();
propagateEdit(clone);
} else if (ae.getSource()==editPurpose) { // fix
Argument clone = prepareToEdit(true);
getNormalMode().editCurrentPurpose();
propagateEdit(clone);
} else if (ae.getSource()==substitute) {
Argument clone = prepareToEdit(true);
getNormalMode().substituteUpdate(getChord());
propagateEdit(clone);
} else if (ae.getSource()==invertInequality) {
Argument clone = prepareToEdit(true);
getNormalMode().invertInequality();
propagateEdit(clone);
} else if (ae.getSource()==expand) {
Argument clone = prepareToEdit(true);
getNormalMode().moveToNephew();
propagateEdit(clone);
} else if (ae.getSource()==toGrandparent) {
Argument clone = prepareToEdit(true);
getMathCollection().getDrag().moveToAncestor();
propagateEdit(clone);
} else if (ae.getSource()==yank) {
getPasteMode().yank();
} else if (ae.getSource()==pasteSubstitution) {
Argument clone = prepareToEdit(true);
getPasteMode().appendSubstituteFromClipboard();
propagateEdit(clone);
} else if (ae.getSource()==pasteBranch) {
Argument clone = prepareToEdit(true);
document.getModes().getPasteMode().appendBranchFromClipboard();
propagateEdit(clone);
} else if (ae.getSource()==pasteParent) {
Argument clone = prepareToEdit(true);
document.getModes().getPasteMode().appendParentFromClipboard();
propagateEdit(clone);
} else if (ae.getSource()==pasteEquation) {
Argument clone = prepareToEdit(true);
document.getModes().getPasteMode().appendEquationFromClipboard();
propagateEdit(clone);
} else if (ae.getSource()==setRegister) {
prepareToEdit(false); //T
getChord().setComplete(false);
getModes().setDocumentState(DocumentState.SET_REGISTER);
propagateEdit(null);
} else if (ae.getSource()==commands) {
normalMode.openDocument(NormalMode.COMMANDS_REFERENCE_FILE);
} else if (ae.getSource()==functions) {
normalMode.openDocument(NormalMode.FUNCTIONS_REFERENCE_FILE);
} else if (ae.getSource()==symbols) {
normalMode.openDocument(NormalMode.SYMBOLS_REFERENCE_FILE);
} else if (ae.getSource()==about) {
document.getFrameManager().displayAboutMessage();
} else {
Ket.out.println(" !!! Unrecognised menu event !!! ");
Ket.out.println(ae);
Ket.out.println("");
}
}
/**
* Return the current chord from the keyboard event handler.
*/
private Chord getChord() {
KeyboardEventHandler keyboardEventHandler = document.getKeyboardEventHandler();
return keyboardEventHandler.getChord();
}
/**
* Before changing the current selection, remove its highlighting and
* clone it for undo purposes.
*/
private Argument prepareToEdit(boolean clone) {
Argument cloneOrNull = clone ? cloneCurrentRoot() : null;
document.getKeyboardEventHandler().setToInitialState();
return cloneOrNull;
}
/**
* Ensure that the previous state is recorded to clipboard, highlight
* selected arguments and repaint.
*/
private void propagateEdit(Argument clone) {
if (clone!=null) {
//- getUndo().recordChange(getSelection().getEquationList());
getMathCollection().updateUndoStack();
}
getKetPanel().updateAndRepaint();
}
private MathCollection getMathCollection() {
return document.getMathCollection();
}
private Selection getSelection() {
return document.getSelection();
}
private Equation getCurrentEquation() {
return document.getCursor().getEquation();
}
private Argument cloneCurrentRoot() { // TODO: Use this here and in normal responder.
Argument root = getCurrentEquation().getRoot();
return Argument.cloneArgument(root);
}
private void setColourScheme(SpecificColourScheme colourScheme) {
ColourSchemeDecorator colourSchemeDecorator = document.getColourScheme();
colourSchemeDecorator.setSpecificColourScheme(colourScheme);
document.getKeyboardEventHandler().setToInitialState();
getKetPanel().updateAndRepaint();
}
private KetPanel getKetPanel() {
return document.getKetPanel();
}
public void updateMultipleEquations() {
KetPanel ketPanel = document.getKetPanel();
boolean multiple = ketPanel.isListDisplayMode();
boolean network = ketPanel.isNetworkDisplayMode();
boolean graph = ketPanel.isGraphDisplayMode();
boolean animated = ketPanel.isAnimatedDisplayMode();
boolean treeMap = ketPanel.isGridDisplayMode();
boolean perspective = ketPanel.isPerspectiveDisplayMode();
boolean scatter = ketPanel.isScatterDisplayMode();
//- ketPanel.fromMiddle(getCurrentEquation().getEquationIndex()); //?
listDisplay.setSelected(multiple);
networkDisplay.setSelected(network);
graphDisplay.setSelected(graph);
singleEquation.setSelected(animated);
columnDisplay.setSelected(treeMap);
perspectiveDisplay.setSelected(perspective);
scatterDisplay.setSelected(scatter);
}
public void showFullMenu(boolean show) {
fileMenu.setEnabled(show);
editMenu.setEnabled(show);
viewMenu.setEnabled(show);
//?- colourScheme.setEnabled(show); // ignore pre-hidden sub-menus.
updateMenu.setEnabled(show);
deleteMenu.setEnabled(show);
pasteMenu.setEnabled(show);
//? In edit mode you still want references and help.
reference.setEnabled(show); //?
helpMenu.setEnabled(show); //?
//?- tutorialsMenu.setEnabled(show); //?
}
public JMenuBar getMenuBar() {
return menuBar;
}
public Modes getModes() {
return document.getModes();
}
static final String SAVE_IMAGES = "Record edits...";
public void saveImages(boolean areSaved) {
if (areSaved) {
imageSaving.setText("Stop recording.");
} else {
imageSaving.setText(SAVE_IMAGES);
}
}
}