[ adempiere-ZK Web Client-2713719 ] Tree doesn't have expand and lookup
This commit is contained in:
parent
3aa9d77dfe
commit
21db3e1d31
|
@ -76,7 +76,6 @@ import org.zkoss.zul.Groupfoot;
|
||||||
import org.zkoss.zul.Separator;
|
import org.zkoss.zul.Separator;
|
||||||
import org.zkoss.zul.SimpleTreeNode;
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
import org.zkoss.zul.Space;
|
import org.zkoss.zul.Space;
|
||||||
import org.zkoss.zul.Tree;
|
|
||||||
import org.zkoss.zul.Treeitem;
|
import org.zkoss.zul.Treeitem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -132,7 +131,7 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
|
|
||||||
private Component formComponent = null;
|
private Component formComponent = null;
|
||||||
|
|
||||||
private Tree tree = null;
|
private ADTreePanel treePanel = null;
|
||||||
|
|
||||||
private GridTabDataBinder dataBinder;
|
private GridTabDataBinder dataBinder;
|
||||||
|
|
||||||
|
@ -202,10 +201,9 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
layout.setParent(this);
|
layout.setParent(this);
|
||||||
layout.setStyle("width: 100%; height: 100%; position: absolute;");
|
layout.setStyle("width: 100%; height: 100%; position: absolute;");
|
||||||
|
|
||||||
tree = new Tree();
|
treePanel = new ADTreePanel();
|
||||||
tree.setStyle("border: none");
|
|
||||||
West west = new West();
|
West west = new West();
|
||||||
west.appendChild(tree);
|
west.appendChild(treePanel);
|
||||||
west.setWidth("300px");
|
west.setWidth("300px");
|
||||||
west.setCollapsible(true);
|
west.setCollapsible(true);
|
||||||
west.setSplittable(true);
|
west.setSplittable(true);
|
||||||
|
@ -218,7 +216,7 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
layout.appendChild(center);
|
layout.appendChild(center);
|
||||||
|
|
||||||
formComponent = layout;
|
formComponent = layout;
|
||||||
tree.addEventListener(Events.ON_SELECT, this);
|
treePanel.getTree().addEventListener(Events.ON_SELECT, this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -492,10 +490,10 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
}
|
}
|
||||||
|
|
||||||
//create tree
|
//create tree
|
||||||
if (gridTab.isTreeTab() && tree != null) {
|
if (gridTab.isTreeTab() && treePanel != null) {
|
||||||
int AD_Tree_ID = MTree.getDefaultAD_Tree_ID (
|
int AD_Tree_ID = MTree.getDefaultAD_Tree_ID (
|
||||||
Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName());
|
Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName());
|
||||||
SimpleTreeModel.initADTree(tree, AD_Tree_ID, windowNo);
|
treePanel.initTree(AD_Tree_ID, windowNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gridTab.isSingleRow() && !isGridView())
|
if (!gridTab.isSingleRow() && !isGridView())
|
||||||
|
@ -779,8 +777,8 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
{
|
{
|
||||||
this.switchRowPresentation();
|
this.switchRowPresentation();
|
||||||
}
|
}
|
||||||
else if (event.getTarget() == tree) {
|
else if (event.getTarget() == treePanel.getTree()) {
|
||||||
Treeitem item = tree.getSelectedItem();
|
Treeitem item = treePanel.getTree().getSelectedItem();
|
||||||
navigateTo((SimpleTreeNode)item.getValue());
|
navigateTo((SimpleTreeNode)item.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -863,7 +861,7 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
dynamicDisplay(col);
|
dynamicDisplay(col);
|
||||||
|
|
||||||
//sync tree
|
//sync tree
|
||||||
if (tree != null) {
|
if (treePanel != null) {
|
||||||
if ("Deleted".equalsIgnoreCase(e.getAD_Message()))
|
if ("Deleted".equalsIgnoreCase(e.getAD_Message()))
|
||||||
if (e.Record_ID != null
|
if (e.Record_ID != null
|
||||||
&& e.Record_ID instanceof Integer
|
&& e.Record_ID instanceof Integer
|
||||||
|
@ -890,10 +888,10 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
private void deleteNode(int recordId) {
|
private void deleteNode(int recordId) {
|
||||||
if (recordId <= 0) return;
|
if (recordId <= 0) return;
|
||||||
|
|
||||||
SimpleTreeModel model = (SimpleTreeModel) tree.getModel();
|
SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel();
|
||||||
|
|
||||||
if (tree.getSelectedItem() != null) {
|
if (treePanel.getTree().getSelectedItem() != null) {
|
||||||
SimpleTreeNode treeNode = (SimpleTreeNode) tree.getSelectedItem().getValue();
|
SimpleTreeNode treeNode = (SimpleTreeNode) treePanel.getTree().getSelectedItem().getValue();
|
||||||
MTreeNode data = (MTreeNode) treeNode.getData();
|
MTreeNode data = (MTreeNode) treeNode.getData();
|
||||||
if (data.getNode_ID() == recordId) {
|
if (data.getNode_ID() == recordId) {
|
||||||
model.removeNode(treeNode);
|
model.removeNode(treeNode);
|
||||||
|
@ -914,7 +912,7 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
boolean summary = gridTab.getValueAsBoolean("IsSummary");
|
boolean summary = gridTab.getValueAsBoolean("IsSummary");
|
||||||
String imageIndicator = (String)gridTab.getValue("Action"); // Menu - Action
|
String imageIndicator = (String)gridTab.getValue("Action"); // Menu - Action
|
||||||
//
|
//
|
||||||
SimpleTreeModel model = (SimpleTreeModel) tree.getModel();
|
SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel();
|
||||||
SimpleTreeNode treeNode = model.getRoot();
|
SimpleTreeNode treeNode = model.getRoot();
|
||||||
MTreeNode root = (MTreeNode) treeNode.getData();
|
MTreeNode root = (MTreeNode) treeNode.getData();
|
||||||
MTreeNode node = new MTreeNode (gridTab.getRecord_ID(), 0, name, description,
|
MTreeNode node = new MTreeNode (gridTab.getRecord_ID(), 0, name, description,
|
||||||
|
@ -922,26 +920,26 @@ DataStatusListener, IADTabpanel, VetoableChangeListener
|
||||||
SimpleTreeNode newNode = new SimpleTreeNode(node, new ArrayList<Object>());
|
SimpleTreeNode newNode = new SimpleTreeNode(node, new ArrayList<Object>());
|
||||||
model.addNode(newNode);
|
model.addNode(newNode);
|
||||||
int[] path = model.getPath(model.getRoot(), newNode);
|
int[] path = model.getPath(model.getRoot(), newNode);
|
||||||
Treeitem ti = tree.renderItemByPath(path);
|
Treeitem ti = treePanel.getTree().renderItemByPath(path);
|
||||||
tree.setSelectedItem(ti);
|
treePanel.getTree().setSelectedItem(ti);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSelectedNode(int recordId) {
|
private void setSelectedNode(int recordId) {
|
||||||
if (recordId <= 0) return;
|
if (recordId <= 0) return;
|
||||||
|
|
||||||
if (tree.getSelectedItem() != null) {
|
if (treePanel.getTree().getSelectedItem() != null) {
|
||||||
SimpleTreeNode treeNode = (SimpleTreeNode) tree.getSelectedItem().getValue();
|
SimpleTreeNode treeNode = (SimpleTreeNode) treePanel.getTree().getSelectedItem().getValue();
|
||||||
MTreeNode data = (MTreeNode) treeNode.getData();
|
MTreeNode data = (MTreeNode) treeNode.getData();
|
||||||
if (data.getNode_ID() == recordId) return;
|
if (data.getNode_ID() == recordId) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SimpleTreeModel model = (SimpleTreeModel) tree.getModel();
|
SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel();
|
||||||
SimpleTreeNode treeNode = model.find(null, recordId);
|
SimpleTreeNode treeNode = model.find(null, recordId);
|
||||||
if (treeNode != null) {
|
if (treeNode != null) {
|
||||||
int[] path = model.getPath(model.getRoot(), treeNode);
|
int[] path = model.getPath(model.getRoot(), treeNode);
|
||||||
Treeitem ti = tree.renderItemByPath(path);
|
Treeitem ti = treePanel.getTree().renderItemByPath(path);
|
||||||
tree.setSelectedItem(ti);
|
treePanel.getTree().setSelectedItem(ti);
|
||||||
} else {
|
} else {
|
||||||
addNewNode();
|
addNewNode();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2009 Low Heng Sin *
|
||||||
|
* Copyright (C) 2009 Idalica Corporation *
|
||||||
|
* 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. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.webui.panel;
|
||||||
|
|
||||||
|
|
||||||
|
import org.adempiere.webui.component.Checkbox;
|
||||||
|
import org.adempiere.webui.component.SimpleTreeModel;
|
||||||
|
import org.adempiere.webui.util.TreeUtils;
|
||||||
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Msg;
|
||||||
|
import org.zkoss.zk.ui.event.Event;
|
||||||
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zul.Panel;
|
||||||
|
import org.zkoss.zul.Panelchildren;
|
||||||
|
import org.zkoss.zul.Toolbar;
|
||||||
|
import org.zkoss.zul.Tree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hengsin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ADTreePanel extends Panel implements EventListener
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private TreeSearchPanel pnlSearch;
|
||||||
|
private Tree tree;
|
||||||
|
|
||||||
|
private Checkbox chkExpand; // Elaine 2009/02/27 - expand tree
|
||||||
|
|
||||||
|
public ADTreePanel()
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param AD_Tree_ID
|
||||||
|
* @param windowNo
|
||||||
|
*/
|
||||||
|
public void initTree(int AD_Tree_ID, int windowNo)
|
||||||
|
{
|
||||||
|
SimpleTreeModel.initADTree(tree, AD_Tree_ID, windowNo);
|
||||||
|
pnlSearch.initialise();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init()
|
||||||
|
{
|
||||||
|
this.setWidth("100%");
|
||||||
|
this.setHeight("100%");
|
||||||
|
|
||||||
|
tree = new Tree();
|
||||||
|
tree.setMultiple(false);
|
||||||
|
tree.setWidth("100%");
|
||||||
|
tree.setVflex(true);
|
||||||
|
tree.setPageSize(-1); // Due to bug in the new paging functionality
|
||||||
|
|
||||||
|
tree.setStyle("border: none");
|
||||||
|
|
||||||
|
pnlSearch = new TreeSearchPanel(tree, Events.ON_SELECT);
|
||||||
|
|
||||||
|
Toolbar toolbar = new Toolbar();
|
||||||
|
toolbar.appendChild(pnlSearch);
|
||||||
|
this.appendChild(toolbar);
|
||||||
|
|
||||||
|
Panelchildren pc = new Panelchildren();
|
||||||
|
this.appendChild(pc);
|
||||||
|
pc.appendChild(tree);
|
||||||
|
|
||||||
|
// Elaine 2009/02/27 - expand tree
|
||||||
|
toolbar = new Toolbar();
|
||||||
|
chkExpand = new Checkbox();
|
||||||
|
chkExpand.setText(Msg.getMsg(Env.getCtx(), "ExpandTree"));
|
||||||
|
chkExpand.addEventListener(Events.ON_CHECK, this);
|
||||||
|
toolbar.appendChild(chkExpand);
|
||||||
|
this.appendChild(toolbar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event
|
||||||
|
* @see EventListener#onEvent(Event)
|
||||||
|
*/
|
||||||
|
public void onEvent(Event event)
|
||||||
|
{
|
||||||
|
String eventName = event.getName();
|
||||||
|
|
||||||
|
// Elaine 2009/02/27 - expand tree
|
||||||
|
if (eventName.equals(Events.ON_CHECK) && event.getTarget() == chkExpand)
|
||||||
|
{
|
||||||
|
expandOnCheck();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return tree
|
||||||
|
*/
|
||||||
|
public Tree getTree()
|
||||||
|
{
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* expand all node
|
||||||
|
*/
|
||||||
|
public void expandAll()
|
||||||
|
{
|
||||||
|
if (!chkExpand.isChecked())
|
||||||
|
chkExpand.setChecked(true);
|
||||||
|
|
||||||
|
TreeUtils.expandAll(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* collapse all node
|
||||||
|
*/
|
||||||
|
public void collapseAll()
|
||||||
|
{
|
||||||
|
if (chkExpand.isChecked())
|
||||||
|
chkExpand.setChecked(false);
|
||||||
|
|
||||||
|
TreeUtils.collapseAll(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On check event for the expand checkbox
|
||||||
|
*/
|
||||||
|
private void expandOnCheck()
|
||||||
|
{
|
||||||
|
if (chkExpand.isChecked())
|
||||||
|
expandAll();
|
||||||
|
else
|
||||||
|
collapseAll();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}
|
|
@ -26,6 +26,7 @@ import org.adempiere.webui.component.Checkbox;
|
||||||
import org.adempiere.webui.event.MenuListener;
|
import org.adempiere.webui.event.MenuListener;
|
||||||
import org.adempiere.webui.exception.ApplicationException;
|
import org.adempiere.webui.exception.ApplicationException;
|
||||||
import org.adempiere.webui.session.SessionManager;
|
import org.adempiere.webui.session.SessionManager;
|
||||||
|
import org.adempiere.webui.util.TreeUtils;
|
||||||
import org.compiere.model.MTree;
|
import org.compiere.model.MTree;
|
||||||
import org.compiere.model.MTreeNode;
|
import org.compiere.model.MTreeNode;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
|
@ -56,7 +57,7 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private Properties ctx;
|
private Properties ctx;
|
||||||
private MenuSearchPanel pnlSearch;
|
private TreeSearchPanel pnlSearch;
|
||||||
private Tree menuTree;
|
private Tree menuTree;
|
||||||
private ArrayList<MenuListener> menuListeners = new ArrayList<MenuListener>();
|
private ArrayList<MenuListener> menuListeners = new ArrayList<MenuListener>();
|
||||||
|
|
||||||
|
@ -95,7 +96,7 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
|
|
||||||
menuTree.setStyle("border: none");
|
menuTree.setStyle("border: none");
|
||||||
|
|
||||||
pnlSearch = new MenuSearchPanel(this);
|
pnlSearch = new TreeSearchPanel(menuTree);
|
||||||
|
|
||||||
Toolbar toolbar = new Toolbar();
|
Toolbar toolbar = new Toolbar();
|
||||||
toolbar.appendChild(pnlSearch);
|
toolbar.appendChild(pnlSearch);
|
||||||
|
@ -173,7 +174,6 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
treeitem.setImage("/images/mWindow.png");
|
treeitem.setImage("/images/mWindow.png");
|
||||||
|
|
||||||
treeitem.getTreerow().setDraggable("favourite"); // Elaine 2008/07/24
|
treeitem.getTreerow().setDraggable("favourite"); // Elaine 2008/07/24
|
||||||
pnlSearch.addTreeItem(treeitem);
|
|
||||||
|
|
||||||
treeitem.getTreerow().addEventListener(Events.ON_CLICK, this);
|
treeitem.getTreerow().addEventListener(Events.ON_CLICK, this);
|
||||||
}
|
}
|
||||||
|
@ -209,10 +209,7 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
// Elaine 2009/02/27 - expand tree
|
// Elaine 2009/02/27 - expand tree
|
||||||
else if (eventName.equals(Events.ON_CHECK) && event.getTarget() == chkExpand)
|
else if (eventName.equals(Events.ON_CHECK) && event.getTarget() == chkExpand)
|
||||||
{
|
{
|
||||||
if(comp.equals(chkExpand))
|
expandOnCheck();
|
||||||
{
|
|
||||||
expandTree();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
@ -242,37 +239,6 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
return menuTree;
|
return menuTree;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Elaine 2009/02/27 - expand tree
|
|
||||||
private void expand(Treechildren treechildren, boolean expand)
|
|
||||||
{
|
|
||||||
List<?> list = treechildren.getChildren();
|
|
||||||
for(int index = 0; index < list.size(); index++)
|
|
||||||
{
|
|
||||||
Object o = list.get(index);
|
|
||||||
if(o instanceof Treechildren)
|
|
||||||
{
|
|
||||||
Treechildren treechild = (Treechildren) o;
|
|
||||||
expand(treechild, expand);
|
|
||||||
}
|
|
||||||
else if(o instanceof Treeitem)
|
|
||||||
{
|
|
||||||
Treeitem treeitem = (Treeitem) o;
|
|
||||||
treeitem.setOpen(expand);
|
|
||||||
|
|
||||||
List<?> treeitemChildren = treeitem.getChildren();
|
|
||||||
for(int childIndex = 0; childIndex < treeitemChildren.size(); childIndex++)
|
|
||||||
{
|
|
||||||
Object child = treeitemChildren.get(childIndex);
|
|
||||||
if(child instanceof Treechildren)
|
|
||||||
{
|
|
||||||
Treechildren treechild = (Treechildren) child;
|
|
||||||
expand(treechild, expand);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* expand all node
|
* expand all node
|
||||||
*/
|
*/
|
||||||
|
@ -281,7 +247,7 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
if (!chkExpand.isChecked())
|
if (!chkExpand.isChecked())
|
||||||
chkExpand.setChecked(true);
|
chkExpand.setChecked(true);
|
||||||
|
|
||||||
expandTree();
|
TreeUtils.expandAll(menuTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -292,16 +258,18 @@ public class MenuPanel extends Panel implements EventListener
|
||||||
if (chkExpand.isChecked())
|
if (chkExpand.isChecked())
|
||||||
chkExpand.setChecked(false);
|
chkExpand.setChecked(false);
|
||||||
|
|
||||||
expandTree();
|
TreeUtils.collapseAll(menuTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clicked on Expand All
|
* On check event for the expand checkbox
|
||||||
*/
|
*/
|
||||||
private void expandTree()
|
private void expandOnCheck()
|
||||||
{
|
{
|
||||||
Treechildren treechildren = menuTree.getTreechildren();
|
if (chkExpand.isChecked())
|
||||||
expand(treechildren, chkExpand.isChecked());
|
expandAll();
|
||||||
|
else
|
||||||
|
collapseAll();
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,21 @@ import java.util.TreeMap;
|
||||||
import org.adempiere.webui.component.AutoComplete;
|
import org.adempiere.webui.component.AutoComplete;
|
||||||
import org.adempiere.webui.component.Label;
|
import org.adempiere.webui.component.Label;
|
||||||
import org.adempiere.webui.component.Panel;
|
import org.adempiere.webui.component.Panel;
|
||||||
|
import org.adempiere.webui.util.TreeItemAction;
|
||||||
|
import org.adempiere.webui.util.TreeNodeAction;
|
||||||
|
import org.adempiere.webui.util.TreeUtils;
|
||||||
|
import org.compiere.model.MTreeNode;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.Msg;
|
import org.compiere.util.Msg;
|
||||||
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.zk.ui.util.Clients;
|
import org.zkoss.zk.ui.util.Clients;
|
||||||
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
|
import org.zkoss.zul.Tree;
|
||||||
import org.zkoss.zul.Treeitem;
|
import org.zkoss.zul.Treeitem;
|
||||||
|
import org.zkoss.zul.event.TreeDataEvent;
|
||||||
|
import org.zkoss.zul.event.TreeDataListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -36,24 +44,38 @@ import org.zkoss.zul.Treeitem;
|
||||||
* @date Mar 3, 2007
|
* @date Mar 3, 2007
|
||||||
* @version $Revision: 0.10 $
|
* @version $Revision: 0.10 $
|
||||||
*/
|
*/
|
||||||
public class MenuSearchPanel extends Panel implements EventListener
|
public class TreeSearchPanel extends Panel implements EventListener, TreeDataListener
|
||||||
{
|
{
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private TreeMap<String, Treeitem> treeNodeItemMap = new TreeMap<String, Treeitem>();
|
private TreeMap<String, Object> treeNodeItemMap = new TreeMap<String, Object>();
|
||||||
private String[] treeValues;
|
private String[] treeValues;
|
||||||
private String[] treeDescription;
|
private String[] treeDescription;
|
||||||
|
|
||||||
private Label lblSearch;
|
private Label lblSearch;
|
||||||
private AutoComplete cmbSearch;
|
private AutoComplete cmbSearch;
|
||||||
|
|
||||||
private MenuPanel menuPanel;
|
private Tree tree;
|
||||||
|
|
||||||
|
private String eventToFire;
|
||||||
|
|
||||||
public MenuSearchPanel(MenuPanel menuPanel)
|
/**
|
||||||
|
* @param tree
|
||||||
|
*/
|
||||||
|
public TreeSearchPanel(Tree tree)
|
||||||
|
{
|
||||||
|
this(tree, Events.ON_CLICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tree
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
public TreeSearchPanel(Tree tree, String event)
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
this.menuPanel = menuPanel;
|
this.tree = tree;
|
||||||
|
this.eventToFire = event;
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,37 +94,95 @@ public class MenuSearchPanel extends Panel implements EventListener
|
||||||
this.appendChild(cmbSearch);
|
this.appendChild(cmbSearch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addTreeItem(Treeitem treeItem)
|
private void addTreeItem(Treeitem treeItem)
|
||||||
{
|
{
|
||||||
String key = treeItem.getLabel();
|
String key = treeItem.getLabel();
|
||||||
treeNodeItemMap.put(key, treeItem);
|
treeNodeItemMap.put(key, treeItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addTreeItem(SimpleTreeNode node) {
|
||||||
|
Object data = node.getData();
|
||||||
|
if (data instanceof MTreeNode) {
|
||||||
|
MTreeNode mNode = (MTreeNode) data;
|
||||||
|
treeNodeItemMap.put(mNode.getName(), node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* populate the searchable list
|
||||||
|
*/
|
||||||
public void initialise()
|
public void initialise()
|
||||||
{
|
{
|
||||||
|
refreshSearchList();
|
||||||
|
|
||||||
|
if (tree.getModel() != null)
|
||||||
|
{
|
||||||
|
tree.getModel().addTreeDataListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshSearchList() {
|
||||||
|
treeNodeItemMap.clear();
|
||||||
|
if (tree.getModel() == null) {
|
||||||
|
TreeUtils.traverse(tree, new TreeItemAction() {
|
||||||
|
public void run(Treeitem treeItem) {
|
||||||
|
addTreeItem(treeItem);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
TreeUtils.traverse(tree.getModel(), new TreeNodeAction() {
|
||||||
|
public void run(SimpleTreeNode treeNode) {
|
||||||
|
addTreeItem(treeNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
treeValues = new String[treeNodeItemMap.size()];
|
treeValues = new String[treeNodeItemMap.size()];
|
||||||
treeDescription = new String[treeNodeItemMap.size()];
|
treeDescription = new String[treeNodeItemMap.size()];
|
||||||
|
|
||||||
int i = -1;
|
int i = -1;
|
||||||
|
|
||||||
for (Treeitem treeItem: treeNodeItemMap.values())
|
for (Object value : treeNodeItemMap.values())
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
|
if (value instanceof Treeitem)
|
||||||
|
{
|
||||||
|
Treeitem treeItem = (Treeitem) value;
|
||||||
treeValues[i] = treeItem.getLabel();
|
treeValues[i] = treeItem.getLabel();
|
||||||
treeDescription[i] = treeItem.getTooltiptext();
|
treeDescription[i] = treeItem.getTooltiptext();
|
||||||
}
|
}
|
||||||
|
else if (value instanceof SimpleTreeNode)
|
||||||
|
{
|
||||||
|
SimpleTreeNode sNode = (SimpleTreeNode) value;
|
||||||
|
MTreeNode mNode = (MTreeNode) sNode.getData();
|
||||||
|
treeValues[i] = mNode.getName();
|
||||||
|
treeDescription[i] = mNode.getDescription();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cmbSearch.setDescription(treeDescription);
|
cmbSearch.setDescription(treeDescription);
|
||||||
cmbSearch.setDict(treeValues);
|
cmbSearch.setDict(treeValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event
|
||||||
|
* @see EventListener#onEvent(Event)
|
||||||
|
*/
|
||||||
public void onEvent(Event event)
|
public void onEvent(Event event)
|
||||||
{
|
{
|
||||||
if (cmbSearch.equals(event.getTarget()) && (event.getName().equals(Events.ON_CHANGE)))
|
if (cmbSearch.equals(event.getTarget()) && (event.getName().equals(Events.ON_CHANGE)))
|
||||||
{
|
{
|
||||||
String value = cmbSearch.getValue();
|
String value = cmbSearch.getValue();
|
||||||
Treeitem treeItem = treeNodeItemMap.get(value);
|
Object node = treeNodeItemMap.get(value);
|
||||||
|
Treeitem treeItem = null;
|
||||||
|
if (node instanceof Treeitem) {
|
||||||
|
treeItem = (Treeitem) node;
|
||||||
|
} else {
|
||||||
|
SimpleTreeNode sNode = (SimpleTreeNode) node;
|
||||||
|
int[] path = tree.getModel().getPath(tree.getModel().getRoot(), sNode);
|
||||||
|
treeItem = tree.renderItemByPath(path);
|
||||||
|
tree.setSelectedItem(treeItem);
|
||||||
|
}
|
||||||
if (treeItem != null)
|
if (treeItem != null)
|
||||||
{
|
{
|
||||||
select(treeItem);
|
select(treeItem);
|
||||||
|
@ -112,9 +192,16 @@ public class MenuSearchPanel extends Panel implements EventListener
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* don't call this directly, use internally for post selection event
|
||||||
|
*/
|
||||||
public void onPostSelect() {
|
public void onPostSelect() {
|
||||||
Clients.showBusy(null, false);
|
Clients.showBusy(null, false);
|
||||||
Event event = new Event(Events.ON_CLICK, menuPanel.getMenuTree().getSelectedItem().getTreerow());
|
Event event = null;
|
||||||
|
if (eventToFire.equals(Events.ON_CLICK))
|
||||||
|
event = new Event(Events.ON_CLICK, tree.getSelectedItem().getTreerow());
|
||||||
|
else
|
||||||
|
event = new Event(eventToFire, tree);
|
||||||
Events.postEvent(event);
|
Events.postEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,4 +215,12 @@ public class MenuSearchPanel extends Panel implements EventListener
|
||||||
}
|
}
|
||||||
selectedItem.getTree().setSelectedItem(selectedItem);
|
selectedItem.getTree().setSelectedItem(selectedItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param event
|
||||||
|
* @see TreeDataListener#onChange(TreeDataEvent)
|
||||||
|
*/
|
||||||
|
public void onChange(TreeDataEvent event) {
|
||||||
|
refreshSearchList();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2009 Low Heng Sin *
|
||||||
|
* Copyright (C) 2009 Idalica Corporation *
|
||||||
|
* 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. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.webui.util;
|
||||||
|
|
||||||
|
import org.zkoss.zul.Treeitem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hengsin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface TreeItemAction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param treeItem
|
||||||
|
*/
|
||||||
|
public void run(Treeitem treeItem);
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2009 Low Heng Sin *
|
||||||
|
* Copyright (C) 2009 Idalica Corporation *
|
||||||
|
* 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. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.webui.util;
|
||||||
|
|
||||||
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hengsin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface TreeNodeAction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param treeNode
|
||||||
|
*/
|
||||||
|
public void run(SimpleTreeNode treeNode);
|
||||||
|
}
|
|
@ -0,0 +1,129 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2009 Low Heng Sin *
|
||||||
|
* Copyright (C) 2009 Idalica Corporation *
|
||||||
|
* 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. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.webui.util;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
|
import org.zkoss.zul.Tree;
|
||||||
|
import org.zkoss.zul.TreeModel;
|
||||||
|
import org.zkoss.zul.Treechildren;
|
||||||
|
import org.zkoss.zul.Treeitem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hengsin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TreeUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collapse all nodes
|
||||||
|
* @param tree
|
||||||
|
*/
|
||||||
|
public static void collapseAll(Tree tree) {
|
||||||
|
traverse(tree, new TreeItemAction() {
|
||||||
|
public void run(Treeitem treeItem) {
|
||||||
|
treeItem.setOpen(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expand all nodes
|
||||||
|
* @param tree
|
||||||
|
*/
|
||||||
|
public static void expandAll(Tree tree) {
|
||||||
|
traverse(tree, new TreeItemAction() {
|
||||||
|
public void run(Treeitem treeItem) {
|
||||||
|
treeItem.setOpen(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Traverse tree and execution action on Treeitem
|
||||||
|
* @param tree
|
||||||
|
* @param action
|
||||||
|
*/
|
||||||
|
public static void traverse(Tree tree, TreeItemAction action)
|
||||||
|
{
|
||||||
|
Treechildren treechildren = tree.getTreechildren();
|
||||||
|
traverse(treechildren, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Traverse treechildren and execution action on Treeitem
|
||||||
|
* @param treechildren
|
||||||
|
* @param action
|
||||||
|
*/
|
||||||
|
public static void traverse(Treechildren treechildren, TreeItemAction action)
|
||||||
|
{
|
||||||
|
List<?> list = treechildren.getChildren();
|
||||||
|
for(int index = 0; index < list.size(); index++)
|
||||||
|
{
|
||||||
|
Object o = list.get(index);
|
||||||
|
if(o instanceof Treechildren)
|
||||||
|
{
|
||||||
|
Treechildren treechild = (Treechildren) o;
|
||||||
|
traverse(treechild, action);
|
||||||
|
}
|
||||||
|
else if(o instanceof Treeitem)
|
||||||
|
{
|
||||||
|
Treeitem treeitem = (Treeitem) o;
|
||||||
|
action.run(treeitem);
|
||||||
|
|
||||||
|
List<?> treeitemChildren = treeitem.getChildren();
|
||||||
|
for(int childIndex = 0; childIndex < treeitemChildren.size(); childIndex++)
|
||||||
|
{
|
||||||
|
Object child = treeitemChildren.get(childIndex);
|
||||||
|
if(child instanceof Treechildren)
|
||||||
|
{
|
||||||
|
Treechildren treechild = (Treechildren) child;
|
||||||
|
traverse(treechild, action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Traverse tree model and execution action on tree node
|
||||||
|
* @param model
|
||||||
|
* @param action
|
||||||
|
*/
|
||||||
|
public static void traverse(TreeModel model, TreeNodeAction action) {
|
||||||
|
traverse(model, model.getRoot(), action);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Traverse tree model from parent and execution action on tree node
|
||||||
|
* @param model
|
||||||
|
* @param parent
|
||||||
|
* @param action
|
||||||
|
*/
|
||||||
|
public static void traverse(TreeModel model, Object parent,
|
||||||
|
TreeNodeAction action) {
|
||||||
|
int count = model.getChildCount(parent);
|
||||||
|
for(int i = 0; i < count; i++) {
|
||||||
|
Object child = model.getChild(parent, i);
|
||||||
|
if (child instanceof SimpleTreeNode) {
|
||||||
|
action.run((SimpleTreeNode) child);
|
||||||
|
}
|
||||||
|
traverse(model, child, action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue