diff --git a/.classpath b/.classpath
index a7d20c8a12..ef925ceedc 100644
--- a/.classpath
+++ b/.classpath
@@ -1,148 +1,149 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zkwebui/WEB-INF/src/metainfo/zk/lang-addon.xml b/zkwebui/WEB-INF/src/metainfo/zk/lang-addon.xml
index a5817a028f..4c75955e2a 100644
--- a/zkwebui/WEB-INF/src/metainfo/zk/lang-addon.xml
+++ b/zkwebui/WEB-INF/src/metainfo/zk/lang-addon.xml
@@ -19,8 +19,8 @@ Copyright (C) 2007 Ashley G Ramdass (ADempiere WebUI).
org.adempiere.webui.AdempiereWebUI
- 0.2
+ 1.0
-
+
diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/CWindowToolbar.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/CWindowToolbar.java
index 0a1d264c6a..b3dfaabb2c 100644
--- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/CWindowToolbar.java
+++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/CWindowToolbar.java
@@ -27,6 +27,7 @@ import java.util.logging.Level;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.event.ToolbarListener;
+import org.adempiere.webui.session.SessionManager;
import org.compiere.model.MRole;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
@@ -80,12 +81,17 @@ public class CWindowToolbar extends FToolbar implements EventListener
private Event event;
private Map keyMap = new HashMap();
+ private Map altKeyMap = new HashMap();
+ private Map ctrlKeyMap = new HashMap();
private boolean embedded;
// Elaine 2008/12/04
/** Show Personal Lock */
public boolean isPersonalLock = MRole.getDefault().isPersonalLock();
+
+ private int windowNo = 0;
+
/** Last Modifier of Action Event */
// public int lastModifiers;
//
@@ -203,6 +209,34 @@ public class CWindowToolbar extends FToolbar implements EventListener
return buttons.get(name);
}
+ /** VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
+ public static final int VK_A = 0x41;
+ public static final int VK_B = 0x42;
+ public static final int VK_C = 0x43;
+ public static final int VK_D = 0x44;
+ public static final int VK_E = 0x45;
+ public static final int VK_F = 0x46;
+ public static final int VK_G = 0x47;
+ public static final int VK_H = 0x48;
+ public static final int VK_I = 0x49;
+ public static final int VK_J = 0x4A;
+ public static final int VK_K = 0x4B;
+ public static final int VK_L = 0x4C;
+ public static final int VK_M = 0x4D;
+ public static final int VK_N = 0x4E;
+ public static final int VK_O = 0x4F;
+ public static final int VK_P = 0x50;
+ public static final int VK_Q = 0x51;
+ public static final int VK_R = 0x52;
+ public static final int VK_S = 0x53;
+ public static final int VK_T = 0x54;
+ public static final int VK_U = 0x55;
+ public static final int VK_V = 0x56;
+ public static final int VK_W = 0x57;
+ public static final int VK_X = 0x58;
+ public static final int VK_Y = 0x59;
+ public static final int VK_Z = 0x5A;
+
private void configureKeyMap()
{
keyMap.put(KeyEvent.F1, btnHelp);
@@ -216,6 +250,22 @@ public class CWindowToolbar extends FToolbar implements EventListener
keyMap.put(KeyEvent.F9, btnHistoryRecords);
keyMap.put(KeyEvent.F11, btnReport);
keyMap.put(KeyEvent.F12, btnPrint);
+
+ altKeyMap.put(KeyEvent.LEFT, btnParentRecord);
+ altKeyMap.put(KeyEvent.RIGHT, btnDetailRecord);
+ altKeyMap.put(KeyEvent.UP, btnPrevious);
+ altKeyMap.put(KeyEvent.DOWN, btnNext);
+ altKeyMap.put(KeyEvent.PAGE_UP, btnFirst);
+ altKeyMap.put(KeyEvent.PAGE_DOWN, btnLast);
+ altKeyMap.put(VK_P, btnReport);
+ altKeyMap.put(VK_Z, btnIgnore);
+
+ ctrlKeyMap.put(VK_I, btnProductInfo);
+ ctrlKeyMap.put(VK_P, btnPrint);
+ ctrlKeyMap.put(VK_N, btnNew);
+ ctrlKeyMap.put(VK_S, btnSave);
+ ctrlKeyMap.put(VK_X, btnDelete);
+ ctrlKeyMap.put(VK_F, btnFind);
}
protected void addSeparator()
@@ -251,7 +301,7 @@ public class CWindowToolbar extends FToolbar implements EventListener
} else if (eventName.equals(Events.ON_CTRL_KEY))
{
KeyEvent keyEvent = (KeyEvent) event;
- this.onCtrlKeyEvent(keyEvent.getKeyCode());
+ this.onCtrlKeyEvent(keyEvent);
}
}
@@ -429,9 +479,26 @@ public class CWindowToolbar extends FToolbar implements EventListener
return event;
}
- public void onCtrlKeyEvent(int keycode) {
+ private void onCtrlKeyEvent(KeyEvent keyEvent) {
if (isRealVisible()) {
- ToolBarButton btn = keyMap.get(keycode);
+ ToolBarButton btn = null;
+ if (keyEvent.isAltKey() && !keyEvent.isCtrlKey() && !keyEvent.isShiftKey())
+ {
+ if (keyEvent.getKeyCode() == VK_X)
+ {
+ if (windowNo > 0)
+ SessionManager.getAppDesktop().closeWindow(windowNo);
+ }
+ else
+ {
+ btn = altKeyMap.get(keyEvent.getKeyCode());
+ }
+ }
+ else if (!keyEvent.isAltKey() && keyEvent.isCtrlKey() && !keyEvent.isShiftKey())
+ btn = ctrlKeyMap.get(keyEvent.getKeyCode());
+ else if (!keyEvent.isAltKey() && !keyEvent.isCtrlKey() && !keyEvent.isShiftKey())
+ btn = keyMap.get(keyEvent.getKeyCode());
+
if (btn != null && !btn.isDisabled() && btn.isVisible()) {
Events.sendEvent(btn, new Event(Events.ON_CLICK, btn));
}
@@ -467,5 +534,9 @@ public class CWindowToolbar extends FToolbar implements EventListener
btn.setVisible(visible);
}
}
+
+ public void setWindowNo(int windowNo) {
+ this.windowNo = windowNo;
+ }
}
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 3a788580b4..badd82d88c 100644
--- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/CompositeADTab.java
+++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/CompositeADTab.java
@@ -64,7 +64,6 @@ public class CompositeADTab extends AbstractADTab
} else {
window.setPage(page);
}
- window.setCtrlKeys("#f1#f2#f3#f4#f5#f6#f7#f8#f9#f10#f11#f12");
return window;
}
diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridPanel.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridPanel.java
index dbc076407f..e00a2423a7 100644
--- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridPanel.java
+++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridPanel.java
@@ -12,7 +12,6 @@
*****************************************************************************/
package org.adempiere.webui.component;
-
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -21,22 +20,25 @@ import javax.swing.table.AbstractTableModel;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.editor.WEditor;
+import org.adempiere.webui.util.SortComparator;
import org.compiere.model.GridField;
import org.compiere.model.GridTab;
import org.compiere.model.GridTable;
import org.compiere.model.MSysConfig;
import org.compiere.util.DisplayType;
+import org.compiere.util.Env;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.South;
+import org.zkoss.zul.Column;
import org.zkoss.zul.Paging;
import org.zkoss.zul.event.ZulEvents;
/**
- *
+ * Grid view implemented using the Grid component.
* @author Low Heng Sin
*
*/
@@ -48,7 +50,7 @@ public class GridPanel extends Borderlayout implements EventListener
private static final long serialVersionUID = 1L;
- private Listbox listbox = null;
+ private Grid listbox = null;
private int pageSize = 100;
@@ -67,7 +69,7 @@ public class GridPanel extends Borderlayout implements EventListener
private Paging paging;
- private GridTabListItemRenderer renderer;
+ private GridTabRowRenderer renderer;
private South south;
@@ -78,17 +80,24 @@ public class GridPanel extends Borderlayout implements EventListener
this(0);
}
+ /**
+ * @param windowNo
+ */
public GridPanel(int windowNo)
{
this.windowNo = windowNo;
- listbox = new Listbox();
+ listbox = new Grid();
south = new South();
this.appendChild(south);
//default paging size
pageSize = MSysConfig.getIntValue(PAGE_SIZE_KEY, 100);
}
-
+
+ /**
+ *
+ * @param gridTab
+ */
public void init(GridTab gridTab)
{
if (init) return;
@@ -108,29 +117,45 @@ public class GridPanel extends Borderlayout implements EventListener
this.init = true;
}
+ /**
+ *
+ * @return boolean
+ */
public boolean isInit() {
return init;
}
- public void activate(GridTab gridTab) {
- if (isInit())
- refresh(gridTab);
- else
+ /**
+ * call when tab is activated
+ * @param gridTab
+ */
+ public void activate(GridTab gridTab) {
+ if (!isInit()) {
init(gridTab);
+ }
}
+ /**
+ * refresh after switching from form view
+ * @param gridTab
+ */
public void refresh(GridTab gridTab) {
- this.gridTab = gridTab;
- tableModel = gridTab.getTableModel();
- gridField = ((GridTable)tableModel).getFields();
-
- updateModel();
-
- updateListIndex();
+ if (this.gridTab != gridTab)
+ {
+ init = false;
+ init(gridTab);
+ }
+ else
+ {
+ if (renderer != null)
+ renderer.stopEditing(false);
+
+ listbox.setModel(listModel);
+ }
}
/**
- * Update listbox index to sync with grid current row pointer changes
+ * Update current row from model
*/
public void updateListIndex() {
int rowIndex = gridTab.isOpen() ? gridTab.getCurrentRow() : -1;
@@ -139,27 +164,25 @@ public class GridPanel extends Borderlayout implements EventListener
paging.setTotalSize(gridTab.getRowCount());
int pgIndex = rowIndex % pageSize;
int pgNo = (rowIndex - pgIndex) / pageSize;
+
if (listModel.getPage() != pgNo) {
listModel.setPage(pgNo);
}
- if (paging.getActivePage() != pgNo)
+ if (paging.getActivePage() != pgNo) {
paging.setActivePage(pgNo);
- if (listbox.getSelectedIndex() != pgIndex) {
- renderer.stopEditing(false);
- listModel.updateComponent(listbox.getSelectedIndex());
- listModel.updateComponent(pgIndex);
- listbox.setSelectedIndex(pgIndex);
- }
+ }
+ renderer.stopEditing(false);
+ listModel.updateComponent(pgIndex);
} else {
- if (listbox.getSelectedIndex() != rowIndex) {
- renderer.stopEditing(false);
- listModel.updateComponent(listbox.getSelectedIndex());
- listModel.updateComponent(rowIndex);
- listbox.setSelectedIndex(rowIndex);
- }
+ renderer.stopEditing(false);
+ listModel.updateComponent(rowIndex);
}
}
+ /**
+ * set paging size
+ * @param pageSize
+ */
public void setPageSize(int pageSize)
{
this.pageSize = pageSize;
@@ -170,6 +193,10 @@ public class GridPanel extends Borderlayout implements EventListener
this.getChildren().clear();
}
+ /**
+ * toggle visibility
+ * @param bool
+ */
public void showGrid(boolean bool)
{
if (bool)
@@ -182,8 +209,11 @@ public class GridPanel extends Borderlayout implements EventListener
{
if (init) return;
- ListHead header = new ListHead();
- header.setSizable(true);
+ Columns columns = new Columns();
+ listbox.appendChild(columns);
+ columns.setSizable(true);
+ columns.setMenupopup("auto");
+ columns.setColumnsgroup(false);
Map colnames = new HashMap();
int index = 0;
@@ -193,9 +223,10 @@ public class GridPanel extends Borderlayout implements EventListener
{
colnames.put(index, gridField[i].getHeader());
index++;
- ListHeader colHeader = new ListHeader();
- colHeader.setSort("auto");
- colHeader.setLabel(gridField[i].getHeader());
+ org.zkoss.zul.Column column = new Column();
+ column.setSortAscending(new SortComparator(i, true, Env.getLanguage(Env.getCtx())));
+ column.setSortDescending(new SortComparator(i, false, Env.getLanguage(Env.getCtx())));
+ column.setLabel(gridField[i].getHeader());
int l = DisplayType.isNumeric(gridField[i].getDisplayType())
? 100 : gridField[i].getDisplayLength() * 9;
if (gridField[i].getHeader().length() * 9 > l)
@@ -204,11 +235,10 @@ public class GridPanel extends Borderlayout implements EventListener
l = MAX_COLUMN_WIDTH;
else if ( l < MIN_COLUMN_WIDTH)
l = MIN_COLUMN_WIDTH;
- colHeader.setWidth(Integer.toString(l) + "px");
- header.appendChild(colHeader);
+ column.setWidth(Integer.toString(l) + "px");
+ columns.appendChild(column);
}
}
- listbox.appendChild(header);
}
private void render()
@@ -216,9 +246,8 @@ public class GridPanel extends Borderlayout implements EventListener
LayoutUtils.addSclass("adtab-grid-panel", this);
listbox.setVflex(true);
- listbox.addEventListener(Events.ON_SELECT, this);
-
- LayoutUtils.addSclass("adtab-grid", listbox);
+ listbox.setFixedLayout(true);
+ listbox.addEventListener(Events.ON_CLICK, this);
updateModel();
@@ -234,12 +263,13 @@ public class GridPanel extends Borderlayout implements EventListener
paging.setDetailed(true);
south.appendChild(paging);
paging.addEventListener(ZulEvents.ON_PAGING, this);
- this.getParent().invalidate();
+ renderer.setPaging(paging);
}
else
{
south.setVisible(false);
}
+
}
private void updateModel() {
@@ -247,12 +277,18 @@ public class GridPanel extends Borderlayout implements EventListener
listModel.setPageSize(pageSize);
if (renderer != null)
renderer.stopEditing(false);
- renderer = new GridTabListItemRenderer(gridTab, windowNo);
- listbox.setItemRenderer(renderer);
- listbox.setModel(listModel);
+ renderer = new GridTabRowRenderer(gridTab, windowNo);
+
+ listbox.setRowRenderer(renderer);
+ listbox.setModel(listModel);
}
+ /**
+ * deactivate panel
+ */
public void deactivate() {
+ if (renderer != null)
+ renderer.stopEditing(false);
}
public void onEvent(Event event) throws Exception
@@ -261,34 +297,33 @@ public class GridPanel extends Borderlayout implements EventListener
return;
else if (event.getTarget() == listbox)
{
- int index = listbox.getSelectedIndex();
- onSelectedRowChange(index);
+ Object data = event.getData();
+ if (data != null && data instanceof org.zkoss.zul.Row)
+ {
+ int index = listbox.getRows().getChildren().indexOf(data);
+ onSelectedRowChange(index);
+ }
}
else if (event.getTarget() == paging)
{
int pgNo = paging.getActivePage();
if (pgNo != listModel.getPage())
{
- listbox.clearSelection();
listModel.setPage(pgNo);
- listbox.setSelectedIndex(0);
onSelectedRowChange(0);
}
}
}
private void onSelectedRowChange(int index) {
- if (updateModelIndex()) {
+ if (updateModelIndex(index)) {
listModel.updateComponent(index);
- listbox.setSelectedIndex(index);
} else if (!renderer.isInitialize()) {
listModel.updateComponent(index);
- listbox.setSelectedIndex(index);
}
}
- private boolean updateModelIndex() {
- int rowIndex = listbox.getSelectedIndex();
+ private boolean updateModelIndex(int rowIndex) {
if (pageSize > 0) {
int start = listModel.getPage() * listModel.getPageSize();
rowIndex = start + rowIndex;
@@ -302,10 +337,17 @@ public class GridPanel extends Borderlayout implements EventListener
return false;
}
- public Listbox getListbox() {
+ /**
+ * @return Grid
+ */
+ public Grid getListbox() {
return listbox;
}
-
+
+ /**
+ * Validate display properties of fields of current row
+ * @param col
+ */
public void dynamicDisplay(int col) {
if (!gridTab.isOpen())
{
diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridTabListItemRenderer.java b/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridTabListItemRenderer.java
index d47e678b42..ab8fbea987 100644
--- a/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridTabListItemRenderer.java
+++ b/zkwebui/WEB-INF/src/org/adempiere/webui/component/GridTabListItemRenderer.java
@@ -43,19 +43,22 @@ import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.ListitemRendererExt;
+import org.zkoss.zul.Paging;
+import org.zkoss.zul.RendererCtrl;
/**
* ListItem renderer for GridTab list box.
* @author hengsin
*
*/
-public class GridTabListItemRenderer implements ListitemRenderer, ListitemRendererExt {
+public class GridTabListItemRenderer implements ListitemRenderer, ListitemRendererExt, RendererCtrl {
private static final int MAX_TEXT_LENGTH = 60;
private GridTab gridTab;
private int windowNo;
private GridTabDataBinder dataBinder;
private Map editors = new HashMap();
+ private Paging paging;
/**
*
@@ -90,6 +93,9 @@ public class GridTabListItemRenderer implements ListitemRenderer, ListitemRender
editors.put(gridField[i], WebEditorFactory.getEditor(gridField[i], true));
int rowIndex = listitem.getIndex();
+ if (paging != null && paging.getPageSize() > 0) {
+ rowIndex = (paging.getActivePage() * paging.getPageSize()) + rowIndex;
+ }
Listcell cell = null;
if (rowIndex == gridTab.getCurrentRow() && gridField[i].isEditable(true)) {
cell = getEditorCell(gridField[i], values[i], i);
@@ -232,6 +238,8 @@ public class GridTabListItemRenderer implements ListitemRenderer, ListitemRender
return item;
}
+ private Map> lookupCache = null;
+
private String getDisplayText(Object value, int columnIndex)
{
if (value == null)
@@ -244,9 +252,36 @@ public class GridTabListItemRenderer implements ListitemRenderer, ListitemRender
}
else if (gridField[columnIndex].isLookup())
{
+ if (value == null) return "";
+
+ if (lookupCache != null)
+ {
+ Map