Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • af3/kernel
  • diewald/kernel
2 results
Show changes
Commits on Source (22)
Showing
with 574 additions and 63 deletions
ContextMenuUtil.java 405387151d45b09dffb3b6ba44f980313c8edcaf GREEN
CurvedLinkLayoutedContentAnchorangeController.java 67c20e31ddb82fe2fd499117193353b0545839a0 GREEN
EObjectDiagramController.java 9af59e8e586c8251d174108a2ce2fcdee5e75782 GREEN
EObjectEllipticResizableContentControllerBase.java 3494d4f0dcdff5eb35f22f0e21d04df81b32e494 GREEN
EObjectDiagramController.java 2b253941592ee25ead95223470f983f23ef9776f GREEN
EObjectEllipticResizableContentControllerBase.java 7c862a03b97d2f2cfdcc2fcee7434de2e1e257d2 GREEN
EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN
EObjectRectangularResizableContentControllerBase.java f4a967591a60fadb20550ec3eaabccf240c9ec0d GREEN
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
......@@ -18,6 +18,8 @@ import static java.util.Objects.requireNonNull;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createDisplayMenu;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.canCompose;
import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.compose;
import java.util.List;
......@@ -33,6 +35,7 @@ import org.fortiss.tooling.kernel.ui.service.IContextMenuService;
import javafx.scene.Node;
import javafx.scene.control.MenuItem;
import javafx.scene.input.Dragboard;
/**
* Diagram controller that uses the {@link IElementCompositorService} to create context menu
......@@ -41,7 +44,6 @@ import javafx.scene.control.MenuItem;
* @author hoelzl
*/
public class EObjectDiagramController<T extends EObject> extends ControllerBase {
/** The model change provider. */
private final EObjectModelChangeProvider modelChangeProvider;
......@@ -85,4 +87,18 @@ public class EObjectDiagramController<T extends EObject> extends ControllerBase
result.add(createDisplayMenu(getViewer()));
return result;
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation) {
double zoom = getViewer().getFeatures().getCurrentZoomFactor();
return canCompose(db, diagramLocation, getModelElement(), true, zoom);
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation) {
double zoom = getViewer().getFeatures().getCurrentZoomFactor();
return compose(db, diagramLocation, getModelElement(), true, zoom);
}
}
......@@ -17,6 +17,8 @@ import static java.lang.Math.max;
import static java.util.Objects.requireNonNull;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.canCompose;
import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.compose;
import java.util.List;
......@@ -40,6 +42,7 @@ import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
import javafx.scene.Node;
import javafx.scene.control.MenuItem;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
/**
......@@ -148,4 +151,18 @@ public abstract class EObjectEllipticResizableContentControllerBase<T extends EO
public IClickController getClickController(Node node, DiagramCoordinate diagramLocation) {
return openEditorDoubleClickController;
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation) {
double zoom = getViewer().getFeatures().getCurrentZoomFactor();
return canCompose(db, diagramLocation, getModelElement(), false, zoom);
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation) {
double zoom = getViewer().getFeatures().getCurrentZoomFactor();
return compose(db, diagramLocation, getModelElement(), false, zoom);
}
}
......@@ -19,6 +19,8 @@ import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHA
import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_MINIMUM_WIDTH;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext;
import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.canCompose;
import static org.fortiss.tooling.base.ui.utils.FXDNDUtils.compose;
import java.util.List;
......@@ -46,6 +48,7 @@ import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
import javafx.geometry.Dimension2D;
import javafx.scene.Node;
import javafx.scene.control.MenuItem;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
/**
......@@ -177,4 +180,18 @@ public abstract class EObjectRectangularResizableContentControllerBase<T extends
public IClickController getClickController(Node node, DiagramCoordinate diagramLocation) {
return openEditorDoubleClickController;
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation) {
double zoom = getViewer().getFeatures().getCurrentZoomFactor();
return canCompose(db, diagramLocation, getModelElement(), false, zoom);
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation) {
double zoom = getViewer().getFeatures().getCurrentZoomFactor();
return compose(db, diagramLocation, getModelElement(), false, zoom);
}
}
/*-------------------------------------------------------------------------+
| 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);
}
}
......@@ -2,6 +2,7 @@ AbstractNameEditingSupport.java c57336a0e0da18711a1610ca667dfea76728807f GREEN
ActionUtils.java 322f43d4f92f992daef8ac88eb0f9197c840c89b GREEN
DragAndDropBaseUtils.java d375377f9124f6113b2a295e6b0e09ac8966e564 GREEN
EllipseLayoutUIUtils.java 4dd9dbd96a45e8c455c019caa19e4a50f18336af GREEN
FXDNDUtils.java 6ce94e239e68f9e2b3cc0524b072606f4a120076 GREEN
FontUtils.java a167a05bdaa8da9853705cc5134f30f6d81bc9f2 GREEN
GCStateManager.java 983973a92376b5c757c1253b32e33d0666ccdf7b GREEN
LWFXEditorUtils.java c624d3f0f6487b6d426b168dad048b2c39e71114 GREEN
......
/*-------------------------------------------------------------------------+
| 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.utils;
import static org.fortiss.tooling.base.utils.LayoutModelElementFactory.createPoint;
import static org.fortiss.tooling.kernel.service.IPrototypeService.PROTOTYPE_DATA_FORMAT;
import org.eclipse.emf.ecore.EObject;
import org.fortiss.tooling.base.dnd.ElementDropContext;
import org.fortiss.tooling.base.model.layout.Point;
import org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramCoordinate;
import org.fortiss.tooling.kernel.extension.data.Prototype;
import org.fortiss.tooling.kernel.service.ICommandStackService;
import org.fortiss.tooling.kernel.service.IElementCompositorService;
import org.fortiss.tooling.kernel.service.IPrototypeService;
import javafx.scene.input.Dragboard;
/**
* Utility methods for JavaFX drag-and-drop.
*
* @author hoelzl
*/
public final class FXDNDUtils {
/** Returns whether element composition can be done via {@link IElementCompositorService}. */
public static boolean canCompose(Dragboard db, EObject container) {
Prototype proto = extractPrototype(db);
if(proto != null) {
return IElementCompositorService.getInstance().canCompose(container,
proto.getPrototypeCopy(), null);
}
return false;
}
/** Returns whether element composition can be done via {@link IElementCompositorService}. */
public static boolean canCompose(Dragboard db, DiagramCoordinate location, EObject container,
boolean isRootContainer, double zoom) {
Prototype proto = extractPrototype(db);
if(proto != null) {
ElementDropContext ctx =
createElementDropContext(location, container, isRootContainer, zoom);
return IElementCompositorService.getInstance().canCompose(container,
proto.getPrototypeCopy(), ctx);
}
return false;
}
/** Composes the elements using {@link IElementCompositorService}. */
public static boolean compose(Dragboard db, EObject container) {
Prototype proto = extractPrototype(db);
if(proto != null) {
EObject copy = proto.getPrototypeCopy();
return doElementComposition(container, copy, null);
}
return false;
}
/**
* Composes the elements using {@link IElementCompositorService} creating an
* {@link ElementDropContext} for the given location, root element, and zoom factor.
*/
public static boolean compose(Dragboard db, DiagramCoordinate location, EObject container,
boolean isRootContainer, double zoom) {
Prototype proto = extractPrototype(db);
if(proto != null) {
EObject copy = proto.getPrototypeCopy();
ElementDropContext ctx =
createElementDropContext(location, container, isRootContainer, zoom);
return doElementComposition(container, copy, ctx);
}
return false;
}
/** Delegates to {@link IElementCompositorService} in order to compose the elements. */
private static boolean doElementComposition(EObject container, EObject contained,
ElementDropContext context) {
IElementCompositorService ecs = IElementCompositorService.getInstance();
if(ecs.canCompose(container, contained, context)) {
ICommandStackService.getInstance().runAsCommand(container, () -> {
ecs.compose(container, contained, context);
});
return true;
}
return false;
}
/** Creates the {@link ElementDropContext} containing the drop location. */
private static ElementDropContext createElementDropContext(DiagramCoordinate location,
EObject container, boolean isRootContainer, double zoom) {
Point dcLocation = createPoint((int)location.getX(), (int)location.getY(), "");
ElementDropContext ctx =
new ElementDropContext(container, dcLocation, isRootContainer, zoom);
return ctx;
}
/** Extracts the prototype from the dragboard. */
private static Prototype extractPrototype(Dragboard db) {
Object data = db.getContent(PROTOTYPE_DATA_FORMAT);
if(data instanceof String) {
return IPrototypeService.getInstance().getPrototypeByUniqueID((String)data);
}
return null;
}
/** Constructor. */
private FXDNDUtils() {
// prevent instantiation
}
}
DynamicTreeContentProviderBase.java e801da995a1b6e5a1b757247c1638bafb6073e6d GREEN
DynamicTreeItem.java 75dc5534b119ffdb3c10a65810c2a0f330b7955e GREEN
DynamicTreeTableUIProviderBase.java 7bfc1395283d3dc10026aff5e2e65df88d25f3a7 GREEN
DynamicTreeTableViewer.java 43757359b3071192ae79710bcbc0e9577bb6f62d GREEN
DynamicTreeUIProviderBase.java 56fe4df4577b35f1e5e6e4c4be189b706c852d52 GREEN
DynamicTreeViewer.java da5e24ae57777a482d8e12c8262513d8143bfa93 GREEN
DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN
DynamicTreeTableUIProviderBase.java 75ddf3e91c08fd6a5853ab261593040d1039d774 GREEN
DynamicTreeTableViewer.java 431ac62cbd6ad7df25852fce1b5a62a05ba510e3 GREEN
DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN
DynamicTreeViewer.java e9f19d16a2a7e5a1b03b8a8b543453ac7eb6a051 GREEN
DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN
IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN
......@@ -19,6 +19,7 @@ import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.TreeTableCell;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.input.Dragboard;
import javafx.util.Callback;
/**
......@@ -59,6 +60,28 @@ public abstract class DynamicTreeTableUIProviderBase<T> {
return null;
}
/**
* @param item
* the tree element currently targeted by the drag location
* @param dragboard
* the current {@link Dragboard}
* @return whether the drag-over event succeeds (i.e. should be consumed).
*/
public boolean dragOver(T item, Dragboard dragboard) {
return false;
}
/**
* @param element
* the element the content is dropped on
* @param dragboard
* the current {@link Dragboard}
* @return whether the drop event completed (i.e. should be consumed).
*/
public boolean dropClipboardContent(T element, Dragboard dragboard) {
return false;
}
/**
* Returns whether the given column is editable.
*
......
......@@ -15,12 +15,17 @@
*******************************************************************************/
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;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableRow;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.TreeTableView.TreeTableViewSelectionModel;
import javafx.scene.input.TransferMode;
import javafx.util.Callback;
/**
* A JavaFX {@link TreeTableView} based on an {@link DynamicTreeContentProviderBase} and
......@@ -43,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;
......@@ -51,6 +56,28 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
view.setRoot(rootItem);
view.setShowRoot(showRoot);
view.setEditable(true);
view.setRowFactory(new Callback<TreeTableView<T>, TreeTableRow<T>>() {
@Override
public TreeTableRow<T> call(TreeTableView<T> param) {
final TreeTableRow<T> row = new TreeTableRow<T>();
row.setOnDragOver(evt -> {
T item = row.getItem();
if(uiProvider.dragOver(item, evt.getDragboard())) {
evt.acceptTransferModes(TransferMode.ANY);
evt.consume();
}
});
row.setOnDragDropped(evt -> {
T item = row.getItem();
if(uiProvider.dropClipboardContent(item, evt.getDragboard())) {
evt.setDropCompleted(true);
evt.consume();
}
});
return row;
}
});
TreeTableViewSelectionModel<T> selectionModel = view.getSelectionModel();
selectionModel.setSelectionMode(SelectionMode.MULTIPLE);
selectionModel.selectedItemProperty().addListener((obs, oVal, nVal) -> {
......@@ -91,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}.
......@@ -98,8 +135,8 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
public TreeTableColumn<T, String> addColumn(String headerLabel, int prefWidth) {
int num = view.getColumns().size();
TreeTableColumn<T, String> column = new TreeTableColumn<>(headerLabel);
column.setPrefWidth(prefWidth);
column.setCellValueFactory(param -> {
T data = param.getValue().getValue();
return new SimpleObjectProperty<String>(uiProvider.getLabel(data, num));
......@@ -126,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;
}
}
......@@ -15,10 +15,12 @@ package org.fortiss.tooling.common.ui.javafx.control.treetableview;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard;
/**
* This UI provider is responsible to return the label, the icon, and the context menu for each cell
* in the {@link DynamicTreeViewer} based on the data object.
* in the {@link DynamicTreeViewer} based on the data object. It also handles drag start events.
*/
public abstract class DynamicTreeUIProviderBase<T> {
/**
......@@ -47,4 +49,35 @@ public abstract class DynamicTreeUIProviderBase<T> {
public ContextMenu createContextMenu(T element) {
return null;
}
/**
* @param element
* the tree element, which was dragged
* @return the content of the clipboard or {@code null} if the drag should be ignored.
*/
public ClipboardContent getDragClipboardContent(T element) {
return null;
}
/**
* @param item
* the tree element currently targeted by the drag location
* @param dragboard
* the current {@link Dragboard}
* @return whether the drag-over event succeeds (i.e. should be consumed).
*/
public boolean dragOver(T item, Dragboard dragboard) {
return false;
}
/**
* @param element
* the element the content is dropped on
* @param dragboard
* the current {@link Dragboard}
* @return whether the drop event completed (i.e. should be consumed).
*/
public boolean dropClipboardContent(T element, Dragboard dragboard) {
return false;
}
}
......@@ -16,15 +16,15 @@
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.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
/**
* A JavaFX {@link TreeView} based on a {@link DynamicTreeContentProviderBase} and a
......@@ -40,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;
......@@ -119,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 -> {
......@@ -134,10 +127,17 @@ 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 -> {
dragDetected(evt, this, item);
});
this.setOnDragOver(evt -> {
dragOver(evt, item);
});
this.setOnDragDropped(evt -> {
dragDropped(evt, item);
});
} else {
this.setText(null);
this.setGraphic(null);
......@@ -149,6 +149,28 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
});
}
/** Called when an item in the tree is dragged. */
private void dragDetected(MouseEvent evt, TreeCell<T> cell, T item) {
ClipboardContent cbContent = uiProvider.getDragClipboardContent(item);
if(cbContent != null) {
Dragboard db = cell.startDragAndDrop(TransferMode.ANY);
db.setContent(cbContent);
evt.consume();
}
}
/** Gives the current drag-over event to the UI provider. */
private void dragOver(DragEvent evt, T item) {
if(uiProvider.dragOver(item, evt.getDragboard())) {
evt.consume();
}
}
/** Gives the completed drop gesture to the UI provider. */
private void dragDropped(DragEvent evt, T item) {
uiProvider.dropClipboardContent(item, evt.getDragboard());
}
/** Expands the tree to the given item. */
public void expandItem(TreeItem<T> item) {
while(item.getParent() != null) {
......@@ -169,6 +191,19 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
}
}
/** Expands the whole tree. */
public void expandAllItems() {
expandAllItems(rootItem);
}
/** Recursively expands the whole tree. */
private void expandAllItems(TreeItem<T> item) {
item.setExpanded(true);
for(TreeItem<T> child : item.getChildren()) {
expandAllItems(child);
}
}
/** Returns the underlying {@link TreeView}. */
public TreeView<T> getControl() {
return view;
......@@ -179,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;
}
}
......@@ -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();
}
DiagramCoordinate.java 6b00aec99054d4cd19003a72bd4e5e774ac6a641 GREEN
DiagramLayers.java 155cbb47a5f0aaa0025320ae607e6777f3a2d2e8 GREEN
DiagramViewer.java e7c550be6443f798ba9399a35ab3059033a33e59 RED
DiagramViewer.java a96338d3d8e043564eb857920ade45f6e2d4ac18 GREEN
DiagramViewerDefaultTags.java 6230763252409c60009ab8887b4ef582cf883229 GREEN
DiagramViewerFeatures.java 31e3fb61f915b0d8695005b083c47ce1c5be0b05 GREEN
DiagramViewerSelection.java e833f592543bc97077907d980a39b123fc4044e6 GREEN
......@@ -8,5 +8,5 @@ EDragGesture.java 5cfa098d3877db11981c2750e5e103156d62fc5e GREEN
FeedbackChange.java b088fa89af648f1674f2f9c1f7f99d585ce801ca GREEN
GridCanvasVisual.java 734027d56af342cd01ff445ba9347b8dbb6c83c2 GREEN
MVCBundleManager.java 2b4ab114c55b30a3d98d7135458f8f3ddd244d58 GREEN
MouseState.java ff90af6d1cca427ef6f3fded76367b535120a5df GREEN
MouseState.java 3d9993f799d5d74bc74ac03b46e4a1857c4d267e GREEN
SVGExporter.java 2211f06d81c7b0523ae52dc832410a76875a9e07 GREEN
......@@ -71,6 +71,8 @@ import javafx.scene.shape.Rectangle;
* for the purpose of source code size reduction.
*/
public class DiagramViewer {
/** The default dash stroke pattern. */
private final Double[] DEFAULT_DASH_STROKE_PATTERN = new Double[] {15.0, 5.0};
/** The bundle manager helper class reference. */
private final MVCBundleManager viewerManager;
/** The feature state helper class reference. */
......@@ -118,8 +120,7 @@ public class DiagramViewer {
// selection feedback rectangle
mouseDragRectangle.setFill(Color.TRANSPARENT);
mouseDragRectangle.setStroke(Color.ORANGERED);
// TODO (SB): Magic constant
mouseDragRectangle.getStrokeDashArray().addAll(15.0, 5.0);
mouseDragRectangle.getStrokeDashArray().addAll(DEFAULT_DASH_STROKE_PATTERN);
mouseDragRectangle.setMouseTransparent(true);
// viewer pane
viewerPane = new Pane();
......
......@@ -31,9 +31,11 @@ import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IVisual;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.input.DragEvent;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
/**
* Class for monitoring mouse operations including clicking, dragging and linking
......@@ -324,6 +326,50 @@ public final class MouseState {
}
};
/** The drag over event handler. */
private final EventHandler<DragEvent> dragOverHandler = new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if(!nodesToBundleMap.containsKey(event.getSource())) {
return;
}
// wild cast works, since source is in nodesMap
Node source = (Node)event.getSource();
IMVCBundle bundle = nodesToBundleMap.get(source);
IController ctrl = bundle.getController();
lastMouseLocation =
viewer.convertEventToDiagramCoordinates(event.getX(), event.getY(), source);
if(ctrl != null) {
if(ctrl.handleExternalDNDDragOver(event.getDragboard(), lastMouseLocation)) {
event.acceptTransferModes(TransferMode.ANY);
event.consume();
}
}
}
};
/** The drop event handler. */
private final EventHandler<DragEvent> dropHandler = new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if(!nodesToBundleMap.containsKey(event.getSource())) {
return;
}
// wild cast works, since source is in nodesMap
Node source = (Node)event.getSource();
IMVCBundle bundle = nodesToBundleMap.get(source);
IController ctrl = bundle.getController();
lastMouseLocation =
viewer.convertEventToDiagramCoordinates(event.getX(), event.getY(), source);
if(ctrl != null) {
if(ctrl.handleExternalDNDDrop(event.getDragboard(), lastMouseLocation)) {
event.setDropCompleted(true);
event.consume();
}
}
}
};
/** Registers the mouse listeners on the given node. */
/* package */ void registerMouseListeners(Node node, IMVCBundle mvcb) {
node.setOnMousePressed(mousePressedHandler);
......@@ -337,11 +383,15 @@ public final class MouseState {
node.setOnMouseDragReleased(mouseDragCompletedHandler);
node.setOnMouseMoved(mouseMotionHandler);
node.setOnKeyReleased(keyEventHandler);
node.setOnDragOver(dragOverHandler);
node.setOnDragDropped(dropHandler);
nodesToBundleMap.put(node, mvcb);
}
/** Unregisters the mouse listeners from the given node. */
/* package */ void unregisterMouseListeners(Node node) {
node.setOnDragDropped(null);
node.setOnDragOver(null);
node.setOnKeyReleased(null);
node.setOnMouseMoved(null);
node.setOnMouseDragReleased(null);
......
IClickController.java c0270e99d918aef14612d46f3e84905d3a6bdd8c GREEN
IController.java 6ba069977e7588f97187916c23a0e37f7cb91059 GREEN
IController.java 443fe97dae2f8142e9ebc6df3267b505444c4bbe GREEN
IControllerFactory.java 85b86eda643489f2a03454eae5383915ecf27f83 GREEN
IDragController.java c1f311d2ae9ed684c8a7cd85e9ed1f85e79658d1 GREEN
IKeyPressController.java dc8fe2a7c441866122e8c7b3114fd12d17f0b051 GREEN
......@@ -23,6 +23,7 @@ import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.MVCBundleTag;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.control.MenuItem;
import javafx.scene.input.Dragboard;
/**
* Interface for controllers which are informed about gestures or clicks and provide context menus
......@@ -58,6 +59,20 @@ public interface IController extends IMVCBundlePart {
*/
List<MenuItem> contextMenuContributions(Node node, DiagramCoordinate diagramLocation);
/**
* Handles the external DND drag over event. The framework calls this method when a
* {@link Node#setOnDragOver(javafx.event.EventHandler)} event occurred at the given location.
* This method should return {@code true} if the event was processed.
*/
boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation);
/**
* Handles the external DND drop event. The framework calls this method when a
* {@link Node#setOnDragDropped(javafx.event.EventHandler)} event occurred at the given
* location. This method should return {@code true} if the drop event was completed.
*/
boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation);
/**
* Returns whether this bundle represents a possible link target. If this method returns
* {@code false} this bundle is considered neither when a new link gesture is started nor
......
AnchorageContentControllerBase.java da56b10cbf2711b5da69f0b59f43eacbe54f4eea GREEN
ClickControllerBase.java 8e5861ed5f9318008ad0fdd5497ed320cd5bd647 GREEN
ContentAnchorageMoveControllerBase.java c18e7915ce23e124757f5b736086ecc46694800a GREEN
ControllerBase.java 309e9ee3f3a255b5a06fed8f1b4d4ec8bf88f101 GREEN
ControllerBase.java c74e905a2b47dbf9b6443d94a877f1a9e56ba031 GREEN
DefaultDiagramController.java 0e083b89a08f63967102a384d66ebc1d64d203af GREEN
DelegatingContentAnchorageController.java 2e3b1b4e14402a3503233f816b21ef3e4aa09edc GREEN
DragControllerBase.java b15ff874304f679fe494d85f57cc8cbe4d0d1d15 GREEN
DraggingUtils.java 95117e2ea4c36b6c6a31f8088bb95b484e0e6612 GREEN
LinkControllerBase.java 392cb79cb42e9f878c665d47053b0795c3768603 GREEN
LinkControllerBase.java 4b6239c10cbbc5a2226615f7c6775f11adf226ef GREEN
MoveControllerBase.java 38d632e31f5e27d112ecdd4933e3a331378180d0 GREEN
ResizableContentControllerBase.java 898500d389b035f8138308d496d2d24be501c719 GREEN
......@@ -32,6 +32,7 @@ import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.impl.MVCBundlePartBase;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.control.MenuItem;
import javafx.scene.input.Dragboard;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
......@@ -104,6 +105,18 @@ public abstract class ControllerBase extends MVCBundlePartBase implements IContr
return true;
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDragOver(Dragboard db, DiagramCoordinate diagramLocation) {
return false;
}
/** {@inheritDoc} */
@Override
public boolean handleExternalDNDDrop(Dragboard db, DiagramCoordinate diagramLocation) {
return false;
}
/** {@inheritDoc} */
@Override
public IDragController getDragController(EDragGesture gesture, Node node,
......