package bluej.editor.stride;

import bluej.Config;
import bluej.prefmgr.PrefMgr;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.View;
import bluej.stride.slots.EditableSlot;
import bluej.stride.slots.EditableSlot.MenuItemOrder;
import bluej.stride.slots.EditableSlot.SortedMenuItem;
import bluej.utility.DialogManager;
import bluej.utility.Utility;
import bluej.utility.javafx.FXPlatformConsumer;
import bluej.utility.javafx.FXRunnable;
import bluej.utility.javafx.JavaFXUtil;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.print.PrinterJob;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.input.KeyCharacterCombination;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import threadchecker.OnThread;
import threadchecker.Tag;

import java.util.Arrays;
import java.util.List;
import java.util.Map;


| A class to manage the menus for a frame editor. | class FrameMenuManager extends TabMenuManager{ private final FrameEditorTab editor; private final List<SortedMenuItem> defaultEditItems; private final ObservableList<SortedMenuItem> contextualEditItems = FXCollections.observableArrayList(); private final ObservableList<SortedMenuItem> extraViewItems = FXCollections.observableArrayList(); private FXRunnable unbindEditItems; private FXRunnable unbindViewItems; private EditableSlot.MenuItems editMenuListener; private EditableSlot.MenuItems viewMenuListener; private List<Menu> menus = null; private final BooleanProperty javaPreviewShowing; FrameMenuManager(FrameEditorTab editor) { super(editor); this.editor = editor; this.javaPreviewShowing = new SimpleBooleanProperty(editor.getView() == View.JAVA_PREVIEW); JavaFXUtil.addChangeListener(javaPreviewShowing, b -> { if (b) JavaFXUtil.runNowOrLater(() -> editor.enableJavaPreview(Frame.ViewChangeReason.MENU_OR_SHORTCUT)); else{ JavaFXUtil.runNowOrLater(() -> editor.disableJavaPreview(Frame.ViewChangeReason.MENU_OR_SHORTCUT)); } }); defaultEditItems = Arrays.asList( MenuItemOrder.UNDO.item(JavaFXUtil.makeMenuItem(Config.getString("editor.undoLabel"), editor::undo, new KeyCodeCombination(KeyCode.Z, KeyCodeCombination.SHORTCUT_DOWN))), MenuItemOrder.REDO.item(JavaFXUtil.makeMenuItem(Config.getString("editor.redoLabel"), editor::redo, Config.isMacOS() ? new KeyCodeCombination(KeyCode.Z, KeyCodeCombination.SHORTCUT_DOWN, KeyCodeCombination.SHIFT_DOWN) : new KeyCodeCombination(KeyCode.Y, KeyCodeCombination.SHORTCUT_DOWN))), MenuItemOrder.CUT.item(JavaFXUtil.makeDisabledMenuItem(Config.getString("editor.cutLabel"), new KeyCodeCombination(KeyCode.X, KeyCodeCombination.SHORTCUT_DOWN))), MenuItemOrder.COPY.item(JavaFXUtil.makeDisabledMenuItem(Config.getString("editor.copyLabel"), new KeyCodeCombination(KeyCode.C, KeyCodeCombination.SHORTCUT_DOWN))), MenuItemOrder.PASTE.item(JavaFXUtil.makeDisabledMenuItem(Config.getString("editor.pasteLabel"), new KeyCodeCombination(KeyCode.V, KeyCodeCombination.SHORTCUT_DOWN))) ); } p.public void notifyView(View v) { javaPreviewShowing.set(v == View.JAVA_PREVIEW); } @OnThread(Tag.FXPlatform) List<Menu> getMenus() { if (menus == null) { Menu editMenu = JavaFXUtil.makeMenu(Config.getString("frame.editmenu.title")); JavaFXUtil.bindList(editMenu.getItems(), SortedMenuItem.sortAndAddDividers(contextualEditItems, defaultEditItems)); editMenu.setOnShowing(e -> Utility.ifNotNull(editMenuListener, EditableSlot.MenuItems::onShowing)); editMenu.setOnHidden(e -> Utility.ifNotNull(editMenuListener, EditableSlot.MenuItems::onHidden)); MenuItem birdsEyeItem = JavaFXUtil.makeMenuItem("", editor::enableCycleBirdseyeView, new KeyCharacterCombination("d", KeyCombination.SHORTCUT_DOWN)); birdsEyeItem.textProperty().bind(new StringBinding() { {super.bind(editor.viewProperty()); } @Override protected String computeValue() { switch (editor.viewProperty().get()) { case BIRDSEYE_NODOC: return Config.getString("frame.viewmenu.birdseye.doc"); default: return Config.getString("frame.viewmenu.birdseye"); } } }); FXPlatformConsumer<? super Boolean> frameCatalogueShownListener = newValue -> editor.recordShowHideFrameCatalogue(newValue, FrameCatalogue.ShowReason.MENU_OR_SHORTCUT); ObservableList<MenuItem> standardViewMenuItems = FXCollections.observableArrayList( JavaFXUtil.makeMenuItem(Config.getString("frame.viewmenu.nextError"), editor::nextError, new KeyCharacterCombination("k", KeyCombination.SHORTCUT_DOWN)) ,new SeparatorMenuItem() ,JavaFXUtil.makeCheckMenuItem(Config.getString("frame.viewmenu.cheatsheet"), editor.cheatSheetShowingProperty(), new KeyCodeCombination(KeyCode.F1), frameCatalogueShownListener) ,birdsEyeItem ,JavaFXUtil.makeCheckMenuItem(Config.getString("frame.viewmenu.java"), javaPreviewShowing, new KeyCharacterCombination("j", KeyCombination.SHORTCUT_DOWN)) ,new SeparatorMenuItem() ,JavaFXUtil.makeMenuItem(Config.getString("frame.viewmenu.fontbigger"), editor::increaseFontSize, new KeyCharacterCombination("=", KeyCombination.SHORTCUT_DOWN)) ,JavaFXUtil.makeMenuItem(Config.getString("frame.viewmenu.fontsmaller"), editor::decreaseFontSize, new KeyCharacterCombination("-", KeyCombination.SHORTCUT_DOWN)) ,JavaFXUtil.makeMenuItem(Config.getString("frame.viewmenu.fontdefault"), editor::resetFontSize, new KeyCharacterCombination("0", KeyCombination.SHORTCUT_DOWN)) ); Menu viewMenu = new Menu(Config.getString("frame.viewmenu.title")); JavaFXUtil.bindList(viewMenu.getItems(), standardViewMenuItems); viewMenu.setOnShowing(e -> Utility.ifNotNull(viewMenuListener, EditableSlot.MenuItems::onShowing)); viewMenu.setOnHidden(e -> Utility.ifNotNull(viewMenuListener, EditableSlot.MenuItems::onHidden)); updateMoveMenus(); menus = Arrays.asList( JavaFXUtil.makeMenu(Config.getString("frame.classmenu.title") , mainMoveMenu , JavaFXUtil.makeMenuItem(Config.getString("frame.classmenu.print"), () -> print(), new KeyCodeCombination(KeyCode.P, KeyCombination.SHORTCUT_DOWN)) , JavaFXUtil.makeMenuItem(Config.getString("frame.classmenu.close"), () -> editor.getParent().close(editor), new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN)) ), editMenu, viewMenu ); } else { updateMoveMenus(); } return menus; }
| Print the Stride class of the associated editor. | @OnThread(Tag.FXPlatform) private void print() { PrinterJob job = JavaFXUtil.createPrinterJob(); if (job == null) { DialogManager.showErrorFX(editor.getParent().getWindow(),"print-no-printers"); } else if (job.showPrintDialog(editor.getParent().getWindow())) { FXRunnable printAction = editor.getFrameEditor().printTo(job, PrefMgr.PrintSize.STANDARD, false, false); new Thread() { @Override @OnThread(value = Tag.FX, ignoreParent = true) public void run() { printAction.run(); job.endJob(); } }.start(); } } void setMenuItems(Map<EditableSlot.TopLevelMenu, EditableSlot.MenuItems> items) { if (unbindEditItems != null) { unbindEditItems.run(); unbindEditItems = null; contextualEditItems.clear(); editMenuListener = null; } EditableSlot.MenuItems editItems = items.get(EditableSlot.TopLevelMenu.EDIT); if (editItems != null) { editMenuListener = editItems; unbindEditItems = JavaFXUtil.bindList(contextualEditItems, editItems.getItems()); } if (unbindViewItems != null) { unbindViewItems.run(); unbindViewItems = null; extraViewItems.clear(); viewMenuListener = null; } EditableSlot.MenuItems viewItems = items.get(EditableSlot.TopLevelMenu.VIEW); if (viewItems != null) { viewMenuListener = viewItems; unbindViewItems = JavaFXUtil.bindList(extraViewItems, viewItems.getItems()); } } }

.   - FrameMenuManager
.   notifyView
.   computeValue
.   print
.   run
.   setMenuItems




258 neLoCode + 2 LoComm