From abb5851afb35fd91fb7753ca98ae01328e748379 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 16 Mar 2012 11:51:32 +0100 Subject: [PATCH] Add new money cost bar at this moment using value, icon and color of reported hours FEA: ItEr76S17MoneyCostMonitoringSystem --- .../FunctionalityExposedForExtensions.java | 17 +++++- .../main/java/org/zkoss/ganttz/Planner.java | 56 ++++++++++++++++++- .../java/org/zkoss/ganttz/TaskComponent.java | 34 ++++++++++- .../adapters/IDisabilityConfiguration.java | 6 +- .../ganttz/adapters/PlannerConfiguration.java | 11 ++++ .../main/java/org/zkoss/ganttz/data/Task.java | 26 ++++++++- .../ContextRelativeToOtherComponent.java | 15 ++++- .../extensions/ContextWithPlannerTask.java | 15 ++++- .../org/zkoss/ganttz/extensions/IContext.java | 9 ++- .../web/ganttz/zul/plannerLayout.zul | 9 ++- .../resources/web/js/ganttz/TaskComponent.js | 3 + .../resources/web/js/ganttz/mold/milestone.js | 1 + .../web/js/ganttz/mold/task-component.js | 1 + .../web/js/ganttz/mold/task-container.js | 1 + .../src/main/webapp/planner/css/ganttzk.css | 12 +++- 15 files changed, 204 insertions(+), 12 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java index 5320124d7..8a402899c 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -227,6 +227,7 @@ public class FunctionalityExposedForExtensions implements IContext { } result.setShowingReportedHours(planner.showReportedHoursRightNow()); + result.setShowingMoneyCostBar(planner.showMoneyCostBarRightNow()); result.setShowingAdvances(planner.showAdvancesRightNow()); mapper.register(position, result, data); @@ -465,6 +466,20 @@ public class FunctionalityExposedForExtensions implements IContext { } } + @Override + public void showMoneyCostBar() { + for (Task task : diagramGraph.getTasks()) { + task.setShowingMoneyCostBar(true); + } + } + + @Override + public void hideMoneyCostBar() { + for (Task task : diagramGraph.getTasks()) { + task.setShowingMoneyCostBar(false); + } + } + @Override public void reloadCharts() { configuration.reloadCharts(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java index 1d2984df6..6ef06531d 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -120,6 +120,15 @@ public class Planner extends HtmlMacroComponent { return toLowercaseSet(values).contains("all"); } + public static boolean guessShowMoneyCostBarByDefault( + Map queryURLParameters) { + String[] values = queryURLParameters.get("moneyCostBar"); + if (values == null) { + return false; + } + return toLowercaseSet(values).contains("all"); + } + private static Set toLowercaseSet(String[] values) { Set result = new HashSet(); for (String each : values) { @@ -156,6 +165,8 @@ public class Planner extends HtmlMacroComponent { private boolean isShowingReportedHours = false; + private boolean isShowingMoneyCostBar = false; + private boolean isShowingResources = false; private boolean isExpandAll = false; @@ -571,12 +582,22 @@ public class Planner extends HtmlMacroComponent { } }; + private IGraphChangeListener showMoneyCostBarOnChange = new IGraphChangeListener() { + + @Override + public void execute() { + context.showMoneyCostBar(); + } + }; + private boolean containersExpandedByDefault = false; private boolean shownAdvanceByDefault = false; private boolean shownReportedHoursByDefault = false; + private boolean shownMoneyCostBarByDefault = false; + private FilterAndParentExpandedPredicates predicate; private boolean visibleChart; @@ -645,6 +666,26 @@ public class Planner extends HtmlMacroComponent { } } + public void showMoneyCostBar() { + Button showMoneyCostBarButton = (Button) getFellow("showMoneyCostBar"); + if (disabilityConfiguration.isMoneyCostBarEnabled()) { + if (isShowingMoneyCostBar) { + context.hideMoneyCostBar(); + diagramGraph + .removePostGraphChangeListener(showMoneyCostBarOnChange); + showMoneyCostBarButton.setSclass("planner-command"); + showMoneyCostBarButton.setTooltiptext(_("Show money cost bar")); + } else { + context.showMoneyCostBar(); + diagramGraph + .addPostGraphChangeListener(showMoneyCostBarOnChange); + showMoneyCostBarButton.setSclass("planner-command clicked"); + showMoneyCostBarButton.setTooltiptext(_("Hide money cost bar")); + } + isShowingMoneyCostBar = !isShowingMoneyCostBar; + } + } + public void showAllLabels() { Button showAllLabelsButton = (Button) getFellow("showAllLabels"); if (isShowingLabels) { @@ -732,6 +773,19 @@ public class Planner extends HtmlMacroComponent { return (areShownReportedHoursByDefault() || isShowingReportedHours); } + public void setAreShownMoneyCostBarByDefault( + boolean shownMoneyCostBarByDefault) { + this.shownMoneyCostBarByDefault = shownMoneyCostBarByDefault; + } + + public boolean areShownMoneyCostBarByDefault() { + return shownMoneyCostBarByDefault; + } + + public boolean showMoneyCostBarRightNow() { + return (areShownMoneyCostBarByDefault() || isShowingMoneyCostBar); + } + public void expandAll() { Button expandAllButton = (Button) getFellow("expandAll"); if (disabilityConfiguration.isExpandAllEnabled()) { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java index 786c7626c..48940a2ad 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -58,6 +58,7 @@ import org.zkoss.zul.Div; * Graphical component which represents a {@link Task}. * * @author Javier Morán Rúa + * @author Manuel Rego Casasnovas */ public class TaskComponent extends Div implements AfterCompose { @@ -76,6 +77,8 @@ public class TaskComponent extends Div implements AfterCompose { private PropertyChangeListener showingReportedHoursPropertyListener; + private PropertyChangeListener showingMoneyCostBarPropertyListener; + public static TaskComponent asTaskComponent(Task task, IDisabilityConfiguration disabilityConfiguration, boolean isTopLevel) { @@ -276,6 +279,20 @@ public class TaskComponent extends Div implements AfterCompose { this.task .addReportedHoursPropertyChangeListener(showingReportedHoursPropertyListener); + if (showingMoneyCostBarPropertyListener == null) { + showingMoneyCostBarPropertyListener = new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (isInPage() && !(task instanceof Milestone)) { + updateCompletionMoneyCostBar(); + } + } + }; + } + this.task + .addMoneyCostBarPropertyChangeListener(showingMoneyCostBarPropertyListener); + if (criticalPathPropertyListener == null) { criticalPathPropertyListener = new PropertyChangeListener() { @@ -483,6 +500,7 @@ public class TaskComponent extends Div implements AfterCompose { return; } updateCompletionReportedHours(); + updateCompletionMoneyCostBar(); updateCompletionAdvance(); } @@ -499,6 +517,20 @@ public class TaskComponent extends Div implements AfterCompose { } } + public void updateCompletionMoneyCostBar() { + if (task.isShowingMoneyCostBar()) { + int startPixels = this.task.getBeginDate().toPixels(getMapper()); + // TODO change method, for the moment using getHoursAdvanceEndDate() + String widthMoneyCostBar = pixelsFromStartUntil( + startPixels, this.task.getHoursAdvanceEndDate()) + "px"; + response(null, new AuInvoke(this, "resizeCompletionMoneyCostBar", + widthMoneyCostBar)); + } else { + response(null, new AuInvoke(this, "resizeCompletionMoneyCostBar", + "0px")); + } + } + private void updateCompletionAdvance() { if (task.isShowingAdvances()) { int startPixels = this.task.getBeginDate().toPixels(getMapper()); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java index 3fa8307be..6f5b50b38 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -22,7 +22,7 @@ package org.zkoss.ganttz.adapters; /** * @author Óscar González Fernández - * + * @author Manuel Rego Casasnovas */ public interface IDisabilityConfiguration { @@ -40,6 +40,8 @@ public interface IDisabilityConfiguration { public boolean isReportedHoursEnabled(); + public boolean isMoneyCostBarEnabled(); + public boolean isExpandAllEnabled(); public boolean isFlattenTreeEnabled(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java index e9728222a..0931feeac 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java @@ -148,6 +148,8 @@ public class PlannerConfiguration implements IDisabilityConfiguration { private boolean reportedHoursEnabled = true; + private boolean moneyCostBarEnabled = true; + private boolean expandAllEnabled = true; private boolean flattenTreeEnabled = true; @@ -345,6 +347,15 @@ public class PlannerConfiguration implements IDisabilityConfiguration { return reportedHoursEnabled; } + public void setMoneyCostBarEnabled(boolean moneyCostBarEnabled) { + this.moneyCostBarEnabled = moneyCostBarEnabled; + } + + @Override + public boolean isMoneyCostBarEnabled() { + return moneyCostBarEnabled; + } + public void setExpandAllEnabled(boolean expandAllEnabled) { this.expandAllEnabled = expandAllEnabled; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java index b8b10fae0..ebe696bad 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -32,7 +32,6 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.Validate; import org.joda.time.Duration; import org.joda.time.LocalDate; @@ -48,7 +47,9 @@ import org.zkoss.ganttz.util.WeakReferencedListeners.Mode; /** * This class contains the information of a task. It can be modified and * notifies of the changes to the interested parties.
+ * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public abstract class Task implements ITaskFundamentalProperties { @@ -73,6 +74,9 @@ public abstract class Task implements ITaskFundamentalProperties { private PropertyChangeSupport reportedHoursProperty = new PropertyChangeSupport( this); + private PropertyChangeSupport moneyCostBarProperty = new PropertyChangeSupport( + this); + private final ITaskFundamentalProperties fundamentalProperties; private boolean visible = true; @@ -83,6 +87,8 @@ public abstract class Task implements ITaskFundamentalProperties { private boolean showingReportedHours = false; + private boolean showingMoneyCostBar = false; + private ConstraintViolationNotificator violationNotificator = ConstraintViolationNotificator .create(); @@ -178,6 +184,17 @@ public abstract class Task implements ITaskFundamentalProperties { return showingReportedHours; } + public void setShowingMoneyCostBar(boolean showingMoneyCostBar) { + boolean previousValue = this.showingMoneyCostBar; + this.showingMoneyCostBar = showingMoneyCostBar; + moneyCostBarProperty.firePropertyChange("showingMoneyCostBar", + previousValue, this.showingMoneyCostBar); + } + + public boolean isShowingMoneyCostBar() { + return showingMoneyCostBar; + } + public String getName() { return fundamentalProperties.getName(); } @@ -242,6 +259,11 @@ public abstract class Task implements ITaskFundamentalProperties { this.reportedHoursProperty.addPropertyChangeListener(listener); } + public void addMoneyCostBarPropertyChangeListener( + PropertyChangeListener listener) { + this.moneyCostBarProperty.addPropertyChangeListener(listener); + } + public void addFundamentalPropertiesChangeListener( PropertyChangeListener listener) { this.fundamentalPropertiesListeners.addPropertyChangeListener(listener); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java index 14a3be66e..a0fd03996 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -35,7 +35,9 @@ import org.zkoss.zk.ui.Component; /** * An implementation of {@link IContext} that delegates to another context and * redefines its {@link IContext#getRelativeTo()} + * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class ContextRelativeToOtherComponent implements IContext { @@ -147,4 +149,15 @@ public class ContextRelativeToOtherComponent implements IContext { public void showReportedHours() { context.showReportedHours(); } + + @Override + public void hideMoneyCostBar() { + context.hideMoneyCostBar(); + } + + @Override + public void showMoneyCostBar() { + context.showMoneyCostBar(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java index a1ddd3c0d..59b09e8c2 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -36,7 +36,9 @@ import org.zkoss.zk.ui.Component; * An implementation of {@link IContextWithPlannerTask} that wraps another * context and specifies the task to be returned by * {@link IContextWithPlannerTask#getTask()} + * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class ContextWithPlannerTask implements IContextWithPlannerTask { @@ -149,4 +151,15 @@ public class ContextWithPlannerTask implements IContextWithPlannerTask { public void showReportedHours() { context.showReportedHours(); } + + @Override + public void hideMoneyCostBar() { + context.hideMoneyCostBar(); + } + + @Override + public void showMoneyCostBar() { + context.showMoneyCostBar(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java index c5b02d2a6..4465b3a72 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * 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 @@ -38,7 +38,9 @@ import org.zkoss.zk.ui.Component; /** * A facade for operations allowed to extensions
+ * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public interface IContext { @@ -143,4 +145,9 @@ public interface IContext { void showReportedHours(); void hideReportedHours(); + + void showMoneyCostBar(); + + void hideMoneyCostBar(); + } diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul index c86c7a858..7aef9ab44 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul @@ -3,7 +3,7 @@ Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e Desenvolvemento Tecnolóxico de Galicia - Copyright (C) 2010-2011 Igalia, S.L. + 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 @@ -86,6 +86,13 @@ planner = self; sclass="planner-command"/> + +