| | |
| | import javafx.beans.binding.Bindings; |
| | +import javafx.beans.property.BooleanProperty; |
| | +import javafx.beans.property.SimpleBooleanProperty; |
| | +import javafx.beans.value.ObservableBooleanValue; |
| | import javafx.event.ActionEvent; |
| | import javafx.event.Event; |
 |
| | import javafx.scene.control.MenuBar; |
| | import javafx.scene.control.MenuItem; |
| | +import javafx.scene.control.Separator; |
| | import javafx.scene.control.SeparatorMenuItem; |
| | import javafx.scene.control.ToolBar; |
 |
| | import de.jensd.fx.glyphs.GlyphsDude; |
| | import static de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon.*; |
| | +import java.util.function.Function; |
| | |
| | /** |
 |
| | new SeparatorMenuItem(), |
| | fileExitMenuItem); |
| | + |
| | + // Edit menu |
| | + MenuItem editUndoMenuItem = createMenuItem("Undo", "Shortcut+Z", UNDO, e -> editUndo()); |
| | + MenuItem editRedoMenuItem = createMenuItem("Redo", "Shortcut+Y", REPEAT, e -> editRedo()); |
| | + |
| | + editUndoMenuItem.disableProperty().bind(createActiveBooleanProperty(FileEditor::canUndoProperty).not()); |
| | + editRedoMenuItem.disableProperty().bind(createActiveBooleanProperty(FileEditor::canRedoProperty).not()); |
| | + |
| | + Menu editMenu = new Menu("Edit", null, |
| | + editUndoMenuItem, |
| | + editRedoMenuItem); |
| | |
| | // Help menu |
| | MenuItem helpAboutMenuItem = createMenuItem("About Markdown Writer FX", null, null, e -> helpAbout()); |
| | |
| | Menu helpMenu = new Menu("Help", null, |
| | helpAboutMenuItem); |
| | |
| | - return new MenuBar(fileMenu, helpMenu); |
| | + return new MenuBar(fileMenu, editMenu, helpMenu); |
| | } |
| | |
| | private ToolBar createToolBar() { |
| | Button fileNewButton = createToolBarButton(FILE_ALT, "New", "Shortcut+N", e -> fileNew()); |
| | Button fileOpenButton = createToolBarButton(FOLDER_OPEN_ALT, "Open", "Shortcut+O", e -> fileOpen()); |
| | Button fileSaveButton = createToolBarButton(FLOPPY_ALT, "Save", "Shortcut+S", e -> fileSave()); |
| | + |
| | + Button editUndoButton = createToolBarButton(UNDO, "Undo", "Shortcut+Z", e -> editUndo()); |
| | + Button editRedoButton = createToolBarButton(REPEAT, "Redo", "Shortcut+Y", e -> editRedo()); |
| | |
| | fileSaveButton.disableProperty().bind(Bindings.not(fileEditorTabPane.activeFileEditorModifiedProperty())); |
| | + |
| | + editUndoButton.disableProperty().bind(createActiveBooleanProperty(FileEditor::canUndoProperty).not()); |
| | + editRedoButton.disableProperty().bind(createActiveBooleanProperty(FileEditor::canRedoProperty).not()); |
| | |
| | return new ToolBar( |
| | fileNewButton, |
| | fileOpenButton, |
| | - fileSaveButton); |
| | + fileSaveButton, |
| | + new Separator(), |
| | + editUndoButton, |
| | + editRedoButton); |
| | } |
| | |
 |
| | button.setOnAction(action); |
| | return button; |
| | + } |
| | + |
| | + /** |
| | + * Creates a boolean property that is bound to another boolean value |
| | + * of the active editor. |
| | + */ |
| | + private BooleanProperty createActiveBooleanProperty(Function<FileEditor, ObservableBooleanValue> func) { |
| | + BooleanProperty b = new SimpleBooleanProperty(); |
| | + FileEditor fileEditor = fileEditorTabPane.activeFileEditorProperty().get(); |
| | + if (fileEditor != null) |
| | + b.bind(func.apply(fileEditor)); |
| | + fileEditorTabPane.activeFileEditorProperty().addListener((observable, oldFileEditor, newFileEditor) -> { |
| | + b.unbind(); |
| | + if (newFileEditor != null) |
| | + b.bind(func.apply(newFileEditor)); |
| | + else |
| | + b.set(false); |
| | + }); |
| | + return b; |
| | } |
| | |
 |
| | Window window = scene.getWindow(); |
| | Event.fireEvent(window, new WindowEvent(window, WindowEvent.WINDOW_CLOSE_REQUEST)); |
| | + } |
| | + |
| | + //---- Edit menu ---------------------------------------------------------- |
| | + |
| | + private void editUndo() { |
| | + fileEditorTabPane.activeFileEditorProperty().get().undo(); |
| | + } |
| | + |
| | + private void editRedo() { |
| | + fileEditorTabPane.activeFileEditorProperty().get().redo(); |
| | } |
| | |