/*
* 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.LagTimeHandler;
import ganttviewer.util.GanttViewerProperties;
import ganttviewer.viewer.View;
import ganttviewer.viewer.Viewer;
import ilog.views.gantt.IlvActivity;
import ilog.views.gantt.IlvActivityFactory;
import ilog.views.gantt.IlvConstraintFactory;
import ilog.views.gantt.IlvGanttChart;
import ilog.views.gantt.IlvGanttModel;
import ilog.views.gantt.IlvHierarchyChart;
import ilog.views.gantt.IlvTimeScrollController;
import ilog.views.gantt.event.ConstraintPropertyEvent;
import ilog.views.gantt.event.SelectionEvent;
import ilog.views.gantt.event.SelectionListener;
import ilog.views.gantt.graphic.IlvConstraintGraphic;
import ilog.views.gantt.graphic.IlvConstraintGraphicLayer;
import ilog.views.gantt.graphic.IlvConstraintGraphicLayerPolicy;
import ilog.views.gantt.graphic.IlvGanttSheet;
import ilog.views.gantt.graphic.grid.IlvGanttGridRenderer;
import ilog.views.gantt.graphic.grid.IlvWeekendGrid;
import ilog.views.gantt.model.general.ConstraintUserPropertyEvent;
import ilog.views.gantt.model.general.IlvGeneralConstraint;
import ilog.views.util.styling.IlvStylingException;
import javax.swing.JComponent;
/**
* <code>GanttView</code> is the Gantt chart view.
*/
public class GanttView extends View implements SelectionListener {
private static final String NAME_COLUMN = "Name";
private static final int notSatisfiedConstraintsLayerIndex = 5;
/**
* Activity factory.
*/
private IlvActivityFactory activityFactory;
/**
* Constraint factory.
*/
private IlvConstraintFactory constraintFactory;
/**
* A time scroll controller.
*/
private IlvTimeScrollController timeScrollController;
/**
* Build a <code>GanttView</code>.
* @param viewer The viewer.
* @param iD The view's ID.
* @param name The view's name.
* @param timeScrollController A time scroll controller.
* @param activityFactory An activity factory.
* @param constraintFactory A constraint factory.
*/
public GanttView(Viewer viewer, String iD, String name,
IlvTimeScrollController timeScrollController,
IlvActivityFactory activityFactory, IlvConstraintFactory constraintFactory) {
super(viewer, iD, name);
this.activityFactory = activityFactory;
this.constraintFactory = constraintFactory;
this.timeScrollController = timeScrollController;
// set the Gantt chart.
setMainComponent(new IlvGanttChart());
}
/**
* Overridden constraint graphic layer policy. Manages two layers of constraints,
* the default layer and one for highlighting the not satisfied constraints.
*/
class NotSatisfiedConstraintsLayerPolicy extends
IlvConstraintGraphicLayerPolicy {
private IlvConstraintGraphicLayer notSatifiedConstraintsLayer;
/**
* Build a <code>NotSatisfiedConstraintsLayerPolicy</code>.
* @param notSatifiedConstraintsLayer The layer.
*/
public NotSatisfiedConstraintsLayerPolicy(
IlvConstraintGraphicLayer notSatifiedConstraintsLayer) {
super(getGanttChart().getGanttSheet());
this.notSatifiedConstraintsLayer = notSatifiedConstraintsLayer;
}
/**
* Adds the constraint graphic.
* @param graphic The constraint graphic.
*/
Override
public void addConstraintGraphic(IlvConstraintGraphic graphic) {
IlvGeneralConstraint constraint = (IlvGeneralConstraint) graphic
.getConstraint();
if (!constraint.getPropertyNames().contains(
LagTimeHandler.CONSTRAINT_SATISFIED_PROPERTY)) {
super.addConstraintGraphic(graphic);
return;
}
if (!(Boolean) constraint
.getProperty(LagTimeHandler.CONSTRAINT_SATISFIED_PROPERTY)) {
notSatifiedConstraintsLayer.addConstraintGraphic(graphic);
} else {
super.addConstraintGraphic(graphic);
}
}
/**
* Removes all the constraint graphics.
*/
Override
public void removeAllConstraintGraphics() {
super.removeAllConstraintGraphics();
notSatifiedConstraintsLayer.removeAllConstraintGraphics();
}
/**
* Updates the layer of the constraint graphic if its satisfied property has changed.
* @param graphic The constraint graphic.
* @param evt The event that implies the update.
*/
Override
public void updateConstraintGraphic(IlvConstraintGraphic graphic,
ConstraintPropertyEvent evt) {
IlvGanttSheet ganttSheet = getGanttChart().getGanttSheet();
if (evt instanceof ConstraintUserPropertyEvent) {
ConstraintUserPropertyEvent cupEvt = (ConstraintUserPropertyEvent) evt;
if (LagTimeHandler.CONSTRAINT_SATISFIED_PROPERTY.equals(cupEvt
.getPropertyName())) {
if (!(Boolean) cupEvt.getNewValue()) {
// we put the constraint on an above layer if it is satisfied
ganttSheet.getManager().setLayer(graphic,
notSatifiedConstraintsLayer.getIndex(), true);
} else {
// we put the constraint on the default layer if it now satisfied
ganttSheet.getManager().setLayer(graphic,
ganttSheet.getDefaultConstraintGraphicLayerIndex(), true);
}
}
}
}
}
/**
* Customizes the Gantt chart before it is added.
* @param component The chart to be added.
* @return The chart.
*/
Override
protected JComponent mainComponentAboutToBeAdded(JComponent component) {
IlvGanttChart chart = (IlvGanttChart) component;
// add a constraint layer to the Gantt sheet
IlvConstraintGraphicLayer notSatisfiedConstraintsLayer = new IlvConstraintGraphicLayer();
chart.getGanttSheet().getManager().addLayer(notSatisfiedConstraintsLayer,
GanttView.notSatisfiedConstraintsLayerIndex);
chart.getGanttSheet().setConstraintGraphicLayerPolicy(
new NotSatisfiedConstraintsLayerPolicy(notSatisfiedConstraintsLayer));
// factories init.
chart.setActivityFactory(activityFactory);
chart.setConstraintFactory(constraintFactory);
// time interval synchronization.
timeScrollController.addTimeScrollable(chart);
// listen to selection changes.
chart.addSelectionListener(this);
// customize the table.
int nameWidth = Integer.parseInt(GanttViewerProperties
.getString("Table.Column.Name.Width"));
chart.getTable().getColumn(GanttView.NAME_COLUMN).setPreferredWidth(
nameWidth);
chart.setDividerLocation(nameWidth);
// set hover highlighting
chart.getGanttSheet().setHoverHighlightingMode(IlvGanttSheet.HH_GRAYSCALE);
// force the weekend grid to print opaque. This reduces the print job
// size from >60Mb to approx. 150Kb.
IlvGanttGridRenderer verticalGrid = chart.getGanttSheet().getVerticalGrid();
if (verticalGrid instanceof IlvWeekendGrid) {
((IlvWeekendGrid) verticalGrid).setPrintWeekendsOpaque(true);
}
// enable animation of changes to the visible time interval.
chart.setVisibleIntervalAnimationSteps(4);
return component;
}
/**
* Attaches the Gantt data model to the view.
* @param model The Gantt data model.
*/
Override
protected void attachModel(Object model) {
IlvGanttChart chart = getGanttChart();
chart.setGanttModel((IlvGanttModel) model);
if (model == null) {
return;
}
// expand all rows
chart.expandAllRows();
}
/**
* Returns the Gantt chart.
* @return The Gantt chart.
*/
public IlvGanttChart getGanttChart() {
return (IlvGanttChart) getMainComponent();
}
/**
* 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) throws IlvStylingException {
IlvHierarchyChart chart = getGanttChart();
chart.setStyleSheet(css);
}
/**
* 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) {
getGanttChart().select((IlvActivity) obj, selected);
}
}
/**
* Deselects all.
*/
Override
protected void deSelectAllImpl() {
getGanttChart().deSelectAllRows();
}
/**
* Listens for selection changes.
* @param event The selection event.
*/
Override
public void selectionChanged(SelectionEvent event) {
super.selectionChanged(event.getSource(), event.isObjectSelected());
}
}