diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java b/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java index d67c8b130..ce325b486 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java @@ -60,7 +60,7 @@ public class TabsRegistry { public void loadNewName(ITab tab) { if (fromTabToMenuKey.containsKey(tab)) { Object key = fromTabToMenuKey.get(tab); - menu.renameMenuItem(key, tab.getName()); + menu.renameMenuItem(key, tab.getName(), tab.getCssClass()); } } @@ -94,7 +94,8 @@ public class TabsRegistry { public void registerAtMenu(IMenuItemsRegister menu) { this.menu = menu; for (final ITab t : tabs) { - Object key = menu.addMenuItem(t.getName(), new EventListener() { + Object key = menu.addMenuItem(t.getName(), t.getCssClass(), + new EventListener() { @Override public void onEvent(Event event) throws Exception { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java index e87650630..b96f9bdcc 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java @@ -26,6 +26,12 @@ public interface ITab { String getName(); + /** + * the css class is optional so it can be null + * @return + */ + String getCssClass(); + void addToParent(Component parent); void show(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java index aa65ca35e..9c8cfee35 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java @@ -52,4 +52,9 @@ public class TabProxy implements ITab { proxiedTab.show(); } + @Override + public String getCssClass() { + return proxiedTab.getCssClass(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/IMenuItemsRegister.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/IMenuItemsRegister.java index f75272d08..7ea62cbdd 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/util/IMenuItemsRegister.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/IMenuItemsRegister.java @@ -24,13 +24,15 @@ import org.zkoss.zk.ui.event.EventListener; public interface IMenuItemsRegister { /** + * @param cssClass + * can be null * @return a key to access the new menu item */ - public Object addMenuItem(String name, EventListener eventListener); + public Object addMenuItem(String name, String cssClass, EventListener eventListener); public void activateMenuItem(Object key); - public void renameMenuItem(Object key, String name); + public void renameMenuItem(Object key, String name, String cssClass); public void toggleVisibilityTo(Object key, boolean visible); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java index 430155295..1ccaf3285 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java @@ -25,6 +25,8 @@ import static org.navalplanner.web.I18nHelper._; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.navalplanner.business.users.entities.UserRole; import org.navalplanner.web.security.SecurityUtils; @@ -255,11 +257,14 @@ public class CustomMenuController extends Div implements IMenuItemsRegister { private Button currentOne = null; @Override - public Object addMenuItem(String name, + public Object addMenuItem(String name, String cssClass, org.zkoss.zk.ui.event.EventListener eventListener) { Vbox insertionPoint = getRegisteredItemsInsertionPoint(); Button button = new Button(); button.setLabel(_(name)); + if (cssClass != null) { + toggleDomainCssClass(cssClass, button); + } setDeselectedClass(button); button.addEventListener(Events.ON_CLICK, doNotCallTwice(button, eventListener)); @@ -274,9 +279,24 @@ public class CustomMenuController extends Div implements IMenuItemsRegister { } @Override - public void renameMenuItem(Object key, String name) { + public void renameMenuItem(Object key, String name, String cssClass) { Button button = (Button) key; button.setLabel(name); + if (cssClass != null) { + toggleDomainCssClass(cssClass, button); + } + } + + private void toggleDomainCssClass(String cssClass, Button button) { + Matcher matcher = perspectiveCssClass + .matcher(button.getSclass() == null ? "" : button.getSclass()); + String previousPerspectiveClass; + if (matcher.find()) { + previousPerspectiveClass = matcher.group(); + } else { + previousPerspectiveClass = ""; + } + button.setSclass(previousPerspectiveClass + " " + cssClass); } @Override @@ -287,11 +307,32 @@ public class CustomMenuController extends Div implements IMenuItemsRegister { } private void setSelectClass(final Button button) { - button.setSclass("perspective-active"); + togglePerspectiveClassTo(button, "perspective-active"); } private void setDeselectedClass(Button button) { - button.setSclass("perspective"); + togglePerspectiveClassTo(button, "perspective"); + } + + private static final Pattern perspectiveCssClass = Pattern + .compile("\\bperspective(-\\w+)?\\b"); + + private void togglePerspectiveClassTo(final Button button, + String newPerspectiveClass) { + button + .setSclass(togglePerspectiveCssClass(newPerspectiveClass, + button)); + } + + private String togglePerspectiveCssClass(String newPerspectiveClass, + Button button) { + String sclass = button.getSclass(); + if (!perspectiveCssClass.matcher(sclass).find()) { + return newPerspectiveClass + " " + sclass; + } else { + Matcher matcher = perspectiveCssClass.matcher(sclass); + return matcher.replaceAll(newPerspectiveClass); + } } private EventListener doNotCallTwice(final Button button, @@ -324,7 +365,6 @@ public class CustomMenuController extends Div implements IMenuItemsRegister { return; } if (currentOne != null) { - currentOne.setSclass("sub_menu"); setDeselectedClass(currentOne); } setSelectClass(button); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/AdvancedAllocationTabCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/AdvancedAllocationTabCreator.java index 2c9fc57da..dde3ca40b 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/AdvancedAllocationTabCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/AdvancedAllocationTabCreator.java @@ -233,6 +233,7 @@ public class AdvancedAllocationTabCreator { }; return new CreatedOnDemandTab(ADVANCED_ALLOCATION_VIEW, + "advanced-allocation", advanceAllocationComponentCreator) { private boolean firstTime = true; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/CreatedOnDemandTab.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/CreatedOnDemandTab.java index b5fa9bfef..5ad9609f8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/CreatedOnDemandTab.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/CreatedOnDemandTab.java @@ -32,16 +32,23 @@ public class CreatedOnDemandTab implements ITab { private Component parent; private final IComponentCreator componentCreator; private Component component; + private final String cssClass; public interface IComponentCreator { public Component create(Component parent); } public CreatedOnDemandTab(String name, IComponentCreator componentCreator) { + this(name, null, componentCreator); + } + + public CreatedOnDemandTab(String name, String cssClass, + IComponentCreator componentCreator) { Validate.notNull(name); Validate.notNull(componentCreator); this.componentCreator = componentCreator; this.name = name; + this.cssClass = cssClass; } @Override @@ -73,4 +80,9 @@ public class CreatedOnDemandTab implements ITab { protected void afterShowAction() { } + @Override + public String getCssClass() { + return cssClass; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/OrdersTabCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/OrdersTabCreator.java index 8417703b8..15a0af08a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/OrdersTabCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/OrdersTabCreator.java @@ -97,7 +97,7 @@ public class OrdersTabCreator { } private ITab createGlobalOrdersTab() { - return new CreatedOnDemandTab(ORDERS_VIEW, ordersTabCreator) { + return new CreatedOnDemandTab(ORDERS_VIEW, "orders", ordersTabCreator) { @Override protected void afterShowAction() { orderCRUDController.goToList(); @@ -124,7 +124,8 @@ public class OrdersTabCreator { } private ITab createOrderOrdersTab() { - return new CreatedOnDemandTab(ORDER_ORDERS_VIEW, ordersTabCreator) { + return new CreatedOnDemandTab(ORDER_ORDERS_VIEW, "order-data", + ordersTabCreator) { @Override protected void afterShowAction() { breadcrumbs.getChildren().clear(); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java index de702b978..b4eee6ff1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/PlanningTabCreator.java @@ -128,7 +128,8 @@ public class PlanningTabCreator { } }; - return new CreatedOnDemandTab(ENTERPRISE_VIEW, componentCreator) { + return new CreatedOnDemandTab(ENTERPRISE_VIEW, "company-scheduling", + componentCreator) { @Override protected void afterShowAction() { companyPlanningController.setConfigurationForPlanner(); @@ -159,7 +160,8 @@ public class PlanningTabCreator { } }; - return new CreatedOnDemandTab(ORDER_ENTERPRISE_VIEW, componentCreator) { + return new CreatedOnDemandTab(ORDER_ENTERPRISE_VIEW, + "order-scheduling", componentCreator) { @Override protected void afterShowAction() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/ResourcesLoadTabCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/ResourcesLoadTabCreator.java index d5c337605..d39779ae4 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/ResourcesLoadTabCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/ResourcesLoadTabCreator.java @@ -98,7 +98,7 @@ public class ResourcesLoadTabCreator { } }; - return new CreatedOnDemandTab(ORDER_RESOURCE_LOAD_VIEW, + return new CreatedOnDemandTab(ORDER_RESOURCE_LOAD_VIEW, "order-load", componentCreator) { @Override @@ -132,7 +132,8 @@ public class ResourcesLoadTabCreator { } }; - return new CreatedOnDemandTab(RESOURCE_LOAD_VIEW, componentCreator) { + return new CreatedOnDemandTab(RESOURCE_LOAD_VIEW, "company-load", + componentCreator) { @Override protected void afterShowAction() { resourceLoadControllerGlobal.filterBy(null); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/TabOnModeType.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/TabOnModeType.java index deba52ccd..a44f1ad69 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/TabOnModeType.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/TabOnModeType.java @@ -116,6 +116,11 @@ public class TabOnModeType implements ITab { return getCurrentTab().getName(); } + @Override + public String getCssClass() { + return getCurrentTab().getCssClass(); + } + @Override public void hide() { beingShown = false;