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

Merge branch '4322' into 'master'

4322/3797: Editing DSE project

See merge request !209
parents 0a17507d 47feeeed
No related branches found
No related tags found
1 merge request!2094322/3797: Editing DSE project
Showing with 186 additions and 40 deletions
DynamicTreeTableNameProvider.java 3ca45f24b94e97b02313e80b16ba8b370f541541 GREEN
ModelElementTreeViewer.java c27c57ae21b32de790c6fb5a86695dd5952fcf32 GREEN
ModelElementTreeViewer.java 83a3693cf820161e42e7d84a697a3cd0d55f8c1f GREEN
......@@ -18,9 +18,6 @@ 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;
import org.fortiss.tooling.base.model.element.IHierarchicElement;
import org.fortiss.tooling.base.model.element.IModelElement;
import org.fortiss.tooling.common.ui.javafx.AF3FXViewPart;
......@@ -32,8 +29,6 @@ import org.fortiss.tooling.kernel.model.INamedElement;
import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
......@@ -74,25 +69,11 @@ public class ModelElementTreeViewer<T extends INamedElement> {
}
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;
/**
* List of context menu entries that supplied by clients (see
* {@link #addContextMenuEntry(MenuItem)}).
*/
protected List<MenuItem> contextMenuEntries = new ArrayList<>();
/** Constructor. */
public ModelElementTreeViewer(TreeView<T> treeView, T modelRoot,
DynamicTreeContentProviderBase<T> contentProvider) {
......@@ -112,18 +93,6 @@ public class ModelElementTreeViewer<T extends INamedElement> {
return new ModelElementUIProvider();
}
/**
* Method to define context {@link MenuItem}s for items of the underlying content. The given
* function may use the selected element (given as a parameter to the function) to define
* dynamic behavior.
*
* @param menuItem
* {@link MenuItem} and its logic to be added to the context menu.
*/
public void addContextMenuEntry(MenuItem menuItem) {
contextMenuEntries.add(menuItem);
}
/** Update the internal viewer. */
public void update() {
dynTreeViewer.update();
......
......@@ -6,10 +6,11 @@ DynamicTreeContentProviderBase.java 91896b1fb5104d126544c44c1ff8c30f2a13a8d6 GRE
DynamicTreeItem.java 7e81ea98038b5eca90df583e0268d4e8f37aaf25 GREEN
DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 GREEN
DynamicTreeTableUIProviderBase.java c52a1f9598de25874f83c133a8cbbcddc86442e9 GREEN
DynamicTreeTableViewer.java 77e9995a3bee37d57578dad9434a53c702128efa YELLOW
DynamicTreeUIProviderBase.java 82d3c051213f0147f4c67ad247a08696cee73110 GREEN
DynamicTreeViewer.java 33066062a82101cf28410e4d04f85bb9c24251db GREEN
DynamicTreeTableViewer.java 6e1fcc7a45076d741b80c3a5642a5c688fc651a6 GREEN
DynamicTreeUIProviderBase.java 606d2f199f82aba3fcc33f96caa07157b087cbe5 GREEN
DynamicTreeViewer.java b0d8cc4b3e11aa970446af12d1e54c750713b297 GREEN
DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN
EmptyChildrenContentProvider.java 51b4468f9df8423abeea5ac6aa2f6cf99c2eb512 GREEN
IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN
IDynamicItem.java 083d02459e7ec33542d9910c04abe2581e0b5422 GREEN
TreeContextMenuItem.java 893b1ca2535bb581e192b0f351429957de6766da GREEN
......@@ -210,6 +210,16 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
view.scrollTo(count);
}
/** Clears the current selection. */
public void clearSelection() {
view.getSelectionModel().clearSelection();
}
/** Selects the items referencing the provided values (a previous selection is NOT cleared). */
public void selectValues(List<T> values) {
selectValues(view.getRoot(), values);
}
/** Selects the given values in item's subtree */
private void selectValues(TreeItem<T> item, List<T> values) {
if(values.contains(item.getValue())) {
......
......@@ -13,6 +13,9 @@
*******************************************************************************/
package org.fortiss.tooling.common.ui.javafx.control.treetableview;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.TreeItem;
......@@ -55,12 +58,27 @@ public abstract class DynamicTreeUIProviderBase<T> {
}
/**
* @param element
* the displayed element
* @return the context menu
* List of context menu entries types supplied by clients
* (see{@link #addContextMenuEntry(Class)}).
*/
public ContextMenu createContextMenu(T element) {
return null;
private List<Class<? extends TreeContextMenuItem<T>>> contextMenuEntryTypes = new ArrayList<>();
/**
* Method to define context {@link TreeContextMenuItem}s. Depending on the selected content, the
* editor will show and enable the context menu. {@code null} may be used to denote menu
* separators.
*/
protected void addContextMenuEntry(Class<? extends TreeContextMenuItem<T>> menuItemType) {
contextMenuEntryTypes.add(menuItemType);
}
/**
* Creates a context menu based on the the {@link TreeContextMenuItem} types registered via
* {@link #addContextMenuEntry(Class)}.
*/
/** package */
final ContextMenu createContextMenu(T element) {
return TreeContextMenuItem.createTreeContextMenu(contextMenuEntryTypes, element);
}
/**
......
......@@ -102,6 +102,7 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
// wild cast works: see constructor
DynamicTreeItemBase<T> rootItem = (DynamicTreeItemBase<T>)view.getRoot();
rootItem.update();
view.refresh();
}
/** Sets the selection of this tree view. */
......
/*-------------------------------------------------------------------------+
| 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 static javafx.embed.swt.SWTFXUtils.toFXImage;
import java.lang.reflect.Constructor;
import java.util.List;
import org.eclipse.jface.resource.ImageDescriptor;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
/**
* 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(List, 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);
}
/** Constructor. */
protected TreeContextMenuItem(T element, String label, ImageDescriptor imgDescr) {
this(element, label, getSelectIcon(imgDescr));
}
/** Helper to build the select icon. */
private static Node getSelectIcon(ImageDescriptor imgDescr) {
Image fxIcon = toFXImage(imgDescr.getImageData(100), null);
return new ImageView(fxIcon);
}
/** 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.
* {@code null} may be used to denote menu separators.
*/
public static <T> ContextMenu createTreeContextMenu(
List<Class<? extends TreeContextMenuItem<T>>> contextMenuEntryTypes, T element) {
boolean previousWasItem = false;
boolean needSeparator = false;
ContextMenu menu = new ContextMenu();
for(Class<? extends TreeContextMenuItem<T>> entryType : contextMenuEntryTypes) {
if(entryType == null) {
if(previousWasItem) {
// Separator is only needed if there is a preceding visible item
needSeparator = true;
previousWasItem = false;
}
} else {
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()) {
// Add separator only if there is a subsequent visible item
if(needSeparator) {
menu.getItems().add(new SeparatorMenuItem());
needSeparator = false;
}
menu.getItems().add(entry);
entry.setDisable(entry.isDisabled());
previousWasItem = true;
}
} 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