/*******************************************************************************
* This file is part of logisim-evolution.
*
* logisim-evolution 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.
*
* logisim-evolution 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 logisim-evolution. If not, see <http://www.gnu.org/licenses/>.
*
* Original code by Carl Burch (http://www.cburch.com), 2011.
* Subsequent modifications by :
* + Haute École Spécialisée Bernoise
* http://www.bfh.ch
* + Haute École du paysage, d'ingénierie et d'architecture de Genève
* http://hepia.hesge.ch/
* + Haute École d'Ingénierie et de Gestion du Canton de Vaud
* http://www.heig-vd.ch/
* The project is currently maintained by :
* + REDS Institute - HEIG-VD
* Yverdon-les-Bains, Switzerland
* http://reds.heig-vd.ch
*******************************************************************************/
package com.cburch.logisim.gui.menu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import com.cburch.logisim.proj.Action;
import com.cburch.logisim.proj.Project;
import com.cburch.logisim.proj.ProjectEvent;
import com.cburch.logisim.proj.ProjectListener;
import com.cburch.logisim.util.StringUtil;
class MenuEdit extends Menu {
private class MyListener implements ProjectListener, ActionListener {
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
Project proj = menubar.getProject();
if (src == undo) {
if (proj != null) {
proj.undoAction();
}
} else if (src == redo) {
if (proj != null) {
proj.redoAction();
}
}
}
public void projectChanged(ProjectEvent e) {
Project proj = menubar.getProject();
Action last = proj == null ? null : proj.getLastAction();
if (last == null) {
undo.setText(Strings.get("editCantUndoItem"));
undo.setEnabled(false);
} else {
undo.setText(StringUtil.format(Strings.get("editUndoItem"),
last.getName()));
undo.setEnabled(true);
}
// If there is a project open...
if (proj != null)
// And you CAN redo an undo...
if (proj.getCanRedo()) {
// Get that action
Action lastRedo = proj.getLastRedoAction();
// Set the detailed, localized text
redo.setText(StringUtil.format(Strings.get("editRedoItem"),
lastRedo.getName()));
// Set it to enabled
redo.setEnabled(true);
} else { // If there is no project...
// Let them know they can't redo anything
redo.setText(StringUtil.format(Strings
.get("editCantRedoItem")));
// And disable the button
redo.setEnabled(false);
}
}
}
private static final long serialVersionUID = 1L;
private LogisimMenuBar menubar;
private JMenuItem undo = new JMenuItem();
private JMenuItem redo = new JMenuItem();
private MenuItemImpl cut = new MenuItemImpl(this, LogisimMenuBar.CUT);
private MenuItemImpl copy = new MenuItemImpl(this, LogisimMenuBar.COPY);
private MenuItemImpl paste = new MenuItemImpl(this, LogisimMenuBar.PASTE);
private MenuItemImpl delete = new MenuItemImpl(this, LogisimMenuBar.DELETE);
private MenuItemImpl dup = new MenuItemImpl(this, LogisimMenuBar.DUPLICATE);
private MenuItemImpl selall = new MenuItemImpl(this,
LogisimMenuBar.SELECT_ALL);
private MenuItemImpl raise = new MenuItemImpl(this, LogisimMenuBar.RAISE);
private MenuItemImpl lower = new MenuItemImpl(this, LogisimMenuBar.LOWER);
private MenuItemImpl raiseTop = new MenuItemImpl(this,
LogisimMenuBar.RAISE_TOP);
private MenuItemImpl lowerBottom = new MenuItemImpl(this,
LogisimMenuBar.LOWER_BOTTOM);
private MenuItemImpl addCtrl = new MenuItemImpl(this,
LogisimMenuBar.ADD_CONTROL);
private MenuItemImpl remCtrl = new MenuItemImpl(this,
LogisimMenuBar.REMOVE_CONTROL);
private MyListener myListener = new MyListener();
public MenuEdit(LogisimMenuBar menubar) {
this.menubar = menubar;
int menuMask = getToolkit().getMenuShortcutKeyMask();
undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, menuMask));
redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, menuMask));
cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, menuMask));
copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, menuMask));
paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, menuMask));
delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
dup.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, menuMask));
selall.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, menuMask));
raise.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_UP, menuMask));
lower.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, menuMask));
raiseTop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_UP, menuMask
| KeyEvent.SHIFT_DOWN_MASK));
lowerBottom.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,
menuMask | KeyEvent.SHIFT_DOWN_MASK));
add(undo);
add(redo);
addSeparator();
add(cut);
add(copy);
add(paste);
addSeparator();
add(delete);
add(dup);
add(selall);
addSeparator();
add(raise);
add(lower);
add(raiseTop);
add(lowerBottom);
addSeparator();
add(addCtrl);
add(remCtrl);
Project proj = menubar.getProject();
if (proj != null) {
proj.addProjectListener(myListener);
undo.addActionListener(myListener);
redo.addActionListener(myListener);
}
undo.setEnabled(false);
redo.setEnabled(false);
menubar.registerItem(LogisimMenuBar.CUT, cut);
menubar.registerItem(LogisimMenuBar.COPY, copy);
menubar.registerItem(LogisimMenuBar.PASTE, paste);
menubar.registerItem(LogisimMenuBar.DELETE, delete);
menubar.registerItem(LogisimMenuBar.DUPLICATE, dup);
menubar.registerItem(LogisimMenuBar.SELECT_ALL, selall);
menubar.registerItem(LogisimMenuBar.RAISE, raise);
menubar.registerItem(LogisimMenuBar.LOWER, lower);
menubar.registerItem(LogisimMenuBar.RAISE_TOP, raiseTop);
menubar.registerItem(LogisimMenuBar.LOWER_BOTTOM, lowerBottom);
menubar.registerItem(LogisimMenuBar.ADD_CONTROL, addCtrl);
menubar.registerItem(LogisimMenuBar.REMOVE_CONTROL, remCtrl);
computeEnabled();
}
@Override
void computeEnabled() {
setEnabled(menubar.getProject() != null || cut.hasListeners()
|| copy.hasListeners() || paste.hasListeners()
|| delete.hasListeners() || dup.hasListeners()
|| selall.hasListeners() || raise.hasListeners()
|| lower.hasListeners() || raiseTop.hasListeners()
|| lowerBottom.hasListeners() || addCtrl.hasListeners()
|| remCtrl.hasListeners());
}
public void localeChanged() {
this.setText(Strings.get("editMenu"));
myListener.projectChanged(null);
cut.setText(Strings.get("editCutItem"));
copy.setText(Strings.get("editCopyItem"));
paste.setText(Strings.get("editPasteItem"));
delete.setText(Strings.get("editClearItem"));
dup.setText(Strings.get("editDuplicateItem"));
selall.setText(Strings.get("editSelectAllItem"));
raise.setText(Strings.get("editRaiseItem"));
lower.setText(Strings.get("editLowerItem"));
raiseTop.setText(Strings.get("editRaiseTopItem"));
lowerBottom.setText(Strings.get("editLowerBottomItem"));
addCtrl.setText(Strings.get("editAddControlItem"));
remCtrl.setText(Strings.get("editRemoveControlItem"));
}
}