/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.vpm.view.widget; import java.util.Hashtable; import java.util.logging.Logger; import org.openflexo.fge.ConnectorGraphicalRepresentation; import org.openflexo.fge.DefaultDrawing; import org.openflexo.fge.GraphicalRepresentation; import org.openflexo.fge.ShapeGraphicalRepresentation; import org.openflexo.foundation.DataModification; import org.openflexo.foundation.FlexoObservable; import org.openflexo.foundation.GraphicalFlexoObserver; import org.openflexo.foundation.viewpoint.ConnectorPatternRole; import org.openflexo.foundation.viewpoint.EditionPattern; import org.openflexo.foundation.viewpoint.PatternRole; import org.openflexo.foundation.viewpoint.ShapePatternRole; public class EditionPatternPreviewRepresentation extends DefaultDrawing<EditionPattern> implements GraphicalFlexoObserver, EditionPatternPreviewConstants { private static final Logger logger = Logger.getLogger(EditionPatternPreviewRepresentation.class.getPackage().getName()); private EditionPatternPreviewShemaGR graphicalRepresentation; private Boolean ignoreNotifications = true; private Hashtable<PatternRole, EditionPatternPreviewShapeGR> shapesGR; private Hashtable<PatternRole, EditionPatternPreviewConnectorGR> connectorsGR; public EditionPatternPreviewRepresentation(EditionPattern anEditionPattern) { super(anEditionPattern); shapesGR = new Hashtable<PatternRole, EditionPatternPreviewShapeGR>(); connectorsGR = new Hashtable<PatternRole, EditionPatternPreviewConnectorGR>(); fromArtifacts = new Hashtable<PatternRole, ConnectorFromArtifact>(); toArtifacts = new Hashtable<PatternRole, ConnectorToArtifact>(); anEditionPattern.addObserver(this); updateGraphicalObjectsHierarchy(); ignoreNotifications = false; } @Override public void delete() { if (graphicalRepresentation != null) { graphicalRepresentation.delete(); } if (getEditionPattern() != null) { getEditionPattern().deleteObserver(this); } for (PatternRole role : getEditionPattern().getPatternRoles()) { role.deleteObserver(this); } super.delete(); } @Override protected void beginUpdateObjectHierarchy() { ignoreNotifications = true; super.beginUpdateObjectHierarchy(); } @Override protected void endUpdateObjectHierarchy() { super.endUpdateObjectHierarchy(); ignoreNotifications = false; } protected boolean ignoreNotifications() { if (ignoreNotifications == null) { return true; } return ignoreNotifications; } @Override protected void buildGraphicalObjectsHierarchy() { for (PatternRole role : getEditionPattern().getPatternRoles()) { if (role instanceof ShapePatternRole) { if (((ShapePatternRole) role).getParentShapeAsDefinedInAction()) { addDrawable(role, getEditionPattern()); // System.out.println("Add shape " + role.getPatternRoleName() + " under EditionPattern"); } else { addDrawable(role, ((ShapePatternRole) role).getParentShapePatternRole()); // System.out.println("Add shape " + role.getPatternRoleName() + " under " // + ((ShapePatternRole) role).getParentShapePatternRole().getPatternRoleName()); } } } for (PatternRole role : getEditionPattern().getPatternRoles()) { if (role instanceof ConnectorPatternRole) { if (((ConnectorPatternRole) role).getStartShapePatternRole() == null) { addDrawable(getFromArtifact((ConnectorPatternRole) role), getEditionPattern()); // System.out.println("Add From artifact under EditionPattern"); } if (((ConnectorPatternRole) role).getEndShapePatternRole() == null) { addDrawable(getToArtifact((ConnectorPatternRole) role), getEditionPattern()); // System.out.println("Add To artifact under EditionPattern"); } // System.out.println("Add connector " + role.getPatternRoleName() + " under EditionPattern"); addDrawable(role, getEditionPattern()); } } } public EditionPattern getEditionPattern() { return getModel(); } @Override public EditionPatternPreviewShemaGR getDrawingGraphicalRepresentation() { if (graphicalRepresentation == null) { graphicalRepresentation = new EditionPatternPreviewShemaGR(this); } return graphicalRepresentation; } @SuppressWarnings("unchecked") @Override public <O> GraphicalRepresentation<O> retrieveGraphicalRepresentation(O aDrawable) { if (aDrawable instanceof PatternRole) { PatternRole patternRole = (PatternRole) aDrawable; if (patternRole instanceof ShapePatternRole) { EditionPatternPreviewShapeGR returned = shapesGR.get(patternRole); if (returned == null || returned.isDeleted()) { returned = buildGraphicalRepresentationForShape((ShapePatternRole) patternRole); shapesGR.put(patternRole, returned); return (GraphicalRepresentation<O>) returned; } return (GraphicalRepresentation<O>) returned; } else if (patternRole instanceof ConnectorPatternRole) { EditionPatternPreviewConnectorGR returned = connectorsGR.get(patternRole); if (returned == null || returned.isDeleted()) { returned = buildGraphicalRepresentationForConnector((ConnectorPatternRole) patternRole); connectorsGR.put(patternRole, returned); return (GraphicalRepresentation<O>) returned; } return (GraphicalRepresentation<O>) returned; } } else if (aDrawable instanceof ConnectorFromArtifact) { ConnectorFromArtifact connector = (ConnectorFromArtifact) aDrawable; return (GraphicalRepresentation<O>) connector.getGraphicalRepresentation(); } else if (aDrawable instanceof ConnectorToArtifact) { ConnectorToArtifact connector = (ConnectorToArtifact) aDrawable; return (GraphicalRepresentation<O>) connector.getGraphicalRepresentation(); } logger.warning("Cannot build GraphicalRepresentation for " + aDrawable); return null; } private EditionPatternPreviewShapeGR buildGraphicalRepresentationForShape(ShapePatternRole patternRole) { // System.out.println("Build new EditionPatternPreviewShapeGR for shape " + patternRole.getPatternRoleName()); patternRole.addObserver(this); if (patternRole.getGraphicalRepresentation() instanceof ShapeGraphicalRepresentation) { EditionPatternPreviewShapeGR graphicalRepresentation = new EditionPatternPreviewShapeGR(patternRole, this); ((ShapeGraphicalRepresentation<?>) patternRole.getGraphicalRepresentation()).setValidated(false); graphicalRepresentation.setsWith((GraphicalRepresentation<?>) patternRole.getGraphicalRepresentation(), GraphicalRepresentation.Parameters.text); patternRole._setGraphicalRepresentationNoNotification(graphicalRepresentation); return graphicalRepresentation; } EditionPatternPreviewShapeGR graphicalRepresentation = new EditionPatternPreviewShapeGR(patternRole, this); patternRole._setGraphicalRepresentationNoNotification(graphicalRepresentation); return graphicalRepresentation; } private EditionPatternPreviewConnectorGR buildGraphicalRepresentationForConnector(ConnectorPatternRole patternRole) { // System.out.println("Build new EditionPatternPreviewConnectorGR for connector " + patternRole.getPatternRoleName()); // System.out.println("start shape = " + getStartShape(patternRole)); // System.out.println("end shape = " + getEndShape(patternRole)); patternRole.addObserver(this); if (patternRole.getGraphicalRepresentation() instanceof ConnectorGraphicalRepresentation) { EditionPatternPreviewConnectorGR graphicalRepresentation = new EditionPatternPreviewConnectorGR(patternRole, this); ((ConnectorGraphicalRepresentation<?>) patternRole.getGraphicalRepresentation()).setValidated(false); graphicalRepresentation.setsWith((ConnectorGraphicalRepresentation<?>) patternRole.getGraphicalRepresentation(), GraphicalRepresentation.Parameters.text); patternRole._setGraphicalRepresentationNoNotification(graphicalRepresentation); return graphicalRepresentation; } EditionPatternPreviewConnectorGR graphicalRepresentation = new EditionPatternPreviewConnectorGR(patternRole, this); patternRole._setGraphicalRepresentationNoNotification(graphicalRepresentation); return graphicalRepresentation; } @Override public void update(FlexoObservable observable, DataModification dataModification) { if (ignoreNotifications()) { return; } updateGraphicalObjectsHierarchy(); } protected ConnectorFromArtifact getFromArtifact(ConnectorPatternRole connector) { ConnectorFromArtifact returned = fromArtifacts.get(connector); if (returned == null) { returned = new ConnectorFromArtifact(connector); fromArtifacts.put(connector, returned); } return returned; } protected ConnectorToArtifact getToArtifact(ConnectorPatternRole connector) { ConnectorToArtifact returned = toArtifacts.get(connector); if (returned == null) { returned = new ConnectorToArtifact(connector); toArtifacts.put(connector, returned); } return returned; } private Hashtable<PatternRole, ConnectorFromArtifact> fromArtifacts; private Hashtable<PatternRole, ConnectorToArtifact> toArtifacts; protected class ConnectorFromArtifact { private EditionPatternConnectorFromArtefactGR gr; private ConnectorPatternRole connector; protected ConnectorFromArtifact(ConnectorPatternRole aConnector) { connector = aConnector; gr = null; } protected EditionPatternConnectorFromArtefactGR getGraphicalRepresentation() { if (gr == null || gr.isDeleted()) { gr = new EditionPatternConnectorFromArtefactGR(this, EditionPatternPreviewRepresentation.this); if (connector.getArtifactFromGraphicalRepresentation() instanceof ShapeGraphicalRepresentation) { GraphicalRepresentation<?> storedGR = (GraphicalRepresentation<?>) connector.getArtifactFromGraphicalRepresentation(); gr.setsWith(storedGR, GraphicalRepresentation.Parameters.text); } connector.setArtifactFromGraphicalRepresentation(gr); } return gr; } } protected class ConnectorToArtifact { private EditionPatternConnectorToArtefactGR gr; private ConnectorPatternRole connector; protected ConnectorToArtifact(ConnectorPatternRole aConnector) { connector = aConnector; gr = null; } protected EditionPatternConnectorToArtefactGR getGraphicalRepresentation() { if (gr == null || gr.isDeleted()) { gr = new EditionPatternConnectorToArtefactGR(this, EditionPatternPreviewRepresentation.this); if (connector.getArtifactToGraphicalRepresentation() instanceof ShapeGraphicalRepresentation) { gr.setsWith((GraphicalRepresentation<?>) connector.getArtifactToGraphicalRepresentation(), GraphicalRepresentation.Parameters.text); } connector.setArtifactToGraphicalRepresentation(gr); } return gr; } } protected ShapeGraphicalRepresentation<?> getStartShape(ConnectorPatternRole connector) { Object startShape = connector.getStartShapePatternRole(); if (startShape == null) { startShape = getFromArtifact(connector); } return (ShapeGraphicalRepresentation<?>) getGraphicalRepresentation(startShape); } protected ShapeGraphicalRepresentation<?> getEndShape(ConnectorPatternRole connector) { Object endShape = connector.getEndShapePatternRole(); if (endShape == null) { endShape = getToArtifact(connector); } return (ShapeGraphicalRepresentation<?>) getGraphicalRepresentation(endShape); } }