diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul
index eacdf4f31..d7fde1e90 100644
--- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul
+++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul
@@ -64,7 +64,7 @@ planner = self;
-
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java
index a11c986e0..9a922f799 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/company/CompanyPlanningModel.java
@@ -29,6 +29,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -61,6 +62,7 @@ import org.navalplanner.web.planner.chart.Chart;
import org.navalplanner.web.planner.chart.ChartFiller;
import org.navalplanner.web.planner.chart.EarnedValueChartFiller;
import org.navalplanner.web.planner.chart.IChartFiller;
+import org.navalplanner.web.planner.chart.EarnedValueChartFiller.EarnedValueType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@@ -79,6 +81,10 @@ import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener;
import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
import org.zkoss.ganttz.util.Interval;
import org.zkoss.zk.ui.Executions;
+import org.zkoss.zk.ui.event.Event;
+import org.zkoss.zk.ui.event.EventListener;
+import org.zkoss.zk.ui.event.Events;
+import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Div;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Tab;
@@ -86,6 +92,7 @@ import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Tabpanel;
import org.zkoss.zul.Tabpanels;
import org.zkoss.zul.Tabs;
+import org.zkoss.zul.Vbox;
/**
@@ -120,6 +127,8 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
@Autowired
private ICostCalculator hoursCostCalculator;
+ private List earnedValueChartConfigurationCheckboxes = new ArrayList();
+
private final class TaskElementNavigator implements
IStructureNavigator {
@Override
@@ -149,6 +158,7 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
Tabbox chartComponent = new Tabbox();
chartComponent.setOrient("vertical");
+ chartComponent.setHeight("200px");
appendTabs(chartComponent);
Timeplot chartLoadTimeplot = new Timeplot();
@@ -164,8 +174,9 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
setupChart(chartLoadTimeplot, new CompanyLoadChartFiller(), planner
.getTimeTracker());
- setupChart(chartEarnedValueTimeplot,
+ Chart earnedValueChart = setupChart(chartEarnedValueTimeplot,
new CompanyEarnedValueChartFiller(), planner.getTimeTracker());
+ setEventListenerConfigurationCheckboxes(earnedValueChart);
}
private void appendTabs(Tabbox chartComponent) {
@@ -216,16 +227,92 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
private void appendEarnedValueChartAndLegend(
Tabpanel earnedValueChartPannel, Timeplot chartEarnedValueTimeplot) {
Hbox hbox = new Hbox();
+
hbox.appendChild(getEarnedValueChartLegend());
+ Vbox vbox = new Vbox();
+
Div div = new Div();
div.appendChild(chartEarnedValueTimeplot);
div.setSclass("plannergraph");
- hbox.appendChild(div);
+ vbox.appendChild(div);
+
+ vbox.appendChild(getEarnedValueChartConfiguration());
+
+ hbox.appendChild(vbox);
earnedValueChartPannel.appendChild(hbox);
}
+ private org.zkoss.zk.ui.Component getEarnedValueChartConfiguration() {
+ Div div = new Div();
+ div.setId("earnedValueChartConfiguration");
+
+ for (EarnedValueType type : EarnedValueType.values()) {
+ Checkbox checkbox = new Checkbox(type.getAcronym());
+ checkbox.setTooltiptext(type.getName());
+ checkbox.setAttribute("indicator", type);
+ div.appendChild(checkbox);
+
+ earnedValueChartConfigurationCheckboxes.add(checkbox);
+ }
+
+ markAsSelectedDefaultIndicators();
+
+ return div;
+ }
+
+ private void markAsSelectedDefaultIndicators() {
+ for (Checkbox checkbox : earnedValueChartConfigurationCheckboxes) {
+ EarnedValueType type = (EarnedValueType) checkbox
+ .getAttribute("indicator");
+ switch (type) {
+ case BCWS:
+ case ACWP:
+ case BCWP:
+ checkbox.setChecked(true);
+ break;
+
+ default:
+ checkbox.setChecked(false);
+ break;
+ }
+ }
+ }
+
+ private Set getSelectedIndicators() {
+ Set result = new HashSet();
+ for (Checkbox checkbox : earnedValueChartConfigurationCheckboxes) {
+ if (checkbox.isChecked()) {
+ EarnedValueType type = (EarnedValueType) checkbox
+ .getAttribute("indicator");
+ result.add(type);
+ }
+ }
+ return result;
+ }
+
+ private void setEventListenerConfigurationCheckboxes(
+ final Chart earnedValueChart) {
+ for (Checkbox checkbox : earnedValueChartConfigurationCheckboxes) {
+ checkbox.addEventListener(Events.ON_CHECK, new EventListener() {
+
+ @Override
+ public void onEvent(Event event) throws Exception {
+ transactionService
+ .runOnReadOnlyTransaction(new IOnTransaction() {
+ @Override
+ public Void execute() {
+ earnedValueChart.fillChart();
+ return null;
+ }
+ });
+ }
+
+ });
+ }
+ }
+
private org.zkoss.zk.ui.Component getEarnedValueChartLegend() {
Div div = new Div();
Executions.createComponents("/planner/_legendEarnedValueChart.zul",
@@ -248,12 +335,13 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
}
}
- private void setupChart(Timeplot chartComponent,
+ private Chart setupChart(Timeplot chartComponent,
IChartFiller loadChartFiller, TimeTracker timeTracker) {
Chart loadChart = new Chart(chartComponent, loadChartFiller,
timeTracker);
loadChart.fillChart();
timeTracker.addZoomListener(fillOnZoomChange(loadChart));
+ return loadChart;
}
private IZoomLevelChangedListener fillOnZoomChange(
@@ -538,25 +626,25 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel {
calculateValues(interval);
- Plotinfo bcws = createPlotInfo(
- indicators.get(EarnedValueType.BCWS), interval, "0000FF");
- Plotinfo acwp = createPlotInfo(
- indicators.get(EarnedValueType.ACWP), interval, "FF0000");
- Plotinfo bcwp = createPlotInfo(
- indicators.get(EarnedValueType.BCWP), interval, "00FF00");
- Plotinfo cv = createPlotInfo(indicators.get(EarnedValueType.CV),
- interval, "FFFF00");
- Plotinfo sv = createPlotInfo(indicators.get(EarnedValueType.SV),
- interval, "00FFFF");
+ List plotinfos = new ArrayList();
+ for (EarnedValueType indicator : getSelectedIndicators()) {
+ Plotinfo plotinfo = createPlotInfo(indicators.get(indicator),
+ interval, indicator.getColor());
+ plotinfos.add(plotinfo);
+ }
+
+ if (plotinfos.isEmpty()) {
+ // If user doesn't select any indicator, it is needed to create
+ // a default Plotinfo in order to avoid errors on Timemplot
+ plotinfos.add(new Plotinfo());
+ }
ValueGeometry valueGeometry = getValueGeometry();
TimeGeometry timeGeometry = getTimeGeometry(interval);
- appendPlotinfo(chart, bcws, valueGeometry, timeGeometry);
- appendPlotinfo(chart, acwp, valueGeometry, timeGeometry);
- appendPlotinfo(chart, bcwp, valueGeometry, timeGeometry);
- appendPlotinfo(chart, cv, valueGeometry, timeGeometry);
- appendPlotinfo(chart, sv, valueGeometry, timeGeometry);
+ for (Plotinfo plotinfo : plotinfos) {
+ appendPlotinfo(chart, plotinfo, valueGeometry, timeGeometry);
+ }
chart.setWidth(size + "px");
chart.setHeight("100px");