/* * 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.util.GanttViewerProperties; import ganttviewer.viewer.View; import ganttviewer.viewer.Viewer; import ilog.views.chart.IlvChart; import ilog.views.chart.IlvChartAreaSynchronizer; import ilog.views.chart.IlvChartLayout; import ilog.views.gantt.IlvActivityFactory; import ilog.views.gantt.IlvConstraintFactory; import ilog.views.gantt.IlvGanttModel; import ilog.views.gantt.IlvHierarchyChart; import ilog.views.gantt.IlvResource; import ilog.views.gantt.IlvScheduleChart; import ilog.views.gantt.IlvTimeScrollController; import ilog.views.gantt.event.SelectionEvent; import ilog.views.gantt.event.SelectionListener; import ilog.views.gantt.event.TimeChangedEvent; import ilog.views.gantt.event.TimeScrollListener2; import ilog.views.gantt.event.VisibleDurationChangedEvent; import ilog.views.gantt.event.VisibleTimeChangedEvent; import ilog.views.gantt.graphic.IlvActivityTileLayout; import ilog.views.gantt.graphic.IlvGanttSheet; import ilog.views.gantt.graphic.grid.IlvGanttGridRenderer; import ilog.views.gantt.graphic.grid.IlvWeekendGrid; import ilog.views.schedule.IlvResourceDataChart; import ilog.views.schedule.interactor.IlvScheduleInfoViewInteractor; import ilog.views.util.styling.IlvStylingException; import java.awt.Dimension; import javax.swing.JComponent; import javax.swing.JSplitPane; /** * <code>ResourceUsageView</code> is the resource usage view. */ public class ResourceUsageView extends View implements SelectionListener { private static final String QUANTITY_COLUMN = "Qty"; private static final String NAME_COLUMN = "Name"; /** * ResourceData chart. */ private IlvResourceDataChart loadChart; /** * Activity factory. */ private IlvActivityFactory activityFactory; /** * Constraint factory. */ private IlvConstraintFactory constraintFactory; /** * A time scroll controller. */ private IlvTimeScrollController timeScrollController; /** * Builds a <code>ResourceUsageView</code>. * @param viewer The viewer. * @param iD The ID of the view. * @param name The name of the view. * @param timeScrollController A time scroll controller. * @param activityFactory An activity factory. * @param constraintFactory A constraint factory. */ public ResourceUsageView(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 Schedule chart. setMainComponent(new IlvScheduleChart()); } /** * Customizes the Schedule chart before it is added. * @param component The chart to be added. * @return A split pane to add. */ Override protected JComponent mainComponentAboutToBeAdded(JComponent component) { IlvScheduleChart chart = (IlvScheduleChart) component; timeScrollController.addTimeScrollable(chart); // factories init. chart.setActivityFactory(activityFactory); chart.setConstraintFactory(constraintFactory); // listen to selection changes. chart.addSelectionListener(this); // create the load chart. loadChart = new IlvResourceDataChart(); // synchronize both charts loadChart.getChartArea().getChart().setResizingPolicy(null); loadChart.setVisibleInterval(chart.getVisibleTime(), chart .getVisibleDuration()); chart.addTimeScrollListener(new TimeScrollListener2() { Override public void visibleTimeChanged(VisibleTimeChangedEvent evt) { if (!evt.isAdjusting()) { loadChart.setVisibleTime(evt.getTime()); } } Override public void visibleDurationChanged(VisibleDurationChangedEvent evt) { loadChart.setVisibleInterval(getScheduleChart().getVisibleTime(), evt .getDuration()); } Override public void minVisibleTimeChanged(TimeChangedEvent evt) { } Override public void maxVisibleTimeChanged(TimeChangedEvent evt) { } Override public void minVisibleDurationChanged(VisibleDurationChangedEvent evt) { } }); // configure the table configureTable(chart); // configure the load chart configureLoadChart(loadChart); // 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); // the split pane to be added. JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); splitPane.setDividerSize(3); splitPane.setResizeWeight(0.75); splitPane.setTopComponent(chart); splitPane.setBottomComponent(loadChart); return splitPane; } /** * Configures the table. * @param chart The Schedule chart. */ protected void configureTable(IlvScheduleChart chart) { chart.getTable().getColumn(NAME_COLUMN).setPreferredWidth( Integer.parseInt(GanttViewerProperties .getString("Table.Column.Name.Width"))); // remove quantity chart.getTable().removeColumn(QUANTITY_COLUMN); } /** * Configures the Resource Data chart. * @param loadChart The Resource Data chart. */ protected void configureLoadChart(IlvResourceDataChart loadChart) { loadChart.setMinimumSize(new Dimension(50, 50)); // add a highlight interactor that displays the load of a resource in a // tooltip loadChart.addInteractor(new IlvScheduleInfoViewInteractor()); // synchronize the data models of the charts. Resources selected in the // in the Schedule chart will be displayed in the Resource Data chart. loadChart.syncGanttModel(getScheduleChart(), IlvResourceDataChart.DISPLAY_SELECTED_LEAVES); // customize the legend customizeLegend(loadChart); IlvChart.Area chartArea = loadChart.getChartArea(); IlvChartAreaSynchronizer.synchronize(chartArea.getChart(), getScheduleChart().getGanttSheet()); } /** * Customizes the legend. * @param loadChart The Resource Data chart. */ protected void customizeLegend(IlvResourceDataChart loadChart) { loadChart.setLegendPosition(IlvChartLayout.SOUTH_TOP); } /** * Attaches the Gantt data model to the view. * @param model The Gantt data model. */ Override protected void attachModel(Object model) { IlvScheduleChart chart = getScheduleChart(); chart.setGanttModel((IlvGanttModel) model); if (model == null) { return; } // graph layout chart.getGanttSheet().setActivityLayout(new IlvActivityTileLayout()); // expand all rows chart.expandAllRows(); } /** * Returns the Schedule chart. * @return The Schedule chart. */ public IlvScheduleChart getScheduleChart() { return (IlvScheduleChart) getMainComponent(); } /** * Returns the Resource Data chart. * @return The Resource Data chart. */ public IlvResourceDataChart getLoadChart() { return loadChart; } /** * 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 = getScheduleChart(); chart.setStyleSheet(css); } /** * Resource 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 IlvResource) { getScheduleChart().select((IlvResource) obj, selected); } } /** * Listens for selection changes. * @param event The selection event. */ Override public void selectionChanged(SelectionEvent event) { super.selectionChanged(event.getSource(), event.isObjectSelected()); } /** * Deselects all. */ Override protected void deSelectAllImpl() { getScheduleChart().deSelectAllRows(); } }