From 87bc2809bc9086d2dd1da28e64b0083d8bf5e858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 22 Apr 2010 22:02:17 +0200 Subject: [PATCH 01/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: Remove the static variable so previous listings can't affect the current one --- .../web/calendars/BaseCalendarsTreeModel.java | 48 +++++++------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarsTreeModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarsTreeModel.java index ff854af94..56400986b 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarsTreeModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarsTreeModel.java @@ -36,8 +36,6 @@ import org.zkoss.zul.SimpleTreeNode; */ public class BaseCalendarsTreeModel extends SimpleTreeModel { - private static Map> relationParentChildren = new HashMap>(); - public BaseCalendarsTreeModel(BaseCalendarTreeRoot root) { super(createRootNodeAndDescendants(root, root.getRootCalendars(), root .getDerivedCalendars())); @@ -47,65 +45,55 @@ public class BaseCalendarsTreeModel extends SimpleTreeModel { BaseCalendarTreeRoot root, List rootCalendars, List derivedCalendars) { - fillHashParentChildren(rootCalendars, derivedCalendars); - - return new SimpleTreeNode(root, asNodes(rootCalendars)); + Map> parentChildren = createRelationParentChildren( + rootCalendars, derivedCalendars); + return new SimpleTreeNode(root, asNodes(parentChildren, rootCalendars)); } - private static List asNodes(List baseCalendars) { + private static List asNodes( + Map> relationParentChildren, + List baseCalendars) { if (baseCalendars == null) { return new ArrayList(); } ArrayList result = new ArrayList(); for (BaseCalendar baseCalendar : baseCalendars) { - result.add(asNode(baseCalendar)); + result.add(asNode(relationParentChildren, baseCalendar)); } return result; } - private static SimpleTreeNode asNode(BaseCalendar baseCalendar) { + private static SimpleTreeNode asNode( + Map> relationParentChildren, + BaseCalendar baseCalendar) { List children = relationParentChildren.get(baseCalendar); - return new SimpleTreeNode(baseCalendar, asNodes(children)); + return new SimpleTreeNode(baseCalendar, asNodes(relationParentChildren, + children)); } - private static void fillHashParentChildren( + private static Map> createRelationParentChildren( List rootCalendars, List derivedCalendars) { + Map> result = new HashMap>(); for (BaseCalendar root : rootCalendars) { - relationParentChildren.put(root, new ArrayList()); + result.put(root, new ArrayList()); } for (BaseCalendar derived : derivedCalendars) { BaseCalendar parent = derived.getParent(); - List siblings = relationParentChildren.get(parent); + List siblings = result.get(parent); if (siblings == null) { siblings = new ArrayList(); siblings.add(derived); - relationParentChildren.put(parent, siblings); + result.put(parent, siblings); } else { siblings.add(derived); } } - } - - @Override - public boolean isLeaf(Object node) { - if (node == null) { - return true; - } - - SimpleTreeNode simpleTreeNode = (SimpleTreeNode) node; - BaseCalendar baseCalendar = (BaseCalendar) simpleTreeNode.getData(); - - List children = relationParentChildren.get(baseCalendar); - if (children == null) { - return true; - } - - return children.isEmpty(); + return result; } } From aab58d8d34ab4af36a5002734784c1f2f9e76458 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Thu, 22 Apr 2010 20:08:21 +0200 Subject: [PATCH 02/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: Inverted contrast for selected rows --- navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css b/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css index 2bec7f175..44d9c5d47 100644 --- a/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css +++ b/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css @@ -1143,7 +1143,7 @@ span.z-dottree-line { tr.z-tree-row-seld, tr.z-list-item-seld, .z-combobox-pp .z-combo-item-seld { background-color: #fdd772; - color: #FFFFFF; + color: #000000; } .timeplot-canvas { From e3395e4c40bd42e842d6932a42b6abffcbe0228d Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Thu, 22 Apr 2010 20:08:22 +0200 Subject: [PATCH 03/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: Removed trim of long labels in resourcesLoad tree --- .../java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java index 54e713795..32b1a4bbb 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java @@ -222,7 +222,6 @@ MutableTreeModel modelForTree, Label label = new Label(); final String conceptName = principal.getConceptName(); label.setValue(conceptName); - limitValue(result, label, 40); result.appendChild(label); return result; } From 007b39a65f63d67f131906426cdf702be48aa49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Fri, 23 Apr 2010 13:31:35 +0200 Subject: [PATCH 04/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: [Bug #421] Disable name text box in company view. I had to add a configuration variable in ganttzk component to enable/disable the edition of that field. --- .../main/java/org/zkoss/ganttz/LeftTasksTreeRow.java | 5 +++++ .../ganttz/adapters/IDisabilityConfiguration.java | 2 ++ .../zkoss/ganttz/adapters/PlannerConfiguration.java | 11 +++++++++++ .../web/planner/company/CompanyPlanningModel.java | 1 + 4 files changed, 19 insertions(+) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java index ce6d300c3..fda8a090a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java @@ -372,6 +372,7 @@ public class LeftTasksTreeRow extends GenericForwardComposer { private void updateComponents() { getNameBox().setValue(task.getName()); + getNameBox().setDisabled(!canRenameTask()); getNameBox().setTooltiptext(task.getName()); getStartDateBox().setValue(task.getBeginDate()); @@ -396,6 +397,10 @@ public class LeftTasksTreeRow extends GenericForwardComposer { && task.canBeExplicitlyResized(); } + private boolean canRenameTask() { + return disabilityConfiguration.isRenamingTasksEnabled(); + } + private String asString(Date date) { return dateFormat.format(date); } 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 beb61b19b..f5a63dd54 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java @@ -39,4 +39,6 @@ public interface IDisabilityConfiguration { public boolean isFlattenTreeEnabled(); + public boolean isRenamingTasksEnabled(); + } 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 ec5ccb59a..2dd0630c5 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java @@ -134,6 +134,8 @@ public class PlannerConfiguration implements IDisabilityConfiguration { private boolean flattenTreeEnabled = true; + private boolean renamingTasksEnabled = true; + // private String identifier = null; private IDetailItemModificator firstLevelModificators = SeveralModificators @@ -298,6 +300,15 @@ public class PlannerConfiguration implements IDisabilityConfiguration { return flattenTreeEnabled; } + public void setRenamingTasksEnabled(boolean renamingTasksEnabled) { + this.renamingTasksEnabled = renamingTasksEnabled; + } + + @Override + public boolean isRenamingTasksEnabled() { + return renamingTasksEnabled; + } + public IDetailItemModificator getSecondLevelModificators() { return secondLevelModificators; } 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 212eecf96..095069105 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 @@ -482,6 +482,7 @@ public abstract class CompanyPlanningModel implements ICompanyPlanningModel { configuration.setCriticalPathEnabled(false); configuration.setExpandAllEnabled(false); configuration.setFlattenTreeEnabled(false); + configuration.setRenamingTasksEnabled(false); } private void addAdditionalCommands( From 1fadcf497b115049a9b49a71299079a350bab936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Fri, 23 Apr 2010 18:06:04 +0200 Subject: [PATCH 05/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: [Bug #419] Disable multiple selection in order elements tree. --- .../src/main/webapp/orders/components/_orderElementTree.zul | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul b/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul index ac41e9f1f..06d5b203e 100644 --- a/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul +++ b/navalplanner-webapp/src/main/webapp/orders/components/_orderElementTree.zul @@ -45,7 +45,7 @@ - Date: Fri, 23 Apr 2010 18:06:05 +0200 Subject: [PATCH 06/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: [Bug #419] Select elements in order element tree when clicking on the first cell. --- .../java/org/navalplanner/web/tree/TreeController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java index 63f8c99a2..8ee75508e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java @@ -426,6 +426,16 @@ public abstract class TreeController> extends onDoubleClickForSchedulingStateCell(currentElement); } }); + cell.addEventListener(Events.ON_CLICK, new EventListener() { + + private Treeitem item = (Treeitem) getCurrentTreeRow().getParent(); + + @Override + public void onEvent(Event event) throws Exception { + item.setSelected(true); + Util.reloadBindings(item.getParent()); + } + }); schedulingState.addTypeChangeListener( new ITypeChangedListener() { From 8dac1ebf1e4b58523b06ffcf6477bc957ca0506a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Fri, 23 Apr 2010 18:06:06 +0200 Subject: [PATCH 07/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: [Bug #419] Select elements in order element tree when focusing in any of the text entries. Works with orders and templates. --- .../web/orders/OrderElementTreeController.java | 1 + .../navalplanner/web/tree/TreeController.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java index 0b4dc801f..42078b83a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java @@ -584,6 +584,7 @@ public class OrderElementTreeController extends TreeController { notifyDateboxCantBeCreated(dateboxName, currentOrderElement .getCode()); } + registerFocusEvent(dinamicDatebox.getDateTextBox()); addCell(cell); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java index 8ee75508e..5f0ffca5f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java @@ -58,6 +58,7 @@ import org.zkoss.zul.Treecell; import org.zkoss.zul.Treeitem; import org.zkoss.zul.TreeitemRenderer; import org.zkoss.zul.Treerow; +import org.zkoss.zul.impl.api.InputElement; public abstract class TreeController> extends GenericForwardComposer { @@ -318,6 +319,20 @@ public abstract class TreeController> extends public Renderer() { } + protected void registerFocusEvent(final InputElement inputElement) { + inputElement.addEventListener(Events.ON_FOCUS, + new EventListener() { + + private Treeitem item = (Treeitem) getCurrentTreeRow().getParent(); + + @Override + public void onEvent(Event event) throws Exception { + item.setSelected(true); + Util.reloadBindings(item.getParent()); + } + }); + } + protected Treecell addCell(Component... components) { return addCell(null, components); } @@ -329,6 +344,9 @@ public abstract class TreeController> extends } for (Component component : components) { cell.appendChild(component); + if(component instanceof InputElement) { + registerFocusEvent((InputElement) component); + } } currentTreeRow.appendChild(cell); return cell; From c16ba813f6610080453d42ad0cec5b53a4ca80ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Fri, 23 Apr 2010 18:06:07 +0200 Subject: [PATCH 08/67] ItEr55S04ValidacionEProbasFuncionaisItEr54S04: Deleted some legacy code about order element numbers in OrderElementTreeController --- .../orders/OrderElementTreeController.java | 25 +++---------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java index 42078b83a..41d94c102 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java @@ -410,7 +410,7 @@ public class OrderElementTreeController extends TreeController { InputElement codeBox = (InputElement) ((Treecell)row.getChildren().get(1)).getChildren().get(0); InputElement nameBox = (InputElement) - ((Treecell)row.getChildren().get(2)).getChildren().get(1); + ((Treecell)row.getChildren().get(2)).getChildren().get(0); InputElement hoursBox = (InputElement) ((Treecell)row.getChildren().get(3)).getChildren().get(0); InputElement initDateBox = (InputElement) @@ -423,30 +423,13 @@ public class OrderElementTreeController extends TreeController { @Override protected void addDescriptionCell(OrderElement element) { - addTaskNumberCell(element); + addTaskNameCell(element); } - private void addTaskNumberCell(final OrderElement orderElementForThisRow) { + private void addTaskNameCell(final OrderElement orderElementForThisRow) { int[] path = getModel().getPath(orderElementForThisRow); String cssClass = "depth_" + path.length; - Label taskNumber = new Label(pathAsString(path)); - taskNumber.setSclass("tasknumber"); - taskNumber.addEventListener(Events.ON_DOUBLE_CLICK, - new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - IOrderElementModel model = orderModel - .getOrderElementModel(orderElementForThisRow); - orderElementController.openWindow(model); - // Util.reloadBindings(tree); - } - - }); - - // TODO It would be needed to expand the width for the numbers - // to make it ready for 2 and 3 digit numbers Textbox textBox = Util.bind(new Textbox(), new Util.Getter() { @@ -464,7 +447,7 @@ public class OrderElementTreeController extends TreeController { if (readOnly) { textBox.setDisabled(true); } - addCell(cssClass, taskNumber, textBox); + addCell(cssClass, textBox); registerKeyboardListener(textBox); } From 384a56cc5e32b0807828d1bf53b12b8ac904f5c1 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 23 Apr 2010 21:19:40 +0200 Subject: [PATCH 09/67] ItEr55S07AdaptacionServiciosRESTItEr54S09: Updated test to fulfill new specs related with calendar modifications in the past. --- .../calendars/entities/BaseCalendarTest.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java index 17d03c127..217dffd63 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java @@ -26,7 +26,6 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import java.util.Set; @@ -608,8 +607,8 @@ public class BaseCalendarTest { assertThat(calendar.getOwnExceptions().size(), equalTo(2)); } - @Test(expected = IllegalArgumentException.class) - public void testNotAllowCreateExceptionsInThePast() { + @Test + public void testAllowCreateExceptionsInThePast() { BaseCalendar calendar = createBasicCalendar(); LocalDate pastMonth = (new LocalDate()).minusMonths(1); @@ -619,28 +618,26 @@ public class BaseCalendarTest { calendar.addExceptionDay(exceptionDay); } - @Test(expected = IllegalArgumentException.class) - public void testNotAllowRemoveExceptionsInThePast() { + @Test + public void testAllowRemoveExceptionsInThePast() { BaseCalendar calendar = createBasicCalendar(); LocalDate pastMonth = (new LocalDate()).minusMonths(1); + CalendarException exceptionDay = CalendarException.create(pastMonth, 0, + createCalendarExceptionType()); + calendar.addExceptionDay(exceptionDay); calendar.removeExceptionDay(pastMonth); } @Test - public void testNotAllowSetExpiringDateInThePast() { + public void testAllowSetExpiringDateInThePast() { BaseCalendar calendar = createBasicCalendar(); calendar.newVersion((new LocalDate()).plusDays(1)); LocalDate pastWeek = (new LocalDate()).minusWeeks(1); - try { - calendar.setExpiringDate(pastWeek); - fail("It should throw an exception"); - } catch (IllegalArgumentException e) { - - } + calendar.setExpiringDate(pastWeek); } @Test @@ -697,8 +694,8 @@ public class BaseCalendarTest { equalTo(currentDate.plusWeeks(2))); } - @Test(expected = IllegalArgumentException.class) - public void testNotAllowSetValidFromInThePast() { + @Test + public void testAllowSetValidFromInThePast() { BaseCalendar calendar = createBasicCalendar(); LocalDate currentDate = new LocalDate(); From 55c73b3d08f16388a0a248b750d959aea9b5426c Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 23 Apr 2010 21:19:41 +0200 Subject: [PATCH 10/67] ItEr55S07AdaptacionServiciosRESTItEr54S09: Modified calendar model to fulfill new specs related with modifications in the past. --- .../calendars/entities/BaseCalendar.java | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java index d7d41479c..d234700f8 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java @@ -211,11 +211,6 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { public void addExceptionDay(CalendarException day) throws IllegalArgumentException { - if (day.getDate().compareTo(new LocalDate()) <= 0) { - throw new IllegalArgumentException( - "You can not modify the past adding a new exception day"); - } - if (isExceptionDayAlreadyInExceptions(day)) { throw new IllegalArgumentException( "This day is already in the exception days"); @@ -230,11 +225,6 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { public void removeExceptionDay(LocalDate date) throws IllegalArgumentException { - if (date.compareTo(new LocalDate()) <= 0) { - throw new IllegalArgumentException( - "You can not modify the past removing an exception day"); - } - CalendarException day = getOwnExceptionDay(date); if (day == null) { throw new IllegalArgumentException( @@ -650,11 +640,6 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { + "because of this is the last version"); } - if (expiringDate.compareTo(new LocalDate()) <= 0) { - throw new IllegalArgumentException( - "This date must be greater than current date"); - } - Integer index = calendarDataVersions.indexOf(calendarData); if (index > 0) { CalendarData preivousCalendarData = calendarDataVersions @@ -759,13 +744,8 @@ public class BaseCalendar extends IntegrationEntity implements IWorkHours { throw new IllegalArgumentException( "You can not remove the current calendar data"); } - if (validFrom.compareTo(new LocalDate()) > 0) { - calendarDataVersions.remove(lastCalendarData); - getLastCalendarData().removeExpiringDate(); - } else { - throw new IllegalArgumentException( - "You can not modify the past removing a calendar data"); - } + calendarDataVersions.remove(lastCalendarData); + getLastCalendarData().removeExpiringDate(); } else { throw new IllegalArgumentException( "You just can remove the last calendar data"); From d795fe62706a289c92a0d115853ff6bc8215babd Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 23 Apr 2010 21:21:15 +0200 Subject: [PATCH 11/67] ItEr55S07AdaptacionServiciosRESTItEr54S09: Using a more human friendly code for CalendarExceptionType predefined entities. --- .../calendars/entities/CalendarExceptionType.java | 6 ++++++ .../entities/PredefinedCalendarExceptionTypes.java | 3 ++- scripts/rest-clients/calendars-sample.xml | 12 ++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarExceptionType.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarExceptionType.java index f6cf68320..ed3ce782e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarExceptionType.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CalendarExceptionType.java @@ -37,6 +37,12 @@ public class CalendarExceptionType extends IntegrationEntity { return create(new CalendarExceptionType(name, color, notAssignable)); } + public static CalendarExceptionType create(String code, String name, + String color, Boolean notAssignable) { + return create(new CalendarExceptionType(name, color, notAssignable), + code); + } + private String name; private String color; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/PredefinedCalendarExceptionTypes.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/PredefinedCalendarExceptionTypes.java index bc1e59ca7..36375c261 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/PredefinedCalendarExceptionTypes.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/PredefinedCalendarExceptionTypes.java @@ -37,7 +37,8 @@ public enum PredefinedCalendarExceptionTypes { private PredefinedCalendarExceptionTypes(String name, String color, Boolean notAssignable) { - calendarExceptionType = CalendarExceptionType.create(name, color, + // Using the name as code in order to be more human friendly + calendarExceptionType = CalendarExceptionType.create(name, name, color, notAssignable); } diff --git a/scripts/rest-clients/calendars-sample.xml b/scripts/rest-clients/calendars-sample.xml index c2494a1d0..85bfcb83c 100644 --- a/scripts/rest-clients/calendars-sample.xml +++ b/scripts/rest-clients/calendars-sample.xml @@ -3,10 +3,10 @@ - - @@ -25,16 +25,16 @@ name="Galician Calendar" code="000-001"> - - - - From 813b77c04f2e7945c2c42ae2aa2ab203431a2d18 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 23 Apr 2010 21:24:52 +0200 Subject: [PATCH 12/67] ItEr55S07AdaptacionServiciosRESTItEr54S09: Fixed type in hors-per-day instead of hours-per-day. --- .../ws/calendars/api/CalendarDataDTO.java | 2 +- scripts/rest-clients/calendars-sample.xml | 16 ++++++++-------- .../resource-withCalendars-sample.xml | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java index e9105eb5c..ac21f8ac3 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/calendars/api/CalendarDataDTO.java @@ -40,7 +40,7 @@ public class CalendarDataDTO extends IntegrationEntityDTO { public final static String ENTITY_TYPE = "calendar-data"; - @XmlElementWrapper(name = "hors-per-day-list") + @XmlElementWrapper(name = "hours-per-day-list") @XmlElement(name = "hours-per-day") public List hoursPerDays = new ArrayList(); diff --git a/scripts/rest-clients/calendars-sample.xml b/scripts/rest-clients/calendars-sample.xml index 85bfcb83c..0a49fb44f 100644 --- a/scripts/rest-clients/calendars-sample.xml +++ b/scripts/rest-clients/calendars-sample.xml @@ -12,12 +12,12 @@ - + - + @@ -41,28 +41,28 @@ - + - + - + - + - + - + diff --git a/scripts/rest-clients/resource-withCalendars-sample.xml b/scripts/rest-clients/resource-withCalendars-sample.xml index 6e1e27a98..e9d059199 100644 --- a/scripts/rest-clients/resource-withCalendars-sample.xml +++ b/scripts/rest-clients/resource-withCalendars-sample.xml @@ -13,7 +13,7 @@ - + @@ -43,7 +43,7 @@ - + From db2600c111dcc68c9f4440243cb3ffa18b705d70 Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Mon, 26 Apr 2010 09:45:13 +0200 Subject: [PATCH 13/67] ItEr55S11RFAspectosGraficosRecursoLimitantesItEr54S12: Created basic LimitingResources controller and components structure --- .../LimitingResourcesComponent.java | 136 +++++++++ .../LimitingResourcesLeftPane.java | 197 +++++++++++++ .../LimitingResourcesList.java | 134 +++++++++ .../LimitingResourcesPanel.java | 259 ++++++++++++++++++ .../main/resources/metainfo/zk/lang-addon.xml | 34 +++ .../web/ganttz/limitingresources/leftPane.zul | 28 ++ .../limitingresources/limitingresources.dsp | 12 + .../limitingresourceslist.dsp | 11 + .../ganttz/zul/limitingResourcesLayout.zul | 148 ++++++++++ .../LimitingResourcesController.java | 150 ++++++++++ .../planner/tabs/IGlobalViewEntryPoints.java | 2 + .../tabs/LimitingResourcesTabCreator.java | 160 +++++++++++ .../tabs/MultipleTabsPlannerController.java | 22 ++ .../main/webapp/common/css/navalplan_zk.css | 7 + .../limitingresources/_limitingresources.zul | 31 +++ .../src/main/webapp/planner/css/ganttzk.css | 6 + 16 files changed, 1337 insertions(+) create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesComponent.java create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesLeftPane.java create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesList.java create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesPanel.java create mode 100644 ganttzk/src/main/resources/web/ganttz/limitingresources/leftPane.zul create mode 100644 ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresources.dsp create mode 100644 ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresourceslist.dsp create mode 100644 ganttzk/src/main/resources/web/ganttz/zul/limitingResourcesLayout.zul create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/LimitingResourcesTabCreator.java create mode 100644 navalplanner-webapp/src/main/webapp/limitingresources/_limitingresources.zul diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesComponent.java new file mode 100644 index 000000000..5cf526cc3 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesComponent.java @@ -0,0 +1,136 @@ +/* + * This file is part of NavalPlan + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galic + * ia + * + * 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 . + */ + +package org.zkoss.ganttz.limitingresources; + +import java.util.ArrayList; +import java.util.List; + +import org.joda.time.LocalDate; +import org.zkoss.ganttz.IDatesMapper; +import org.zkoss.ganttz.data.resourceload.LoadPeriod; +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.timetracker.TimeTracker; +import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; +import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; +import org.zkoss.zul.Div; +import org.zkoss.zul.impl.XulElement; + +/** + * This class wraps ResourceLoad data inside an specific HTML Div component. + * @author Lorenzo Tilve Álvaro + */ +public class LimitingResourcesComponent extends XulElement { + + public static LimitingResourcesComponent create(TimeTracker timeTracker, + LoadTimeLine loadLine) { + return new LimitingResourcesComponent(timeTracker, loadLine); + } + + private final LoadTimeLine loadLine; + private final TimeTracker timeTracker; + private transient IZoomLevelChangedListener zoomChangedListener; + + private LimitingResourcesComponent(final TimeTracker timeTracker, + final LoadTimeLine loadLine) { + this.loadLine = loadLine; + this.timeTracker = timeTracker; + createChildren(loadLine, timeTracker.getMapper()); + zoomChangedListener = new IZoomLevelChangedListener() { + + @Override + public void zoomLevelChanged(ZoomLevel detailLevel) { + getChildren().clear(); + createChildren(loadLine, timeTracker.getMapper()); + invalidate(); + } + }; + this.timeTracker.addZoomListener(zoomChangedListener); + } + + private void createChildren(LoadTimeLine loadLine, IDatesMapper mapper) { + List
divs = createDivsForPeriods(mapper, loadLine.getLoadPeriods()); + for (Div div : divs) { + appendChild(div); + } + } + + public String getResourceLoadName() { + return loadLine.getConceptName(); + } + + public String getResourceLoadType() { + return loadLine.getType(); + } + + + private static List
createDivsForPeriods(IDatesMapper datesMapper, + List loadPeriods) { + List
result = new ArrayList
(); + for (LoadPeriod loadPeriod : loadPeriods) { + result.add(createDivForPeriod(datesMapper, loadPeriod)); + } + return result; + } + + private static Div createDivForPeriod(IDatesMapper datesMapper, + LoadPeriod loadPeriod) { + Div result = new Div(); + result.setClass(String.format("taskassignmentinterval %s", loadPeriod + .getLoadLevel().getCategory())); + + String load = "Load: " + loadPeriod.getLoadLevel().getPercentage() + + "% , "; + if (loadPeriod.getLoadLevel().getPercentage() == Integer.MAX_VALUE) { + load = ""; + } + result.setTooltiptext(load + + "total work hours: " + loadPeriod.getTotalResourceWorkHours() + + " , " + "assigned hours: " + loadPeriod.getAssignedHours()); + + result.setLeft(forCSS(getStartPixels(datesMapper, loadPeriod))); + result.setWidth(forCSS(getWidthPixels(datesMapper, loadPeriod))); + return result; + } + + private static int getWidthPixels(IDatesMapper datesMapper, + LoadPeriod loadPeriod) { + LocalDate start = loadPeriod.getStart(); + LocalDate end = loadPeriod.getEnd(); + return datesMapper + .toPixels(toMilliseconds(end) - toMilliseconds(start)); + } + + private static long toMilliseconds(LocalDate localDate) { + return localDate.toDateMidnight().getMillis(); + } + + private static String forCSS(int pixels) { + return String.format("%dpx", pixels); + } + + private static int getStartPixels(IDatesMapper datesMapper, + LoadPeriod loadPeriod) { + return datesMapper.toPixels(loadPeriod.getStart().toDateMidnight() + .toDate()); + } + +} \ No newline at end of file diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesLeftPane.java b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesLeftPane.java new file mode 100644 index 000000000..343c0ce46 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesLeftPane.java @@ -0,0 +1,197 @@ +/* + * This file is part of NavalPlan + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 . + */ + +package org.zkoss.ganttz.limitingresources; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.util.MutableTreeModel; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.OpenEvent; +import org.zkoss.zul.Div; +import org.zkoss.zul.Label; +import org.zkoss.zul.Popup; +import org.zkoss.zul.Treecell; +import org.zkoss.zul.Treechildren; +import org.zkoss.zul.Treeitem; +import org.zkoss.zul.TreeitemRenderer; +import org.zkoss.zul.Treerow; +import org.zkoss.zul.api.Tree; + +public class LimitingResourcesLeftPane extends HtmlMacroComponent { + + private MutableTreeModel modelForTree; + private final LimitingResourcesList limitingResourcesList; + + public LimitingResourcesLeftPane(MutableTreeModel modelForTree, + LimitingResourcesList resourceLoadList) { + this.limitingResourcesList = resourceLoadList; + this.modelForTree = modelForTree; + } + + + @Override + public void afterCompose() { + super.afterCompose(); + getContainerTree().setModel(modelForTree); + getContainerTree().setTreeitemRenderer(getRendererForTree()); + } + + private TreeitemRenderer getRendererForTree() { + return new TreeitemRenderer() { + @Override + public void render(Treeitem item, Object data) + throws Exception { + LoadTimeLine line = (LoadTimeLine) data; + item.setOpen(false); + item.setValue(line); + + Treerow row = new Treerow(); + Treecell cell = new Treecell(); + Component component = createComponent(line); + item.appendChild(row); + row.appendChild(cell); + cell.appendChild(component); + collapse(line); + addExpandedListener(item, line); + } + + private void addExpandedListener(final Treeitem item, + final LoadTimeLine line) { + item.addEventListener("onOpen", new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + OpenEvent openEvent = (OpenEvent) event; + if (openEvent.isOpen()) { + List closed = calculatedClosedItems(item); + expand(line, closed); + } else { + collapse(line); + } + } + }); + } + + private Component createComponent(LoadTimeLine line) { + return isTopLevel(line) ? createFirstLevel(line) + : createSecondLevel(line); + } + + private boolean isTopLevel(LoadTimeLine line) { + int[] path = modelForTree.getPath(modelForTree.getRoot(), line); + return path.length == 0; + } + }; + } + + private void collapse(LoadTimeLine line) { + limitingResourcesList.collapse(line); + } + + private void expand(LoadTimeLine line, List closed) { + limitingResourcesList.expand(line, closed); + } + + private List calculatedClosedItems(Treeitem item) { + List result = new ArrayList(); + Treechildren treeChildren = item.getTreechildren(); + if (treeChildren != null) { + List myTreeItems = (List) treeChildren + .getChildren(); + Iterator iterator = myTreeItems.iterator(); + while (iterator.hasNext()) { + Treeitem child = (Treeitem) iterator.next(); + if (!child.isOpen()) { + result.addAll(getLineChildrenBy(child)); + } else { + result.addAll(calculatedClosedItems(child)); + } + } + } + return result; + } + + private List getLineChildrenBy(Treeitem item) { + List result = new ArrayList(); + LoadTimeLine line = getLineByTreeitem(item); + if (line != null) { + result.addAll(line.getAllChildren()); + } + return result; + } + + private LoadTimeLine getLineByTreeitem(Treeitem child) { + LoadTimeLine line = null; + try { + line = (LoadTimeLine) child.getValue(); + } catch (Exception e) { + return null; + } + return line; + } + + private Tree getContainerTree() { + return (Tree) getFellow("loadsTree"); + } + + private Component createFirstLevel(LoadTimeLine principal) { + Div result = createLabelWithName(principal); + result.setSclass("firstlevel"); + return result; + } + + private Component createSecondLevel(LoadTimeLine loadTimeLine) { + Div result = createLabelWithName(loadTimeLine); + result.setSclass("secondlevel"); + return result; + } + + private Div createLabelWithName(LoadTimeLine principal) { + Div result = new Div(); + Label label = new Label(); + final String conceptName = principal.getConceptName(); + label.setValue(conceptName); + limitValue(result, label, 40); + result.appendChild(label); + return result; + } + + private static void limitValue(Div parent, Label label, int maxLength) { + String originalValue = label.getValue(); + if (originalValue == null || originalValue.length() <= maxLength) { + return; + } + label.setValue(originalValue.substring(0, maxLength - 3) + "..."); + label.setTooltip(createPopup(parent, originalValue)); + } + + private static Popup createPopup(Div parent, String originalValue) { + Popup result = new Popup(); + result.appendChild(new Label(originalValue)); + parent.appendChild(result); + return result; + } +} diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesList.java b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesList.java new file mode 100644 index 000000000..7a3257ec1 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesList.java @@ -0,0 +1,134 @@ +/* + * This file is part of NavalPlan + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 . + */ + +package org.zkoss.ganttz.limitingresources; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.timetracker.TimeTracker; +import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; +import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; +import org.zkoss.ganttz.util.MutableTreeModel; +import org.zkoss.zk.au.out.AuInvoke; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zk.ui.ext.AfterCompose; + +/** + * Component to include a list of ResourceLoads inside the ResourcesLoadPanel. + * @author Lorenzo Tilve Álvaro + */ +public class LimitingResourcesList extends HtmlMacroComponent implements + AfterCompose { + + private final IZoomLevelChangedListener zoomListener; + + private Map fromTimeLineToComponent = new HashMap(); + + private final MutableTreeModel timelinesTree; + + public LimitingResourcesList(TimeTracker timeTracker, + MutableTreeModel timelinesTree) { + this.timelinesTree = timelinesTree; + zoomListener = adjustTimeTrackerSizeListener(); + timeTracker.addZoomListener(zoomListener); + LoadTimeLine current = timelinesTree.getRoot(); + List toInsert = new ArrayList(); + fill(timelinesTree, current, toInsert); + insertAsComponents(timeTracker, toInsert); + } + + private void fill(MutableTreeModel timelinesTree, + LoadTimeLine current, List result) { + final int length = timelinesTree.getChildCount(current); + for (int i = 0; i < length; i++) { + LoadTimeLine child = timelinesTree.getChild(current, i); + result.add(child); + fill(timelinesTree, child, result); + } + } + + private IZoomLevelChangedListener adjustTimeTrackerSizeListener() { + return new IZoomLevelChangedListener() { + + @Override + public void zoomLevelChanged(ZoomLevel detailLevel) { + response(null, new AuInvoke(LimitingResourcesList.this, + "adjustTimeTrackerSize")); + response(null, new AuInvoke(LimitingResourcesList.this, + "adjustResourceLoadRows")); + } + }; + } + + private void insertAsComponents(TimeTracker timetracker, + List children) { + for (LoadTimeLine loadTimeLine : children) { + LimitingResourcesComponent component = LimitingResourcesComponent + .create( + timetracker, loadTimeLine); + appendChild(component); + fromTimeLineToComponent.put(loadTimeLine, component); + } + } + + public void collapse(LoadTimeLine line) { + for (LoadTimeLine l : line.getAllChildren()) { + getComponentFor(l).detach(); + } + } + + private LimitingResourcesComponent getComponentFor(LoadTimeLine l) { + LimitingResourcesComponent resourceLoadComponent = fromTimeLineToComponent + .get(l); + return resourceLoadComponent; + } + + public void expand(LoadTimeLine line, List closed) { + LimitingResourcesComponent parentComponent = getComponentFor(line); + Component nextSibling = parentComponent.getNextSibling(); + + List childrenToOpen = getChildrenReverseOrderFor(line); + childrenToOpen.removeAll(closed); + + for (LoadTimeLine loadTimeLine : childrenToOpen) { + LimitingResourcesComponent child = getComponentFor(loadTimeLine); + insertBefore(child, nextSibling); + nextSibling = child; + } + + } + + private List getChildrenReverseOrderFor(LoadTimeLine line) { + List childrenOf = line.getAllChildren(); + Collections.reverse(childrenOf); + return childrenOf; + } + + @Override + public void afterCompose() { + super.afterCompose(); + } +} diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesPanel.java b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesPanel.java new file mode 100644 index 000000000..6d3fb9ddb --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/limitingresources/LimitingResourcesPanel.java @@ -0,0 +1,259 @@ +/* + * This file is part of NavalPlan + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 . + */ + +package org.zkoss.ganttz.limitingresources; + +import static org.zkoss.ganttz.i18n.I18nHelper._; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.zkoss.ganttz.data.resourceload.LoadTimeLine; +import org.zkoss.ganttz.resourceload.ScriptsRequiredByResourceLoadPanel; +import org.zkoss.ganttz.timetracker.TimeTracker; +import org.zkoss.ganttz.timetracker.TimeTrackerComponent; +import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; +import org.zkoss.ganttz.util.ComponentsFinder; +import org.zkoss.ganttz.util.MutableTreeModel; +import org.zkoss.ganttz.util.OnZKDesktopRegistry; +import org.zkoss.ganttz.util.script.IScriptsRegister; +import org.zkoss.zk.au.out.AuInvoke; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.HtmlMacroComponent; +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.Button; +import org.zkoss.zul.ListModel; +import org.zkoss.zul.Separator; +import org.zkoss.zul.SimpleListModel; +import org.zkoss.zul.api.Listbox; + +public class LimitingResourcesPanel extends HtmlMacroComponent { + + public interface IToolbarCommand { + public void doAction(); + + public String getLabel(); + + public String getImage(); + } + + private TimeTrackerComponent timeTrackerComponent; + + private LimitingResourcesLeftPane leftPane; + + private LimitingResourcesList limitingResourcesList; + + private List groups; + + private MutableTreeModel treeModel; + + private TimeTracker timeTracker; + + // private WeakReferencedListeners zoomListeners = + // WeakReferencedListeners.create(); + + private Listbox listZoomLevels; + + private static final String filterResources = _("Filter by resources"); + private static final String filterCriterions = _("Filter by criterions"); + private boolean filterbyResources = true; + + public LimitingResourcesPanel(List groups, + TimeTracker timeTracker) { + init(groups, timeTracker); + + } + + public void init(List groups, TimeTracker timeTracker) { + this.groups = groups; + this.timeTracker = timeTracker; + treeModel = createModelForTree(); + timeTrackerComponent = timeTrackerForResourcesLoadPanel(timeTracker); + limitingResourcesList = new LimitingResourcesList(timeTracker, + treeModel); + leftPane = new LimitingResourcesLeftPane(treeModel, + limitingResourcesList); + registerNeededScripts(); + } + + public ListModel getFilters() { + String[] filters = new String[] { filterResources, filterCriterions }; + return new SimpleListModel(filters); + } + + public void setFilter(String filterby) { + if (filterby.equals(filterResources)) { + this.filterbyResources = true; + } else { + this.filterbyResources = false; + } + } + + public boolean getFilter() { + return filterbyResources; + } + + // public void onApplyFilter() { + // zoomListeners + // .fireEvent(new IListenerNotification() { + // @Override + // public void doNotify(IFilterChangedListener listener) { + // listener.filterChanged(getFilter()); + // } + // }); + // } + // + // public void addFilterListener(IFilterChangedListener listener) { + // zoomListeners.addListener(listener); + // } + + public ListModel getZoomLevels() { + return new SimpleListModel(ZoomLevel.values()); + } + + public void setZoomLevel(final ZoomLevel zoomLevel) { + timeTracker.setZoomLevel(zoomLevel); + } + + public void zoomIncrease() { + timeTracker.zoomIncrease(); + } + + public void zoomDecrease() { + timeTracker.zoomDecrease(); + } + + public void add(final IToolbarCommand... commands) { + Component toolbar = getToolbar(); + Separator separator = getSeparator(); + for (IToolbarCommand c : commands) { + toolbar.insertBefore(asButton(c), separator); + } + } + + private Button asButton(final IToolbarCommand c) { + Button result = new Button(); + result.addEventListener(Events.ON_CLICK, new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + c.doAction(); + } + }); + if (!StringUtils.isEmpty(c.getImage())) { + result.setImage(c.getImage()); + result.setTooltiptext(c.getLabel()); + } else { + result.setLabel(c.getLabel()); + } + return result; + } + + @SuppressWarnings("unchecked") + private Separator getSeparator() { + List children = getToolbar().getChildren(); + Separator separator = ComponentsFinder.findComponentsOfType( + Separator.class, children).get(0); + return separator; + } + + private Component getToolbar() { + Component toolbar = getFellow("toolbar"); + return toolbar; + } + + private void registerNeededScripts() { + getScriptsRegister().register(ScriptsRequiredByResourceLoadPanel.class); + } + + private IScriptsRegister getScriptsRegister() { + return OnZKDesktopRegistry.getLocatorFor(IScriptsRegister.class) + .retrieve(); + } + + private MutableTreeModel createModelForTree() { + MutableTreeModel result = MutableTreeModel + .create(LoadTimeLine.class); + for (LoadTimeLine loadTimeLine : this.groups) { + result.addToRoot(loadTimeLine); + result = addNodes(result, loadTimeLine); + } + return result; + } + + + private MutableTreeModel addNodes( + MutableTreeModel tree, LoadTimeLine parent) { + if (!parent.getChildren().isEmpty()) { + tree.add(parent, parent.getChildren()); + for (LoadTimeLine loadTimeLine : parent.getChildren()) { + tree = addNodes(tree, loadTimeLine); + } + } + return tree; + } + + private TimeTrackerComponent timeTrackerForResourcesLoadPanel( + TimeTracker timeTracker) { + return new TimeTrackerComponent(timeTracker) { + @Override + protected void scrollHorizontalPercentage(int pixelsDisplacement) { + response("", new AuInvoke(limitingResourcesList, + "adjustScrollHorizontalPosition", pixelsDisplacement + + "")); + } + }; + } + + @Override + public void afterCompose() { + super.afterCompose(); + + leftPane.afterCompose(); + + getFellow("insertionPointRightPanel").appendChild(timeTrackerComponent); + getFellow("insertionPointRightPanel").appendChild(limitingResourcesList); + TimeTrackerComponent timeTrackerHeader = createTimeTrackerHeader(); + getFellow("insertionPointTimetracker").appendChild(timeTrackerHeader); + + timeTrackerHeader.afterCompose(); + timeTrackerComponent.afterCompose(); + listZoomLevels = (Listbox) getFellow("listZoomLevels"); + listZoomLevels.setSelectedIndex(timeTracker.getDetailLevel().ordinal()); + } + + public void clearComponents() { + getFellow("insertionPointLeftPanel").getChildren().clear(); + getFellow("insertionPointRightPanel").getChildren().clear(); + getFellow("insertionPointTimetracker").getChildren().clear(); + } + + private TimeTrackerComponent createTimeTrackerHeader() { + return new TimeTrackerComponent( + timeTracker) { + + @Override + protected void scrollHorizontalPercentage(int pixelsDisplacement) { + } + }; + } + +} \ No newline at end of file diff --git a/ganttzk/src/main/resources/metainfo/zk/lang-addon.xml b/ganttzk/src/main/resources/metainfo/zk/lang-addon.xml index db0359088..9bba07a50 100755 --- a/ganttzk/src/main/resources/metainfo/zk/lang-addon.xml +++ b/ganttzk/src/main/resources/metainfo/zk/lang-addon.xml @@ -48,6 +48,29 @@ ~./ganttz/resourceload/leftPane.zul + + + LimitingResourcesPanel + org.zkoss.ganttz.limitingresources.LimitingResourcesPanel + ~./ganttz/zul/limitingResourcesLayout.zul + + + + LimitingResourcesList + org.zkoss.ganttz.limitingresources.LimitingResourcesList + + default + ~./ganttz/limitingresources/limitingresourceslist.dsp + + + + + LimitingResourcesLeftPane + org.zkoss.ganttz.limitingresources.LimitingResourcesLeftPane + ~./ganttz/limitingresources/leftPane.zul + + + leftPane org.zkoss.ganttz.LeftPane @@ -79,6 +102,17 @@ + + limitingresources + org.zkoss.ganttz.limitingresources.LimitingResourcesComponent + + + default + ~./ganttz/limitingresources/limitingresources.dsp + + + + taskRow org.zkoss.ganttz.TaskRow diff --git a/ganttzk/src/main/resources/web/ganttz/limitingresources/leftPane.zul b/ganttzk/src/main/resources/web/ganttz/limitingresources/leftPane.zul new file mode 100644 index 000000000..2e06c5724 --- /dev/null +++ b/ganttzk/src/main/resources/web/ganttz/limitingresources/leftPane.zul @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresources.dsp b/ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresources.dsp new file mode 100644 index 000000000..907fd3f43 --- /dev/null +++ b/ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresources.dsp @@ -0,0 +1,12 @@ +<%@ taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c" %> +<%@ taglib uri="http://www.zkoss.org/dsp/zk/core" prefix="z" %> + + +
+ ${self.resourceLoadName} + + ${z:redraw(child, null)} + +
+ diff --git a/ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresourceslist.dsp b/ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresourceslist.dsp new file mode 100644 index 000000000..79664deee --- /dev/null +++ b/ganttzk/src/main/resources/web/ganttz/limitingresources/limitingresourceslist.dsp @@ -0,0 +1,11 @@ +<%@ taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c" %> +<%@ taglib uri="http://www.zkoss.org/dsp/zk/core" prefix="z" %> + + + +
+ + ${z:redraw(child, null)} + +
diff --git a/ganttzk/src/main/resources/web/ganttz/zul/limitingResourcesLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/limitingResourcesLayout.zul new file mode 100644 index 000000000..020671be1 --- /dev/null +++ b/ganttzk/src/main/resources/web/ganttz/zul/limitingResourcesLayout.zul @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + +