IDEMPIERE-662 Zk: Menu lookup improvement.
This commit is contained in:
parent
30debbd3e1
commit
e40910d646
|
@ -117,7 +117,7 @@ public class AutoComplete extends Combobox
|
||||||
/**
|
/**
|
||||||
* Refresh comboitem based on the specified value.
|
* Refresh comboitem based on the specified value.
|
||||||
*/
|
*/
|
||||||
private void refresh(String val)
|
public void refresh(String val)
|
||||||
{
|
{
|
||||||
if (comboItems == null || val == null) {
|
if (comboItems == null || val == null) {
|
||||||
super.getChildren().clear();
|
super.getChildren().clear();
|
||||||
|
|
|
@ -255,11 +255,11 @@ public abstract class AbstractMenuPanel extends Panel implements EventListener<E
|
||||||
String eventName = event.getName();
|
String eventName = event.getName();
|
||||||
if (eventName.equals(Events.ON_CLICK))
|
if (eventName.equals(Events.ON_CLICK))
|
||||||
{
|
{
|
||||||
doOnClick(comp);
|
doOnClick(comp, event.getData());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doOnClick(Component comp) {
|
private void doOnClick(Component comp, Object eventData) {
|
||||||
boolean newRecord = false;
|
boolean newRecord = false;
|
||||||
if (comp instanceof A) {
|
if (comp instanceof A) {
|
||||||
comp = comp.getParent().getParent();
|
comp = comp.getParent().getParent();
|
||||||
|
@ -267,6 +267,8 @@ public abstract class AbstractMenuPanel extends Panel implements EventListener<E
|
||||||
if (comp instanceof Toolbarbutton) {
|
if (comp instanceof Toolbarbutton) {
|
||||||
comp = comp.getParent().getParent();
|
comp = comp.getParent().getParent();
|
||||||
newRecord = true;
|
newRecord = true;
|
||||||
|
} else if (eventData != null && eventData instanceof Boolean) {
|
||||||
|
newRecord = (Boolean)eventData;
|
||||||
}
|
}
|
||||||
if (comp instanceof Treerow)
|
if (comp instanceof Treerow)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,7 +34,7 @@ public class MenuSearchPanel extends AbstractMenuPanel
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 5308522340852904168L;
|
private static final long serialVersionUID = 5308522340852904168L;
|
||||||
|
|
||||||
private TreeSearchPanel pnlSearch;
|
private MenuTreeSearchPanel pnlSearch;
|
||||||
|
|
||||||
public MenuSearchPanel(Component parent)
|
public MenuSearchPanel(Component parent)
|
||||||
{
|
{
|
||||||
|
@ -74,7 +74,7 @@ public class MenuSearchPanel extends AbstractMenuPanel
|
||||||
toolbar.setMold("panel");
|
toolbar.setMold("panel");
|
||||||
this.appendChild(toolbar);
|
this.appendChild(toolbar);
|
||||||
|
|
||||||
pnlSearch = new TreeSearchPanel(getMenuTree());
|
pnlSearch = new MenuTreeSearchPanel(getMenuTree());
|
||||||
pnlSearch.setSclass("menu-search-panel");
|
pnlSearch.setSclass("menu-search-panel");
|
||||||
toolbar.appendChild(pnlSearch);
|
toolbar.appendChild(pnlSearch);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,210 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2013 Heng Sin Low *
|
||||||
|
* Copyright (C) 2013 Trek Global *
|
||||||
|
* 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 java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
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.Msg;
|
||||||
|
import org.compiere.util.Util;
|
||||||
|
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.zul.A;
|
||||||
|
import org.zkoss.zul.DefaultTreeNode;
|
||||||
|
import org.zkoss.zul.Hlayout;
|
||||||
|
import org.zkoss.zul.Toolbarbutton;
|
||||||
|
import org.zkoss.zul.Tree;
|
||||||
|
import org.zkoss.zul.Treeitem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hengsin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MenuTreeSearchPanel extends TreeSearchPanel {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generated serial id
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 8785295166415073971L;
|
||||||
|
private Toolbarbutton newBtn;
|
||||||
|
private Toolbarbutton openBtn;
|
||||||
|
private boolean isNew = false;
|
||||||
|
|
||||||
|
public MenuTreeSearchPanel(Tree tree, String event, int windowno, int tabno) {
|
||||||
|
super(tree, event, windowno, tabno);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MenuTreeSearchPanel(Tree tree, String event) {
|
||||||
|
super(tree, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MenuTreeSearchPanel(Tree tree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
super.init();
|
||||||
|
layout.getFirstChild().detach();
|
||||||
|
Hlayout hlayout = new Hlayout();
|
||||||
|
hlayout.setValign("middle");
|
||||||
|
hlayout.setSpacing("0px");
|
||||||
|
hlayout.setSclass("menu-search-toggle-box");
|
||||||
|
|
||||||
|
newBtn = new Toolbarbutton();
|
||||||
|
newBtn.setImage("/images/New16.png");
|
||||||
|
newBtn.setSclass("menu-search-toggle-off");
|
||||||
|
newBtn.addEventListener(Events.ON_CLICK, new EventListener<Event>() {
|
||||||
|
@Override
|
||||||
|
public void onEvent(Event event) throws Exception {
|
||||||
|
newBtn.setDisabled(true);
|
||||||
|
newBtn.setSclass("menu-search-toggle-on");
|
||||||
|
isNew = true;
|
||||||
|
openBtn.setDisabled(false);
|
||||||
|
openBtn.setSclass("menu-search-toggle-off");
|
||||||
|
refreshAutoComplete();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
newBtn.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "New")));
|
||||||
|
|
||||||
|
openBtn = new Toolbarbutton();
|
||||||
|
openBtn.setImage("/images/Open16.png");
|
||||||
|
openBtn.setSclass("menu-search-toggle-on");
|
||||||
|
openBtn.setDisabled(true);
|
||||||
|
openBtn.addEventListener(Events.ON_CLICK, new EventListener<Event>() {
|
||||||
|
@Override
|
||||||
|
public void onEvent(Event event) throws Exception {
|
||||||
|
openBtn.setDisabled(true);
|
||||||
|
openBtn.setSclass("menu-search-toggle-on");
|
||||||
|
isNew = false;
|
||||||
|
newBtn.setDisabled(false);
|
||||||
|
newBtn.setSclass("menu-search-toggle-off");
|
||||||
|
refreshAutoComplete();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
openBtn.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Open")));
|
||||||
|
|
||||||
|
hlayout.appendChild(newBtn);
|
||||||
|
hlayout.appendChild(openBtn);
|
||||||
|
|
||||||
|
layout.insertBefore(hlayout, layout.getFirstChild());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void refreshSearchList() {
|
||||||
|
treeNodeItemMap.clear();
|
||||||
|
if (tree.getModel() == null) {
|
||||||
|
TreeUtils.traverse(tree, new TreeItemAction() {
|
||||||
|
public void run(Treeitem treeItem) {
|
||||||
|
if (treeItem.isVisible())
|
||||||
|
addTreeItem(treeItem);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
TreeUtils.traverse(tree.getModel(), new TreeNodeAction() {
|
||||||
|
public void run(DefaultTreeNode<?> treeNode) {
|
||||||
|
addTreeItem(treeNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshAutoComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshAutoComplete() {
|
||||||
|
List<String> valueList = new ArrayList<String>();
|
||||||
|
List<String> descriptionList = new ArrayList<String>();
|
||||||
|
List<String> imageList = new ArrayList<String>();
|
||||||
|
|
||||||
|
for (Object value : treeNodeItemMap.values())
|
||||||
|
{
|
||||||
|
if (value instanceof Treeitem)
|
||||||
|
{
|
||||||
|
Treeitem treeItem = (Treeitem) value;
|
||||||
|
if (isFolder(treeItem))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (isNew) {
|
||||||
|
if (!"window".equals(treeItem.getAttribute("menu.type"))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
valueList.add(getLabel(treeItem));
|
||||||
|
descriptionList.add(treeItem.getTooltiptext());
|
||||||
|
String image = getImage(treeItem);
|
||||||
|
if (image == null || image.length() == 0)
|
||||||
|
{
|
||||||
|
image = "/images/Folder16.png";
|
||||||
|
}
|
||||||
|
imageList.add(image);
|
||||||
|
}
|
||||||
|
else if (value instanceof DefaultTreeNode)
|
||||||
|
{
|
||||||
|
DefaultTreeNode<?> sNode = (DefaultTreeNode<?>) value;
|
||||||
|
MTreeNode mNode = (MTreeNode) sNode.getData();
|
||||||
|
if (!mNode.isLeaf())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (isNew) {
|
||||||
|
if (!mNode.isWindow()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
valueList.add(mNode.getName());
|
||||||
|
descriptionList.add(mNode.getDescription());
|
||||||
|
imageList.add(mNode.getImagePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
treeDescription = descriptionList.toArray(new String[0]);
|
||||||
|
treeValues = valueList.toArray(new String[0]);
|
||||||
|
treeImages = imageList.toArray(new String[0]);
|
||||||
|
|
||||||
|
cmbSearch.setDescription(treeDescription);
|
||||||
|
cmbSearch.setDict(treeValues);
|
||||||
|
cmbSearch.setImages(treeImages);
|
||||||
|
cmbSearch.refresh("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostSelectTreeitem() {
|
||||||
|
Clients.clearBusy();
|
||||||
|
Event event = null;
|
||||||
|
if (eventToFire.equals(Events.ON_CLICK))
|
||||||
|
{
|
||||||
|
if (tree.getSelectedItem().getTreerow().getFirstChild().getFirstChild() instanceof A)
|
||||||
|
{
|
||||||
|
event = new Event(Events.ON_CLICK, tree.getSelectedItem().getTreerow().getFirstChild().getFirstChild(), isNew);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event = new Event(Events.ON_CLICK, tree.getSelectedItem().getTreerow(), isNew);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event = new Event(eventToFire, tree, isNew);
|
||||||
|
Events.postEvent(event);
|
||||||
|
Events.echoEvent(ON_POST_FIRE_TREE_EVENT, this, null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -63,27 +63,28 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
{
|
{
|
||||||
private static final String ON_COMBO_SELECT_ECHO_EVENT = "onComboSelectEcho";
|
private static final String ON_COMBO_SELECT_ECHO_EVENT = "onComboSelectEcho";
|
||||||
private static final String ON_POST_SELECT_TREEITEM_EVENT = "onPostSelectTreeitem";
|
private static final String ON_POST_SELECT_TREEITEM_EVENT = "onPostSelectTreeitem";
|
||||||
private static final String ON_POST_FIRE_TREE_EVENT = "onPostFireTreeEvent";
|
protected static final String ON_POST_FIRE_TREE_EVENT = "onPostFireTreeEvent";
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 3478451169922775667L;
|
private static final long serialVersionUID = 3478451169922775667L;
|
||||||
private TreeMap<String, Object> treeNodeItemMap = new TreeMap<String, Object>();
|
protected TreeMap<String, Object> treeNodeItemMap = new TreeMap<String, Object>();
|
||||||
private String[] treeValues;
|
protected String[] treeValues;
|
||||||
private String[] treeDescription;
|
protected String[] treeDescription;
|
||||||
private String[] treeImages;
|
protected String[] treeImages;
|
||||||
|
|
||||||
private Label lblSearch;
|
private Label lblSearch;
|
||||||
protected AutoComplete cmbSearch;
|
protected AutoComplete cmbSearch;
|
||||||
|
|
||||||
private Tree tree;
|
protected Tree tree;
|
||||||
|
|
||||||
private String eventToFire;
|
protected String eventToFire;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private int m_windowno = 0;
|
private int m_windowno = 0;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private int m_tabno = 0;
|
private int m_tabno = 0;
|
||||||
private Treeitem selectedItem;
|
private Treeitem selectedItem;
|
||||||
|
protected Hlayout layout;
|
||||||
|
|
||||||
private static final String PREFIX_DOCUMENT_SEARCH = "/";
|
private static final String PREFIX_DOCUMENT_SEARCH = "/";
|
||||||
|
|
||||||
|
@ -128,10 +129,10 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
+ "var evt = new zk.Event(panel, 'onComboSelectEcho', [comboitem.uuid, popupheight], {toServer: true});"
|
+ "var evt = new zk.Event(panel, 'onComboSelectEcho', [comboitem.uuid, popupheight], {toServer: true});"
|
||||||
+ "zAu.send(evt);";
|
+ "zAu.send(evt);";
|
||||||
|
|
||||||
private void init()
|
protected void init()
|
||||||
{
|
{
|
||||||
Hlayout hLayout = new Hlayout();
|
layout = new Hlayout();
|
||||||
hLayout.setValign("middle");
|
layout.setValign("middle");
|
||||||
lblSearch = new Label();
|
lblSearch = new Label();
|
||||||
lblSearch.setValue(Msg.getMsg(Env.getCtx(),"TreeSearch").replaceAll("&", "") + ":");
|
lblSearch.setValue(Msg.getMsg(Env.getCtx(),"TreeSearch").replaceAll("&", "") + ":");
|
||||||
lblSearch.setTooltiptext(Msg.getMsg(Env.getCtx(),"TreeSearchText"));
|
lblSearch.setTooltiptext(Msg.getMsg(Env.getCtx(),"TreeSearchText"));
|
||||||
|
@ -164,20 +165,20 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
cmbSearch.setWidth("200px");
|
cmbSearch.setWidth("200px");
|
||||||
}
|
}
|
||||||
|
|
||||||
hLayout.appendChild(lblSearch);
|
layout.appendChild(lblSearch);
|
||||||
hLayout.appendChild(cmbSearch);
|
layout.appendChild(cmbSearch);
|
||||||
this.appendChild(hLayout);
|
this.appendChild(layout);
|
||||||
|
|
||||||
addEventListener(ON_POST_FIRE_TREE_EVENT, this);
|
addEventListener(ON_POST_FIRE_TREE_EVENT, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTreeItem(Treeitem treeItem)
|
protected void addTreeItem(Treeitem treeItem)
|
||||||
{
|
{
|
||||||
String key = getLabel(treeItem);
|
String key = getLabel(treeItem);
|
||||||
treeNodeItemMap.put(key, treeItem);
|
treeNodeItemMap.put(key, treeItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTreeItem(DefaultTreeNode<?> node) {
|
protected void addTreeItem(DefaultTreeNode<?> node) {
|
||||||
Object data = node.getData();
|
Object data = node.getData();
|
||||||
if (data instanceof MTreeNode) {
|
if (data instanceof MTreeNode) {
|
||||||
MTreeNode mNode = (MTreeNode) data;
|
MTreeNode mNode = (MTreeNode) data;
|
||||||
|
@ -250,7 +251,7 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
cmbSearch.setImages(treeImages);
|
cmbSearch.setImages(treeImages);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFolder(Treeitem treeItem) {
|
protected boolean isFolder(Treeitem treeItem) {
|
||||||
List<Component> list = treeItem.getChildren();
|
List<Component> list = treeItem.getChildren();
|
||||||
for (Component c : list) {
|
for (Component c : list) {
|
||||||
if (c instanceof Treechildren && ((Treechildren)c).getChildren().size() > 1) {
|
if (c instanceof Treechildren && ((Treechildren)c).getChildren().size() > 1) {
|
||||||
|
@ -260,7 +261,7 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getLabel(Treeitem treeItem) {
|
protected String getLabel(Treeitem treeItem) {
|
||||||
String label = treeItem.getLabel();
|
String label = treeItem.getLabel();
|
||||||
if (label == null || label.trim().length() == 0)
|
if (label == null || label.trim().length() == 0)
|
||||||
{
|
{
|
||||||
|
@ -274,7 +275,7 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getImage(Treeitem treeItem) {
|
protected String getImage(Treeitem treeItem) {
|
||||||
String image = treeItem.getImage();
|
String image = treeItem.getImage();
|
||||||
if (image == null || image.trim().length() == 0)
|
if (image == null || image.trim().length() == 0)
|
||||||
{
|
{
|
||||||
|
@ -378,7 +379,7 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onPostSelectTreeitem() {
|
protected void onPostSelectTreeitem() {
|
||||||
Clients.clearBusy();
|
Clients.clearBusy();
|
||||||
Event event = null;
|
Event event = null;
|
||||||
if (eventToFire.equals(Events.ON_CLICK))
|
if (eventToFire.equals(Events.ON_CLICK))
|
||||||
|
|
|
@ -1220,4 +1220,24 @@ tbody.z-grid-empty-body td {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.
|
.menu-search-toggle-box {
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid #ababab;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-search-toggle-box .z-toolbarbutton-over {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-search-toggle-off {
|
||||||
|
margin:0px;
|
||||||
|
padding: 1px 4px 1px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-search-toggle-on {
|
||||||
|
background: #999999;
|
||||||
|
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
|
||||||
|
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) inset;
|
||||||
|
margin:0px;
|
||||||
|
padding: 1px 4px 1px 4px;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue