/* * 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 scheduleChart; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.ButtonGroup; import javax.swing.JMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.JToolBar; import ilog.views.gantt.IlvGanttModel; import ilog.views.gantt.IlvHierarchyChart; import ilog.views.gantt.IlvScheduleChart; import ilog.views.gantt.action.IlvAction; import ilog.views.gantt.graphic.IlvActivityLayout; import ilog.views.gantt.graphic.IlvActivityLogisticLayout; import ilog.views.gantt.graphic.IlvActivitySimpleLayout; import ilog.views.gantt.graphic.IlvActivityTileLayout; import ilog.views.gantt.graphic.IlvDefaultActivityRendererFactory; import ilog.views.gantt.graphic.renderer.IlvActivityBar; import ilog.views.gantt.graphic.renderer.IlvActivityCompositeRenderer; import ilog.views.gantt.graphic.renderer.IlvActivitySymbol; import ilog.views.gantt.swing.IlvJTable; import shared.AbstractGanttExample; import shared.GanttCommand; import shared.data.GeneralActivityFactory; import shared.data.GeneralResourceFactory; import shared.data.SimpleEngineeringProject; import shared.swing.ExampleFrame; /** * A Schedule chart example showing how to use <code>IlvScheduleChart</code>. */ public class ScheduleExample extends AbstractGanttExample { /** * The various menu and toolbar actions. */ protected IlvAction makeReservationAction; protected IlvAction deleteReservationAction; // ========================================= // Instance Construction and Initialization // ========================================= /** * Creates the Schedule chart. * * @return The Schedule chart. */ Override protected IlvHierarchyChart createChart() { return new IlvScheduleChart(); } /** * Customizes the data model factories and graphic renderers of the Schedule * chart. */ Override protected void customizeFactories() { // Change the default activity and resource factories of the Schedule chart // to ones that sequentially number the activities and resources. chart.setActivityFactory(new GeneralActivityFactory(chart)); chart.setResourceFactory(new GeneralResourceFactory(chart)); // Change the default activity renderer factory of the Schedule chart. chart.setActivityRendererFactory(new ActivityRendererFactory(chart)); } /** * Customizes the appearance of the Schedule chart. */ Override protected void customizeChart() { super.customizeChart(); // Default column widths are 75. Resize some of the columns so that the // text is not truncated. IlvJTable table = chart.getTable(); table.getColumn("Name").setPreferredWidth(150); table.getColumn("ID").setPreferredWidth(60); table.getColumn("Qty").setPreferredWidth(40); } // ========================================= // Accessing // ========================================= /** * Returns the Schedule chart. * * @return The Schedule chart. */ public IlvScheduleChart getScheduleChart() { return (IlvScheduleChart) getChart(); } /** * Returns whether any resources are currently selected. * * @return Whether any resources are selected. */ public boolean isResourceSelected() { return chart.getSelectedRows().length > 0; } /** * Returns whether any reservations are currently selected. * * @return Whether any reservations are selected. */ public boolean isReservationSelected() { return ((IlvScheduleChart) chart).getSelectedReservations().length > 0; } // ========================================= // Menus // ========================================= /** * Initializes the actions for the Edit menu. */ protected void initEditActions() { IlvScheduleChart chart = (IlvScheduleChart) getChart(); insertRowAction = new GanttCommand.InsertResourceAction(chart); deleteRowAction = new GanttCommand.DeleteSelectedRowsAction(chart); makeReservationAction = new GanttCommand.MakeActivityAction(chart); deleteReservationAction = new GanttCommand.DeleteSelectedReservationsAction(chart); deleteAllAction = new GanttCommand.DeleteSelectedAction(chart); rowExpandCollapseAction = new GanttCommand.RowExpandCollapseAction(chart); rowIndentAction = new GanttCommand.RowIndentAction(chart); rowOutdentAction = new GanttCommand.RowOutdentAction(chart); rowUpAction = new GanttCommand.RowUpAction(chart); rowDownAction = new GanttCommand.RowDownAction(chart); if (isExitAllowed()) { exitAction = new GanttCommand.ExitAction(); } } /** * Creates the Edit menu. * * @return The Edit menu. */ Override public JMenu createEditMenu() { JMenu menu = new JMenu("Edit"); menu.setMnemonic(KeyEvent.VK_E); setHelpID(menu, "Menu.Edit.helpID"); setStatusText(menu, "Adds, removes, or modifies resources and reservations."); initEditActions(); // Menu item for "Insert new resource". int actionCount = 0; if (insertRowAction != null) { addAction(menu, insertRowAction); actionCount++; } // Menu item for "Delete selected resource". if (deleteRowAction != null) { addAction(menu, deleteRowAction); actionCount++; } // Menu item for "Create reservation". if (makeReservationAction != null) { addAction(menu, makeReservationAction); actionCount++; } // Menu item for "Delete selected reservations". if (deleteReservationAction != null) { addAction(menu, deleteReservationAction); actionCount++; } if (actionCount > 0) { menu.addSeparator(); } // Menu item for "Delete all". if (deleteAllAction != null) { addAction(menu, deleteAllAction); menu.addSeparator(); } // Menu item for "Expand/Collapse". actionCount = 0; if (rowExpandCollapseAction != null) { addAction(menu, rowExpandCollapseAction); actionCount++; } // Menu item for "Indent resource". if (rowIndentAction != null) { addAction(menu, rowIndentAction); actionCount++; } // Menu item for "Outdent resource". if (rowOutdentAction != null) { addAction(menu, rowOutdentAction); actionCount++; } // Menu item for "Move up". if (rowUpAction != null) { addAction(menu, rowUpAction); actionCount++; } // Menu item for "Move down". if (rowDownAction != null) { addAction(menu, rowDownAction); actionCount++; } // Menu item for "Exit". if (exitAction != null) { if (actionCount > 0) { menu.addSeparator(); } addAction(menu, exitAction); } return menu; } /** * Creates the Row menu. * * @return The Row menu. */ Override public JMenu createRowMenu() { JMenu menu = super.createRowMenu(); setStatusText(menu, "Changes the chart's row height or activity layout."); menu.addSeparator(); ButtonGroup buttonGroup = new ButtonGroup(); final IlvScheduleChart scheduleChart = getScheduleChart(); IlvActivityLayout layout = scheduleChart.getActivityLayout(); // Menu item for "Simple Layout". JRadioButtonMenuItem simpleItem = new JRadioButtonMenuItem("Simple Layout"); simpleItem.setSelected(layout.getClass() == IlvActivitySimpleLayout.class); buttonGroup.add(simpleItem); menu.add(simpleItem); simpleItem.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent event) { scheduleChart.setActivityLayout(new IlvActivitySimpleLayout()); scheduleChart.setRowHeight(scheduleChart.getRowHeight()); } }); setStatusText(simpleItem, "Uses a Simple Activity Layout for the schedule chart."); // Menu item for "Cascade Layout". JRadioButtonMenuItem cascadeItem = new JRadioButtonMenuItem("Cascade Layout"); cascadeItem.setSelected(layout instanceof IlvActivityLogisticLayout && ((IlvActivityLogisticLayout) layout).getArrangeMode() == IlvActivityLogisticLayout.CASCADE); buttonGroup.add(cascadeItem); menu.add(cascadeItem); cascadeItem.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent event) { scheduleChart.setActivityLayout(new IlvActivityLogisticLayout(IlvActivityLogisticLayout.CASCADE)); scheduleChart.setRowHeight(scheduleChart.getRowHeight()); } }); setStatusText(cascadeItem, "Uses a Cascade Activity Layout for the schedule chart."); // Menu item for "Pretty Layout". JRadioButtonMenuItem prettyItem = new JRadioButtonMenuItem("Pretty Layout"); prettyItem.setSelected(layout instanceof IlvActivityLogisticLayout && ((IlvActivityLogisticLayout) layout).getArrangeMode() == IlvActivityLogisticLayout.PRETTY); buttonGroup.add(prettyItem); menu.add(prettyItem); prettyItem.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent event) { scheduleChart.setActivityLayout(new IlvActivityLogisticLayout(IlvActivityLogisticLayout.PRETTY)); scheduleChart.setRowHeight(scheduleChart.getRowHeight()); } }); setStatusText(prettyItem, "Uses a Pretty Activity Layout for the schedule chart."); // Menu item for "Tile Layout". JRadioButtonMenuItem tileItem = new JRadioButtonMenuItem("Tile Layout"); tileItem.setSelected(layout instanceof IlvActivityTileLayout); buttonGroup.add(tileItem); menu.add(tileItem); tileItem.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent event) { scheduleChart.setActivityLayout(new IlvActivityTileLayout()); } }); setStatusText(tileItem, "Uses a Tile Activity Layout for the schedule chart."); return menu; } // ========================================= // Toolbar // ========================================= /** * Populates the toolbar edit actions. * * @param toolbar * The toolbar. */ Override protected void populateToolBarEditActions(JToolBar toolbar) { super.populateToolBarEditActions(toolbar); addAction(toolbar, makeReservationAction); addAction(toolbar, deleteReservationAction); addAction(toolbar, deleteAllAction); } // ========================================= // Data Model // ========================================= /** * Creates and returns the Gantt data model. * * @return The Gantt data model. */ Override protected IlvGanttModel createGanttModel() { return new SimpleEngineeringProject(chart); } // ========================================= // Example Application // ========================================= /** * Returns the title of the example. * * @return The title of the example. */ Override public String getTitle() { return "Schedule Chart Example"; } /** * Application mainline. * * @param args * The command line arguments. */ public static void main(String[] args) { ExampleFrame.createAndShowGUI(ScheduleExample.class); } /** * This class shows how to customize the default activity renderer factory. * The factory resets the parent activity renderer and the leaf activity * renderer of the <code>IlvDefaultActivityRendererFactory</code>. */ class ActivityRendererFactory extends IlvDefaultActivityRendererFactory { /** * Creates the activity renderer factory. * * @param chart * The chart that the factory is associated with. */ public ActivityRendererFactory(IlvHierarchyChart chart) { super(chart); // Define the new leaf activity renderer. IlvActivityBar leafRenderer = new IlvActivityBar(); leafRenderer.setStyle(IlvActivityBar.RELIEF); leafRenderer.setBackground(Color.orange); leafRenderer.setThickness(1); // Reset the leaf activity renderer setLeafActivityRenderer(leafRenderer); // Define the parent activity renderer. The new parent // activity renderer is composed of an activity bar as // the main bar and two diamonds as end symbols. IlvActivityCompositeRenderer parentRenderer = new IlvActivityCompositeRenderer(); IlvActivityBar mainBar = new IlvActivityBar(); IlvActivitySymbol startSymbol = new IlvActivitySymbol(); IlvActivitySymbol endSymbol = new IlvActivitySymbol(); startSymbol.setShape(IlvActivitySymbol.DIAMOND); endSymbol.setShape(IlvActivitySymbol.DIAMOND); mainBar.setBackground(Color.yellow); mainBar.setThickness(0); startSymbol.setForeground(Color.cyan); endSymbol.setForeground(Color.cyan); endSymbol.setAlignment(IlvActivitySymbol.END); parentRenderer.addRenderer(mainBar); parentRenderer.addRenderer(startSymbol); parentRenderer.addRenderer(endSymbol); // Resets the parent activity renderer setParentActivityRenderer(parentRenderer); } } }