/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2012 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.zkoss.ganttz.adapters;
import static org.zkoss.ganttz.data.constraint.ConstraintOnComparableValues.biggerOrEqualThan;
import static org.zkoss.ganttz.data.constraint.ConstraintOnComparableValues.lessOrEqualThan;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.Validate;
import org.zkoss.ganttz.Planner;
import org.zkoss.ganttz.data.GanttDate;
import org.zkoss.ganttz.data.GanttDiagramGraph.IGraphChangeListener;
import org.zkoss.ganttz.data.constraint.Constraint;
import org.zkoss.ganttz.extensions.ICommand;
import org.zkoss.ganttz.extensions.ICommandOnTask;
import org.zkoss.ganttz.extensions.IContext;
import org.zkoss.ganttz.extensions.IContextWithPlannerTask;
import org.zkoss.ganttz.timetracker.zoom.IDetailItemModifier;
import org.zkoss.ganttz.timetracker.zoom.SeveralModifiers;
import org.zkoss.zk.ui.Component;
/**
* A object that defines several extension points for gantt planner.
*
* @author Óscar González Fernández <ogonzalez@igalia.com>
* @author Manuel Rego Casasnovas <rego@igalia.com>
*/
public class PlannerConfiguration<T> implements IDisabilityConfiguration {
private static final String PRINT_NOT_SUPPORTED = "print not supported";
public interface IPrintAction {
void doPrint();
void doPrint(Map<String, String> parameters);
void doPrint(Map<String, String> parameters, Planner planner);
}
public interface IReloadChartListener {
void reloadChart();
}
private static class NullCommand<T> implements ICommand<T> {
@Override
public void doAction(IContext<T> context) {
// Do nothing
}
@Override
public String getName() {
return "";
}
@Override
public String getImage() {
return "";
}
@Override
public boolean isDisabled() {
return false;
}
@Override
public boolean isPlannerCommand() {
return false;
}
}
private static class NullCommandOnTask<T> implements ICommandOnTask<T> {
@Override
public void doAction(IContextWithPlannerTask<T> context, T task) {
// Do nothing
}
@Override
public String getName() {
return "";
}
@Override
public String getIcon() {
return null;
}
@Override
public boolean isApplicableTo(T task) {
return true;
}
}
private IAdapterToTaskFundamentalProperties<T> adapter;
private IStructureNavigator<T> navigator;
private List<? extends T> data;
private List<ICommand<T>> globalCommands = new ArrayList<>();
private List<ICommandOnTask<T>> commandsOnTasks = new ArrayList<>();
private ICommand<T> goingDownInLastArrowCommand = new NullCommand<>();
private ICommandOnTask<T> doubleClickCommand = new NullCommandOnTask<>();
private Component chartComponent;
private boolean addingDependenciesEnabled = true;
private boolean movingTasksEnabled = true;
private boolean resizingTasksEnabled = true;
private boolean editingDatesEnabled = true;
private GanttDate notBeforeThan = null;
private GanttDate notAfterThan = null;
private boolean dependenciesConstraintsHavePriority = false;
private boolean criticalPathEnabled = true;
private boolean advancesEnabled = true;
private boolean reportedHoursEnabled = true;
private boolean moneyCostBarEnabled = true;
private boolean expandAllEnabled = true;
private boolean flattenTreeEnabled = true;
private boolean showAllResourcesEnabled = true;
private boolean renamingTasksEnabled = true;
private boolean treeEditable = true;
private IDetailItemModifier firstLevelModifiers = SeveralModifiers.empty();
private IDetailItemModifier secondLevelModifiers = SeveralModifiers.empty();
private List<IReloadChartListener> reloadChartListeners = new ArrayList<>();
private IPrintAction printAction;
private boolean expandPlanningViewCharts;
private final List<IGraphChangeListener> preGraphChangeListeners = new ArrayList<>();
private final List<IGraphChangeListener> postGraphChangeListeners = new ArrayList<>();
private boolean scheduleBackwards = false;
public PlannerConfiguration(IAdapterToTaskFundamentalProperties<T> adapter,
IStructureNavigator<T> navigator,
List<? extends T> data) {
this.adapter = adapter;
this.navigator = navigator;
this.data = data;
}
public IAdapterToTaskFundamentalProperties<T> getAdapter() {
return adapter;
}
public IStructureNavigator<T> getNavigator() {
return navigator;
}
public List<? extends T> getData() {
return data;
}
public void addCommandOnTask(ICommandOnTask<T> commandOnTask) {
Validate.notNull(commandOnTask);
this.commandsOnTasks.add(commandOnTask);
}
public void addGlobalCommand(ICommand<T> command) {
Validate.notNull(command);
this.globalCommands.add(command);
}
public List<ICommandOnTask<T>> getCommandsOnTasks() {
return Collections.unmodifiableList(commandsOnTasks);
}
public List<ICommand<T>> getGlobalCommands() {
return Collections.unmodifiableList(globalCommands);
}
public ICommand<T> getGoingDownInLastArrowCommand() {
return goingDownInLastArrowCommand;
}
public void setNotBeforeThan(Date notBeforeThan) {
this.notBeforeThan = GanttDate.createFrom(notBeforeThan);
}
public void setNotAfterThan(Date notAfterThan) {
this.notAfterThan = GanttDate.createFrom(notAfterThan);
}
public void setGoingDownInLastArrowCommand(ICommand<T> goingDownInLastArrowCommand) {
Validate.notNull(goingDownInLastArrowCommand);
this.goingDownInLastArrowCommand = goingDownInLastArrowCommand;
}
public ICommandOnTask<T> getDoubleClickCommand() {
return doubleClickCommand;
}
public void setDoubleClickCommand(ICommandOnTask<T> editTaskCommand) {
Validate.notNull(editTaskCommand);
this.doubleClickCommand = editTaskCommand;
}
public void setChartComponent(Component chartComponent) {
this.chartComponent = chartComponent;
}
public Component getChartComponent() {
return chartComponent;
}
public void setAddingDependenciesEnabled(boolean addingDependenciesEnabled) {
this.addingDependenciesEnabled = addingDependenciesEnabled;
}
@Override
public boolean isAddingDependenciesEnabled() {
return addingDependenciesEnabled;
}
@Override
public boolean isMovingTasksEnabled() {
return movingTasksEnabled;
}
public void setMovingTasksEnabled(boolean movingTasksEnabled) {
this.movingTasksEnabled = movingTasksEnabled;
}
@Override
public boolean isResizingTasksEnabled() {
return resizingTasksEnabled;
}
public void setResizingTasksEnabled(boolean resizingTasksEnabled) {
this.resizingTasksEnabled = resizingTasksEnabled;
}
@Override
public boolean isEditingDatesEnabled() {
return editingDatesEnabled;
}
public void setEditingDatesEnabled(boolean editingDatesEnabled) {
this.editingDatesEnabled = editingDatesEnabled;
}
public static List<Constraint<GanttDate>> getStartConstraintsGiven(GanttDate notBeforeThan) {
return notBeforeThan != null
? Collections.singletonList(biggerOrEqualThan(notBeforeThan))
: Collections.emptyList();
}
public List<Constraint<GanttDate>> getStartConstraints() {
return getStartConstraintsGiven(notBeforeThan);
}
public static List<Constraint<GanttDate>> getEndConstraintsGiven(GanttDate notAfterThan) {
return notAfterThan != null
? Collections.singletonList(lessOrEqualThan(notAfterThan))
: Collections.emptyList();
}
public List<Constraint<GanttDate>> getEndConstraints() {
return getEndConstraintsGiven(notAfterThan);
}
public boolean isDependenciesConstraintsHavePriority() {
return dependenciesConstraintsHavePriority;
}
public void setDependenciesConstraintsHavePriority(boolean haveDependenciesPriority) {
this.dependenciesConstraintsHavePriority = haveDependenciesPriority;
}
public void setCriticalPathEnabled(boolean criticalPathEnabled) {
this.criticalPathEnabled = criticalPathEnabled;
}
@Override
public boolean isCriticalPathEnabled() {
return criticalPathEnabled;
}
public void setAdvancesEnabled(boolean advancesEnabled) {
this.advancesEnabled = advancesEnabled;
}
@Override
public boolean isAdvancesEnabled() {
return advancesEnabled;
}
public void setReportedHoursEnabled(boolean reportedHoursEnabled) {
this.reportedHoursEnabled = reportedHoursEnabled;
}
@Override
public boolean isReportedHoursEnabled() {
return reportedHoursEnabled;
}
public void setMoneyCostBarEnabled(boolean moneyCostBarEnabled) {
this.moneyCostBarEnabled = moneyCostBarEnabled;
}
@Override
public boolean isMoneyCostBarEnabled() {
return moneyCostBarEnabled;
}
public void setExpandAllEnabled(boolean expandAllEnabled) {
this.expandAllEnabled = expandAllEnabled;
}
@Override
public boolean isExpandAllEnabled() {
return expandAllEnabled;
}
public void setFlattenTreeEnabled(boolean flattenTreeEnabled) {
this.flattenTreeEnabled = flattenTreeEnabled;
}
@Override
public boolean isShowAllResourcesEnabled() {
return showAllResourcesEnabled;
}
public void setShowAllResourcesEnabled(boolean showAllResourcesEnabled) {
this.showAllResourcesEnabled = showAllResourcesEnabled;
}
@Override
public boolean isFlattenTreeEnabled() {
return flattenTreeEnabled;
}
public void setRenamingTasksEnabled(boolean renamingTasksEnabled) {
this.renamingTasksEnabled = renamingTasksEnabled;
}
@Override
public boolean isRenamingTasksEnabled() {
return renamingTasksEnabled;
}
public IDetailItemModifier getSecondLevelModifiers() {
return secondLevelModifiers;
}
public void setSecondLevelModifiers(IDetailItemModifier... secondLevelModifiers) {
this.secondLevelModifiers = SeveralModifiers.create(secondLevelModifiers);
}
public IDetailItemModifier getFirstLevelModifiers() {
return firstLevelModifiers;
}
public void setFirstLevelModifiers(IDetailItemModifier... firstLevelModifiers) {
this.firstLevelModifiers = SeveralModifiers.create(firstLevelModifiers);
}
public void addReloadChartListener(IReloadChartListener reloadChartListener) {
Validate.notNull(reloadChartListener);
this.reloadChartListeners.add(reloadChartListener);
}
public void reloadCharts() {
for (IReloadChartListener each : this.reloadChartListeners) {
each.reloadChart();
}
}
public boolean isPrintEnabled() {
return printAction != null;
}
public void setPrintAction(IPrintAction printAction) {
this.printAction = printAction;
}
public void print() {
if ( !isPrintEnabled() ) {
throw new UnsupportedOperationException(PRINT_NOT_SUPPORTED);
}
printAction.doPrint();
}
public void print(Map<String, String> parameters) {
if ( !isPrintEnabled() ) {
throw new UnsupportedOperationException(PRINT_NOT_SUPPORTED);
}
printAction.doPrint(parameters);
}
public void print(HashMap<String, String> parameters, Planner planner) {
if ( !isPrintEnabled() ) {
throw new UnsupportedOperationException(PRINT_NOT_SUPPORTED);
}
printAction.doPrint(parameters, planner);
}
public void setExpandPlanningViewCharts(boolean expandPlanningViewCharts) {
this.expandPlanningViewCharts = expandPlanningViewCharts;
}
@Override
public boolean isExpandPlanningViewCharts() {
return expandPlanningViewCharts;
}
public void addPreGraphChangeListener(IGraphChangeListener preGraphChangeListener) {
Validate.notNull(preGraphChangeListener);
if ( !preGraphChangeListeners.contains(preGraphChangeListener) ) {
preGraphChangeListeners.add(preGraphChangeListener);
}
}
public void addPostGraphChangeListener(IGraphChangeListener postGraphChangeListener) {
Validate.notNull(postGraphChangeListener);
if ( !postGraphChangeListeners.contains(postGraphChangeListener) ) {
postGraphChangeListeners.add(postGraphChangeListener);
}
}
public List<IGraphChangeListener> getPreChangeListeners() {
return Collections.unmodifiableList(preGraphChangeListeners);
}
public List<IGraphChangeListener> getPostChangeListeners() {
return Collections.unmodifiableList(postGraphChangeListeners);
}
public void setTreeEditable(boolean treeEditable) {
this.treeEditable = treeEditable;
}
@Override
public boolean isTreeEditable() {
return treeEditable;
}
public boolean isScheduleBackwards() {
return scheduleBackwards;
}
public void setScheduleBackwards(boolean scheduleBackwards) {
this.scheduleBackwards = scheduleBackwards;
}
}