diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/ADButtonTabList.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/ADButtonTabList.java index 872b14acb4..03a54d3d51 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/ADButtonTabList.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/ADButtonTabList.java @@ -24,25 +24,41 @@ import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; /** - * + * * @author Low Heng Sin * */ public class ADButtonTabList extends Panel implements IADTabList, EventListener { /** - * + * */ private static final long serialVersionUID = -9203013067784673646L; private List listItems = new ArrayList(); - private List listeners = new ArrayList(); + private List listeners = new ArrayList(); private IADTab tabbox; private int selectedIndex = 0; - + private int tabPlacement = IADTab.LEFT; + public ADButtonTabList() { this.setStyle("margin:0;padding:0"); } - + + /** + * Set tab placement ( left or right ) + * @param tabPlacement + */ + public void setTabplacement(int tabPlacement) { + if (tabPlacement != IADTab.LEFT && tabPlacement != IADTab.RIGHT) + return; + else if (tabPlacement == this.tabPlacement) + return; + else { + this.tabPlacement = tabPlacement; + this.invalidate(); + } + } + public synchronized void refresh() { List childs = getChildren(); int childCount = childs.size(); @@ -56,7 +72,7 @@ public class ADButtonTabList extends Panel implements IADTabList, EventListener Text text = new Text(tabLabel.label); button.appendChild(text); int s = tabbox.getSelectedIndex(); - + if ( s == i) { button.setSclass("adwindow-navbtn-sel"); button.setDynamicProperty("disabled", null); @@ -64,7 +80,7 @@ public class ADButtonTabList extends Panel implements IADTabList, EventListener if (!tabbox.canNavigateTo(s, i)) { button.setDynamicProperty("disabled", "disabled"); button.setSclass("adwindow-navbtn-dis"); - if (!tabbox.isDisplay(i)) + if (!tabbox.isDisplay(i)) button.setVisible(false); else button.setVisible(true); @@ -74,12 +90,12 @@ public class ADButtonTabList extends Panel implements IADTabList, EventListener button.setVisible(true); } } - - String style = "margin-left:" + (tabLabel.tabLevel*15+5) + "px"; + + String style = (tabPlacement == IADTab.LEFT ? "margin-left:" : "margin-right:") + (tabLabel.tabLevel*15+5) + "px"; String width = (195 - tabLabel.tabLevel*15)+"px"; - style = style + "; width:" + width; + style = style + "; width:" + width; button.setStyle(style); - + button.setParent(this); button.addEventListener(Events.ON_CLICK, this); } @@ -90,22 +106,22 @@ public class ADButtonTabList extends Panel implements IADTabList, EventListener } public void setSelectedIndex(int index) { - this.selectedIndex = index; + this.selectedIndex = index; } - + public synchronized void setItems(List listItems) { this.listItems = listItems; refresh(); } - + public void setADTab(IADTab adTab) { this.tabbox = adTab; } - - public void addSelectionEventListener(EventListener listener) { + + public void addSelectionEventListener(EventListener listener) { listeners.add(listener); } - + public boolean removeSelectionEventListener(EventListener listener) { return listeners.remove(listener); } @@ -121,10 +137,10 @@ public class ADButtonTabList extends Panel implements IADTabList, EventListener } i++; } - + selectedIndex = i; for (EventListener listener : listeners) { listener.onEvent(selectEvent); - } + } } } diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/CompositeADTab.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/CompositeADTab.java index bd8cd15759..1422bfd352 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/CompositeADTab.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/CompositeADTab.java @@ -40,19 +40,19 @@ public class CompositeADTab extends AbstractADTab { /** Logger */ private static CLogger log = CLogger.getCLogger (CompositeADTab.class); - + private List tabLabelList = new ArrayList(); private Div div; - + protected ADButtonTabList tabList; - + public CompositeADTab() { tabList = new ADButtonTabList(); tabList.setADTab(this); } - + protected Component doCreatePart(Component parent) { div= new Div(); @@ -64,14 +64,14 @@ public class CompositeADTab extends AbstractADTab } return div; } - + @Override protected void doAddTab(GridTab gTab, IADTabpanel tabPanel) { tabPanel.setParent(div); tabPanel.setVisible(false); - + ADTabListModel.ADTabLabel tabLabel = new ADTabListModel.ADTabLabel(gTab.getName(), gTab.getTabLevel()); - tabLabelList.add(tabLabel); + tabLabelList.add(tabLabel); } /** @@ -81,11 +81,11 @@ public class CompositeADTab extends AbstractADTab public void evaluate (DataStatusEvent e) { tabList.setItems(tabLabelList); - + super.evaluate(e); - + } // evaluate - + @Override protected void updateTabState() { tabList.refresh(); @@ -102,7 +102,7 @@ public class CompositeADTab extends AbstractADTab } return null; } - + public int getSelectedIndex() { for(int i = 0; i < tabPanelList.size(); i++) { if (tabPanelList.get(i).isVisible()) @@ -110,11 +110,11 @@ public class CompositeADTab extends AbstractADTab } return -1; } - + public void addSelectionEventListener(EventListener listener) { tabList.addSelectionEventListener(listener); } - + public Component getTabSelectionComponent() { return tabList; } @@ -128,7 +128,7 @@ public class CompositeADTab extends AbstractADTab } newTabpanel.createUI(); newTabpanel.setVisible(true); - + if (tabList.getSelectedIndex() != newIndex) tabList.setSelectedIndex(newIndex); } @@ -139,5 +139,12 @@ public class CompositeADTab extends AbstractADTab public Component getComponent() { return div; - } + } + + /** + * @param tabPlacement + */ + public void setTabplacement(int tabPlacement) { + tabList.setTabplacement(tabPlacement); + } } diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/IADTab.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/IADTab.java index 6c17d81255..8dea35be3f 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/IADTab.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/IADTab.java @@ -20,44 +20,44 @@ import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.EventListener; /** - * + * * @author Low Heng Sin * */ public interface IADTab extends UIPart { /** - * + * * @return selected tab index */ public int getSelectedIndex(); - + /** - * + * * @param tab index */ public void setSelectedIndex(int i); - + /** * @param oldTabIndex * @param newTabIndex * @return */ public boolean updateSelectedIndex(int oldTabIndex, int newTabIndex); - + /** * @return selected tab panel reference */ public IADTabpanel getSelectedTabpanel(); - + /** - * + * * @param fromIndex * @param toIndex * @return boolean */ public boolean canNavigateTo(int fromIndex, int toIndex); - + /** * @param index * @return boolean @@ -65,7 +65,7 @@ public interface IADTab extends UIPart { public boolean isDisplay(int index); /** - * + * * @param tab * @param tabPanel */ @@ -87,7 +87,7 @@ public interface IADTab extends UIPart { public String getPath(); /** - * + * * @param listener */ public void addSelectionEventListener(EventListener listener); @@ -96,7 +96,7 @@ public interface IADTab extends UIPart { * @return tab selection component */ public Component getTabSelectionComponent(); - + /** * @return boolean */ @@ -106,5 +106,17 @@ public interface IADTab extends UIPart { * @param index * @return IADTabpanel */ - public IADTabpanel getADTabpanel(int index); + public IADTabpanel getADTabpanel(int index); + + /** + * constant for tab placement + */ + public final int LEFT = 0; + public final int RIGHT = 1; + + /** + * Set tab placement ( left or right ) + * @param tabPlacement + */ + public void setTabplacement(int tabPlacement); } diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/panel/ADWindowPanel.java b/zkwebui/WEB-INF/src/org/adempiere/webui/panel/ADWindowPanel.java index 64bcb65afc..287931e839 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/panel/ADWindowPanel.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/panel/ADWindowPanel.java @@ -27,6 +27,7 @@ import org.adempiere.webui.component.Tabbox; import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.Tabs; import org.adempiere.webui.session.SessionManager; +import org.adempiere.webui.util.UserPreference; import org.compiere.model.GridWindow; import org.compiere.model.MQuery; import org.compiere.util.CLogger; @@ -39,16 +40,17 @@ import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.KeyEvent; import org.zkoss.zkex.zul.Borderlayout; import org.zkoss.zkex.zul.Center; +import org.zkoss.zkex.zul.East; import org.zkoss.zkex.zul.North; import org.zkoss.zkex.zul.South; import org.zkoss.zkex.zul.West; import org.zkoss.zul.Tab; /** - * + * * This class is based on org.compiere.apps.APanel written by Jorg Janke. * @author Jorg Janke - * + * * @author Ashley G Ramdass * @author Low Heng Sin * @date Feb 25, 2007 @@ -69,14 +71,16 @@ public class ADWindowPanel extends AbstractADWindowPanel private West west; + private East east; + private Keylistener keyListener; - + public ADWindowPanel(Properties ctx, int windowNo) { super(ctx, windowNo); } - - + + public ADWindowPanel(Properties ctx, int windowNo, GridWindow gridWindow, int tabIndex, IADTabpanel tabPanel) { super(ctx, windowNo, gridWindow, tabIndex, tabPanel); @@ -84,7 +88,7 @@ public class ADWindowPanel extends AbstractADWindowPanel protected Component doCreatePart(Component parent) - { + { layout = new Borderlayout(); if (parent != null) { layout.setParent(parent); @@ -94,7 +98,7 @@ public class ADWindowPanel extends AbstractADWindowPanel } else { layout.setPage(page); } - + if (!isEmbedded()) { North n = new North(); @@ -105,35 +109,50 @@ public class ADWindowPanel extends AbstractADWindowPanel toolbar.setParent(n); toolbar.setWindowNo(getWindowNo()); } - - South s = new South(); + + South s = new South(); layout.appendChild(s); s.setCollapsible(false); statusBar.setParent(s); LayoutUtils.addSclass("adwindow-status", statusBar); - + if (!isEmbedded() && adTab.isUseExternalSelection()) { - west = new West(); - layout.appendChild(west); - west.setSplittable(false); - west.setAutoscroll(true); - LayoutUtils.addSclass("adwindow-nav", west); - adTab.getTabSelectionComponent().setParent(west); + String tabPlacement = SessionManager.getSessionApplication().getUserPreference().getProperty(UserPreference.P_WINDOW_TAB_PLACEMENT); + if (tabPlacement == null || "left".equalsIgnoreCase(tabPlacement)) + { + west = new West(); + layout.appendChild(west); + west.setSplittable(false); + west.setAutoscroll(true); + LayoutUtils.addSclass("adwindow-nav", west); + adTab.setTabplacement(IADTab.LEFT); + adTab.getTabSelectionComponent().setParent(west); + } + else + { + east = new East(); + layout.appendChild(east); + east.setSplittable(false); + east.setAutoscroll(true); + LayoutUtils.addSclass("adwindow-nav", east); + adTab.setTabplacement(IADTab.RIGHT); + adTab.getTabSelectionComponent().setParent(east); + } LayoutUtils.addSclass("adwindow-nav-content", (HtmlBasedComponent) adTab.getTabSelectionComponent()); } - + contentArea = new Center(); contentArea.setParent(layout); contentArea.setAutoscroll(true); contentArea.setFlex(true); adTab.createPart(contentArea); - + if (parent instanceof Tabpanel) { TabOnCloseHanlder handler = new TabOnCloseHanlder(); ((Tabpanel)parent).setOnCloseHandler(handler); } - + if (!isEmbedded()) { if (keyListener != null) keyListener.detach(); @@ -143,7 +162,7 @@ public class ADWindowPanel extends AbstractADWindowPanel keyListener.addEventListener(Events.ON_CTRL_KEY, toolbar); keyListener.addEventListener(Events.ON_CTRL_KEY, this); } - + return layout; } @@ -156,9 +175,9 @@ public class ADWindowPanel extends AbstractADWindowPanel public Borderlayout getComponent() { return layout; } - - - + + + @Override public boolean initPanel(int adWindowId, MQuery query) { boolean retValue = super.initPanel(adWindowId, query); @@ -188,7 +207,7 @@ public class ADWindowPanel extends AbstractADWindowPanel } class TabOnCloseHanlder implements ITabOnCloseHandler { - + public void onClose(Tabpanel tabPanel) { if (ADWindowPanel.this.onExit()) { Tab tab = tabPanel.getLinkedTab(); @@ -198,7 +217,7 @@ public class ADWindowPanel extends AbstractADWindowPanel List childs = tabs.getChildren(); for(int i = 0; i < childs.size(); i++) { if (childs.get(i) == tab) { - if (i > 0) + if (i > 0) tabbox.setSelectedIndex((i-1)); break; } @@ -206,7 +225,7 @@ public class ADWindowPanel extends AbstractADWindowPanel } tabPanel.detach(); tab.detach(); - if (getWindowNo() > 0) + if (getWindowNo() > 0) SessionManager.getAppDesktop().unregisterWindow(getWindowNo()); } } diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/util/UserPreference.java b/zkwebui/WEB-INF/src/org/adempiere/webui/util/UserPreference.java index a99c4afba1..4253e220d2 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/util/UserPreference.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/util/UserPreference.java @@ -24,15 +24,15 @@ import org.compiere.util.Env; import org.compiere.util.Language; /** - * + * * @author hengsin * @author Teo Sarca, www.arhipac.ro *
  • FR [ 2694043 ] Query. first/firstOnly usage best practice */ public final class UserPreference implements Serializable { - + /** - * + * */ private static final long serialVersionUID = -1792570749461784394L; /** Language */ @@ -51,30 +51,36 @@ public final class UserPreference implements Serializable { /** Warehouse Name */ public static final String P_WAREHOUSE = "Warehouse"; private static final String DEFAULT_WAREHOUSE = ""; - + /** Auto Commit */ public static final String P_AUTO_COMMIT = "AutoCommit"; private static final String DEFAULT_AUTO_COMMIT = "Y"; /** Language Name Context **/ public static final String LANGUAGE_NAME = "#LanguageName"; - + + /** window tab placement **/ + public static final String P_WINDOW_TAB_PLACEMENT = "WindowTabPlacement"; + public static final String DEFAULT_WINDOW_TAB_PLACEMENT = "Left"; + /** Ini Properties */ - private static final String[] PROPERTIES = new String[] { + private static final String[] PROPERTIES = new String[] { P_LANGUAGE, - P_ROLE, + P_ROLE, P_CLIENT, - P_ORG, + P_ORG, P_WAREHOUSE, - P_AUTO_COMMIT}; + P_AUTO_COMMIT, + P_WINDOW_TAB_PLACEMENT}; /** Ini Property Values */ - private static final String[] VALUES = new String[] { + private static final String[] VALUES = new String[] { DEFAULT_LANGUAGE, DEFAULT_ROLE, - DEFAULT_CLIENT, - DEFAULT_ORG, + DEFAULT_CLIENT, + DEFAULT_ORG, DEFAULT_WAREHOUSE, - DEFAULT_AUTO_COMMIT}; + DEFAULT_AUTO_COMMIT, + DEFAULT_WINDOW_TAB_PLACEMENT}; /** Container for Properties */ private Properties props = new Properties(); @@ -95,12 +101,14 @@ public final class UserPreference implements Serializable { String attribute = PROPERTIES[i]; String value = props.getProperty(attribute); - MPreference preference = query.setParameters(new Object[]{m_AD_User_ID, attribute}).firstOnly(); + MPreference preference = query.setParameters(new Object[]{m_AD_User_ID, attribute}).firstOnly(); if (preference == null) { - preference = new MPreference(Env.getCtx(), 0, null); + preference = new MPreference(Env.getCtx(), 0, null); preference.setAD_User_ID(m_AD_User_ID); + preference.setAD_Org_ID(0); preference.setAttribute(attribute); } + preference.setAD_Org_ID(0); preference.setValue(value); preference.saveEx(); } @@ -125,8 +133,8 @@ public final class UserPreference implements Serializable { MPreference preference = query.setParameters(new Object[]{m_AD_User_ID, attribute}).firstOnly(); if (preference != null) { value = preference.getValue(); - } - + } + props.setProperty(attribute, value); } } @@ -153,7 +161,7 @@ public final class UserPreference implements Serializable { /*************************************************************************** * Set Property - * + * * @param key * Key * @param value @@ -170,7 +178,7 @@ public final class UserPreference implements Serializable { /** * Set Property - * + * * @param key * Key * @param value @@ -182,7 +190,7 @@ public final class UserPreference implements Serializable { /** * Set Property - * + * * @param key * Key * @param value @@ -194,7 +202,7 @@ public final class UserPreference implements Serializable { /** * Get Propery - * + * * @param key * Key * @return Value @@ -211,7 +219,7 @@ public final class UserPreference implements Serializable { /** * Get Propery as Boolean - * + * * @param key * Key * @return Value