package bluej.stride.operations;

import java.util.List;

import bluej.stride.slots.EditableSlot.MenuItemOrder;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.CustomMenuItem;
import javafx.scene.control.Label;
import bluej.stride.generic.InteractionManager;
import javafx.scene.control.MenuItem;

public abstract class AbstractOperation
{       

| If you select multiple frames, and right click, each will have | a set of operations that can be performed. This enum determines how the different | sets should be combined: | | - ALL means that all sets must feature this item before it is offered | (e.g. for copying) | - ANY means that only one operation need have this available | (e.g. disabling, where you want to allow disabling even if some frames are already disabled) | - ONE means that it only appears in single frame selections | (e.g. frame transformations) | public enum Combine { ANY, ALL, ONE; } protected final String identifier; protected final Combine combine; private boolean wideCustomItem = false; protected InteractionManager editor; public AbstractOperation(InteractionManager editor, String identifier, Combine combine) { this.identifier = identifier; this.combine = combine; this.editor = editor; } public String getIdentifier() { return identifier; } public Combine combine() { return combine; } public static class ItemLabel { private ObservableValue<String> label; private MenuItemOrder order; public ItemLabel(ObservableValue<String> label, MenuItemOrder order) { this.label = label; this.order = order; } @Override public boolean equals(Object obj) { if (obj instanceof ItemLabel) { return label.getValue().equals(((ItemLabel) obj).label.getValue()); } return false; } @Override public int hashCode() { return label.getValue().hashCode(); } public ObservableValue getLabel() { return label; } public MenuItemOrder getOrder() { return order; } }
| One item in list => appears at top-level | Two items => First item is sub-menu title, second item is label | .. and so on, but you surely don't want more than two levels! | public abstract List getLabels(); protected ItemLabel l(String s, MenuItemOrder order) { return new ItemLabel(new ReadOnlyStringWrapper(s){ @Override public boolean equals(Object obj) { if (!(obj instanceof ObservableValue<?>)){ return false; } return getValue().equals(((ObservableValue) obj).getValue()); } @Override public int hashCode() { return getValue().hashCode(); } }, order); } protected CustomMenuItem initializeCustomItem() { Label d = new Label(); d.textProperty().bind(getLabels().get(getLabels().size() - 1).label); if (!wideCustomItem) d.setPrefWidth(150); else{ d.setPrefWidth(300); } CustomMenuItem item = new CustomMenuItem(d); item.textProperty().bind(d.textProperty()); return item; } public void setWideCustomItem(boolean wide) { wideCustomItem = wide; } protected MenuItem initializeNormalItem() { MenuItem item = new MenuItem(); item.textProperty().bind(getLabels().get(getLabels().size() - 1).label); return item; } }
top, use, map, abstract class AbstractOperation

.   AbstractOperation
.   getIdentifier
.   combine

top, use, map, class AbstractOperation . ItemLabel

.   ItemLabel
.   equals
.   hashCode
.   getLabel
.   getOrder
.   getLabels
.   l
.   equals
.   hashCode
.   initializeCustomItem
.   setWideCustomItem
.   initializeNormalItem




164 neLoCode + 12 LoComm