* Added initial support for tree tab.
This commit is contained in:
parent
ffe229a48c
commit
e1c6a92c05
|
@ -0,0 +1,84 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2008 Low Heng Sin *
|
||||||
|
* 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.component;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
|
||||||
|
import org.compiere.model.MTreeNode;
|
||||||
|
import org.zkoss.lang.Objects;
|
||||||
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
|
import org.zkoss.zul.Treecell;
|
||||||
|
import org.zkoss.zul.Treeitem;
|
||||||
|
import org.zkoss.zul.TreeitemRenderer;
|
||||||
|
import org.zkoss.zul.Treerow;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Low Heng Sin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SimpleTreeModel extends org.zkoss.zul.SimpleTreeModel implements TreeitemRenderer {
|
||||||
|
|
||||||
|
public SimpleTreeModel(SimpleTreeNode root) {
|
||||||
|
super(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SimpleTreeModel createFrom(MTreeNode root) {
|
||||||
|
SimpleTreeModel model = null;
|
||||||
|
Enumeration nodeEnum = root.children();
|
||||||
|
|
||||||
|
SimpleTreeNode stRoot = new SimpleTreeNode(root, new ArrayList());
|
||||||
|
while(nodeEnum.hasMoreElements()) {
|
||||||
|
MTreeNode childNode = (MTreeNode)nodeEnum.nextElement();
|
||||||
|
SimpleTreeNode stNode = new SimpleTreeNode(childNode, new ArrayList());
|
||||||
|
stRoot.getChildren().add(stNode);
|
||||||
|
if (childNode.getChildCount() > 0) {
|
||||||
|
populate(stNode, childNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
model = new SimpleTreeModel(stRoot);
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void populate(SimpleTreeNode stNode, MTreeNode root) {
|
||||||
|
Enumeration nodeEnum = root.children();
|
||||||
|
while(nodeEnum.hasMoreElements()) {
|
||||||
|
MTreeNode childNode = (MTreeNode)nodeEnum.nextElement();
|
||||||
|
SimpleTreeNode stChildNode = new SimpleTreeNode(childNode, new ArrayList());
|
||||||
|
stNode.getChildren().add(stChildNode);
|
||||||
|
if (childNode.getChildCount() > 0) {
|
||||||
|
populate(stChildNode, childNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void render(Treeitem ti, Object node) {
|
||||||
|
Treecell tc = new Treecell(Objects.toString(node));
|
||||||
|
Treerow tr = null;
|
||||||
|
if(ti.getTreerow()==null){
|
||||||
|
tr = new Treerow();
|
||||||
|
tr.setParent(ti);
|
||||||
|
}else{
|
||||||
|
tr = ti.getTreerow();
|
||||||
|
tr.getChildren().clear();
|
||||||
|
}
|
||||||
|
tc.setParent(tr);
|
||||||
|
|
||||||
|
ti.setValue(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -23,6 +23,7 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.adempiere.webui.LayoutUtils;
|
import org.adempiere.webui.LayoutUtils;
|
||||||
import org.adempiere.webui.component.Bandbox;
|
import org.adempiere.webui.component.Bandbox;
|
||||||
|
@ -33,6 +34,7 @@ import org.adempiere.webui.component.Label;
|
||||||
import org.adempiere.webui.component.Listbox;
|
import org.adempiere.webui.component.Listbox;
|
||||||
import org.adempiere.webui.component.Row;
|
import org.adempiere.webui.component.Row;
|
||||||
import org.adempiere.webui.component.Rows;
|
import org.adempiere.webui.component.Rows;
|
||||||
|
import org.adempiere.webui.component.SimpleTreeModel;
|
||||||
import org.adempiere.webui.component.ToolBar;
|
import org.adempiere.webui.component.ToolBar;
|
||||||
import org.adempiere.webui.editor.IZoomableEditor;
|
import org.adempiere.webui.editor.IZoomableEditor;
|
||||||
import org.adempiere.webui.editor.WButtonEditor;
|
import org.adempiere.webui.editor.WButtonEditor;
|
||||||
|
@ -50,6 +52,8 @@ import org.compiere.model.GridTab;
|
||||||
import org.compiere.model.GridTable;
|
import org.compiere.model.GridTable;
|
||||||
import org.compiere.model.GridWindow;
|
import org.compiere.model.GridWindow;
|
||||||
import org.compiere.model.MLookup;
|
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.model.X_AD_FieldGroup;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
|
@ -62,9 +66,17 @@ import org.zkoss.zk.ui.HtmlBasedComponent;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
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.Div;
|
||||||
import org.zkoss.zul.Separator;
|
import org.zkoss.zul.Separator;
|
||||||
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
import org.zkoss.zul.Toolbarbutton;
|
import org.zkoss.zul.Toolbarbutton;
|
||||||
|
import org.zkoss.zul.Tree;
|
||||||
|
import org.zkoss.zul.Treecol;
|
||||||
|
import org.zkoss.zul.Treecols;
|
||||||
|
import org.zkoss.zul.Treeitem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -77,6 +89,7 @@ import org.zkoss.zul.Toolbarbutton;
|
||||||
* @date Feb 25, 2007
|
* @date Feb 25, 2007
|
||||||
* @version $Revision: 0.10 $
|
* @version $Revision: 0.10 $
|
||||||
*
|
*
|
||||||
|
* @author Low Heng Sin
|
||||||
*/
|
*/
|
||||||
public class ADTabpanel extends Div implements Evaluatee, EventListener,
|
public class ADTabpanel extends Div implements Evaluatee, EventListener,
|
||||||
DataStatusListener, ValueChangeListener, IADTabpanel
|
DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
|
@ -117,6 +130,10 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
|
|
||||||
private ArrayList<Row> rowList;
|
private ArrayList<Row> rowList;
|
||||||
|
|
||||||
|
private Component formComponent = null;
|
||||||
|
|
||||||
|
private Tree tree = null;
|
||||||
|
|
||||||
public ADTabpanel()
|
public ADTabpanel()
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
@ -135,13 +152,14 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
//have problem moving the following out as css class
|
//have problem moving the following out as css class
|
||||||
grid.setWidth("99%");
|
grid.setWidth("99%");
|
||||||
grid.setHeight("100%");
|
grid.setHeight("100%");
|
||||||
grid.setStyle("margin:0; padding:0; position: absolute");
|
|
||||||
grid.setSclass("grid-no-striped");
|
grid.setSclass("grid-no-striped");
|
||||||
|
grid.setStyle("margin:0; padding:0; position: absolute");
|
||||||
grid.setOddRowSclass("even");
|
grid.setOddRowSclass("even");
|
||||||
|
|
||||||
|
|
||||||
listPanel = new GridPanel();
|
listPanel = new GridPanel();
|
||||||
listPanel.getListbox().addEventListener(Events.ON_DOUBLE_CLICK, this);
|
listPanel.getListbox().addEventListener(Events.ON_DOUBLE_CLICK, this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init(AbstractADWindowPanel winPanel, int windowNo, GridTab gridTab,
|
public void init(AbstractADWindowPanel winPanel, int windowNo, GridTab gridTab,
|
||||||
|
@ -152,12 +170,51 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
this.gridTab = gridTab;
|
this.gridTab = gridTab;
|
||||||
this.windowPanel = winPanel;
|
this.windowPanel = winPanel;
|
||||||
gridTab.addDataStatusListener(this);
|
gridTab.addDataStatusListener(this);
|
||||||
|
|
||||||
|
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;");
|
||||||
|
|
||||||
|
tree = new Tree();
|
||||||
|
tree.setStyle("border: none");
|
||||||
|
West west = new West();
|
||||||
|
west.appendChild(tree);
|
||||||
|
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;
|
||||||
|
tree.addEventListener(Events.ON_SELECT, this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.appendChild(grid);
|
||||||
|
formComponent = grid;
|
||||||
|
}
|
||||||
|
this.appendChild(listPanel);
|
||||||
|
listPanel.setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createUI()
|
public void createUI()
|
||||||
{
|
{
|
||||||
if (uiCreated) return;
|
if (uiCreated) return;
|
||||||
|
|
||||||
|
uiCreated = true;
|
||||||
Rows rows = new Rows();
|
Rows rows = new Rows();
|
||||||
GridField fields[] = gridTab.getFields();
|
GridField fields[] = gridTab.getFields();
|
||||||
Row row = new Row();
|
Row row = new Row();
|
||||||
|
@ -334,7 +391,25 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
}
|
}
|
||||||
grid.appendChild(rows);
|
grid.appendChild(rows);
|
||||||
|
|
||||||
uiCreated = true;
|
if (gridTab.isTreeTab() && tree != null) {
|
||||||
|
int AD_Tree_ID = MTree.getDefaultAD_Tree_ID (
|
||||||
|
Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName());
|
||||||
|
MTree vTree = new MTree (Env.getCtx(), AD_Tree_ID, false, true, null);
|
||||||
|
MTreeNode root = vTree.getRoot();
|
||||||
|
SimpleTreeModel treeModel = SimpleTreeModel.createFrom(root);
|
||||||
|
|
||||||
|
Treecols treeCols = new Treecols();
|
||||||
|
tree.appendChild(treeCols);
|
||||||
|
Treecol treeCol = new Treecol();
|
||||||
|
treeCols.appendChild(treeCol);
|
||||||
|
tree.setPageSize(-1);
|
||||||
|
try {
|
||||||
|
tree.setTreeitemRenderer(treeModel);
|
||||||
|
tree.setModel(treeModel);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.log(Level.SEVERE, "Failed to setup tree");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Component createSpacer() {
|
private Component createSpacer() {
|
||||||
|
@ -525,17 +600,6 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
|
|
||||||
public void activate(boolean activate)
|
public void activate(boolean activate)
|
||||||
{
|
{
|
||||||
if (!this.getChildren().contains(grid))
|
|
||||||
{
|
|
||||||
this.appendChild(grid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.getChildren().contains(listPanel))
|
|
||||||
{
|
|
||||||
this.appendChild(listPanel);
|
|
||||||
listPanel.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (listPanel.isVisible()) {
|
if (listPanel.isVisible()) {
|
||||||
if (activate)
|
if (activate)
|
||||||
listPanel.activate(gridTab);
|
listPanel.activate(gridTab);
|
||||||
|
@ -543,7 +607,7 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
listPanel.deactivate();
|
listPanel.deactivate();
|
||||||
} else {
|
} else {
|
||||||
if (activate)
|
if (activate)
|
||||||
grid.setVisible(activate);
|
formComponent.setVisible(activate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -587,6 +651,40 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
{
|
{
|
||||||
this.switchRowPresentation();
|
this.switchRowPresentation();
|
||||||
}
|
}
|
||||||
|
else if (event.getTarget() == tree) {
|
||||||
|
Treeitem item = tree.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);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dataStatusChanged(DataStatusEvent e)
|
public void dataStatusChanged(DataStatusEvent e)
|
||||||
|
@ -629,6 +727,46 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
}
|
}
|
||||||
//if (col >= 0)
|
//if (col >= 0)
|
||||||
dynamicDisplay(col);
|
dynamicDisplay(col);
|
||||||
|
|
||||||
|
//sync tree
|
||||||
|
if (tree != null) {
|
||||||
|
setSelectedNode(gridTab.getRecord_ID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSelectedNode(int recordId) {
|
||||||
|
if (recordId < 0) return;
|
||||||
|
|
||||||
|
if (tree.getSelectedItem() != null) {
|
||||||
|
SimpleTreeNode treeNode = (SimpleTreeNode) tree.getSelectedItem().getValue();
|
||||||
|
MTreeNode data = (MTreeNode) treeNode.getData();
|
||||||
|
if (data.getNode_ID() == recordId) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleTreeModel model = (SimpleTreeModel) tree.getModel();
|
||||||
|
SimpleTreeNode root = (SimpleTreeNode) model.getRoot();
|
||||||
|
SimpleTreeNode treeNode = find(model, root, recordId);
|
||||||
|
if (treeNode != null) {
|
||||||
|
int[] path = model.getPath(model.getRoot(), treeNode);
|
||||||
|
Treeitem ti = tree.renderItemByPath(path);
|
||||||
|
tree.setSelectedItem(ti);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SimpleTreeNode find(SimpleTreeModel model, SimpleTreeNode root, int recordId) {
|
||||||
|
MTreeNode data = (MTreeNode) root.getData();
|
||||||
|
if (data.getNode_ID() == recordId)
|
||||||
|
return root;
|
||||||
|
if (model.isLeaf(root))
|
||||||
|
return null;
|
||||||
|
int cnt = model.getChildCount(root);
|
||||||
|
for(int i = 0; i < cnt; i++ ) {
|
||||||
|
SimpleTreeNode child = (SimpleTreeNode) model.getChild(root, i);
|
||||||
|
SimpleTreeNode treeNode = find(model, child, recordId);
|
||||||
|
if (treeNode != null)
|
||||||
|
return treeNode;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void valueChange(ValueChangeEvent e)
|
public void valueChange(ValueChangeEvent e)
|
||||||
|
@ -681,12 +819,12 @@ DataStatusListener, ValueChangeListener, IADTabpanel
|
||||||
} // ValueChange
|
} // ValueChange
|
||||||
|
|
||||||
public void switchRowPresentation() {
|
public void switchRowPresentation() {
|
||||||
if (grid.isVisible()) {
|
if (formComponent.isVisible()) {
|
||||||
grid.setVisible(false);
|
formComponent.setVisible(false);
|
||||||
} else {
|
} else {
|
||||||
grid.setVisible(true);
|
formComponent.setVisible(true);
|
||||||
}
|
}
|
||||||
listPanel.setVisible(!grid.isVisible());
|
listPanel.setVisible(!formComponent.isVisible());
|
||||||
if (listPanel.isVisible()) {
|
if (listPanel.isVisible()) {
|
||||||
listPanel.activate(gridTab);
|
listPanel.activate(gridTab);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue