package org.geogebra.desktop.gui.menubar;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.KeyStroke;
import javax.swing.event.MenuEvent;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.main.OptionType;
import org.geogebra.common.main.SelectionManager;
import org.geogebra.desktop.gui.GuiManagerD;
import org.geogebra.desktop.main.AppD;
import org.geogebra.desktop.util.GuiResourcesD;
/**
* The "Edit" menu.
*/
public class EditMenuD extends BaseMenu {
private static final long serialVersionUID = -2649808771324470803L;
SelectionManager selection;
private AbstractAction deleteAction, invertAction, showhideAction,
showhideLabelsAction, propertiesAction, selectAllAction,
selectAllAncestorsAction, selectAllDescendantsAction,
selectCurrentLayerAction, copyToClipboardAction, copyAction,
pasteAction, insertImageFromClipboardAction,
insertImageFromFileAction;
private JMenuItem deleteItem, invertItem, showhideItem, showhideLabelsItem,
selectAllItem, selectAllAncestorsItem, selectAllDescendantsItem,
selectCurrentLayerItem, copyToClipboardItem, copyItem, pasteItem,
clipboardMenu;
private JSeparator selectionSeparator, deleteSeparator;
public EditMenuD(AppD app) {
super(app, "Edit");
selection = app.getSelectionManager();
// items are added to the menu when it's opened, see BaseMenu:
// addMenuListener(this);
}
/**
* Initialize the items.
*/
@Override
protected void initItems() {
removeAll();
JMenuItem mi;
if (app.isUndoActive()) {
mi = add(((GuiManagerD) app.getGuiManager()).getUndoAction());
mi.setIcon(app.getMenuIcon(GuiResourcesD.MENU_EDIT_UNDO));
setMenuShortCutAccelerator(mi, 'Z');
mi = add(((GuiManagerD) app.getGuiManager()).getRedoAction());
mi.setIcon(app.getMenuIcon(GuiResourcesD.MENU_EDIT_REDO));
if (AppD.MAC_OS) {
// Command-Shift-Z
setMenuShortCutShiftAccelerator(mi, 'Z');
} else {
// Ctrl-Y
setMenuShortCutAccelerator(mi, 'Y');
}
addSeparator();
}
copyItem = add(copyAction);
setMenuShortCutAccelerator(copyItem, 'C');
pasteItem = add(pasteAction);
setMenuShortCutAccelerator(pasteItem, 'V');
if (!app.isMacOS() || !app.isJava7()) {
copyToClipboardItem = add(copyToClipboardAction);
// ctrl-shift-c is also handled in MyKeyListener
setMenuShortCutShiftAccelerator(copyToClipboardItem, 'C');
}
addSeparator();
// insert image from...
JMenu submenu = new JMenu(loc.getMenu("InsertImageFrom"));
submenu.addMenuListener(this);
submenu.setIcon(app.getEmptyIcon());
add(submenu);
submenu.add(insertImageFromFileAction);
clipboardMenu = submenu.add(insertImageFromClipboardAction);
addSeparator();
if (app.letShowPropertiesDialog()) {
mi = add(propertiesAction);
setMenuShortCutAccelerator(mi, 'E');
addSeparator();
}
selectAllItem = add(selectAllAction);
setMenuShortCutAccelerator(selectAllItem, 'A');
selectCurrentLayerItem = add(selectCurrentLayerAction);
setMenuShortCutAccelerator(selectCurrentLayerItem, 'L');
selectAllDescendantsItem = add(selectAllDescendantsAction);
setMenuShortCutShiftAccelerator(selectAllDescendantsItem, 'J');
selectAllAncestorsItem = add(selectAllAncestorsAction);
setMenuShortCutAccelerator(selectAllAncestorsItem, 'J');
selectionSeparator = new JSeparator();
add(selectionSeparator);
invertItem = add(invertAction);
setMenuShortCutAccelerator(invertItem, 'I');
showhideItem = add(showhideAction);
setMenuShortCutAccelerator(showhideItem, 'G');
showhideLabelsItem = add(showhideLabelsAction);
setMenuShortCutShiftAccelerator(showhideLabelsItem, 'G');
if (app.letDelete()) {
deleteSeparator = new JSeparator();
add(deleteSeparator);
deleteItem = add(deleteAction);
if (AppD.MAC_OS) {
deleteItem.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0));
} else {
deleteItem.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
}
}
// support for right-to-left languages
app.setComponentOrientation(this);
}
/**
* Initialize the actions.
*/
@Override
protected void initActions() {
propertiesAction = new AbstractAction(
loc.getMenu("Properties") + " ...",
app.getMenuIcon(GuiResourcesD.VIEW_PROPERTIES_16)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.getDialogManager().showPropertiesDialog(OptionType.OBJECTS,
null);
}
};
selectAllAction = new AbstractAction(loc.getMenu("SelectAll"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selection.selectAll(-1); // pass "-1" to select all
}
};
selectCurrentLayerAction = new AbstractAction(
loc.getMenu("SelectCurrentLayer"), app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
int layer = selection.getSelectedLayer();
if (layer != -1)
{
selection.selectAll(layer); // select all objects in layer
}
}
};
selectAllAncestorsAction = new AbstractAction(
loc.getMenu("SelectAncestors"), app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selection.selectAllPredecessors();
}
};
selectAllDescendantsAction = new AbstractAction(
loc.getMenu("SelectDescendants"), app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selection.selectAllDescendants();
}
};
showhideAction = new AbstractAction(loc.getMenu("ShowHide"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selection.showHideSelection();
}
};
showhideLabelsAction = new AbstractAction(loc.getMenu("ShowHideLabels"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selection.showHideSelectionLabels();
}
};
copyAction = new AbstractAction(loc.getMenu("Copy"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.setWaitCursor();
app.getCopyPaste().copyToXML(app, selection.getSelectedGeos(),
false);
app.updateMenubar();
app.setDefaultCursor();
}
};
pasteAction = new AbstractAction(loc.getMenu("Paste"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.setWaitCursor();
app.getCopyPaste().pasteFromXML(app, false);
app.setDefaultCursor();
}
};
copyToClipboardAction = new AbstractAction(
loc.getMenu("DrawingPadToClipboard"),
app.getMenuIcon(GuiResourcesD.MENU_EDIT_COPY)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.setWaitCursor();
app.copyGraphicsViewToClipboard();
app.setDefaultCursor();
}
};
insertImageFromClipboardAction = new AbstractAction(
loc.getMenu("Clipboard"), app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.setWaitCursor();
((GuiManagerD) app.getGuiManager()).loadImage(null, true);
app.setDefaultCursor();
}
};
insertImageFromFileAction = new AbstractAction(loc.getMenu("File"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.setWaitCursor();
((GuiManagerD) app.getGuiManager()).loadImage(null, false);
app.setDefaultCursor();
}
};
deleteAction = new AbstractAction(loc.getMenu("Delete"),
app.getMenuIcon(GuiResourcesD.DELETE_SMALL)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.deleteSelectedObjects(false);
}
};
invertAction = new AbstractAction(loc.getMenu("InvertSelection"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selection.invertSelection();
}
};
}
@Override
public void update() {
updateSelection();
}
/**
* Called if the user changes the selected items.
*/
public void updateSelection() {
if (!initialized) {
return;
}
int layer = selection.getSelectedLayer();
/*
* layer values: -1 means nothing selected -2 means different layers
* selected
*/
boolean justCreated = !(app.getActiveEuclidianView()
.getEuclidianController().getJustCreatedGeos().isEmpty());
copyAction.setEnabled(!selection.getSelectedGeos().isEmpty());
pasteAction.setEnabled(!app.getCopyPaste().isEmpty());
deleteAction.setEnabled(layer != -1 || justCreated);
deleteItem.setVisible(layer != -1 || justCreated);
deleteSeparator.setVisible(layer != -1 || justCreated);
showhideAction.setEnabled(layer != -1);
showhideItem.setVisible(layer != -1);
showhideLabelsAction.setEnabled(layer != -1);
showhideLabelsItem.setVisible(layer != -1);
// exactly one layer selected
selectCurrentLayerAction.setEnabled(selection.getSelectedLayer() >= 0);
selectCurrentLayerItem.setVisible(selection.getSelectedLayer() >= 0);
boolean haveSelection = !selection.getSelectedGeos().isEmpty();
invertAction.setEnabled(haveSelection);
invertItem.setVisible(haveSelection);
selectAllDescendantsAction.setEnabled(haveSelection);
selectAllDescendantsItem.setVisible(haveSelection);
selectAllAncestorsAction.setEnabled(haveSelection);
selectAllAncestorsItem.setVisible(haveSelection);
selectionSeparator.setVisible(haveSelection);
Kernel kernel = app.getKernel();
propertiesAction.setEnabled(!kernel.isEmpty());
selectAllAction.setEnabled(!kernel.isEmpty());
}
@Override
public void menuSelected(MenuEvent e) {
// build menu if necessary
super.menuSelected(e);
if (!e.getSource().equals(this)) { // ie submenu opened
// check if there's an image on the clipboard
String[] fileName = ((GuiManagerD) app.getGuiManager())
.getImageFromTransferable(null);
clipboardMenu.setEnabled(fileName.length > 0);
}
}
}