blob: 803eb00de5e1be62491591146768dc7f0eedd856 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Lucas Koehler - initial API and implementation
******************************************************************************/
package org.eclipse.emf.ecp.view.treemasterdetail.fx;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecp.util.fx.EMFUtil;
import org.eclipse.emf.ecp.view.model.fx.ECPFXView;
import org.eclipse.emf.ecp.view.model.fx.ECPFXViewRenderer;
import org.eclipse.emf.ecp.view.model.internal.fx.GridCellFX;
import org.eclipse.emf.ecp.view.model.internal.fx.GridDescriptionFX;
import org.eclipse.emf.ecp.view.model.internal.fx.GridDescriptionFXFactory;
import org.eclipse.emf.ecp.view.model.internal.fx.RendererFX;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.model.VElement;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emf.ecp.view.treemasterdetail.model.VTreeMasterDetail;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.fx.emf.edit.ui.AdapterFactoryCellFactory.ICellUpdateListener;
import org.eclipse.fx.emf.edit.ui.AdapterFactoryTreeCellFactory;
import org.eclipse.fx.emf.edit.ui.AdapterFactoryTreeItem;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Node;
import javafx.scene.control.Cell;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.util.Callback;
// TODO api
@SuppressWarnings("restriction")
public class TreeMasterDetailRendererFX extends RendererFX<VTreeMasterDetail> {
/**
* Default constructor.
*
* @param vElement the {@link VElement} to be rendered
* @param viewContext the {@link ViewModelContext} to use
* @param reportService The {@link ReportService} to use
*/
public TreeMasterDetailRendererFX(VTreeMasterDetail vElement, ViewModelContext viewContext,
ReportService reportService) {
super(vElement, viewContext, reportService);
}
private GridDescriptionFX gridDescription;
@Override
public GridDescriptionFX getGridDescription() {
if (gridDescription == null) {
gridDescription = GridDescriptionFXFactory.INSTANCE.createSimpleGrid(1, 1, this);
}
return gridDescription;
}
@Override
protected Node renderNode(GridCellFX gridCell) throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption {
final GridPane grid = new GridPane();
final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
final TreeView<Object> treeView = new TreeView<>();
final AdapterFactoryTreeItem rootItem = new AdapterFactoryTreeItem(
getViewModelContext().getDomainModel(), adapterFactory);
treeView.setRoot(rootItem);
treeView.setShowRoot(true);
final AdapterFactoryTreeCellFactory cellFactory = new AdapterFactoryTreeCellFactory(
adapterFactory);
final ContextMenu createItemsContextMenu = new ContextMenu();
cellFactory.addCellUpdateListener(new ICellUpdateListener() {
@Override
public void updateItem(Cell<?> cell, Object item, boolean empty) {
if (EObject.class.isInstance(item)) {
final MenuItem createChildrenMenu = EMFUtil
.getCreateChildrenMenu((EObject) item,
new Callback<Void, Void>() {
@Override
public Void call(Void param) {
treeView.selectionModelProperty()
.getValue().selectNext();
return null;
}
});
if (createChildrenMenu == null) {
return;
}
createItemsContextMenu.getItems().clear();
createItemsContextMenu.getItems().add(createChildrenMenu);
cell.setContextMenu(createItemsContextMenu);
}
}
});
treeView.setCellFactory(cellFactory);
final ScrollPane sp = new ScrollPane();
treeView.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<TreeItem<Object>>() {
@Override
public void changed(
ObservableValue<? extends TreeItem<Object>> ov,
TreeItem<Object> old_val, TreeItem<Object> new_val) {
ECPFXView render = null;
if (new_val.getValue() == getViewModelContext()
.getDomainModel()) {
final VTreeMasterDetail renderable = getVElement();
render = ECPFXViewRenderer.INSTANCE.render(
renderable.getDetailView(),
(EObject) new_val.getValue());
} else {
render = ECPFXViewRenderer.INSTANCE
.render((EObject) new_val.getValue());
}
final GridPane node = (GridPane) render.getFXNode();
sp.setContent(node);
node.prefWidthProperty().bind(
sp.widthProperty().subtract(2));
node.prefHeightProperty().bind(
sp.heightProperty().subtract(2));
}
});
treeView.getSelectionModel().select(0);
grid.add(treeView, 0, 0);
grid.add(sp, 1, 0);
GridPane.setHgrow(sp, Priority.ALWAYS);
GridPane.setVgrow(sp, Priority.ALWAYS);
GridPane.setVgrow(treeView, Priority.ALWAYS);
return grid;
}
}