protected void updateState() {
			if (undoManager.canUndo()) {
				setEnabled(true);
				putValue(SHORT_DESCRIPTION, undoManager.getUndoPresentationName());
			} else {
				setEnabled(false);
				putValue(SHORT_DESCRIPTION, "Undo");
			}
		}
	}

	class RedoAction extends AbstractAction {
		public RedoAction() {
			super(REDO);
			putValue(NAME, REDO);
			putValue(ACCELERATOR_KEY, OS.startsWith("Mac") ? KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.META_MASK | KeyEvent.SHIFT_MASK) : KeyStroke.getKeyStroke(KeyEvent.VK_Y, KeyEvent.CTRL_MASK));
		}

		public void actionPerformed(ActionEvent e) {
			if (undoManager.canRedo()) {
				try {
					undoManager.redo();
				} catch (CannotRedoException ex) {
					ex.printStackTrace();
				}
			}
			updateState();
			((UndoAction) getAction(UNDO)).updateState();
		}

		protected void updateState() {
			if (undoManager.canRedo()) {
				setEnabled(true);
				putValue(SHORT_DESCRIPTION, undoManager.getRedoPresentationName());
			} else {
				setEnabled(false);
				putValue(SHORT_DESCRIPTION, "Redo");
			}
		}