Package ketUI

Source Code of ketUI.MenuEventHandler

/*
* 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);
    }
  }
}
TOP

Related Classes of ketUI.MenuEventHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.