//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation 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 // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.authoring.gef.viewer; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.SWTGraphics; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.epf.authoring.gef.edit.DiagramEditPart; import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart; import org.eclipse.epf.authoring.gef.figures.SelectableLabel; import org.eclipse.epf.diagram.model.Diagram; import org.eclipse.epf.diagram.model.LinkedObject; import org.eclipse.epf.diagram.model.NamedNode; import org.eclipse.epf.library.edit.IFilter; import org.eclipse.epf.library.edit.util.Suppression; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.library.layout.diagram.DiagramInfo; import org.eclipse.epf.library.util.ResourceHelper; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.BreakdownElement; import org.eclipse.epf.uma.DiagramElement; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.VariabilityElement; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartFactory; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; /** * The abstract base class for a graphical viewer of the element diagram. * * @author Jinhua Xi * @since 1.0 */ public abstract class AbstractDiagramGraphicalViewer { protected Composite parent; protected GraphicalViewer graphicalViewer; protected Object wrapper; public AbstractDiagramGraphicalViewer(Composite parent) { this.parent = parent; createGraphicalViewer(); } public AbstractDiagramGraphicalViewer(Composite parent, Object wrapper) { this.parent = parent; this.wrapper = wrapper; createGraphicalViewer(); } /** * Creates the GraphicalViewer on the specified <code>Composite</code> * */ protected void createGraphicalViewer() { this.graphicalViewer = new ScrollingGraphicalViewer(); this.graphicalViewer.createControl(parent); configureGraphicalViewer(); } /** * Returns the graphical viewer. * * @return the graphical viewer */ protected GraphicalViewer getGraphicalViewer() { return graphicalViewer; } protected void configureGraphicalViewer() { getGraphicalViewer().getControl().setBackground( ColorConstants.listBackground); ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer(); ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart(); viewer.setRootEditPart(root); viewer.setEditPartFactory(createEditPartFactory()); } protected IFigure getFigure() { GraphicalViewer viewer = getGraphicalViewer(); // find the figure to be saved LayerManager lm = (LayerManager) viewer.getEditPartRegistry().get( LayerManager.ID); IFigure figure = lm.getLayer(LayerConstants.PRINTABLE_LAYERS); return figure; } protected void setSuppressionToDiagram(Diagram diagram) { Object e = diagram.getObject(); if (e instanceof BreakdownElement) { Process proc = TngUtil.getOwningProcess((BreakdownElement) e); if (proc != null) { diagram.setSuppression(Suppression.getSuppression(proc)); } } } /** * Creates diagram for given object (only for {@link Activity} and packs the bounds. * * @param wrapper {@link Object} * @param needReset boolean * @param filter {@link IFilter} * @param sup {@link Suppression} */ public EditPart loadDiagram(Object wrapper, boolean needReset, IFilter filter, Suppression sup) { // initialize the viewer with the edit part EditPart editPart = createEditPart(wrapper, filter, sup); this.graphicalViewer.setContents(editPart); // ask for immediate update of the control so that the diagram figure // will be computed parent.pack(true); // This check is needed for browsing, in order to render activity contributing's // children. In processAuthoring we don't do realization, in order to displayed // realized elements, we have to cleanup ADD diagram and recreate. needtoReset or cleanupdiagram. // Only for activity detail diagram. Object o = TngUtil.unwrap(wrapper); if(o instanceof VariabilityElement && getDiagramType() != null && getDiagramType().equalsIgnoreCase(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL)){ if(TngUtil.hasContributor((VariabilityElement)o)){ needReset = true; } } if (needReset) { cleanUpDiagram(); } IFigure figure = getFigure(); if (figure != null) { Rectangle bounds = figure.getBounds(); //System.out.println("Before update: Diagram Bounds = " + bounds); //$NON-NLS-1$ if (bounds.x < 0 || bounds.y < 0) { ((DiagramEditPart) editPart).moveFigure(-bounds.x, -bounds.y); parent.pack(true); bounds = figure.getBounds(); //System.out.println("After update: Diagram Bounds = " + bounds); //$NON-NLS-1$ } } return editPart; } protected void loadDiagramInfo(GraphicalEditPart part, DiagramInfo diagramInfo) { List children = part.getChildren(); for (Iterator it = children.iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof NodeContainerEditPart) { loadDiagramInfo((GraphicalEditPart) o, diagramInfo); } else if (o instanceof GraphicalEditPart) { part = (GraphicalEditPart) o; Object model = part.getModel(); Object e = model; if (e instanceof LinkedObject) { e = ((LinkedObject) e).getObject(); } if (e instanceof DiagramElement) { continue; } if (e instanceof MethodElement) { boolean suppressed; if (model instanceof NamedNode) { suppressed = ((NamedNode) model).isSuppressed(); } else { suppressed = ((MethodElement) e).getSuppressed() .booleanValue(); } IFigure f = part.getFigure(); Rectangle bounds = f.getBounds(); String altTag = null; if (f instanceof SelectableLabel) { altTag = ((SelectableLabel) f).getText(); } diagramInfo.addArea((MethodElement) e, bounds.x, bounds.y, bounds.width, bounds.height, altTag, suppressed); } } else { // System.out.println("EditPart not handled: " + o); // //$NON-NLS-1$ } } } /** * returns {@link DiagramInfo} * */ public DiagramInfo getDiagramInfo() { DiagramInfo diagramInfo = null; GraphicalEditPart part = (GraphicalEditPart) this.graphicalViewer .getContents(); Object element = part.getModel(); if (element instanceof LinkedObject) { element = ((LinkedObject) element).getObject(); } if (element instanceof MethodElement) { diagramInfo = new DiagramInfo(getDiagramType(), (MethodElement) element); loadDiagramInfo(part, diagramInfo); } return diagramInfo; } /** * Creates diagram image from figure created in loadDiagram method. * */ public Image createDiagramImage() { IFigure figure = getFigure(); SWTGraphics graphics = null; GC gc = null; Image image = null; try { Rectangle bounds = figure.getBounds(); int height = bounds.height; int width = bounds.width; // create a new image and repaint the graph final Display display = Display.getDefault(); image = new Image(display, width, height); gc = new GC(image); graphics = new SWTGraphics(gc); figure.paint(graphics); } catch (Exception ex) { ex.printStackTrace(); } finally { // release resources if (graphics != null) graphics.dispose(); if (gc != null) gc.dispose(); } return image; } public void dispose() { try { if (graphicalViewer != null) { Control ctrl = graphicalViewer.getControl(); if (ctrl != null) { ctrl.dispose(); } graphicalViewer = null; } } catch (RuntimeException e) { e.printStackTrace(); } } protected abstract EditPartFactory createEditPartFactory(); protected abstract EditPart createEditPart(Object e, IFilter filter, Suppression sup); protected abstract String getDiagramType(); protected void cleanUpDiagram() { // default implementation does nothing } }