/** * <copyright> * * Copyright (c) 2012, 2012 SAP AG. * 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 * * Contributors: * SAP AG - initial API, implementation and documentation * cbrand - Bug 382928 - Introduce factory method(s) for easier gradient creation * * </copyright> */ package org.eclipse.graphiti.examples.filesystem.patterns; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.graphiti.examples.filesystem.ui.FilesystemPredefinedColoredAreas; import org.eclipse.graphiti.examples.mm.filesystem.Filesystem; import org.eclipse.graphiti.examples.mm.filesystem.FilesystemFactory; import org.eclipse.graphiti.features.IReason; import org.eclipse.graphiti.features.context.IAddContext; import org.eclipse.graphiti.features.context.ICreateContext; import org.eclipse.graphiti.features.context.IDirectEditingContext; import org.eclipse.graphiti.features.context.ILayoutContext; import org.eclipse.graphiti.features.context.IUpdateContext; import org.eclipse.graphiti.features.impl.Reason; import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm; import org.eclipse.graphiti.mm.algorithms.Rectangle; import org.eclipse.graphiti.mm.algorithms.Text; import org.eclipse.graphiti.mm.algorithms.styles.Orientation; import org.eclipse.graphiti.mm.pictograms.ContainerShape; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.mm.pictograms.Shape; import org.eclipse.graphiti.pattern.AbstractPattern; import org.eclipse.graphiti.pattern.IPattern; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.services.IGaService; import org.eclipse.graphiti.services.IPeCreateService; public class FilesystemPattern extends AbstractPattern implements IPattern { public FilesystemPattern() { super(null); } @Override public String getCreateName() { return "Filesystem"; } @Override public boolean isMainBusinessObjectApplicable(Object mainBusinessObject) { return mainBusinessObject instanceof Filesystem; } @Override protected boolean isPatternControlled(PictogramElement pictogramElement) { Object domainObject = getBusinessObjectForPictogramElement(pictogramElement); return isMainBusinessObjectApplicable(domainObject); } @Override protected boolean isPatternRoot(PictogramElement pictogramElement) { Object domainObject = getBusinessObjectForPictogramElement(pictogramElement); return isMainBusinessObjectApplicable(domainObject); } @Override public boolean canCreate(ICreateContext context) { return context.getTargetContainer() instanceof Diagram; } @Override public Object[] create(ICreateContext context) { Filesystem newFilesystem = FilesystemFactory.eINSTANCE.createFilesystem(); newFilesystem.setName(createNewName()); getDiagram().eResource().getContents().add(newFilesystem); addGraphicalRepresentation(context, newFilesystem); return new Object[] { newFilesystem }; } @Override public boolean canAdd(IAddContext context) { return context.getNewObject() instanceof Filesystem && context.getTargetContainer() instanceof Diagram; } @Override public PictogramElement add(IAddContext context) { Diagram targetDiagram = (Diagram) context.getTargetContainer(); Filesystem addedDomainObject = (Filesystem) context.getNewObject(); IPeCreateService peCreateService = Graphiti.getPeCreateService(); IGaService gaService = Graphiti.getGaService(); // Outer container (invisible) ContainerShape outerContainerShape = peCreateService.createContainerShape(targetDiagram, true); Rectangle outerRectangle = gaService.createInvisibleRectangle(outerContainerShape); gaService.setLocationAndSize(outerRectangle, context.getX(), context.getY(), context.getWidth(), context.getHeight()); // Register tab Rectangle registerRectangle = gaService.createRectangle(outerRectangle); gaService.setLocationAndSize(registerRectangle, 0, 0, 20, 20); registerRectangle.setFilled(true); gaService.setRenderingStyle(registerRectangle, FilesystemPredefinedColoredAreas.getLightGrayAdaptions()); // Main contents area Rectangle mainRectangle = gaService.createRectangle(outerRectangle); setLocationAndSizeOfMainContentsArea(outerRectangle, mainRectangle); mainRectangle.setFilled(true); gaService.setRenderingStyle(mainRectangle, FilesystemPredefinedColoredAreas.getLightGrayAdaptions()); // Folder name Shape shape = peCreateService.createShape(outerContainerShape, false); Text text = gaService.createText(shape, addedDomainObject.getName()); text.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER); text.setVerticalAlignment(Orientation.ALIGNMENT_CENTER); setLocationAndSizeOfTextArea(outerRectangle, text); peCreateService.createChopboxAnchor(outerContainerShape); link(outerContainerShape, addedDomainObject); return outerContainerShape; } @Override public boolean canLayout(ILayoutContext context) { return context.getPictogramElement() instanceof ContainerShape && getBusinessObjectForPictogramElement(context.getPictogramElement()) instanceof Filesystem; } @Override public boolean layout(ILayoutContext context) { boolean changesDone = false; PictogramElement pictogramElement = context.getPictogramElement(); if (pictogramElement instanceof ContainerShape) { ContainerShape outerContainerShape = (ContainerShape) pictogramElement; GraphicsAlgorithm outerGraphicsAlgorithm = outerContainerShape.getGraphicsAlgorithm(); if (outerGraphicsAlgorithm instanceof Rectangle) { Rectangle outerRectangle = (Rectangle) outerGraphicsAlgorithm; // Adapt size of main contents area EList<GraphicsAlgorithm> graphicsAlgorithmChildren = outerRectangle.getGraphicsAlgorithmChildren(); if (graphicsAlgorithmChildren.size() > 1) { GraphicsAlgorithm graphicsAlgorithm = graphicsAlgorithmChildren.get(1); if (graphicsAlgorithm instanceof Rectangle) { setLocationAndSizeOfMainContentsArea(outerRectangle, (Rectangle) graphicsAlgorithm); changesDone = true; } } } } // Adapt size and location of text field Rectangle outerRectangle = getOuterRectangle(pictogramElement); Text nameText = getNameText(pictogramElement); if (outerRectangle != null && nameText != null) { setLocationAndSizeOfTextArea(outerRectangle, nameText); changesDone = true; } return changesDone; } @Override public IReason updateNeeded(IUpdateContext context) { Text nameText = getNameText(context.getPictogramElement()); Filesystem domainObject = (Filesystem) getBusinessObjectForPictogramElement(context.getPictogramElement()); if (domainObject.getName() == null || !domainObject.getName().equals(nameText.getValue())) { return Reason.createTrueReason("Name differs. Expected: '" + domainObject.getName() + "'"); } return Reason.createFalseReason(); } @Override public boolean update(IUpdateContext context) { Text nameText = getNameText(context.getPictogramElement()); Filesystem domainObject = (Filesystem) getBusinessObjectForPictogramElement(context.getPictogramElement()); nameText.setValue(domainObject.getName()); return true; } @Override public int getEditingType() { return TYPE_TEXT; } @Override public boolean canDirectEdit(IDirectEditingContext context) { Object domainObject = getBusinessObjectForPictogramElement(context.getPictogramElement()); GraphicsAlgorithm ga = context.getGraphicsAlgorithm(); if (domainObject instanceof Filesystem && ga instanceof Text) { return true; } return false; } @Override public String getInitialValue(IDirectEditingContext context) { Filesystem filesystem = (Filesystem) getBusinessObjectForPictogramElement(context.getPictogramElement()); return filesystem.getName(); } @Override public String checkValueValid(String value, IDirectEditingContext context) { if (value == null || value.length() == 0) { return "Folder name must not be empty"; } Filesystem filesystem = (Filesystem) getBusinessObjectForPictogramElement(context.getPictogramElement()); EList<Shape> children = getDiagram().getChildren(); for (Shape child : children) { Object domainObject = getBusinessObjectForPictogramElement(child); if (domainObject instanceof Filesystem) { if (!domainObject.equals(filesystem) && value.equals(((Filesystem) domainObject).getName())) { return "A filesystem with name '" + ((Filesystem) domainObject).getName() + "' already exists."; } } } return null; } @Override public void setValue(String value, IDirectEditingContext context) { Filesystem filesystem = (Filesystem) getBusinessObjectForPictogramElement(context.getPictogramElement()); filesystem.setName(value); updatePictogramElement(context.getPictogramElement()); } private void setLocationAndSizeOfMainContentsArea(Rectangle outerRectangle, Rectangle mainRectangle) { Graphiti.getGaService().setLocationAndSize(mainRectangle, 0, 10, outerRectangle.getWidth(), outerRectangle.getHeight() - 10); } private void setLocationAndSizeOfTextArea(Rectangle outerRectangle, Text text) { Graphiti.getGaService().setLocationAndSize(text, 0, 10, outerRectangle.getWidth(), outerRectangle.getHeight() - 10); } private Rectangle getOuterRectangle(PictogramElement pictogramElement) { if (pictogramElement instanceof ContainerShape) { ContainerShape outerContainerShape = (ContainerShape) pictogramElement; GraphicsAlgorithm outerGraphicsAlgorithm = outerContainerShape.getGraphicsAlgorithm(); if (outerGraphicsAlgorithm instanceof Rectangle) { return (Rectangle) outerGraphicsAlgorithm; } } return null; } private Text getNameText(PictogramElement pictogramElement) { if (pictogramElement instanceof ContainerShape) { ContainerShape outerContainerShape = (ContainerShape) pictogramElement; GraphicsAlgorithm outerGraphicsAlgorithm = outerContainerShape.getGraphicsAlgorithm(); if (outerGraphicsAlgorithm instanceof Rectangle) { EList<Shape> children = outerContainerShape.getChildren(); if (children.size() > 0) { Shape shape = children.get(0); GraphicsAlgorithm graphicsAlgorithm = shape.getGraphicsAlgorithm(); if (graphicsAlgorithm instanceof Text) { return (Text) graphicsAlgorithm; } } } } return null; } private String createNewName() { String initialName = "NewFilesystem"; String name = initialName; int number = 0; while (findFilesystem(name) != null) { number++; name = initialName + number; } return name; } private Filesystem findFilesystem(String name) { EList<EObject> contents = getDiagram().eResource().getContents(); for (EObject eObject : contents) { if (eObject instanceof Filesystem) { if (name.equals(((Filesystem) eObject).getName())) { return (Filesystem) eObject; } } } return null; } }