Skip to content
Snippets Groups Projects
Commit a3de447e authored by Florian Hölzl's avatar Florian Hölzl
Browse files

Kernel: model elements view prototype drag-and-drop implemented.

parent 2f0df7b4
No related branches found
No related tags found
1 merge request!923921
Showing
with 107 additions and 17 deletions
DynamicTreeContentProviderBase.java e801da995a1b6e5a1b757247c1638bafb6073e6d GREEN
DynamicTreeItem.java 75dc5534b119ffdb3c10a65810c2a0f330b7955e GREEN
DynamicTreeTableUIProviderBase.java 7bfc1395283d3dc10026aff5e2e65df88d25f3a7 GREEN
DynamicTreeTableViewer.java 43757359b3071192ae79710bcbc0e9577bb6f62d GREEN
DynamicTreeUIProviderBase.java 13b5f54f5a9c19a6c53a5856824fa64bf7460605 YELLOW
DynamicTreeViewer.java 59da052c7c34ad526d3f81db9939676fd6050964 YELLOW
DynamicTreeTableUIProviderBase.java 75ddf3e91c08fd6a5853ab261593040d1039d774 YELLOW
DynamicTreeTableViewer.java 7d35586715715a2b2b29bac37913480b18ca00d2 YELLOW
DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece YELLOW
DynamicTreeViewer.java ff43fff033e81c7eded44baab16e5a5a05b26213 YELLOW
DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e 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.
*
......
......@@ -19,8 +19,11 @@ 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
......@@ -51,6 +54,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) -> {
......@@ -98,8 +123,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));
......
......@@ -15,6 +15,8 @@ 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
......@@ -53,7 +55,29 @@ public abstract class DynamicTreeUIProviderBase<T> {
* the tree element, which was dragged
* @return the content of the clipboard or {@code null} if the drag should be ignored.
*/
public Object getDragClipboardContent(T element) {
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;
}
}
......@@ -24,7 +24,6 @@ import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseButton;
......@@ -147,11 +146,15 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
dragDetected(evt, this, item);
});
this.setOnDragOver(evt -> {
System.out.println("Over " + item.toString());
dragOver(evt, item);
});
this.setOnDragDropped(evt -> {
dragDropped(evt, item);
});
this.setOnDragExited(evt -> {
System.out.println("Exited " + item.toString());
});
} else {
this.setText(null);
this.setGraphic(null);
......@@ -165,22 +168,24 @@ 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) {
Object cbContent = uiProvider.getDragClipboardContent(item);
ClipboardContent cbContent = uiProvider.getDragClipboardContent(item);
if(cbContent != null) {
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.put(new DataFormat("JAVA_OBJECT"), cbContent);
db.setContent(content);
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. */
......
......@@ -5,7 +5,7 @@ LibraryViewDragSourceAdapter.java 56ef61b214ef5d6cb5b751791a92158bda0391ec GREEN
LinkWithEditorPartListener.java c5ab74424378e7b158a805c4dd14fc03c8abeded GREEN
MarkerViewContentProvider.java 4cb1192baebe21bca951c439c163d0c171512515 GREEN
MarkerViewPart.java cbb650271b6877af205421b7cb11f930440a7ef9 GREEN
ModelElementsViewFX.java 77b4a234b4d2bd37f532373265ee7618f7dbafaa YELLOW
ModelElementsViewFX.java 5e1b3217eaa69c6d54c4300cdd1c744e36b3495b YELLOW
NavigatorNewMenu.java a35e391960d1dacbe7f77982e53e1891e9382d5a GREEN
NavigatorTreeContentComparator.java d9f1354cfdff78b104b28887d2397e5ca0e9755b GREEN
NavigatorTreeContentProvider.java 1fbe97bebf3805cc1af190cecd784fc1cfd12306 GREEN
......
......@@ -17,6 +17,7 @@ package org.fortiss.tooling.kernel.ui.internal.views;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.fortiss.tooling.kernel.service.IPrototypeService.PROTOTYPE_DATA_FORMAT;
import static org.fortiss.tooling.kernel.utils.EcoreUtils.filterOutInstanceOf;
import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getParentElement;
......@@ -47,6 +48,7 @@ import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.BorderPane;
/**
......@@ -241,10 +243,15 @@ public final class ModelElementsViewFX extends FXViewPart {
/** {@inheritDoc} */
@Override
public Object getDragClipboardContent(Object element) {
public ClipboardContent getDragClipboardContent(Object element) {
if(element instanceof Prototype) {
Prototype proto = (Prototype)element;
return IPrototypeService.getInstance().getUniquePrototypeID(proto);
String uid = IPrototypeService.getInstance().getUniquePrototypeID(proto);
if(uid != null) {
ClipboardContent cbContent = new ClipboardContent();
cbContent.put(PROTOTYPE_DATA_FORMAT, uid);
return cbContent;
}
}
return null;
}
......
......@@ -24,6 +24,8 @@ import org.fortiss.tooling.kernel.extension.data.Prototype;
import org.fortiss.tooling.kernel.extension.data.PrototypeCategory;
import org.fortiss.tooling.kernel.internal.PrototypeService;
import javafx.scene.input.DataFormat;
/**
* The prototype service provides registration and access to model element
* prototypes. It distinguishes between two types of prototypes. Primary
......@@ -37,6 +39,10 @@ import org.fortiss.tooling.kernel.internal.PrototypeService;
* @author hoelzl
*/
public interface IPrototypeService {
/** The DataFormat used to transfer prototypes via drag-and-drop. */
public static final DataFormat PROTOTYPE_DATA_FORMAT =
new DataFormat(IPrototypeService.class.getName());
/** Returns the service instance. */
public static IPrototypeService getInstance() {
return PrototypeService.getInstance();
......
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