Skip to content
Snippets Groups Projects
Commit 29421b19 authored by Simon Barner's avatar Simon Barner
Browse files

Make TreeContextMenuItem reusable for other ContextMenus

* Move to separate file
* Move construction of TreeContextMenuItem-based ContextMenus from
  DynamicTreeUIProviderBase to static factory method
  TreeContextMenuItem.createTreeContextMenu()

Issue-Ref: 4322
Issue-URL: af3#4322



Signed-off-by: default avatarSimon Barner <barner@fortiss.org>
parent ef2f3b3a
No related branches found
No related tags found
1 merge request!2094322/3797: Editing DSE project
...@@ -7,9 +7,10 @@ DynamicTreeItem.java 7e81ea98038b5eca90df583e0268d4e8f37aaf25 GREEN ...@@ -7,9 +7,10 @@ DynamicTreeItem.java 7e81ea98038b5eca90df583e0268d4e8f37aaf25 GREEN
DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 GREEN DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 GREEN
DynamicTreeTableUIProviderBase.java c52a1f9598de25874f83c133a8cbbcddc86442e9 GREEN DynamicTreeTableUIProviderBase.java c52a1f9598de25874f83c133a8cbbcddc86442e9 GREEN
DynamicTreeTableViewer.java 77e9995a3bee37d57578dad9434a53c702128efa YELLOW DynamicTreeTableViewer.java 77e9995a3bee37d57578dad9434a53c702128efa YELLOW
DynamicTreeUIProviderBase.java 3688498020e322174d222d433220ee56c4549fbb YELLOW DynamicTreeUIProviderBase.java 6c186ade3aba51037303ed7a4ad812399bd70c56 YELLOW
DynamicTreeViewer.java b0d8cc4b3e11aa970446af12d1e54c750713b297 YELLOW DynamicTreeViewer.java b0d8cc4b3e11aa970446af12d1e54c750713b297 YELLOW
DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN
EmptyChildrenContentProvider.java 51b4468f9df8423abeea5ac6aa2f6cf99c2eb512 GREEN EmptyChildrenContentProvider.java 51b4468f9df8423abeea5ac6aa2f6cf99c2eb512 GREEN
IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN
IDynamicItem.java 083d02459e7ec33542d9910c04abe2581e0b5422 GREEN IDynamicItem.java 083d02459e7ec33542d9910c04abe2581e0b5422 GREEN
TreeContextMenuItem.java c7f72dc795c7960f9088126361ead456fa7c02db YELLOW
...@@ -13,15 +13,11 @@ ...@@ -13,15 +13,11 @@
*******************************************************************************/ *******************************************************************************/
package org.fortiss.tooling.common.ui.javafx.control.treetableview; package org.fortiss.tooling.common.ui.javafx.control.treetableview;
import java.lang.reflect.Constructor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.ContextMenu; import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeItem; import javafx.scene.control.TreeItem;
import javafx.scene.input.ClipboardContent; import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard; import javafx.scene.input.Dragboard;
...@@ -61,51 +57,6 @@ public abstract class DynamicTreeUIProviderBase<T> { ...@@ -61,51 +57,6 @@ public abstract class DynamicTreeUIProviderBase<T> {
return null; return null;
} }
/**
* Base class for {@link MenuItem}s used by {@link DynamicTreeViewer}s. Subclasses must provide
* exactly one public constructor that takes the underlying tree element as single argument.
*/
public static abstract class TreeContextMenuItem<T> extends MenuItem {
/** The model element on which the context menu operates. */
private T element;
/** Constructor. */
public TreeContextMenuItem(T element, String label) {
super(label);
init(element);
}
/** Constructor. */
public TreeContextMenuItem(T element, String label, Node graphic) {
super(label, graphic);
init(element);
}
/** Helper for constructors. */
private void init(T element) {
this.element = element;
setOnAction(createOnActionHandler());
}
/** Getter for {@link #element}. */
protected T getElement() {
return element;
}
/** Predicate iff this {@link TreeContextMenuItem} is hidden. */
public abstract boolean isHidden();
/** Predicate when this {@link TreeContextMenuItem} is disabled. */
public abstract boolean isDisabled();
/**
* Factory method for {@link EventHandler} that implements the action triggered by the
* context menu.
*/
protected abstract EventHandler<ActionEvent> createOnActionHandler();
}
/** /**
* List of context menu entries types that supplied by clients * List of context menu entries types that supplied by clients
* (see{@link #addContextMenuEntry(Class)}). * (see{@link #addContextMenuEntry(Class)}).
...@@ -124,33 +75,9 @@ public abstract class DynamicTreeUIProviderBase<T> { ...@@ -124,33 +75,9 @@ public abstract class DynamicTreeUIProviderBase<T> {
* Creates a context menu based on the the {@link TreeContextMenuItem} types registered via * Creates a context menu based on the the {@link TreeContextMenuItem} types registered via
* {@link #addContextMenuEntry(Class)}. * {@link #addContextMenuEntry(Class)}.
*/ */
public final ContextMenu createContextMenu(T element) { /** package */
ContextMenu menu = new ContextMenu(); final ContextMenu createContextMenu(T element) {
for(Class<? extends TreeContextMenuItem<T>> entryType : contextMenuEntryTypes) { return TreeContextMenuItem.createTreeContextMenu(contextMenuEntryTypes, element);
try {
Constructor<?>[] ctrs = entryType.getConstructors();
if(ctrs.length != 1) {
throw new RuntimeException(
"Subclasses of TreeContextMenuItem must provide exactly one public constructor");
}
@SuppressWarnings("unchecked") Constructor<? extends TreeContextMenuItem<T>> ctr =
(Constructor<? extends TreeContextMenuItem<T>>)ctrs[0];
if(ctr.getParameterCount() != 1) {
throw new RuntimeException(
"The constructor of subclasses of TreeContextMenuItem must take the tree element for which the context menu is created as single argument.");
}
TreeContextMenuItem<T> entry = ctr.newInstance(element);
if(!entry.isHidden()) {
menu.getItems().add(entry);
entry.setDisable(entry.isDisabled());
}
} catch(Exception e) {
e.printStackTrace();
}
}
return menu;
} }
/** /**
......
/*-------------------------------------------------------------------------+
| Copyright 2023 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.common.ui.javafx.control.treetableview;
import java.lang.reflect.Constructor;
import java.util.Collection;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
/**
* Base class for {@link MenuItem}s used by {@link DynamicTreeViewer}s (but in principle generally
* applicable for JavaFX {@link ContextMenu}s).
* <ul>
* <li>Subclasses must provide exactly one public constructor that takes the underlying tree element
* as single argument.</li>
* <li>Instances must be created using factory method
* {@link #createTreeContextMenu(Collection, Object)}.</li>
* </ul>
*/
public abstract class TreeContextMenuItem<T> extends MenuItem {
/** The model element on which the context menu operates. */
private T element;
/** Constructor. */
protected TreeContextMenuItem(T element, String label) {
super(label);
init(element);
}
/** Constructor. */
protected TreeContextMenuItem(T element, String label, Node graphic) {
super(label, graphic);
init(element);
}
/** Helper for constructors. */
private void init(T element) {
this.element = element;
setOnAction(createOnActionHandler());
}
/** Getter for {@link #element}. */
protected T getElement() {
return element;
}
/** Predicate iff this {@link TreeContextMenuItem} is hidden. */
public abstract boolean isHidden();
/** Predicate when this {@link TreeContextMenuItem} is disabled. */
public abstract boolean isDisabled();
/**
* Factory method for {@link EventHandler} that implements the action triggered by the
* context menu.
*/
protected abstract EventHandler<ActionEvent> createOnActionHandler();
/** Factory method for a {@link ContextMenu} defined based on {@link TreeContextMenuItem}s. */
public static <T> ContextMenu createTreeContextMenu(
Collection<Class<? extends TreeContextMenuItem<T>>> contextMenuEntryTypes, T element) {
ContextMenu menu = new ContextMenu();
for(Class<? extends TreeContextMenuItem<T>> entryType : contextMenuEntryTypes) {
try {
Constructor<?>[] ctrs = entryType.getConstructors();
if(ctrs.length != 1) {
throw new RuntimeException(
"Subclasses of TreeContextMenuItem must provide exactly one public constructor");
}
@SuppressWarnings("unchecked") Constructor<? extends TreeContextMenuItem<T>> ctr =
(Constructor<? extends TreeContextMenuItem<T>>)ctrs[0];
if(ctr.getParameterCount() != 1) {
throw new RuntimeException(
"The constructor of subclasses of TreeContextMenuItem must take the tree element for which the context menu is created as single argument.");
}
TreeContextMenuItem<?> entry = ctr.newInstance(element);
if(!entry.isHidden()) {
menu.getItems().add(entry);
entry.setDisable(entry.isDisabled());
}
} catch(Exception e) {
e.printStackTrace();
}
}
return menu;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment