From ba964702ea5012995f1a3981509bfe80478c3b99 Mon Sep 17 00:00:00 2001 From: Simon Barner <barner@fortiss.org> Date: Wed, 10 Apr 2019 17:34:38 +0200 Subject: [PATCH] Refactor ModelElementTreeViewer to enable use in another scenario * Restrict input to INamedElement, only * Add expandItem() * Define ModelElementUIProvider as explicit (inner) type * Enable subclassing if needed * Use model element handler to obtain name Issue-Ref: 3709 Issue-Url: https://af3-developer.fortiss.org/issues/3709 Signed-off-by: Simon Barner <barner@fortiss.org> --- .../ui/javafx/control/treetableview/.ratings | 2 +- .../treetableview/ModelElementTreeViewer.java | 79 +++++++++++-------- 2 files changed, 46 insertions(+), 35 deletions(-) diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings index a9e7b2649..7b90b5dde 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings @@ -1 +1 @@ -ModelElementTreeViewer.java 8a555fc12eb6c0531f6334fdc61e9abf52ff784d YELLOW +ModelElementTreeViewer.java 9c7637313b0ce4d70566ebb4f90dfca0d9931d09 YELLOW diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java index 8a555fc12..9c7637313 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java @@ -16,6 +16,7 @@ package org.fortiss.tooling.base.ui.javafx.control.treetableview; import static javafx.embed.swt.SWTFXUtils.toFXImage; +import static org.fortiss.tooling.kernel.ui.util.KernelUIUtils.getName; import java.util.ArrayList; import java.util.List; @@ -24,9 +25,10 @@ import org.fortiss.tooling.base.model.element.IHierarchicElement; import org.fortiss.tooling.base.model.element.IModelElement; import org.fortiss.tooling.common.ui.javafx.AF3FXViewPart; import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeContentProviderBase; +import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeItem; import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeUIProviderBase; import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeViewer; -import org.fortiss.tooling.kernel.model.INamedCommentedElement; +import org.fortiss.tooling.kernel.model.INamedElement; import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; import javafx.scene.Node; @@ -39,18 +41,48 @@ import javafx.scene.image.ImageView; /** * This class is a support fragment for creating tree views in JavaFX Controls. It provides the view * counter part of a {@link DynamicTreeContentProviderBase}. The content provider is responsible - * for selecting elements from a base model and ordering them acc. to a custom defined structure. + * for selecting elements from a base model and ordering them according to a custom defined + * structure. * These two fragments have to be combined in a JavaFX controller inheriting from the base class * {@link AF3FXViewPart}. * <p> * TreeViewer that constructs a DynamicTreeViewer whose UI provider uses the methods and kernel - * services for {@link IHierarchicElement}s and {@link INamedCommentedElement}s. + * services for {@link INamedElement}s. * The Viewer uses a composition principle where a client must provide a {@link TreeView} (JavaFX), * a root element (AF3), and a content provider that selects the elements to be displayed. * * @author diewald */ -public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedElement> { +public class ModelElementTreeViewer<T extends INamedElement> { + + /** {@link DynamicTreeUIProviderBase} for named (and commented) {@link IModelElement}s . */ + protected class ModelElementUIProvider extends DynamicTreeUIProviderBase<T> { + /** {@inheritDoc} */ + @Override + public String getLabel(T element) { + return getName(element); + } + + /** {@inheritDoc} */ + @Override + public Node getIconNode(T element) { + org.eclipse.swt.graphics.Image icon = + IModelElementHandlerService.getInstance().getIcon(element); + if(icon != null) { + Image fxImage = toFXImage(icon.getImageData(), null); + return new ImageView(fxImage); + } + return null; + } + + /** {@inheritDoc} */ + @Override + public ContextMenu createContextMenu(T element) { + ContextMenu menu = new ContextMenu(); + contextMenuEntries.forEach(entry -> menu.getItems().add(entry)); + return menu; + } + } /** References the constructed {@link DynamicTreeViewer} "controller". */ protected DynamicTreeViewer<T> dynTreeViewer; @@ -64,7 +96,7 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle /** Constructor. */ public ModelElementTreeViewer(TreeView<T> treeView, T modelRoot, DynamicTreeContentProviderBase<T> contentProvider) { - DynamicTreeUIProviderBase<T> uiProvider = createContentUIProvider(); + DynamicTreeUIProviderBase<T> uiProvider = createUIProvider(); dynTreeViewer = new DynamicTreeViewer<T>(treeView, modelRoot, true, 0, contentProvider, uiProvider); } @@ -76,35 +108,8 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle * * @return The constructed UI Provider. */ - protected DynamicTreeUIProviderBase<T> createContentUIProvider() { - return new DynamicTreeUIProviderBase<T>() { - - /** {@inheritDoc} */ - @Override - public String getLabel(T element) { - return element.getName(); - } - - /** {@inheritDoc} */ - @Override - public Node getIconNode(T element) { - org.eclipse.swt.graphics.Image icon = - IModelElementHandlerService.getInstance().getIcon(element); - if(icon != null) { - Image fxImage = toFXImage(icon.getImageData(), null); - return new ImageView(fxImage); - } - return null; - } - - /** {@inheritDoc} */ - @Override - public ContextMenu createContextMenu(T element) { - ContextMenu menu = new ContextMenu(); - contextMenuEntries.forEach(entry -> menu.getItems().add(entry)); - return menu; - } - }; + protected DynamicTreeUIProviderBase<T> createUIProvider() { + return new ModelElementUIProvider(); } /** @@ -123,4 +128,10 @@ public class ModelElementTreeViewer<T extends IModelElement & INamedCommentedEle public void update() { dynTreeViewer.update(); } + + /** Expands the tree down to the given value. */ + public void expandItem(T value) { + DynamicTreeItem<T> item = dynTreeViewer.findItem(value); + dynTreeViewer.expandItem(item); + } } -- GitLab