/* * 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 demo.gantt.faces; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Stack; import javax.faces.event.ActionEvent; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; import demo.gantt.faces.ContextDataBean.ContextData; import ilog.views.faces.dhtml.event.FacesViewActionEvent; import ilog.views.gantt.IlvActivity; import ilog.views.gantt.IlvDuration; import ilog.views.gantt.IlvGanttModel; import ilog.views.gantt.IlvHierarchyChart; import ilog.views.gantt.faces.component.data.IlvFacesGanttXMLDataSource; import ilog.views.gantt.faces.dhtml.component.IlvFacesDHTMLGanttChartView; import ilog.views.util.servlet.IlvMenuFactory; /** * The bean that contain the logic of the JSF Gantt Chart sample. */ public class DemoBean { /** * Stores the {@link ContextData} holding all contextual data for the current * request. */ private ContextData _contextData; /** * The contextual pop-up menu factory. */ private IlvMenuFactory _menuFactory; /** * Constructor: Retrieves the context data for the page that originated the * request currently being processed. */ public DemoBean() { // Retrieves the ContextData _contextData = ContextDataBean.getContextData(); // Initialize pop-up menu factory _menuFactory = new DemoFactory(); } /** * Returns the gantt model displayed. * * @return The gantt model. */ private IlvGanttModel getGanttModel() { return _contextData.ganttView.getChart().getGanttModel(); } /** * Builds the activity select item list from the gantt model. */ private void initActivityItems() { _contextData.activityItems = new ArrayList<SelectItem>(); _contextData.activityItems.add(new SelectItem("default", "")); // The gantt view is not initialized with the model at this state. IlvGanttModel model = _contextData.xmlDS.getValue(); IlvActivity rootActivity = model.getRootActivity(); Stack<IlvActivity> stack = new Stack<IlvActivity>(); stack.push(rootActivity); _contextData.activityById = new HashMap<String, IlvActivity>(); while (stack.size() > 0) { int size = stack.size(); for (int i = 0; i < size; i++) { IlvActivity activity = stack.pop(); _contextData.activityItems.add(buildSelectItemFromActivity(activity)); _contextData.activityById.put(activity.getID(), activity); int count = model.getChildActivityCount(activity); for (int j = 0; j < count; j++) stack.push(model.getChildActivity(activity, count - 1 - j)); } } } /** * Builds a select item from an activity. The value is the activity Id and the * label is the activity name. * * @param activity * The activity to build a select item from. * @return A select item initialized with activity id and name. */ private SelectItem buildSelectItemFromActivity(IlvActivity activity) { SelectItem item = new SelectItem(); item.setValue(activity.getID()); item.setLabel(activity.getName()); return item; } /** * Value change listener called on a modification of the select one menu. The * activity is selected, visible (parent nodes are expanded and the view is * centered on this activity) and expanded. * * @param event * The value change event. */ public void onValueChanged(ValueChangeEvent event) { String activityId = (String) event.getNewValue(); if (activityId != null && !activityId.equals("default")) { // Find the activity form its id. IlvActivity activity = _contextData.activityById.get(activityId); // Set the start and end activity date to edit. _contextData.startActivityDate = new Date(activity.getStartTime().getTime()); _contextData.endActivityDate = new Date(activity.getEndTime().getTime()); // Set the visible interval to the activity time interval plus 2 weeks. centerView(_contextData.startActivityDate, _contextData.endActivityDate); IlvGanttModel model = getGanttModel(); IlvHierarchyChart chart = _contextData.ganttView.getChart(); // Collapse the previous selected activity IlvActivity cActivity; if (_contextData.currentActivity != null) { cActivity = _contextData.currentActivity; while (cActivity != model.getRootActivity()) { cActivity = model.getParentActivity(cActivity); chart.collapseRow(cActivity); } chart.collapseRow(_contextData.currentActivity); } // Make the activity visible. cActivity = activity; while (cActivity != model.getRootActivity()) { cActivity = model.getParentActivity(cActivity); chart.expandRow(cActivity); } chart.expandRow(activity); // Selection update. chart.deSelectAllRows(); chart.selectRow(activity, true); _contextData.currentActivity = activity; } } /** * Expands or collapses the activity passed in the event. * * @param event * The view event. */ public void expandCollapse(FacesViewActionEvent event) { IlvActivity activity = (IlvActivity) event.getObject(); IlvHierarchyChart chart = (IlvHierarchyChart) event.getGraphicComponent(); if (activity != null) { if (chart.isRowExpanded(activity)) chart.collapseRow(activity); else chart.expandRow(activity); } } /** * Action called by the contextual pop-up menu. The activity is selected and * expanded. The selectOneMenu is updated * * @param event * The view action event. */ public void nodeValueChanged(FacesViewActionEvent event) { selectNode((IlvActivity) event.getObject()); } /** * Value change listener called on the value modification of the node select * interactor. The picked activity is selected and expanded. The selectOneMenu * is updated. * * @param event * The value change event. */ public void nodeValueChanged(ValueChangeEvent event) { selectNode((IlvActivity) event.getNewValue()); } private void selectNode(IlvActivity activity) { if (activity != null) { // Set the start and end activity date to edit. _contextData.startActivityDate = new Date(activity.getStartTime().getTime()); _contextData.endActivityDate = new Date(activity.getEndTime().getTime()); // Set the visible interval to the activity time interval plus 2 weeks. centerView(_contextData.startActivityDate, _contextData.endActivityDate); // Select the activity IlvHierarchyChart chart = _contextData.ganttView.getChart(); chart.deSelectAllRows(); chart.selectRow(activity, true); // Expand activity child nodes. chart.expandAllRows(activity); // Synchronize the select one menu. setActivityId(activity.getID()); _contextData.currentActivity = activity; } } /** * Action event listener on the save change button of the editing panel. Sets * the start and end time to the currently selected activity and recenter the * view on it. * * @param event * The action event. * @return null. */ public String changeActivityInterval(ActionEvent event) { if (_contextData.currentActivity != null) { _contextData.currentActivity.setStartTime(new Date(_contextData.startActivityDate.getTime())); _contextData.currentActivity.setEndTime(new Date(_contextData.endActivityDate.getTime())); centerView(_contextData.currentActivity.getStartTime(), _contextData.currentActivity.getEndTime()); } return null; } /** * Centers the view displayed on the specified dates zoomed out to have a week * before and after. * * @param start * The start time to center on. * @param end * The end time to center on. */ private void centerView(Date start, Date end) { centerView(start, end, IlvDuration.ONE_WEEK); } /** * Center the view displayed on the specified dates zoomed out to have a the * <code>duration</code> before and after. * * @param start * The start time to center on. * @param end * The end to center on. * @param duration * The duration to have before and after the date interval. */ private void centerView(Date start, Date end, IlvDuration duration) { Date startDate = new Date(start.getTime()); Date endDate = new Date(end.getTime()); startDate.setTime(startDate.getTime() - duration.getMillis()); endDate.setTime(endDate.getTime() + duration.getMillis()); _contextData.ganttView.setStartVisibleInterval(startDate); _contextData.ganttView.setEndVisibleInterval(endDate); } // Getters and Setters. public IlvFacesGanttXMLDataSource getXmlDS() { return _contextData.xmlDS; } public void setXmlDS(IlvFacesGanttXMLDataSource xmlDS) { _contextData.xmlDS = xmlDS; } public ArrayList<SelectItem> getActivityItems() { if (_contextData.activityItems == null) initActivityItems(); return _contextData.activityItems; } public void setActivityItems(ArrayList<SelectItem> selectItemList) { _contextData.activityItems = selectItemList; } public IlvFacesDHTMLGanttChartView getGanttView() { return (IlvFacesDHTMLGanttChartView) _contextData.ganttView; } public void setGanttView(IlvFacesDHTMLGanttChartView ganttView) { _contextData.ganttView = ganttView; } public IlvMenuFactory getMenuFactory() { return _menuFactory; } public void setMenuFactory(IlvMenuFactory menuFactory) { _menuFactory = menuFactory; } public String getActivityId() { return _contextData.currentActivity == null ? "default" : _contextData.currentActivity.getID(); } public void setActivityId(String activityId) { // the value change listener is reponsible to update this value } }