//------------------------------------------------------------------------------ // 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.diagram.ui.viewer; 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.diagram.core.figures.WidenedWrapLabel; import org.eclipse.epf.diagram.model.Diagram; 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.uma.BreakdownElement; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.Process; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartFactory; 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.Color; 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 * @author Shashidhar Kannoori * @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 */ public 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 image from figure created in loadDiagram method. * */ public Image createDiagramImage() { IFigure figure = getFigure(); IFigure borderItemAwareFreeFormLayer = (IFigure) figure.getChildren() .get(0); IFigure tempFigure = (IFigure) borderItemAwareFreeFormLayer .getChildren().get(0); List defaultSizeNodeFigureList = null; if (tempFigure != null) defaultSizeNodeFigureList = tempFigure.getChildren(); for (int i = 0; i < defaultSizeNodeFigureList.size(); i++) { IFigure activityNodeFigure = null; if (defaultSizeNodeFigureList.get(i) != null) activityNodeFigure = (IFigure) ((IFigure) defaultSizeNodeFigureList .get(i)).getChildren().get(0); IFigure widenedWrapLabel = null; if (activityNodeFigure != null) { List children = ((IFigure) activityNodeFigure).getChildren(); if (children != null && !children.isEmpty()) { widenedWrapLabel = (IFigure) activityNodeFigure .getChildren().get(0); if (widenedWrapLabel instanceof WidenedWrapLabel) { widenedWrapLabel.setForegroundColor(new Color(null, 0, 0, 0)); } } } } 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(); } EditPart editPart = graphicalViewer.getContents(); if (editPart != null) { editPart.setModel(null); } 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 } public abstract DiagramInfo getDiagramInfo(); public abstract EditPart loadDiagram(Object wrapper, boolean needReset, IFilter filter, Suppression sup); public abstract void setMethodConfiguration(MethodConfiguration config); }