Skip to content
Snippets Groups Projects
Commit a3e117c4 authored by Andreas Bayha's avatar Andreas Bayha
Browse files

Annotations: AnnotationView uses Generic Combo Column

Factored out the combo column to a generic implementation. Now, a
generic implementation for dynamic combo columns is reusable for all
DynamicTreetBaleViewers.

Issue-Ref: 4014
Issue-Url: https://af3-developer.fortiss.org/issues/4014


Signed-off-by: default avatarAndreas Bayha <bayha@fortiss.org>
parent 31330cc1
No related branches found
No related tags found
1 merge request!1254014
AnnotationFxViewPart.java 34c845f7162a8a8bb680df6ee08160ce63a5a5a3 YELLOW
......@@ -20,19 +20,15 @@ import org.fortiss.tooling.common.ui.javafx.AF3FXViewPart;
import javafx.scene.Scene;
/**
* ViewPart for the FX implementation of the AnnotationView.
*
* @author bayha
*/
public class AnnotationFxViewPart extends AF3FXViewPart {
private static final AnnotationViewFXController VIEW_CONTROLLER =
new AnnotationViewFXController();
private static final AnnotationViewFXController VIEW_CONTROLLER = new AnnotationViewFXController();
/**
* @param controller
* @param cssLocation
* @throws Exception
*/
/** Constructor. */
public AnnotationFxViewPart() throws Exception {
super(VIEW_CONTROLLER, null);
}
......
......@@ -20,6 +20,7 @@ import static java.util.stream.Collectors.toList;
import static javafx.scene.control.TreeSortMode.ALL_DESCENDANTS;
import static org.fortiss.tooling.kernel.ui.util.SelectionUtils.checkAndPickFirst;
import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType;
import static org.fortiss.tooling.kernel.utils.LoggingUtils.showWarning;
import java.util.ArrayList;
import java.util.Collection;
......@@ -55,17 +56,12 @@ import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.model.INamedCommentedElement;
import org.fortiss.tooling.kernel.service.IPersistencyService;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.SplitPane;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableCell;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.cell.ComboBoxTreeTableCell;
import javafx.util.Callback;
/**
*
......@@ -75,26 +71,17 @@ import javafx.util.Callback;
public class AnnotationViewFXController extends CompositeFXControllerBase<SplitPane, Node>
implements ISelectionListener {
/** */
@FXML
private SplitPane annotationSplitPane;
/** */
@FXML
private TreeTableView<AnnotationEntry> annotationTreeTableView;
/** */
private DynamicTreeTableViewer<AnnotationEntry> annotationTreeViewer;
private DynamicTreeTableViewer<AnnotationEntry> annotationViewer;
/** */
private IModelElement selectedElement;
/** */
private DynamicTreeContentProviderBase<AnnotationEntry> contentProvider = new AnnotationTableContentProvider();
/** */
private DynamicTreeTableUIProviderBase<AnnotationEntry> uiProvider = new AnnotationTreeTableUIProvider();
/**
* Associates the handles of the annotations with their ordered column indexes.
* Used for the UI providers of cell items.
......@@ -135,13 +122,13 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
// Collect the annotation entries for all elements.
EList<IModelElement> childElements = getChildrenWithType(selectedElement, IModelElement.class);
ArtificialRoot root = new ArtificialRoot(selectedElement);
ArtificialRoot rootElement = new ArtificialRoot(selectedElement);
for (IModelElement elem : childElements) {
AnnotationEntry entry = IAnnotationValueService.getInstance().getAnnotationEntry(elem);
if (entry != null && !entry.getSpecificationsList().isEmpty()) {
root.elements.add(entry);
rootElement.elements.add(entry);
}
}
......@@ -166,11 +153,13 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
// The DynamicTreeTableViewer needs to be created new, as the root is different.
boolean showRoot = false;
int revealLevel = 1;
annotationTreeViewer = new DynamicTreeTableViewer<AnnotationEntry>(annotationTreeTableView, root, showRoot,
DynamicTreeTableUIProviderBase<AnnotationEntry> uiProvider = new AnnotationTreeTableUIProvider();
DynamicTreeContentProviderBase<AnnotationEntry> contentProvider = new AnnotationTableContentProvider();
annotationViewer = new DynamicTreeTableViewer<AnnotationEntry>(annotationTreeTableView, rootElement, showRoot,
revealLevel, contentProvider, uiProvider);
annotationTreeViewer.addColumn("Model Element", 200);
annotationTreeViewer.addColumn("Comment", 250);
annotationViewer.addColumn("Model Element", 200);
annotationViewer.addColumn("Comment", 250);
int columnIdx = 2;
for (ColumnHandle<IAnnotatedSpecification> handle : sortedColumnHandles) {
......@@ -194,44 +183,39 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
String columnName = valueProvider.getAnnotationName(specification);
TreeTableColumn<AnnotationEntry, String> column = annotationTreeViewer.addColumn(columnName, 150);
colIdxAnnotationMap.put(columnIdx, handle);
TreeTableColumn<AnnotationEntry, String> column = null;
// Case distinction for the cell factory depending on the type to be edited.
if (valueType == null) {
column = annotationViewer.addColumn(columnName, 150);
column.setEditable(false);
return;
}
column.setEditable(true);
// Case distinction for the cell factory depending on the type to be edited.
if (valueType instanceof EEnum) {
ObservableList<String> items = FXCollections.observableArrayList();
Callback<TreeTableColumn<AnnotationEntry, String>, TreeTableCell<AnnotationEntry, String>> comboCellFactory = ComboBoxTreeTableCell
.forTreeTableColumn(items);
column.setCellFactory(comboCellFactory);
column.setOnEditStart(event -> {
// We need to get the type for every row individually, as it might be different
// Enums for every row.
TreeItem<AnnotationEntry> treeItem = event.getRowValue();
AnnotationEntry rowEntry = treeItem.getValue();
return;
} else if (valueType instanceof EEnum) {
// Add a combo column for enumerations.
column = annotationViewer.addComboColumn(columnName, 150, rowEntry -> {
ValueProviderBase<IAnnotatedSpecification> annotationValueProvider = (ValueProviderBase<IAnnotatedSpecification>) rowEntry
.getAnnotationValueProvider(annotationClass);
EStructuralFeatureDescriptor structuralFeature = annotationValueProvider
.getEStructuralFeatureDescriptor();
EClassifier type = structuralFeature.getEType(rowEntry.getSpecification(annotationClass));
// Get the enum literals again, as it might be different for each row.
if (type instanceof EEnum) {
EList<EEnumLiteral> allLiterals = ((EEnum) type).getELiterals();
items.clear();
items.addAll(allLiterals.stream().map(l -> l.getLiteral()).collect(toList()));
return allLiterals.stream().map(l -> l.getLiteral()).collect(toList());
}
return emptyList();
});
} else if (valueType.getInstanceClass().equals(Boolean.class)) {
System.out.println(valueType);
// Use a checkbox column for booleans
annotationViewer.addCheckboxColumn(columnName, 100);
} else {
// For all other types, there is text editing.
column = annotationViewer.addColumn(columnName, 150);
column.setCellFactory(ttColumn -> new DynamicTextFieldTreeTableCell<AnnotationEntry>() {
protected boolean canEdit(AnnotationEntry element) {
// We start editing only, if this cell is supposed to be editable.
......@@ -249,19 +233,23 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
});
}
column.setOnEditCommit(event -> {
TreeItem<AnnotationEntry> treeItem = event.getRowValue();
AnnotationEntry rowEntry = treeItem.getValue();
String newValue = event.getNewValue();
if (column != null) {
column.setEditable(true);
setAnnotationEntryValue(specification, rowEntry, newValue);
});
column.setOnEditCommit(event -> {
TreeItem<AnnotationEntry> treeItem = event.getRowValue();
AnnotationEntry rowEntry = treeItem.getValue();
String newValue = event.getNewValue();
column.setOnEditCancel(event -> {
System.out.println(event);
});
setAnnotationEntryValue(specification, rowEntry, newValue);
});
}
}
/**
* Local helper to set the given newValue for the given annotationEntry and
* specification.
*/
private void setAnnotationEntryValue(IAnnotatedSpecification specification, AnnotationEntry annotationEntry,
String newValue) {
ITopLevelElement tle = IPersistencyService.getInstance().getTopLevelElementFor(selectedElement);
......@@ -270,8 +258,7 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
try {
annotationEntry.setSpecificationValue(newValue, specification.getClass());
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
showWarning("Problem during setting an AnnotationValue: \n" + e1.getStackTrace());
}
});
}
......
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