/****************************************************************************** * Product: Posterita Ajax UI * * Copyright (C) 2007 Posterita Ltd. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius * * or via info@posterita.org or http://www.posterita.org/ * *****************************************************************************/ package org.adempiere.webui.panel; import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Map.Entry; import java.util.logging.Level; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.component.Column; import org.adempiere.webui.component.Columns; import org.adempiere.webui.component.EditorBox; import org.adempiere.webui.component.Grid; import org.adempiere.webui.component.GridPanel; import org.adempiere.webui.component.Label; import org.adempiere.webui.component.Row; import org.adempiere.webui.component.Rows; import org.adempiere.webui.component.SimpleTreeModel; import org.adempiere.webui.editor.IZoomableEditor; import org.adempiere.webui.editor.WButtonEditor; import org.adempiere.webui.editor.WEditor; import org.adempiere.webui.editor.WEditorPopupMenu; import org.adempiere.webui.editor.WebEditorFactory; import org.adempiere.webui.event.ContextMenuListener; import org.adempiere.webui.util.GridTabDataBinder; import org.adempiere.webui.window.FDialog; import org.compiere.model.DataStatusEvent; import org.compiere.model.DataStatusListener; import org.compiere.model.GridField; import org.compiere.model.GridTab; import org.compiere.model.GridTable; import org.compiere.model.GridWindow; import org.compiere.model.MLookup; import org.compiere.model.MTree; import org.compiere.model.MTreeNode; import org.compiere.model.X_AD_FieldGroup; import org.compiere.util.CLogger; import org.compiere.util.Env; import org.compiere.util.Evaluatee; import org.zkoss.zk.au.out.AuFocus; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zkex.zul.Borderlayout; import org.zkoss.zkex.zul.Center; import org.zkoss.zkex.zul.West; import org.zkoss.zul.Div; import org.zkoss.zul.Group; import org.zkoss.zul.Groupfoot; import org.zkoss.zul.Separator; import org.zkoss.zul.SimpleTreeNode; import org.zkoss.zul.Space; import org.zkoss.zul.Treeitem; /** * * This class is based on org.compiere.grid.GridController written by Jorg Janke. * Changes have been brought for UI compatibility. * * @author Jorg Janke * * @author <a href="mailto:agramdass@gmail.com">Ashley G Ramdass</a> * @date Feb 25, 2007 * @version $Revision: 0.10 $ * * @author Low Heng Sin */ public class ADTabpanel extends Div implements Evaluatee, EventListener, DataStatusListener, IADTabpanel, VetoableChangeListener { /** * generated serial version ID */ private static final long serialVersionUID = 6945934489328360251L; private static final CLogger logger; static { logger = CLogger.getCLogger(ADTabpanel.class); } private GridTab gridTab; @SuppressWarnings("unused") private GridWindow gridWindow; private AbstractADWindowPanel windowPanel; private int windowNo; private Grid grid; private ArrayList<WEditor> editors = new ArrayList<WEditor>(); private ArrayList<String> editorIds = new ArrayList<String>(); private boolean uiCreated = false; private GridPanel listPanel; private Map<String, List<org.zkoss.zul.Row>> fieldGroupContents = new HashMap<String, List<org.zkoss.zul.Row>>(); private Map<String, List<org.zkoss.zul.Row>> fieldGroupHeaders = new HashMap<String, List<org.zkoss.zul.Row>>(); private ArrayList<org.zkoss.zul.Row> rowList; private Component formComponent = null; private ADTreePanel treePanel = null; private GridTabDataBinder dataBinder; private Map<Integer, Group> includedTab = new HashMap<Integer, Group>(); private Map<Integer, Groupfoot> includedTabFooter = new HashMap<Integer, Groupfoot>(); private List<EmbeddedPanel> includedPanel = new ArrayList<EmbeddedPanel>(); private boolean active = false; private Group currentGroup; private boolean m_vetoActive = false; public ADTabpanel() { init(); } private void init() { initComponents(); } private void initComponents() { LayoutUtils.addSclass("adtab-content", this); grid = new Grid(); //have problem moving the following out as css class grid.setWidth("100%"); grid.setHeight("100%"); grid.setVflex(true); grid.setStyle("margin:0; padding:0; position: absolute"); grid.makeNoStrip(); listPanel = new GridPanel(); listPanel.getListbox().addEventListener(Events.ON_DOUBLE_CLICK, this); } /** * * @param winPanel * @param windowNo * @param gridTab * @param gridWindow */ public void init(AbstractADWindowPanel winPanel, int windowNo, GridTab gridTab, GridWindow gridWindow) { this.windowNo = windowNo; this.gridWindow = gridWindow; this.gridTab = gridTab; this.windowPanel = winPanel; gridTab.addDataStatusListener(this); this.dataBinder = new GridTabDataBinder(gridTab); this.getChildren().clear(); int AD_Tree_ID = 0; if (gridTab.isTreeTab()) AD_Tree_ID = MTree.getDefaultAD_Tree_ID ( Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName()); if (gridTab.isTreeTab() && AD_Tree_ID != 0) { Borderlayout layout = new Borderlayout(); layout.setParent(this); layout.setStyle("width: 100%; height: 100%; position: absolute;"); treePanel = new ADTreePanel(); West west = new West(); west.appendChild(treePanel); west.setWidth("300px"); west.setCollapsible(true); west.setSplittable(true); west.setAutoscroll(true); layout.appendChild(west); Center center = new Center(); center.setFlex(true); center.appendChild(grid); layout.appendChild(center); formComponent = layout; treePanel.getTree().addEventListener(Events.ON_SELECT, this); } else { this.appendChild(grid); formComponent = grid; } this.appendChild(listPanel); listPanel.setVisible(false); listPanel.setWindowNo(windowNo); listPanel.setADWindowPanel(winPanel); gridTab.getTableModel().addVetoableChangeListener(this); } /** * Create UI components if not already created */ public void createUI() { if (uiCreated) return; uiCreated = true; //setup columns Columns columns = new Columns(); grid.appendChild(columns); Column col = new Column(); col.setWidth("14%"); columns.appendChild(col); col = new Column(); col.setWidth("35%"); columns.appendChild(col); col = new Column(); col.setWidth("14%"); columns.appendChild(col); col = new Column(); col.setWidth("35%"); columns.appendChild(col); col = new Column(); col.setWidth("2%"); columns.appendChild(col); Rows rows = grid.newRows(); GridField fields[] = gridTab.getFields(); org.zkoss.zul.Row row = new Row(); String currentFieldGroup = null; for (int i = 0; i < fields.length; i++) { GridField field = fields[i]; if (field.isDisplayed()) { //included tab if (field.getIncluded_Tab_ID() > 0) { if (row.getChildren().size() == 2) { row.appendChild(createSpacer()); row.appendChild(createSpacer()); row.appendChild(createSpacer()); rows.appendChild(row); if (rowList != null) rowList.add(row); } else if (row.getChildren().size() > 0) { rows.appendChild(row); if (rowList != null) rowList.add(row); } //end current field group if (currentGroup != null) { row = new Groupfoot(); rows.appendChild(row); currentGroup = null; currentFieldGroup = null; } row = new Row(); row.setSpans("5"); row.appendChild(new Separator()); rows.appendChild(row); row = new Group(); row.setSpans("2,3"); rows.appendChild(row); includedTab.put(field.getIncluded_Tab_ID(), (Group)row); row = new Groupfoot(); rows.appendChild(row); includedTabFooter.put(field.getIncluded_Tab_ID(), (Groupfoot)row); for (EmbeddedPanel ep : includedPanel) { if (ep.adTabId == field.getIncluded_Tab_ID()) { ep.group = includedTab.get(ep.adTabId); createEmbeddedPanelUI(ep); break; } } row = new Row(); continue; } //normal field String fieldGroup = field.getFieldGroup(); if (fieldGroup != null && fieldGroup.trim().length() > 0) { if (!fieldGroup.equals(currentFieldGroup)) { currentFieldGroup = fieldGroup; if (row.getChildren().size() == 2) { row.appendChild(createSpacer()); row.appendChild(createSpacer()); row.appendChild(createSpacer()); rows.appendChild(row); if (rowList != null) rowList.add(row); row = new Row(); } else if (row.getChildren().size() > 0) { rows.appendChild(row); if (rowList != null) rowList.add(row); row = new Row(); } List<org.zkoss.zul.Row> headerRows = new ArrayList<org.zkoss.zul.Row>(); fieldGroupHeaders.put(fieldGroup, headerRows); row.setSpans("5"); row.appendChild(new Separator()); rows.appendChild(row); headerRows.add(row); rowList = new ArrayList<org.zkoss.zul.Row>(); fieldGroupContents.put(fieldGroup, rowList); if (X_AD_FieldGroup.FIELDGROUPTYPE_Label.equals(field.getFieldGroupType())) { row = new Row(); row.setSpans("4"); Label groupLabel = new Label(fieldGroup); row.appendChild(groupLabel); row.appendChild(createSpacer()); rows.appendChild(row); headerRows.add(row); row = new Row(); row.setSpans("4"); Separator separator = new Separator(); separator.setBar(true); row.appendChild(separator); row.appendChild(createSpacer()); rows.appendChild(row); headerRows.add(row); } else { row = new Group(fieldGroup); if (X_AD_FieldGroup.FIELDGROUPTYPE_Tab.equals(field.getFieldGroupType()) || field.getIsCollapsedByDefault()) { ((Group)row).setOpen(false); } currentGroup = (Group)row; rows.appendChild(row); headerRows.add(row); } row = new Row(); } } if (!field.isSameLine() || field.isLongField()) { //next line if(row.getChildren().size() > 0) { if (row.getChildren().size() == 2) { row.appendChild(createSpacer()); row.appendChild(createSpacer()); row.appendChild(createSpacer()); } { row.appendChild(createSpacer()); } rows.appendChild(row); if (rowList != null) rowList.add(row); row = new Row(); } } else if (row.getChildren().size() == 4) { //next line if reach max column ( 4 ) row.appendChild(createSpacer()); rows.appendChild(row); if (rowList != null) rowList.add(row); row = new Row(); } WEditor editor = WebEditorFactory.getEditor(gridTab, field, false); if (editor != null) // Not heading { editor.setGridTab(this.getGridTab()); field.addPropertyChangeListener(editor); editors.add(editor); editorIds.add(editor.getComponent().getUuid()); if (field.isFieldOnly()) { row.appendChild(createSpacer()); } else { Div div = new Div(); div.setAlign("right"); Label label = editor.getLabel(); div.appendChild(label); if (label.getDecorator() != null) div.appendChild(label.getDecorator()); row.appendChild(div); } row.appendChild(editor.getComponent()); if (field.isLongField()) { row.setSpans("1,3,1"); row.appendChild(createSpacer()); rows.appendChild(row); if (rowList != null) rowList.add(row); row = new Row(); } if (editor instanceof WButtonEditor) { if (windowPanel != null) ((WButtonEditor)editor).addActionListener(windowPanel); } else { editor.addValueChangeListener(dataBinder); } //streach component to fill grid cell editor.fillHorizontal(); //setup editor context menu WEditorPopupMenu popupMenu = editor.getPopupMenu(); if (popupMenu != null) { popupMenu.addMenuListener((ContextMenuListener)editor); this.appendChild(popupMenu); if (!field.isFieldOnly()) { Label label = editor.getLabel(); if (popupMenu.isZoomEnabled() && editor instanceof IZoomableEditor) { label.setStyle("cursor: pointer; text-decoration: underline;"); label.addEventListener(Events.ON_CLICK, new ZoomListener((IZoomableEditor) editor)); } label.setContext(popupMenu.getId()); } } } else if (field.isHeading()) { //display just a label if we are "heading only" Label label = new Label(field.getHeader()); Div div = new Div(); div.setAlign("center"); row.appendChild(createSpacer()); div.appendChild(label); row.appendChild(div); } } } //last row if (row.getChildren().size() > 0) { if (row.getChildren().size() == 2) { row.appendChild(createSpacer()); row.appendChild(createSpacer()); row.appendChild(createSpacer()); } rows.appendChild(row); if (rowList != null) rowList.add(row); } //create tree if (gridTab.isTreeTab() && treePanel != null) { int AD_Tree_ID = MTree.getDefaultAD_Tree_ID ( Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName()); treePanel.initTree(AD_Tree_ID, windowNo); } if (!gridTab.isSingleRow() && !isGridView()) switchRowPresentation(); } private Component createSpacer() { return new Space(); } /** * Validate display properties of fields of current row * @param col */ public void dynamicDisplay (int col) { if (!gridTab.isOpen()) { return; } // Selective if (col > 0) { GridField changedField = gridTab.getField(col); String columnName = changedField.getColumnName(); ArrayList<?> dependants = gridTab.getDependantFields(columnName); logger.config("(" + gridTab.toString() + ") " + columnName + " - Dependents=" + dependants.size()); if (dependants.size() == 0 && changedField.getCallout().length() > 0) { return; } } boolean noData = gridTab.getRowCount() == 0; logger.config(gridTab.toString() + " - Rows=" + gridTab.getRowCount()); for (WEditor comp : editors) { GridField mField = comp.getGridField(); if (mField != null && mField.getIncluded_Tab_ID() <= 0) { if (mField.isDisplayed(true)) // check context { if (!comp.isVisible()) { comp.setVisible(true); // visibility } if (noData) { comp.setReadWrite(false); } else { comp.dynamicDisplay(); boolean rw = mField.isEditable(true); // r/w - check Context comp.setReadWrite(rw); comp.setMandatory(mField.isMandatory(true)); // check context } } else if (comp.isVisible()) { comp.setVisible(false); } } } // all components //hide row if all editor within the row is invisible List<?> rows = grid.getRows().getChildren(); for(int i = 0; i < rows.size(); i++) { org.zkoss.zul.Row row = (org.zkoss.zul.Row) rows.get(i); List<?> components = row.getChildren(); boolean visible = false; boolean editorRow = false; for (int j = 0; j < components.size(); j++) { Component component = (Component) components.get(j); if (editorIds.contains(component.getUuid())) { editorRow = true; if (component.isVisible()) { visible = true; break; } } } if (editorRow && (row.isVisible() != visible)) row.setVisible(visible); } //hide fieldgroup if all editor row within the fieldgroup is invisible for(Iterator<Entry<String, List<org.zkoss.zul.Row>>> i = fieldGroupHeaders.entrySet().iterator(); i.hasNext();) { Map.Entry<String, List<org.zkoss.zul.Row>> entry = i.next(); List<org.zkoss.zul.Row> contents = fieldGroupContents.get(entry.getKey()); boolean visible = false; for (org.zkoss.zul.Row row : contents) { if (row.isVisible()) { visible = true; break; } } List<org.zkoss.zul.Row> headers = entry.getValue(); for(org.zkoss.zul.Row row : headers) { if (row.isVisible() != visible) row.setVisible(visible); } } logger.config(gridTab.toString() + " - fini - " + (col<=0 ? "complete" : "seletive")); } // dynamicDisplay /** * @return String */ public String getDisplayLogic() { return gridTab.getDisplayLogic(); } /** * @return String */ public String getTitle() { return gridTab.getName(); } // getTitle /** * @param variableName */ public String get_ValueAsString(String variableName) { return Env.getContext(Env.getCtx(), windowNo, variableName); } // get_ValueAsString /** * @return The tab level of this Tabpanel */ public int getTabLevel() { return gridTab.getTabLevel(); } /** * Is panel need refresh * @return boolean */ public boolean isCurrent() { return gridTab != null ? gridTab.isCurrent() : false; } /** * * @return windowNo */ public int getWindowNo() { return windowNo; } /** * Retrieve from db */ public void query() { boolean open = gridTab.isOpen(); gridTab.query(false); if (listPanel.isVisible() && !open) gridTab.getTableModel().fireTableDataChanged(); } /** * Retrieve from db * @param onlyCurrentRows * @param onlyCurrentDays * @param maxRows */ public void query (boolean onlyCurrentRows, int onlyCurrentDays, int maxRows) { boolean open = gridTab.isOpen(); gridTab.query(onlyCurrentRows, onlyCurrentDays, maxRows); if (listPanel.isVisible() && !open) gridTab.getTableModel().fireTableDataChanged(); } /** * @return GridTab */ public GridTab getGridTab() { return gridTab; } /** * Refresh current row */ public void refresh() { gridTab.dataRefresh(); } /** * Activate/deactivate panel * @param activate */ public void activate(boolean activate) { active = activate; if (listPanel.isVisible()) { if (activate) listPanel.activate(gridTab); else listPanel.deactivate(); } else { if (activate) { formComponent.setVisible(activate); setFocusToField(); } } //activate embedded panel for(EmbeddedPanel ep : includedPanel) { activateChild(activate, ep); } } private void activateChild(boolean activate, EmbeddedPanel panel) { if (activate) { panel.windowPanel.getADTab().evaluate(null); panel.windowPanel.getADTab().setSelectedIndex(0); panel.tabPanel.query(false, 0, 0); } panel.tabPanel.activate(activate); } /** * set focus to first active editor */ private void setFocusToField() { WEditor toFocus = null; for (WEditor editor : editors) { if (editor.isHasFocus() && editor.isVisible() && editor.getComponent().getParent() != null) { toFocus = editor; break; } if (toFocus == null) { if (editor.isVisible() && editor.isReadWrite() && editor.getComponent().getParent() != null) { toFocus = editor; } } } if (toFocus != null) { Component c = toFocus.getComponent(); if (c instanceof EditorBox) { c = ((EditorBox)c).getTextbox(); } Clients.response(new AuFocus(c)); } } /** * @param event * @see EventListener#onEvent(Event) */ public void onEvent(Event event) { if (event.getTarget() == listPanel.getListbox()) { this.switchRowPresentation(); } else if (event.getTarget() == treePanel.getTree()) { Treeitem item = treePanel.getTree().getSelectedItem(); navigateTo((SimpleTreeNode)item.getValue()); } } private void navigateTo(SimpleTreeNode value) { MTreeNode treeNode = (MTreeNode) value.getData(); // We Have a TreeNode int nodeID = treeNode.getNode_ID(); // root of tree selected - ignore //if (nodeID == 0) //return; // Search all rows for mode id int size = gridTab.getRowCount(); int row = -1; for (int i = 0; i < size; i++) { if (gridTab.getKeyID(i) == nodeID) { row = i; break; } } if (row == -1) { if (nodeID > 0) logger.log(Level.WARNING, "Tab does not have ID with Node_ID=" + nodeID); return; } // Navigate to node row gridTab.navigate(row); } /** * @param e * @see DataStatusListener#dataStatusChanged(DataStatusEvent) */ public void dataStatusChanged(DataStatusEvent e) { //ignore background event if (Executions.getCurrent() == null) return; int col = e.getChangedColumn(); logger.config("(" + gridTab + ") Col=" + col + ": " + e.toString()); // Process Callout GridField mField = gridTab.getField(col); if (mField != null && (mField.getCallout().length() > 0 || gridTab.hasDependants(mField.getColumnName()))) { String msg = gridTab.processFieldChange(mField); // Dependencies & Callout if (msg.length() > 0) { FDialog.error(windowNo, this, msg); } // Refresh the list on dependant fields ArrayList<GridField> list = gridTab.getDependantFields(mField.getColumnName()); for (int i = 0; i < list.size(); i++) { GridField dependentField = (GridField)list.get(i); // log.trace(log.l5_DData, "Dependent Field", dependentField==null ? "null" : dependentField.getColumnName()); // if the field has a lookup if (dependentField != null && dependentField.getLookup() instanceof MLookup) { MLookup mLookup = (MLookup)dependentField.getLookup(); // if the lookup is dynamic (i.e. contains this columnName as variable) if (mLookup.getValidation().indexOf("@"+mField.getColumnName()+"@") != -1) { mLookup.refresh(); } } } // for all dependent fields } //if (col >= 0) if (!uiCreated) createUI(); dynamicDisplay(col); //sync tree if (treePanel != null) { if ("Deleted".equalsIgnoreCase(e.getAD_Message())) if (e.Record_ID != null && e.Record_ID instanceof Integer && ((Integer)e.Record_ID != gridTab.getRecord_ID())) deleteNode((Integer)e.Record_ID); else setSelectedNode(gridTab.getRecord_ID()); else setSelectedNode(gridTab.getRecord_ID()); } if (listPanel.isVisible()) { listPanel.updateListIndex(); listPanel.dynamicDisplay(col); } if (!includedPanel.isEmpty()) { for (EmbeddedPanel panel : includedPanel) panel.tabPanel.query(false, 0, 0); } } private void deleteNode(int recordId) { if (recordId <= 0) return; SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel(); if (treePanel.getTree().getSelectedItem() != null) { SimpleTreeNode treeNode = (SimpleTreeNode) treePanel.getTree().getSelectedItem().getValue(); MTreeNode data = (MTreeNode) treeNode.getData(); if (data.getNode_ID() == recordId) { model.removeNode(treeNode); return; } } SimpleTreeNode treeNode = model.find(null, recordId); if (treeNode != null) { model.removeNode(treeNode); } } private void addNewNode() { if (gridTab.getRecord_ID() > 0) { String name = (String)gridTab.getValue("Name"); String description = (String)gridTab.getValue("Description"); boolean summary = gridTab.getValueAsBoolean("IsSummary"); String imageIndicator = (String)gridTab.getValue("Action"); // Menu - Action // SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel(); SimpleTreeNode treeNode = model.getRoot(); MTreeNode root = (MTreeNode) treeNode.getData(); MTreeNode node = new MTreeNode (gridTab.getRecord_ID(), 0, name, description, root.getNode_ID(), summary, imageIndicator, false, null); SimpleTreeNode newNode = new SimpleTreeNode(node, new ArrayList<Object>()); model.addNode(newNode); int[] path = model.getPath(model.getRoot(), newNode); Treeitem ti = treePanel.getTree().renderItemByPath(path); treePanel.getTree().setSelectedItem(ti); } } private void setSelectedNode(int recordId) { if (recordId <= 0) return; if (treePanel.getTree().getSelectedItem() != null) { SimpleTreeNode treeNode = (SimpleTreeNode) treePanel.getTree().getSelectedItem().getValue(); MTreeNode data = (MTreeNode) treeNode.getData(); if (data.getNode_ID() == recordId) return; } SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel(); SimpleTreeNode treeNode = model.find(null, recordId); if (treeNode != null) { int[] path = model.getPath(model.getRoot(), treeNode); Treeitem ti = treePanel.getTree().renderItemByPath(path); treePanel.getTree().setSelectedItem(ti); } else { addNewNode(); } } /** * Toggle between form and grid view */ public void switchRowPresentation() { if (formComponent.isVisible()) { formComponent.setVisible(false); //de-activate embedded panel for(EmbeddedPanel ep : includedPanel) { activateChild(false, ep); } } else { formComponent.setVisible(true); //activate embedded panel for(EmbeddedPanel ep : includedPanel) { activateChild(true, ep); } } listPanel.setVisible(!formComponent.isVisible()); if (listPanel.isVisible()) { listPanel.refresh(gridTab); listPanel.scrollToCurrentRow(); } else { listPanel.deactivate(); } } class ZoomListener implements EventListener { private IZoomableEditor searchEditor; ZoomListener(IZoomableEditor editor) { searchEditor = editor; } public void onEvent(Event event) throws Exception { if (Events.ON_CLICK.equals(event.getName())) { searchEditor.actionZoom(); } } } /** * Embed detail tab * @param ctx * @param windowNo * @param gridWindow * @param adTabId * @param tabIndex * @param tabPanel */ public void embed(Properties ctx, int windowNo, GridWindow gridWindow, int adTabId, int tabIndex, IADTabpanel tabPanel) { EmbeddedPanel ep = new EmbeddedPanel(); ep.tabPanel = tabPanel; ep.adTabId = adTabId; ep.tabIndex = tabIndex; ep.gridWindow = gridWindow; includedPanel.add(ep); Group group = includedTab.get(adTabId); ep.group = group; if (tabPanel instanceof ADTabpanel) { ADTabpanel atp = (ADTabpanel) tabPanel; atp.listPanel.setPageSize(-1); } ADWindowPanel panel = new ADWindowPanel(ctx, windowNo, gridWindow, tabIndex, tabPanel); ep.windowPanel = panel; if (group != null) { createEmbeddedPanelUI(ep); if (active) activateChild(true, ep); } } class EmbeddedPanel { Group group; GridWindow gridWindow; int tabIndex; ADWindowPanel windowPanel; IADTabpanel tabPanel; int adTabId; } /** * @see IADTabpanel#afterSave(boolean) */ public void afterSave(boolean onSaveEvent) { if (!includedPanel.isEmpty()) { for (EmbeddedPanel panel : includedPanel) panel.tabPanel.query(false, 0, 0); } } private void createEmbeddedPanelUI(EmbeddedPanel ep) { org.zkoss.zul.Row row = new Row(); row.setSpans("5"); grid.getRows().insertBefore(row, includedTabFooter.get(ep.adTabId)); ep.windowPanel.createPart(row); ep.windowPanel.getComponent().setWidth("100%"); ep.windowPanel.getComponent().setStyle("position: relative"); ep.windowPanel.getComponent().setHeight("400px"); Label title = new Label(ep.gridWindow.getTab(ep.tabIndex).getName()); ep.group.appendChild(title); ep.group.appendChild(ep.windowPanel.getToolbar()); ep.windowPanel.getStatusBar().setZclass("z-group-foot"); ep.windowPanel.initPanel(-1, null); } @Override public void focus() { if (formComponent.isVisible()) this.setFocusToField(); else listPanel.focus(); } public void setFocusToField(String columnName) { if (formComponent.isVisible()) { boolean found = false; for (WEditor editor : editors) { if (found) editor.setHasFocus(false); else if (columnName.equals(editor.getColumnName())) { editor.setHasFocus(true); Clients.response(new AuFocus(editor.getComponent())); found = true; } } } else { listPanel.setFocusToField(columnName); } } /** * @see IADTabpanel#onEnterKey() */ public boolean onEnterKey() { if (listPanel.isVisible()) { return listPanel.onEnterKey(); } return false; } /** * @param e * @see VetoableChangeListener#vetoableChange(PropertyChangeEvent) */ public void vetoableChange(PropertyChangeEvent e) throws PropertyVetoException { // Save Confirmation dialog MTable-RowSave if (e.getPropertyName().equals(GridTable.PROPERTY)) { // throw new PropertyVetoException will call this listener again to revert to old value if (m_vetoActive) { //ignore m_vetoActive = false; return; } if (!Env.isAutoCommit(Env.getCtx(), getWindowNo()) || gridTab.getCommitWarning().length() > 0) { if (!FDialog.ask(getWindowNo(), this, "SaveChanges?", gridTab.getCommitWarning())) { m_vetoActive = true; throw new PropertyVetoException ("UserDeniedSave", e); } } return; } // saveConfirmation } /** * @return boolean */ public boolean isGridView() { return listPanel.isVisible(); } /** * @param gTab * @return embedded panel or null if not found */ public IADTabpanel findEmbeddedPanel(GridTab gTab) { IADTabpanel panel = null; for(EmbeddedPanel ep : includedPanel) { if (ep.tabPanel.getGridTab().equals(gTab)) { return ep.tabPanel; } } return panel; } /** * * @return GridPanel */ public GridPanel getGridView() { return listPanel; } }