/* MainLayoutComposer.java {{IS_NOTE Purpose: Description: History: Nov 12, 2008 3:10:06 PM , Created by jumperchen }}IS_NOTE Copyright (C) 2008 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under GPL Version 3.0 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.zksandbox; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.zkoss.util.logging.Log; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.ComponentNotFoundException; import org.zkoss.zk.ui.Execution; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.BookmarkEvent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.ForwardEvent; import org.zkoss.zk.ui.event.InputEvent; import org.zkoss.zk.ui.event.KeyEvent; import org.zkoss.zk.ui.event.SelectEvent; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Div; import org.zkoss.zul.Include; import org.zkoss.zul.ListModel; import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Textbox; /** * @author jumperchen * */ public class MainLayoutComposer extends GenericForwardComposer implements MainLayoutAPI { private static final Log log = Log.lookup(MainLayoutComposer.class); Textbox searchBox; Listbox itemList; Include xcontents; Div header; Button _selected; public MainLayoutComposer() { initKey(); } private Map getCategoryMap() { return DemoWebAppInit.getCateMap(); } private void initKey() { // We have to decide the key of Google Maps since we have a demo using // it. // This key is used by zksandbox/index.zul to generate a proper // script final Execution exec = Executions.getCurrent(); final String sn = exec.getServerName(); final int sp = exec.getServerPort(); // To add more keys: http://www.google.com/apis/maps/signup.html String gkey = null; if (sn.indexOf("www.potix.com") >= 0) { // http://www.potix.com/ gkey = "ABQIAAAAmGxmYR57XDAbAumS9tV5fxRYCo_4ZGj_-54kHesWSk0nMkbs4xTpq0zo9O75_ZqvsSLGY2YkC7jjNg"; } else if (sn.indexOf("www.zkoss.org") >= 0) { // http://www.zkoss.org/ gkey = "ABQIAAAAmGxmYR57XDAbAumS9tV5fxQXyylOlR69a1vFTcUcpV6DXdesOBSMEHfkewcSzwEwBT7UzVx8ep8vjA"; } else if (sn.indexOf("zkoss.org") >= 0) { // http://www.zkoss.org/ gkey = "ABQIAAAAakIm31AXAvNGFHV8i1Tx8RSF4KLGEmvBsS1z1zAsQZvbQceuNRQBsm65qGaXpTWjZsc2bl-hm2Vyfw"; } else if (sn.indexOf("zktest") >= 0) { //zktest gkey="ABQIAAAAWaNkzbzygbuWnmqS4YCEZhTOLZK1h7IfBeBWqZtjq6JJy913gBRHY1uafo5XzZVSyXXksjv_jHoUsA"; } else if (sn.indexOf("zktest2") >= 0) { //zktest2 gkey="ABQIAAAAWaNkzbzygbuWnmqS4YCEZhTWO6y1eecluAZvbpmC7meqCt-saxSETUOirx46xfUyu-Z-mqLCi4vo9A"; }else if (sn.indexOf("localhost") >= 0) { // localhost if (sp == 80) // http://localhost/ gkey = "ABQIAAAAmGxmYR57XDAbAumS9tV5fxT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRUITTZ-rzsyEVih16Hn3ApyUpSkA"; else if (sp == 8080) // http://localhost:8080 gkey = "ABQIAAAAmGxmYR57XDAbAumS9tV5fxTwM0brOpm-All5BF6PoaKBxRWWERSynObNOWSyMNmLGAMZAO1WkDUubA"; else if (sp == 7799) gkey = "ABQIAAAAmGxmYR57XDAbAumS9tV5fxTT6-Op-9nAQgn7qnDG0QjE8aldaBRU1BQK2ADNWCt1BR2yg4ghOM6YIA"; } if (gkey != null) exec.getDesktop().getSession().setAttribute("gmapsKey", gkey); } public void onCategorySelect(ForwardEvent event) { Button btn = (Button) event.getOrigin().getTarget(); Listitem item = null; if (_selected != btn) { _selected = btn; } else { item = itemList.getSelectedItem(); } String href = getCategory(_selected.getId()).getHref(); if (href != null) { Executions.getCurrent().sendRedirect(href); } else { itemList.setModel(getSelectedModel()); if (item != null) { itemList.renderAll(); ((Listitem)itemList.getFellow(item.getId())).setSelected(true); } } } public void onBookmarkChange$main(BookmarkEvent event) { String id = event.getBookmark(); if (id.length() > 0) { final DemoItem[] items = getItems(); for (int i = 0; i < items.length; i++) { if (items[i].getId().equals(id)) { _selected = (Button)self.getFellow(items[i].getCateId()); itemList.setModel(getSelectedModel()); itemList.renderAll(); Listitem item = ((Listitem)itemList.getFellow(id)); item.setSelected(true); itemList.invalidate(); setSelectedCategory(item); xcontents.setSrc(((DemoItem) item.getValue()).getFile()); item.focus(); return; } } } } public void onSelect$itemList(SelectEvent event) { Listitem item = itemList.getSelectedItem(); if (item != null) { // sometimes the item is unloaded. if (!item.isLoaded()) { itemList.renderItem(item); } setSelectedCategory(item); xcontents.setSrc(((DemoItem) item.getValue()).getFile()); } } public void onMainCreate(Event event) { final Execution exec = Executions.getCurrent(); final String id = exec.getParameter("id"); Listitem item = null; if (id != null) { try { final LinkedList list = new LinkedList(); final DemoItem[] items = getItems(); for (int i = 0; i < items.length; i++) { if (items[i].getId().equals(id)) list.add(items[i]); } if (!list.isEmpty()) { itemList.setModel(new ListModelList(list)); itemList.renderAll(); item = (Listitem) self.getFellow(id); setSelectedCategory(item); } } catch (ComponentNotFoundException ex) { // ignore } } if (item == null) { item = (Listitem) self.getFellow("f1"); setSelectedCategory(item); } xcontents.setSrc(((DemoItem) item.getValue()).getFile()); itemList.selectItem(item); } private void setSelectedCategory(Listitem item) { DemoItem di = (DemoItem) item.getValue(); _selected = (Button) self.getFellow(di.getCateId()); String deselect = _selected != null ? "jq('#"+ _selected.getUuid() + "').addClass('demo-seld').siblings().removeClass('demo-seld');" : ""; Clients.evalJavaScript(deselect); item.getDesktop().setBookmark(item.getId()); } public void onCtrlKey$searchBox(KeyEvent event) { int keyCode = event.getKeyCode(); List items = itemList.getItems(); if (items.isEmpty()) return; Listitem item = null; switch (keyCode) { case 38: // UP item = itemList.getItemAtIndex(items.size() -1); itemList.setSelectedItem(item); break; case 40: // DOWN item = itemList.getItemAtIndex(0); itemList.setSelectedItem(item); break; } if (item != null) { if (!item.isLoaded()) itemList.renderItem(item); setSelectedCategory(item); xcontents.setSrc(((DemoItem) item.getValue()).getFile()); item.focus(); } } public void onChanging$searchBox(InputEvent event) { String key = event.getValue(); LinkedList item = new LinkedList(); DemoItem[] items = getItems(); if (key.trim().length() != 0) { for (int i = 0; i < items.length; i++) { if (items[i].getLabel().toLowerCase() .indexOf(key.toLowerCase()) != -1) item.add(items[i]); } itemList.setModel(new ListModelList(item)); } else itemList.setModel(new ListModelList(items)); _selected = null; } private DemoItem[] getItems() { LinkedList items = new LinkedList(); Category[] categories = getCategories(); for (int i = 0; i < categories.length; i++) { items.addAll(categories[i].getItems()); } return (DemoItem[]) items.toArray(new DemoItem[] {}); } public Category[] getCategories() { return (Category[]) getCategoryMap().values() .toArray(new Category[] {}); } public ListitemRenderer getItemRenderer() { return _defRend; } private static final ListitemRenderer _defRend = new ItemRender(); private static class ItemRender implements ListitemRenderer, java.io.Serializable { public void render(Listitem item, Object data) { DemoItem di = (DemoItem) data; Listcell lc = new Listcell(); item.setValue(di); lc.setHeight("30px"); lc.setImage(di.getIcon()); item.setId(di.getId()); lc.setLabel(di.getLabel()); lc.setParent(item); } }; private Category getCategory(String cateId) { return (Category) getCategoryMap().get(cateId); } public ListModel getSelectedModel() { Category cate = _selected == null ? getCategories()[0] : getCategory(_selected.getId()); return new ListModelList(cate.getItems()); } // Composer Implementation public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); Events.postEvent("onMainCreate", comp, null); } }