| /******************************************************************************* |
| * 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; |
| } |
| |
| } |