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 33125106f4c061e50d0941a6ae8195d2d1a98822..0ed31f29d67cb44b3d3629d109dbe94cd18e28cd 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,15 +1,16 @@ ContextMenuUtil.java 405387151d45b09dffb3b6ba44f980313c8edcaf GREEN CurvedLinkLayoutedContentAnchorangeController.java 67c20e31ddb82fe2fd499117193353b0545839a0 GREEN -EObjectDiagramController.java 9af59e8e586c8251d174108a2ce2fcdee5e75782 GREEN +EObjectDiagramController.java 9af59e8e586c8251d174108a2ce2fcdee5e75782 YELLOW EObjectEllipticResizableContentControllerBase.java 3494d4f0dcdff5eb35f22f0e21d04df81b32e494 GREEN -EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN -EObjectRectangularResizableContentControllerBase.java f4a967591a60fadb20550ec3eaabccf240c9ec0d GREEN -KernelServiceBasedModelChangeProviderBase.java 8d1f8ef79ecd383ff74e5a2bbcf24345aabe70af GREEN -LayoutModelChangeProvider.java b5449d02eaf39086909720c43e21bd061005fc9e GREEN -LayoutedContentAnchorageController.java 9fc513a7404277514c730f7702d45588f2d81878 GREEN +EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 YELLOW +EObjectRectangularResizableContentControllerBase.java f4a967591a60fadb20550ec3eaabccf240c9ec0d YELLOW +KernelServiceBasedModelChangeProviderBase.java 8d1f8ef79ecd383ff74e5a2bbcf24345aabe70af YELLOW +LayoutModelChangeProvider.java b5449d02eaf39086909720c43e21bd061005fc9e YELLOW +LayoutedContentAnchorageController.java 73b103c06edcbf1762654e71a3e524f43c0c50c0 YELLOW LayoutedCurveLinkBendPointController.java 54d7c294c4afaeadb6787408fbfe2ca1958c2de0 GREEN -LayoutedDiagramAnchorageController.java 32d7d77daf252d021458c39ebcfe502f26f29a98 GREEN +LayoutedDiagramAnchorageController.java 32d7d77daf252d021458c39ebcfe502f26f29a98 YELLOW LayoutedEllipticResizableContentController.java 93bdeb7ecd5f7386724a9d7df5fff3174ab8ce10 GREEN LayoutedLineLinkBendPointController.java f5fac4fe8e4b4c0259407acb6bfc80dbe9c3a1fb GREEN -LayoutedLinkBendPointController.java 3203d946de233274934dca1bcd47bbdc1d0a3b13 GREEN -LayoutedRectangularResizableContentController.java 3232d423572924363702898cf8ba240ce7042b65 GREEN +LayoutedLinkBendPointController.java 6d5de856f513ca82eab805a0ad9cda8194be011d YELLOW +LayoutedRectangularResizableContentController.java 3232d423572924363702898cf8ba240ce7042b65 YELLOW +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 4850e6d5cc854062f8760986309dc09fbbc41974..b20ef590312b799f4a45fdfe316378b5a6958198 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 7bfc1395283d3dc10026aff5e2e65df88d25f3a7 GREEN -DynamicTreeTableViewer.java 43757359b3071192ae79710bcbc0e9577bb6f62d GREEN +DynamicTreeTableViewer.java 9e800c69eaea556d38cbbcc086d0f5edfed74b57 GREEN DynamicTreeUIProviderBase.java 56fe4df4577b35f1e5e6e4c4be189b706c852d52 GREEN -DynamicTreeViewer.java da5e24ae57777a482d8e12c8262513d8143bfa93 GREEN -DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN +DynamicTreeViewer.java 73f331c931532c1e3a85ea1464876021ac5a4c6e 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 43757359b3071192ae79710bcbc0e9577bb6f62d..9e800c69eaea556d38cbbcc086d0f5edfed74b57 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; @@ -43,7 +45,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; @@ -91,6 +93,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}. @@ -126,4 +138,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 da5e24ae57777a482d8e12c8262513d8143bfa93..73f331c931532c1e3a85ea1464876021ac5a4c6e 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,15 +16,10 @@ 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; import javafx.scene.control.TreeView; -import javafx.scene.input.MouseButton; -import javafx.scene.input.MouseEvent; /** * A JavaFX {@link TreeView} based on a {@link DynamicTreeContentProviderBase} and a @@ -40,14 +35,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; @@ -119,11 +112,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 -> { @@ -134,8 +122,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)); } else { @@ -179,37 +165,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; - - /** Constructor. */ - public DoubleClickEventDispatcher(EventDispatcher original) { - this.original = original; - } + /** {@inheritDoc} */ + @Override + protected Object getSelectedObject() { + DynamicTreeItem<T> item = (DynamicTreeItem<T>)view.getSelectionModel().getSelectedItem(); - /** {@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); + if(item != null) { + return item.getValue(); } + + 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(); }