blob: 57d7b9d99b455b47af5fe625338b845e3b942ef8 [file] [log] [blame]
//------------------------------------------------------------------------------
// 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.SWT;
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);
gc.setAntialias(SWT.ON);
gc.setTextAntialias(SWT.OFF);
gc.setAdvanced(true);
graphics = new SWTGraphics(gc);
graphics.setAntialias(SWT.ON);
graphics.setTextAntialias(SWT.OFF);
graphics.setAdvanced(true);
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
}
}