Suggested case list:
Using timer to refresh a grid
383guest172.69.33.12125nk0uiMay 7, 2020 7:23:47 AMlinkuser model to move item to another listbox
120guest162.158.193.148d0n3krApr 2, 2020 5:28:28 AMlinkDisabled list item row passed to VM-1981
296fatih123160.83.36.13025nk0uiFeb 13, 2018 4:25:44 PMlinkDisabled list item row passed to VM-1981
295fatih123160.83.36.13025nk0uiFeb 13, 2018 4:25:16 PMlinkDisabled list item row passed to VM-1981
294fatih123160.83.36.13225nk0uiFeb 13, 2018 3:30:44 PMlinkgrid sample with ListModel/RowRenderer
816guest80.82.2.1312vah9ajFeb 21, 2017 11:42:21 AMlinkgrid sample with ListModel/RowRenderer
809guest175.98.113.1622vah9ajJan 26, 2017 9:19:33 AMlinkgrid sample with ListModel/RowRenderer
196guest79.185.142.402vah9ajApr 26, 2014 10:53:57 PMlinkgrid sample with ListModel/RowRenderer
195guest79.185.142.402vah9ajApr 26, 2014 10:53:54 PMlinkgrid sample with ListModel/RowRenderer
194guest79.185.142.402vah9ajApr 26, 2014 10:53:51 PMlinkgrid sample with ListModel/RowRenderer
193guest79.185.142.402vah9ajApr 26, 2014 10:53:48 PMlinkgrid sample with ListModel/RowRenderer
192guest79.185.142.402vah9ajApr 26, 2014 10:53:44 PMlinkgrid sample with ListModel/RowRenderer
191guest79.185.142.402vah9ajApr 26, 2014 10:53:40 PMlinkHierarchy table without using ZK PE/EE
1aaknai151.28.135.2131s871daJul 29, 2013 11:02:46 PMlinkgrid sample with ListModel/RowRenderer
128aaknai151.28.135.2132vah9ajJul 29, 2013 7:20:00 PMlinkuser model to move item to another listbox
1TonyQ114.25.109.94d0n3krApr 21, 2012 10:43:27 AMlinkUsing timer to refresh a grid
1TonyQ220.133.44.3725nk0uiFeb 17, 2012 3:17:34 AMlinkFire a event from child iframe
1TonyQ220.133.44.372eupjotFeb 3, 2012 5:04:52 AMlinkTextbox input restriction sample
1TonyQ72.21.245.2431b3nlr0Dec 20, 2011 10:09:10 AMlinkTest web core taglib in ZUL
1TonyQ198.203.175.175ofqkemDec 17, 2011 3:36:08 AMlinkLatest 10 Fiddles :
Object hashcode different with ZK form binding
2YannUnil172.69.108.13540rj0kApr 19, 2024 1:18:08 PMlinkObject hashcode different with ZK form binding
1YannUnil172.69.108.13040rj0kApr 19, 2024 1:04:31 PMlinkfont awesome effects
1guest172.71.166.21232nla3hApr 18, 2024 6:04:43 PMlinkfont awesome effects
245guest172.71.166.21220t2jmoApr 18, 2024 6:04:41 PMlinkZK-5696
1JamesChu162.158.187.3739iuvhmApr 18, 2024 10:33:52 AMlinkListbox colspan header version 2
3guest172.71.183.199jkpp6qApr 17, 2024 1:54:19 PMlinkZK-5695
1guest162.158.90.1402is2rctApr 17, 2024 10:23:20 AMlinkLocalDate in datebox
2guest172.70.243.516v49n7Apr 17, 2024 6:05:17 AMlinkLocalDate in datebox
1guest172.70.243.516v49n7Apr 17, 2024 6:04:18 AMlinkLocalDate in datebox
1guest172.70.243.511m6i0gcApr 17, 2024 6:04:04 AMlinkMnemonic, underline, Keystroke
1guest220.135.202.140r5v470May 27, 2013 12:39:14 PMlinkresources
index.zulzul<zk xmlns:w="client">
<style>
.z-menubar-mnemonic-active .z-menu-btn:first-letter,
.z-menubar-mnemonic-active .z-menuitem-btn:first-letter {
text-decoration: underline;
}
</style>
<div id="div" apply="pkg$.TestComposer"
hflex="1" vflex="1"
style="border: 1px solid #ccc;">
<listbox id="lbx" ctrlKeys="@a@b@z@d@h">
<listitem>
<listcell height="500px"
style="vertical-align: top;">
<menubar id="menubar" use="pkg$.KeystrokeEnhancedMenubar">
<menu label="Document">
<menupopup use="pkg$.KeystrokeEnhancedMenupopup">
<menuitem label="New" onClick="" />
<menuitem label="Open" onClick="" />
<menuitem label="Save" onClick="" />
<menuseparator />
<menuitem label="Exit" onClick="" />
</menupopup>
</menu>
<menu label="Help">
<menupopup use="pkg$.KeystrokeEnhancedMenupopup">
<menuitem label="Index" onClick="" />
<menu label="About">
<menupopup use="pkg$.KeystrokeEnhancedMenupopup">
<menuitem label="About ZK" onClick="" />
<menuitem label="About Potix" onClick="" />
</menupopup>
</menu>
</menupopup>
</menu>
<menuitem label="ZK" onClick='alert("ZK");' />
</menubar>
</listcell>
</listitem>
</listbox>
</div>
</zk>TestComposer.javajavaimport org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zul.Listbox;
@SuppressWarnings("rawtypes")
public class TestComposer extends SelectorComposer {
/**
*
*/
private static final long serialVersionUID = 5162897369552579175L;
@Wire
KeystrokeEnhancedMenubar menubar;
@Wire
Listbox lbx;
Component focusedItem;
@SuppressWarnings("unchecked")
public void doAfterCompose (Component comp) throws Exception {
super.doAfterCompose(comp);
lbx.setCtrlKeys(menubar.getCtrlKeysString());
}
@Listen ("onCtrlKey = #lbx")
public void focusMenuAccordingly (KeyEvent event) {
String mbCtrlKeys = menubar.getCtrlKeysString();
String key = Character.toString ((char) event.getKeyCode()).toLowerCase();
String ck = event.isCtrlKey()? "^"
: event.isAltKey()? "@"
: event.isShiftKey()? "$" : "";
ck += key;
if (mbCtrlKeys != null && mbCtrlKeys.contains(ck)) {
menubar.focusItem(key);
}
}
}KeystrokeEnhancedMenubar.javajavaimport java.util.HashMap;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Menu;
import org.zkoss.zul.Menubar;
import org.zkoss.zul.Menuitem;
public class KeystrokeEnhancedMenubar extends Menubar {
private static final long serialVersionUID = -8294549031526117978L;
private static HashMap<Integer, String> _ctrlKeyMap = new HashMap<Integer, String>();
private Component _focusedItem;
public KeystrokeEnhancedMenubar () {
setWidgetOverride("setMnemonicClass",
"function (v) {\n"
+" if (v)\n"
+" jq(this.$n()).addClass('z-menubar-mnemonic-active');\n"
+" else\n"
+" jq(this.$n()).removeClass('z-menubar-mnemonic-active');\n"
+" }\n"
);
}
static {
initCtrlKeyMap ();
}
public String getCtrlKeysString () {
StringBuilder sb = new StringBuilder();
for (Component c : getChildren()) {
appendCtrlKeyString(c, sb);
}
return sb.toString();
}
public void focusItem (String key) {
Component first = null;
Component next = null;
boolean foundCurrent = false;
for (Component c : getChildren()) {
String label = (c instanceof Menu)?
((Menu)c).getLabel().toLowerCase()
: ((Menuitem)c).getLabel().toLowerCase();
System.out.println(label);
if (!foundCurrent
&& c.equals(_focusedItem)) {
foundCurrent = true;
} else if (!foundCurrent
&& first == null
&& label.startsWith(key)) {
first = c;
} else if (foundCurrent
&& next == null
&& label.startsWith(key)) {
next = c;
}
}
System.out.println(first);
System.out.println(next);
_focusedItem = (next != null)? next
: (first != null)? first : _focusedItem;
System.out.println("_focusedItem is " + _focusedItem);
if (_focusedItem instanceof Menu) {
((Menu) _focusedItem).open();
} else {
System.out.println(" do focus menuitem");
Events.postEvent("onClick", _focusedItem, null);
}
}
private void appendCtrlKeyString (Component c, StringBuilder sb) {
if (c instanceof Menu) {
appendCtrlKeyString((Menu)c, sb);
} else if (c instanceof Menuitem) {
appendCtrlKeyString((Menuitem)c, sb);
}
}
private void appendCtrlKeyString (Menu m, StringBuilder sb) {
sb.append("@").append(m.getLabel().substring(0, 1).toLowerCase());
}
private void appendCtrlKeyString (Menuitem mi, StringBuilder sb) {
sb.append("@").append(mi.getLabel().substring(0, 1).toLowerCase());
}
private static void initCtrlKeyMap () {
for (int i = 65; i <= 90; i++) {
_ctrlKeyMap.put(new Integer(i), Character.toString ((char) i));
}
}
}
KeystrokeEnhancedMenupopup.javajavaimport org.zkoss.zul.Menupopup;
public class KeystrokeEnhancedMenupopup extends Menupopup {
private static final long serialVersionUID = 3011317593732259762L;
public KeystrokeEnhancedMenupopup () {
setWidgetOverride("open", "function (ref, offset, position, opts) {\n"
+" this.$open(ref, offset, position, opts);\n"
+" var parent = this.parent? this.parent.parent : null;\n"
+" if (parent && parent.$instanceof(zul.menu.Menubar))\n"
+" parent.setMnemonicClass(true);\n"
+" }\n"
);
setWidgetOverride("close", "function () {\n"
+" this.$close();\n"
+" var parent = this.parent? this.parent.parent : null;\n"
+" if (parent && parent.$instanceof(zul.menu.Menubar)) {\n"
+" var menu = this.parent;\n"
+" menu.$class._rmActive(menu);\n"
+" setTimeout(function () {\n"
+" menu.$class._rmActive(menu);\n"
+" if (!jq(parent.$n()).find('.z-menu-body-seld')[0]\n"
+" && !jq(parent.$n()).find('.z-menu-body-over')[0])\n"
+" parent.setMnemonicClass(false);\n"
+" }, 0);\n"
+" }\n"
+" }\n"
);
setWidgetOverride("doKeyDown_", "function (evt) {\n"
+" var keyCode = evt.keyCode;\n"
+" if (keyCode >= 65 && keyCode <= 90) {\n"
+" if (evt.altKey)\n"
+" this.navigateTopMenu_(keyCode);\n"
+" else\n"
+" this.navigateItem_(keyCode);\n"
+" }\n"
+" this.$doKeyDown_(evt);\n"
+" }\n"
);
setWidgetOverride("navigateTopMenu_", "function (keyCode) {\n"
+" var char = String.fromCharCode(keyCode).toLowerCase(),\n"
+" root = this._getRootMenu(this),\n"
+" previous = root._getPrevVisibleMenu(),\n"
+" next = root._getNextVisibleMenu(),\n"
+" arr = [],\n"
+" label;\n"
+" while (next) {\n"
+" label = next._label;\n"
+" if (label && label.toLowerCase().indexOf(char) == 0)\n"
+" break;\n"
+" next = next._getNextVisibleMenu();\n"
+" if (arr.indexOf(next) >= 0) {\n"
+" next = null;\n"
+" break;\n"
+" }\n"
+" arr.push(next);\n"
+" }\n"
+" if (next) {\n"
+" this._activateNextMenu(next);\n"
+" return;\n"
+" }\n"
+" while (previous) {\n"
+" label = previous._label;\n"
+" if (label && label.toLowerCase().indexOf(char) == 0)\n"
+" break;\n"
+" previous = previous._getPrevVisibleMenu();\n"
+" if (arr.indexOf(previous) >= 0) {\n"
+" previous = null;\n"
+" break;\n"
+" }\n"
+" arr.push(previous);\n"
+" }\n"
+" if (previous)\n"
+" this._activateNextMenu(previous);\n"
+" }\n"
);
setWidgetOverride("navigateItem_", "function (keyCode) {\n"
+" var char = String.fromCharCode(keyCode).toLowerCase(),\n"
+" focused = this._currentChild(),\n"
+" tmp = this.firstChild,\n"
+" label,\n"
+" idx = -1,\n"
+" fidx,\n"
+" cidx,\n"
+" nidx,\n"
+" foundFocused,\n"
+" first,\n"
+" next;\n"
+" while(tmp) {\n"
+" if (tmp.isVisible() && (tmp.$instanceof(zul.menu.Menu) || (tmp.$instanceof(zul.menu.Menuitem) && !tmp.isDisabled())))\n"
+" idx++;\n"
+" label = tmp._label;\n"
+" if (!label) {\n"
+" tmp = tmp.nextSibling;\n"
+" continue;\n"
+" }\n"
+" if (!foundFocused && tmp == focused) {\n"
+" foundFocused = true;\n"
+" cidx = idx;\n"
+" } else if (!foundFocused && !first && label && label.toLowerCase().indexOf(char) == 0) {\n"
+" first = tmp;\n"
+" fidx = idx;\n"
+" } else if (foundFocused && !next && label && label.toLowerCase().indexOf(char) == 0) {\n"
+" next = tmp;\n"
+" nidx = idx;\n"
+" }\n"
+" tmp = tmp.nextSibling;\n"
+" }\n"
+" if (focused)\n"
+" focused.$class._rmActive(focused);\n"
+" this._curIndex = next? nidx : first? fidx : cidx;\n"
+" focused = next? next : first? first : focused;\n"
+" if (focused)\n"
+" focused.$class._addActive(focused);\n"
+" if (focused && focused.$instanceof(zul.menu.Menu))\n"
+" this._toggleMenu(focused);\n"
+" }\n"
);
setWidgetOverride("_currentChild", "function () {\n"
+" var index = this._curIndex;\n"
+" if (index >= 0)\n"
+" for (var w = this.firstChild, k = 0; w; w = w.nextSibling)\n"
+" if ((w.isVisible() && (w.$instanceof(zul.menu.Menu) || (w.$instanceof(zul.menu.Menuitem) && !w.isDisabled())))\n"
+" && k++ == index)\n"
+" return w;\n"
+" }\n"
);
setWidgetOverride("_toggleMenu", "function (w) {\n"
+" var pp;\n"
+" if ((pp = w.menupopup)) {\n"
+" if (pp.isOpen())\n"
+" pp.close();\n"
+" else\n"
+" pp.open();\n"
+" } else if ((pp = w._contentHandler)) {\n"
+" if (pp.isOpen())\n"
+" pp.onHide();\n"
+" else\n"
+" pp.onShow();\n"
+" }\n"
+" }\n"
);
setWidgetOverride("_getRootMenu", "function (wgt) {\n"
+" for (var w = wgt; w && (w = this._getMenu(w)); w = w.parent) {\n"
+" if (w.isTopmost())\n"
+" return w;\n"
+" }\n"
+" return null;\n"
+" }\n"
);
setWidgetOverride("_getMenu", "function (wgt) {\n"
+" var p = wgt.parent;\n"
+" return p.$instanceof(zul.menu.Menu) ? p: null;\n"
+" }\n"
);
setWidgetOverride("_activateNextMenu", "function (menu) {\n"
+" var pp = menu.menupopup;\n"
+" if (pp) {\n"
+" pp._shallClose = false;\n"
+" if (!pp.isOpen()) pp.open();\n"
+" }\n"
+" menu.$class._addActive(menu);\n"
+" zWatch.fire('onFloatUp', menu); //notify all\n"
+" }\n"
);
}
}