diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings index 2effda820afa7fbcdc2d1e7bc72356fac2629b5e..76396f2c269dac4b8a3526fc7dd9c343cbe763a9 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings @@ -1,9 +1,9 @@ ContextMenuUtil.java 405387151d45b09dffb3b6ba44f980313c8edcaf GREEN CurvedLinkLayoutedContentAnchorangeController.java 67c20e31ddb82fe2fd499117193353b0545839a0 GREEN -EObjectDiagramController.java 2b253941592ee25ead95223470f983f23ef9776f YELLOW -EObjectEllipticResizableContentControllerBase.java 7c862a03b97d2f2cfdcc2fcee7434de2e1e257d2 YELLOW +EObjectDiagramController.java 2b253941592ee25ead95223470f983f23ef9776f GREEN +EObjectEllipticResizableContentControllerBase.java 7c862a03b97d2f2cfdcc2fcee7434de2e1e257d2 GREEN EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN -EObjectRectangularResizableContentControllerBase.java 28a17bf87f6a7222d927bc1c6b80967cb14b5f03 YELLOW +EObjectRectangularResizableContentControllerBase.java 28a17bf87f6a7222d927bc1c6b80967cb14b5f03 GREEN KernelServiceBasedModelChangeProviderBase.java 8d1f8ef79ecd383ff74e5a2bbcf24345aabe70af GREEN LayoutModelChangeProvider.java b5449d02eaf39086909720c43e21bd061005fc9e GREEN LayoutedContentAnchorageController.java 9fc513a7404277514c730f7702d45588f2d81878 GREEN @@ -13,3 +13,4 @@ LayoutedEllipticResizableContentController.java 93bdeb7ecd5f7386724a9d7df5fff317 LayoutedLineLinkBendPointController.java f5fac4fe8e4b4c0259407acb6bfc80dbe9c3a1fb GREEN LayoutedLinkBendPointController.java 3203d946de233274934dca1bcd47bbdc1d0a3b13 GREEN LayoutedRectangularResizableContentController.java 3232d423572924363702898cf8ba240ce7042b65 GREEN +ModelElementFXEditorUIProviderBase.java b81bf7fc945d40f1f842876f07ba70799ab65f6d GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java new file mode 100644 index 0000000000000000000000000000000000000000..b81bf7fc945d40f1f842876f07ba70799ab65f6d --- /dev/null +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java @@ -0,0 +1,73 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2020 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.tooling.base.ui.editor.fx.controller; + +import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu; + +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.fortiss.tooling.base.model.element.IModelElement; +import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeTableUIProviderBase; +import org.fortiss.tooling.kernel.ui.extension.base.FXEditorBase; +import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; + +import javafx.scene.Node; +import javafx.scene.control.ContextMenu; + +/** + * Base implementation for FX UIProvider for ModelElements. + * + * @author bayha + */ +public abstract class ModelElementFXEditorUIProviderBase<T extends IModelElement> + extends DynamicTreeTableUIProviderBase<T> { + + /** The editor used to post selection changes. */ + protected final FXEditorBase<?> editor; + + /** Constructor. */ + public ModelElementFXEditorUIProviderBase(FXEditorBase<?> editor) { + this.editor = editor; + } + + /** {@inheritDoc} */ + @Override + public Node getIconNode(IModelElement element, int column) { + if(element == null) { + return null; + } + return IModelElementHandlerService.getInstance().getFXIcon(element); + } + + /** {@inheritDoc} */ + @Override + public ContextMenu createContextMenu(IModelElement element, int column) { + if(element == null || column != 0) { + return null; + } + ContextMenu contextMenu = new ContextMenu(); + contextMenu.getItems().addAll(createPrototypeMenu(element, null)); + return contextMenu; + } + + /** {@inheritDoc} */ + @Override + public void select(IModelElement oldValue, IModelElement newValue) { + IStructuredSelection selection = + newValue == null ? StructuredSelection.EMPTY : new StructuredSelection(newValue); + editor.getSite().getSelectionProvider().setSelection(selection); + } +} diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings index 8d6a106e24d63b6430e36627a00f64c04a9436d7..d62ac3736d877b3ebc3db9be04eecb910b812ca1 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings @@ -1,8 +1,8 @@ DynamicTreeContentProviderBase.java e801da995a1b6e5a1b757247c1638bafb6073e6d GREEN DynamicTreeItem.java 75dc5534b119ffdb3c10a65810c2a0f330b7955e GREEN DynamicTreeTableUIProviderBase.java 75ddf3e91c08fd6a5853ab261593040d1039d774 GREEN -DynamicTreeTableViewer.java 7d35586715715a2b2b29bac37913480b18ca00d2 GREEN +DynamicTreeTableViewer.java 431ac62cbd6ad7df25852fce1b5a62a05ba510e3 GREEN DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN -DynamicTreeViewer.java 4f17aa4279b6403d3a90ac8547fa86de780fc0ac GREEN -DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN +DynamicTreeViewer.java e9f19d16a2a7e5a1b03b8a8b543453ac7eb6a051 GREEN +DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java index 7d35586715715a2b2b29bac37913480b18ca00d2..431ac62cbd6ad7df25852fce1b5a62a05ba510e3 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java @@ -15,6 +15,8 @@ *******************************************************************************/ package org.fortiss.tooling.common.ui.javafx.control.treetableview; +import static java.lang.Integer.MAX_VALUE; + import javafx.beans.property.SimpleObjectProperty; import javafx.scene.control.SelectionMode; import javafx.scene.control.TreeItem; @@ -46,7 +48,7 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel, DynamicTreeContentProviderBase<T> contentProvider, DynamicTreeTableUIProviderBase<T> uiProvider) { - super(contentProvider); + super(view, contentProvider); this.uiProvider = uiProvider; // construct view this.view = view; @@ -116,6 +118,16 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { } } + /** Expands all items on all levels. */ + public void expandAllItems() { + TreeItem<T> root = view.getRoot(); + if(root == null) { + return; + } + + expandItem(root, MAX_VALUE); + } + /** * Adds a column to the table part of the view. The labels, context menus and icons are shown as * defined in the {@link DynamicTreeTableUIProviderBase}. @@ -151,4 +163,12 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> { public TreeTableView<T> getControl() { return view; } + + /** {@inheritDoc} */ + @Override + protected T getSelectedObject() { + T value = view.getSelectionModel().getSelectedItem().getValue(); + + return value; + } } diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java index 4f17aa4279b6403d3a90ac8547fa86de780fc0ac..e9f19d16a2a7e5a1b03b8a8b543453ac7eb6a051 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java @@ -16,9 +16,6 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview; import javafx.beans.value.ChangeListener; -import javafx.event.Event; -import javafx.event.EventDispatchChain; -import javafx.event.EventDispatcher; import javafx.scene.control.ContextMenu; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; @@ -26,7 +23,6 @@ import javafx.scene.control.TreeView; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; -import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; @@ -44,14 +40,12 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> { private final DynamicTreeUIProviderBase<T> uiProvider; /** The selection change listener. */ private ChangeListener<Object> selectionChangeListener = null; - /** The double click handler. */ - private IDoubleClickHandler doubleClickHandler; /** Constructor. */ public DynamicTreeViewer(TreeView<T> view, T root, boolean showRoot, int revealLevel, DynamicTreeContentProviderBase<T> contentProvider, DynamicTreeUIProviderBase<T> uiProvider) { - super(contentProvider); + super(view, contentProvider); this.uiProvider = uiProvider; // construct view this.view = view; @@ -123,11 +117,6 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> { this.selectionChangeListener = listener; } - /** Sets the double click handler. */ - public void setDoubleClickHandler(IDoubleClickHandler handler) { - this.doubleClickHandler = handler; - } - /** Configures the cell factory for the viewer. */ private void configureCellFactory() { view.setCellFactory(param -> { @@ -138,8 +127,6 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> { ContextMenu menu = null; if(!empty && item != null) { menu = uiProvider.createContextMenu(item); - EventDispatcher original = this.getEventDispatcher(); - this.setEventDispatcher(new DoubleClickEventDispatcher(original)); this.setText(uiProvider.getLabel(item)); this.setGraphic(uiProvider.getIconNode(item)); this.setOnDragDetected(evt -> { @@ -227,37 +214,15 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> { return uiProvider; } - /** - * Customized event dispatcher to fix double-click behavior. This prevents opening/closing of - * tree items with double click listeners assigned. - */ - private class DoubleClickEventDispatcher implements EventDispatcher { - /** The original event dispatcher. */ - private final EventDispatcher original; + /** {@inheritDoc} */ + @Override + protected Object getSelectedObject() { + DynamicTreeItem<T> item = (DynamicTreeItem<T>)view.getSelectionModel().getSelectedItem(); - /** Constructor. */ - public DoubleClickEventDispatcher(EventDispatcher original) { - this.original = original; + if(item != null) { + return item.getValue(); } - /** {@inheritDoc} */ - @Override - public Event dispatchEvent(Event event, EventDispatchChain tail) { - if(event instanceof MouseEvent) { - MouseEvent mevt = (MouseEvent)event; - if(mevt.getButton() == MouseButton.PRIMARY && mevt.getClickCount() >= 2) { - if(mevt.getEventType().equals(MouseEvent.MOUSE_CLICKED) && - doubleClickHandler != null) { - DynamicTreeItem<T> item = - (DynamicTreeItem<T>)view.getSelectionModel().getSelectedItem(); - if(item != null) { - doubleClickHandler.doubleClicked(item.getValue()); - } - } - event.consume(); - } - } - return original.dispatchEvent(event, tail); - } + return null; } } diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java index 47124c847de322a0ae26eb7a114f85ce4bd02d7e..a2013538b62d86f6a09efdf2cd78babac2072484 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java @@ -15,20 +15,91 @@ *******************************************************************************/ package org.fortiss.tooling.common.ui.javafx.control.treetableview; +import javafx.event.Event; +import javafx.event.EventDispatchChain; +import javafx.event.EventDispatcher; +import javafx.scene.control.Control; +import javafx.scene.control.TreeItem; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; + /** * Base class for {@link DynamicTreeViewer} and {@link DynamicTreeTableViewer}. */ abstract class DynamicTreeViewerBase<T> { + /** The double click handler. */ + private IDoubleClickHandler doubleClickHandler; + + /** The double click event dispatcher. */ + protected DoubleClickEventDispatcher doubleClickEventDispatcher; + /** The content provider implementation. */ private final DynamicTreeContentProviderBase<T> contentProvider; /** Constructor. */ - public DynamicTreeViewerBase(DynamicTreeContentProviderBase<T> contentProvider) { + public DynamicTreeViewerBase(Control control, + DynamicTreeContentProviderBase<T> contentProvider) { this.contentProvider = contentProvider; + + setupEventDispatcher(control); + } + + /** Creates and installs the EventDispatcher. Might be overwritten to change behavior. */ + protected void setupEventDispatcher(Control control) { + EventDispatcher original = control.getEventDispatcher(); + control.setEventDispatcher(new DoubleClickEventDispatcher(original)); } /** Returns the content provider. */ public final DynamicTreeContentProviderBase<T> getContentProvider() { return contentProvider; } + + /** + * Customized event dispatcher to fix double-click behavior. This prevents opening/closing of + * tree items with double click listeners assigned. + */ + private class DoubleClickEventDispatcher implements EventDispatcher { + /** The original event dispatcher. */ + private final EventDispatcher original; + + /** Constructor. */ + public DoubleClickEventDispatcher(EventDispatcher original) { + this.original = original; + } + + /** {@inheritDoc} */ + @Override + public Event dispatchEvent(Event event, EventDispatchChain tail) { + if(event instanceof MouseEvent) { + MouseEvent mevt = (MouseEvent)event; + if(mevt.getButton() == MouseButton.PRIMARY && mevt.getClickCount() >= 2) { + if(mevt.getEventType().equals(MouseEvent.MOUSE_CLICKED) && + doubleClickHandler != null) { + Object item = getSelectedObject(); + if(item != null) { + doubleClickHandler.doubleClicked(item); + } + } + event.consume(); + } + } + return original.dispatchEvent(event, tail); + } + } + + /** Sets the double click handler. */ + public void setDoubleClickHandler(IDoubleClickHandler handler) { + this.doubleClickHandler = handler; + } + + /** + * Retrieves the currently selected {@link Object} from this viewer. + * + * Note: This usually is not e.g. the {@link TreeItem} or similar, but the model object, that is + * represented by it. Usually this will be some EObject. + * + * @return The currently selected {@link Object}. + */ + protected abstract Object getSelectedObject(); }