/******************************************************************************* * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package com.cisco.yangide.ext.model.editor.editors; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.text.FlowPage; import org.eclipse.draw2d.text.TextFlow; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.EditPart; import org.eclipse.gef.KeyHandler; import org.eclipse.gef.Tool; import org.eclipse.gef.dnd.TemplateTransferDragSourceListener; import org.eclipse.gef.internal.ui.palette.editparts.DetailedLabelFigure; import org.eclipse.gef.tools.ConnectionCreationTool; import org.eclipse.gef.tools.CreationTool; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.ui.editor.DefaultPaletteBehavior; import org.eclipse.graphiti.ui.editor.DiagramBehavior; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import com.cisco.yangide.ext.model.ModelPackage; import com.cisco.yangide.ext.model.editor.util.YangModelUtil; /** * @author Konstantin Zaitsev * @date Aug 29, 2014 */ @SuppressWarnings("restriction") public class YangPaletteBehavior extends DefaultPaletteBehavior { private Map<String, EClass> toolEClassMap; private IFigure rootFigure; public YangPaletteBehavior(DiagramBehavior diagramBehavior) { super(diagramBehavior); toolEClassMap = new HashMap<>(); toolEClassMap.put("grouping", ModelPackage.Literals.GROUPING); toolEClassMap.put("container", ModelPackage.Literals.CONTAINER); toolEClassMap.put("rpc", ModelPackage.Literals.RPC); toolEClassMap.put("input", ModelPackage.Literals.RPC_IO); toolEClassMap.put("output", ModelPackage.Literals.RPC_IO); toolEClassMap.put("notification", ModelPackage.Literals.NOTIFICATION); toolEClassMap.put("augment", ModelPackage.Literals.AUGMENT); toolEClassMap.put("list", ModelPackage.Literals.LIST); toolEClassMap.put("choice", ModelPackage.Literals.CHOICE); toolEClassMap.put("case", ModelPackage.Literals.CHOICE_CASE); toolEClassMap.put("leaf", ModelPackage.Literals.LEAF); toolEClassMap.put("anyxml", ModelPackage.Literals.ANYXML); toolEClassMap.put("uses", ModelPackage.Literals.USES); toolEClassMap.put("deviation", ModelPackage.Literals.DEVIATION); toolEClassMap.put("extension", ModelPackage.Literals.EXTENSION); toolEClassMap.put("feature", ModelPackage.Literals.FEATURE); toolEClassMap.put("identity", ModelPackage.Literals.IDENTITY); toolEClassMap.put("leaf list", ModelPackage.Literals.LEAF_LIST); toolEClassMap.put("typedef", ModelPackage.Literals.TYPEDEF); } @Override protected PaletteViewerProvider createPaletteViewerProvider() { return new PaletteViewerProvider(diagramBehavior.getEditDomain()) { private KeyHandler paletteKeyHandler = null; @Override public PaletteViewer createPaletteViewer(Composite parent) { PaletteViewer pViewer = new PaletteViewer() { @Override protected void setRootFigure(IFigure figure) { super.setRootFigure(figure); rootFigure = figure; } }; pViewer.createControl(parent); configurePaletteViewer(pViewer); hookPaletteViewer(pViewer); return pViewer; } @Override protected void configurePaletteViewer(PaletteViewer viewer) { super.configurePaletteViewer(viewer); viewer.getKeyHandler().setParent(getPaletteKeyHandler()); viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer)); } /** * @return Palette Key Handler for the palette */ private KeyHandler getPaletteKeyHandler() { if (paletteKeyHandler == null) { paletteKeyHandler = new KeyHandler() { /** * Processes a <i>key released </i> event. This method is called by the Tool * whenever a key is released, and the Tool is in the proper state. * Overridden to support pressing the enter key to create a shape or * connection (between two selected shapes) * * @param event the KeyEvent * @return <code>true</code> if KeyEvent was handled in some way */ @Override public boolean keyReleased(KeyEvent event) { if (event.keyCode == SWT.Selection) { Tool tool = getEditDomain().getPaletteViewer().getActiveTool().createTool(); if (tool instanceof CreationTool || tool instanceof ConnectionCreationTool) { tool.keyUp(event, diagramBehavior.getDiagramContainer().getGraphicalViewer()); // Deactivate current selection getEditDomain().getPaletteViewer().setActiveTool(null); return true; } } return super.keyReleased(event); } }; } return paletteKeyHandler; } }; } public void updateSelection(ISelection selection) { EClass container = null; if (selection != null && selection instanceof StructuredSelection && ((StructuredSelection) selection).size() == 1) { EditPart editPart = (EditPart) ((StructuredSelection) selection).getFirstElement(); if (editPart.getModel() != null && editPart.getModel() instanceof PictogramElement) { PictogramElement model = (PictogramElement) editPart.getModel(); EObject eObject = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(model); if (eObject != null) { container = eObject.eClass(); } } } ArrayList<DetailedLabelFigure> list = new ArrayList<>(); aggregateToolFigures(rootFigure, list); for (DetailedLabelFigure figure : list) { if (container == null || getToolEClass(figure) == null) { figure.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); } else { if (YangModelUtil.compositeNodeMap.containsKey(container) && YangModelUtil.compositeNodeMap.get(container).contains(getToolEClass(figure))) { figure.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); } else { figure.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY)); } } figure.repaint(); } } private void aggregateToolFigures(IFigure parent, List<DetailedLabelFigure> list) { if (parent instanceof DetailedLabelFigure) { DetailedLabelFigure fig = (DetailedLabelFigure) parent; if (fig.getChildren().size() == 2 && fig.getChildren().get(1) instanceof FlowPage) { list.add(fig); } return; } if (parent.getChildren().size() > 0) { for (Object obj : parent.getChildren()) { aggregateToolFigures((IFigure) obj, list); } } } private EClass getToolEClass(DetailedLabelFigure figure) { TextFlow textFlow = ((TextFlow) ((FlowPage) figure.getChildren().get(1)).getChildren().get(0)); String text = textFlow.getText(); return toolEClassMap.get(text); } }