/*
* Licensed Materials - Property of Perforce Software, Inc.
* © Copyright Perforce Software, Inc. 2014, 2021
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
package ganttviewer.views;
import ganttviewer.GanttViewer;
import ganttviewer.util.GanttViewerLogger;
import ganttviewer.util.GanttViewerProperties;
import ganttviewer.util.PERTDiagram;
import ganttviewer.viewer.View;
import ganttviewer.viewer.Viewer;
import ganttviewer.viewer.exceptions.ViewException;
import ilog.views.IlvManagerViewInteractor;
import ilog.views.IlvPoint;
import ilog.views.IlvRect;
import ilog.views.IlvTransformer;
import ilog.views.event.InteractorListener;
import ilog.views.event.TransformerListener;
import ilog.views.gantt.IlvActivity;
import ilog.views.gantt.IlvGanttModel;
import ilog.views.gantt.IlvGanttModelUtil;
import ilog.views.gantt.event.SelectionEvent;
import ilog.views.gantt.event.SelectionListener;
import java.io.IOException;
import java.util.Iterator;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
/**
* <code>PERTView</code> is the dedicated PERT view.
*/
public class PERTView extends View implements SelectionListener {
private static final String PERT_DIAGRAM_IMPL_CLASS = "ganttviewer.pert.PERTDiagramImpl";
/**
* The PERT diagram.
*/
private PERTDiagram pertDiagram = null;
/**
* Initialization flag.
*/
private boolean initialized = false;
/**
* Builds a <code>PERTView</code>.
* @param viewer The viewer.
* @param iD The ID of the view.
* @param name The name of the view.
*/
public PERTView(Viewer viewer, String iD, String name) {
super(viewer, iD, name);
// create the PERT diagram
try {
Class<?> pertDiagramClass = Class
.forName(PERTView.PERT_DIAGRAM_IMPL_CLASS);
// Diagrammer is in the classpath.
pertDiagram = (PERTDiagram) pertDiagramClass.getDeclaredConstructor().newInstance();
pertDiagram.addSelectionListener(this);
} catch (Throwable th) {
// Diagrammer may not be in the classpath
pertDiagram = new WebPage();
}
// create the view.
setMainComponent((JComponent) pertDiagram);
}
/**
* Customizes the view before it is added.
* @param component The view to be added.
* @return The component to add.
*/
Override
protected JComponent mainComponentAboutToBeAdded(JComponent component) {
((PERTDiagram) component).initialize();
return component;
}
/**
* Attaches the Gantt data model to the view.
* @param model The Gantt data model.
*/
Override
protected void attachModel(Object model) {
pertDiagram.attachGanttModel((IlvGanttModel) model);
// apply default transformation
pertDiagram.setTransformer(getDefaultTransformer());
}
/**
* Indicates whether this view is stylable or not.
* @return <code>true</code>.
*/
Override
public boolean isStylable() {
return true;
}
/**
* Applies the style to this view.
* @param css The CSS.
*/
Override
public void applyStyle(String css) {
try {
pertDiagram.applyStyle(css);
} catch (Exception e) {
GanttViewerLogger.error(new ViewException(
"Unable to apply stylesheet to the PERT view", e));
}
}
/**
* Returns the default transformer.
* @return The transformer.
*/
Override
public IlvTransformer getDefaultTransformer() {
IlvRect rect = pertDiagram.boundingBox();
IlvRect visibleRect = pertDiagram.visibleRect();
if ((visibleRect.width == 0) || (visibleRect.height == 0)) {
return new IlvTransformer();
}
Iterator<IlvActivity> it = IlvGanttModelUtil
.activityPostorderIterator(pertDiagram.getGanttModel());
if (!it.hasNext()) {
return new IlvTransformer();
}
IlvActivity firstActivity = it.next();
IlvRect firstActivityBBox = pertDiagram.boundingBox(firstActivity);
// scroll to center the view on the first activity
double dy = -(firstActivityBBox.y + firstActivityBBox.height / 2 - visibleRect.height / 2);
IlvTransformer newTransformer = new IlvTransformer();
IlvTransformer.computeTransformer(new IlvRect(rect.x, rect.y,
visibleRect.width, visibleRect.height), new IlvRect(rect.x, dy,
visibleRect.width, visibleRect.height), newTransformer);
return newTransformer;
}
/**
* When the view is displayed, selects what has been selected in the previous view if possible.
*/
Override
public void setAsCurrentView() {
if (!initialized) {
// re-apply default transformation because it has not been
// done during GUI creation
pertDiagram.setTransformer(this.getDefaultTransformer());
initialized = true;
}
}
/**
* Activity selection implementation.
* @param obj The object to (de)select.
* @param selected The selection status.
*/
Override
protected void setSelectedImpl(Object obj, boolean selected) {
if (obj instanceof IlvActivity) {
pertDiagram.setSelected((IlvActivity) obj, selected);
}
}
/**
* Deselects all elements.
*/
Override
protected void deSelectAllImpl() {
pertDiagram.deSelectAll();
}
/**
* Listens for selection changes.
* @param event The selection event.
*/
Override
public void selectionChanged(SelectionEvent event) {
super.selectionChanged(event.getSource(), event.isObjectSelected());
}
/**
* Instantiated when JViews Diagrammer is not available.
*/
SuppressWarnings("serial")
private class WebPage extends JEditorPane implements PERTDiagram {
/**
* Builds a <code>WebPage</code>.
*/
public WebPage() {
setEditable(false);
// content type
if ((GanttViewerProperties.getLocale().getVariant() != null)
&& !"".equals(GanttViewerProperties.getLocale().getVariant())) {
setContentType("text/html;CHARSET="
+ GanttViewerProperties.getLocale().getVariant());
} else {
setContentType("text/html");
}
// open HTML
try {
this.setPage(GanttViewer.class.getResource(GanttViewerProperties
.getString("NoPERT.Page")));
} catch (IOException e) {
// doing nothing, white page
}
}
Override
public void addInteractorListener(InteractorListener listener) {
}
Override
public void addSelectionListener(SelectionListener listener) {
}
Override
public void addTransformerListener(TransformerListener listener) {
}
Override
public void applyStyle(String css) throws Exception {
}
Override
public void attachGanttModel(IlvGanttModel ganttModel) {
}
Override
public IlvGanttModel getGanttModel() {
return null;
}
Override
public IlvRect boundingBox() {
return new IlvRect(0, 0, 0, 0);
}
Override
public IlvRect boundingBox(IlvActivity activity) {
return new IlvRect(0, 0, 0, 0);
}
Override
public void deSelectAll() {
}
Override
public IlvManagerViewInteractor getInteractor() {
return null;
}
Override
public IlvTransformer getTransformer() {
return new IlvTransformer();
}
Override
public void initialize() {
}
Override
public boolean isSelected(IlvActivity activity) {
return false;
}
Override
public void removeInteractorListener(InteractorListener listener) {
}
Override
public void removeSelectionListener(SelectionListener listener) {
}
Override
public void removeTransformerListener(TransformerListener listener) {
}
Override
public void setInteractor(IlvManagerViewInteractor interactor) {
}
Override
public void setSelected(IlvActivity activity, boolean selected) {
}
Override
public void setTransformer(IlvTransformer t) {
}
Override
public IlvRect visibleRect() {
return new IlvRect(0, 0, 0, 0);
}
Override
public void zoom(IlvPoint point, double sx, double sy) {
}
Override
public void zoomToFit() {
}
}
}