From: <sim...@us...> - 2007-05-22 22:49:27
|
Revision: 309 http://svn.sourceforge.net/zkforge/?rev=309&view=rev Author: simon_massey Date: 2007-05-22 15:49:29 -0700 (Tue, 22 May 2007) Log Message: ----------- refactoring menu item grid rendering code. Modified Paths: -------------- trunk/foodToGo/src/main/webapp/zul/add-menu-item.zul trunk/foodToGo/src/main/webapp/zul/index.zul Added Paths: ----------- trunk/foodToGo/src/main/webapp/zul/menu-item.zul Removed Paths: ------------- trunk/foodToGo/src/main/webapp/zul/menu-items.zul Modified: trunk/foodToGo/src/main/webapp/zul/add-menu-item.zul =================================================================== --- trunk/foodToGo/src/main/webapp/zul/add-menu-item.zul 2007-05-22 01:35:05 UTC (rev 308) +++ trunk/foodToGo/src/main/webapp/zul/add-menu-item.zul 2007-05-22 22:49:29 UTC (rev 309) @@ -1,54 +1,36 @@ <!-- -ZK Food To Go :: A realistic example of using ZK with POJOs, Spring and Hibernate. -Copyright (C) 2006 Simon Massey - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ---> -<window id="win" title="Add Menu Item" border="normal" width="200px" closable="true"> -<zscript> -<![CDATA[ -doAdd(String name, java.math.BigDecimal price){ + ZK Food To Go :: A realistic example of using ZK with POJOs, Spring and Hibernate. + Copyright (C) 2006 Simon Massey - if( name != "" && price != null ) { - // locate the save button on the main page where the restaurant is stored - saveRestaurantButton = Path.getComponent("//main-page/main-window/saveRestaurantButton"); - restaurant = saveRestaurantButton.getAttribute("restaurant", Component.DESKTOP_SCOPE); - - // create the new menu item and add it to the restaurant - menuItem = new net.chrisrichardson.foodToGo.domain.MenuItem(); - menuItem.price = price.doubleValue(); - menuItem.name = name; - restaurant.menuItems.add(menuItem); - - // reload the include that renders the menu items. use a timestamp to skip the page cache - menuItemInclude = Path.getComponent("//main-page/main-window/menuItemInclude"); - menuItemInclude.setSrc("./menu-items.zul?restaurantId="+(new java.util.Date()).getTime()); - - win.detach(); - } -} -]]> -</zscript> + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +--> +<window id="win" title="Add Menu Item" border="normal" width="200px" + closable="true"> <vbox> - <label id="nameLabel" value="Name:"/><textbox id="name" value="" constraint="no empty"/> - <label id="priceLabel" value="Price:"/><decimalbox id="price" format="#,##0.##" constraint="no zero, no empty"/></vbox> + <label id="nameLabel" value="Name:" /> + <textbox id="name" value="" constraint="no empty" /> + <label id="priceLabel" value="Price:" /> + <decimalbox id="price" format="#,##0.##" + constraint="no zero, no empty" /> + </vbox> <button label="Add"> - <attribute name="onClick"><![CDATA[ - // if they type in the name then click on the add then the validator - // for price does not fire so give a hint that the input field is - // not valid + <custom-attributes restaurant="${arg.restaurant}" /> + <attribute name="onClick"> + <![CDATA[ + // if the user types in the name then clicks on "add" then the validator + // for price does not fire so give a hint that the input field is not valid if( !price.isValid() ) { priceLabel.style = "color: red"; } else { @@ -56,9 +38,20 @@ } if( name.isValid() && price.isValid() ) { - doAdd(name.value,price.value); + if( name != "" && price != null ) { + restaurant = componentScope.get("restaurant"); + + // create the new menu item and add it to the restaurant + menuItem = new net.chrisrichardson.foodToGo.domain.MenuItem(); + menuItem.price = price.value.doubleValue(); + menuItem.name = name.value; + restaurant.menuItems.add(menuItem); + + win.detach(); + } } - ]]></attribute> + ]]> + </attribute> </button> - <button label="Cancel" onClick="win.detach()"/> + <button label="Cancel" onClick="win.detach()" /> </window> \ No newline at end of file Modified: trunk/foodToGo/src/main/webapp/zul/index.zul =================================================================== --- trunk/foodToGo/src/main/webapp/zul/index.zul 2007-05-22 01:35:05 UTC (rev 308) +++ trunk/foodToGo/src/main/webapp/zul/index.zul 2007-05-22 22:49:29 UTC (rev 309) @@ -46,13 +46,12 @@ <![CDATA[ // selectedRestaurant.id calls getId() on this sparcely loaded Restaurant POJO restaurant = restaurantFacadeSpringBean.loadRestaurant(""+selectedRestaurant.id).getRestaurant(); - // cache the loaded POJO on an attribute of the save button for use later - saveRestaurantButton.setAttribute("restaurant", restaurant, Component.DESKTOP_SCOPE); - // force the included menu item include panel to be rerendered. the timestamp bypasses caching - // TODO this is ugly and we should find a better way - now = (new java.util.Date()).getTime(); - menuItemInclude.setSrc("./menu-items.zul?now="+now); + // cache the loaded POJO on an attribute of the page for use later + spaceScope.put("restaurant", restaurant); + + // get the list of menu item pojos from our fully loaded restaurant POJO + rebuildMenuGrid(restaurant); ]]> </attribute> </listbox> @@ -83,17 +82,54 @@ type="restaurant.type;save-when:self.onTypeChange;access:both"/> <restaurant/> </groupbox> - <include id="menuItemInclude" src=""/> + <groupbox width="500px"> + <caption label="Menu Items" /> + <grid> + <zscript> + rebuildMenuGrid(restaurant){ + // clear the current menu item grid rows + menuItemRows.children.clear(); + + menuItems = restaurant.menuItems; + + index = 0; + + // create the new menu item grid elements. this is sort of like the innerHTML DOM trick + for( Iterator i = menuItems.iterator(); i.hasNext(); ){ + menuItem = i.next(); + spaceScope.put("index", index); + spaceScope.put("name", menuItem.name); + spaceScope.put("price", menuItem.price); + Executions.createComponents("menu-item.zul", menuItemRows, spaceScope); + index++; + } + } + </zscript> + <rows id="menuItemRows"/> + </grid> + </groupbox> <hbox> + <button id="newRestaurantButton" label="New"> + <attribute name="onClick"> + <!-- Here we launch the new restaurant model dialogue --> + <![CDATA[ + Window win = (Window) Executions.createComponents( + "add-restaurant.zul", null, null); + win.doModal(); + ]]> + </attribute> + </button> <button label="Add Menu Item"> <attribute name="onClick"> <!-- Here we launch the add menu item dialogue --> <![CDATA[ - restaurant = saveRestaurantButton.getAttribute("restaurant", Component.DESKTOP_SCOPE); + restaurant = spaceScope.get("restaurant"); if( null != restaurant ) { Window win = (Window) Executions.createComponents( - "add-menu-item.zul", null, null); + "add-menu-item.zul", null, spaceScope); win.doModal(); + + rebuildMenuGrid(restaurant); } else { alert("Please select a restaurant."); } @@ -104,7 +140,7 @@ <attribute name="onClick"> <!-- Here we save the POJO cached on the save button --> <![CDATA[ - restaurant = self.getAttribute("restaurant", Component.DESKTOP_SCOPE); + restaurant = spaceScope.get("restaurant"); if( null != restaurant ) { restaurantFacadeSpringBean.saveRestaurant(restaurant); Events.sendEvent(reload,event); @@ -112,16 +148,6 @@ ]]> </attribute> </button> - <button id="newRestaurantButton" label="New"> - <attribute name="onClick"> - <!-- Here we launch the new restaurant model dialogue --> - <![CDATA[ - Window win = (Window) Executions.createComponents( - "add-restaurant.zul", null, null); - win.doModal(); - ]]> - </attribute> - </button> </hbox> </vbox> </hbox> Added: trunk/foodToGo/src/main/webapp/zul/menu-item.zul =================================================================== --- trunk/foodToGo/src/main/webapp/zul/menu-item.zul (rev 0) +++ trunk/foodToGo/src/main/webapp/zul/menu-item.zul 2007-05-22 22:49:29 UTC (rev 309) @@ -0,0 +1,42 @@ +<!-- + ZK Food To Go :: A realistic example of using ZK with POJOs, Spring and Hibernate. + Copyright (C) 2007 Simon Massey + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +--> +<row> + <label value="${arg.name}" /> + <hbox> + $ + <textbox value="${arg.price}" /> + </hbox> + <button label="X"> + <custom-attributes index="${arg.index}" /> + <custom-attributes restaurant="${arg.restaurant}" /> + <attribute name="onClick"> + <![CDATA[ + restaurant = componentScope.get("restaurant"); + + menuItems = restaurant.getMenuItems(); + + Integer index = componentScope.get("index"); + + menuItems.remove(index.intValue()); + + self.parent.setParent(null); + ]]> + </attribute> + </button> +</row> \ No newline at end of file Deleted: trunk/foodToGo/src/main/webapp/zul/menu-items.zul =================================================================== --- trunk/foodToGo/src/main/webapp/zul/menu-items.zul 2007-05-22 01:35:05 UTC (rev 308) +++ trunk/foodToGo/src/main/webapp/zul/menu-items.zul 2007-05-22 22:49:29 UTC (rev 309) @@ -1,85 +0,0 @@ -<!-- -ZK Food To Go :: A realistic example of using ZK with POJOs, Spring and Hibernate. -Copyright (C) 2006 Simon Massey - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ---> -<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?> -<window id="main"> - <zscript> - void deleteMenuItem(menuItemPk){ - menuItems = restaurant.getMenuItems(); - index = 0; - for( i = menuItems.iterator(); i.hasNext(); ) { - menuItem = i.next(); - if( menuItem.getId() == menuItemPk ) { - break; - } - index++; - } - menuItems.remove(index); - myRows.removeChild(myRows.getChildren().get(index)); - } - </zscript> - <groupbox width="500px"> - <caption label="Menu Items" /> - <grid> - <attribute name="onCreate"> - <![CDATA[ - // locate the save button on the main page where the restaurant is stored - saveRestaurantButton = Path.getComponent("//main-page/main-window/saveRestaurantButton"); - restaurant = saveRestaurantButton.getAttribute("restaurant", Component.DESKTOP_SCOPE); - - // now programmatically build up the menu item table - for( i = restaurant.getMenuItems().iterator(); i.hasNext(); ){ - menuItem = i.next(); - priceB = new java.math.BigDecimal(menuItem.getPrice()); - Label label = new Label(); - label.setValue(menuItem.name); - textbox = new Textbox(); - numberFormat = java.text.NumberFormat.getCurrencyInstance(Locale.US); - doublePayment = priceB.doubleValue(); - formattedPrice = numberFormat.format(doublePayment); - textbox.setValue(formattedPrice); - Hbox hbox = new Hbox(); - hbox.appendChild(textbox); - deleteButton = new Button("X"); - deleteButton.setAttribute("menuItemId", menuItem.id); - cond = new org.zkoss.zk.ui.util.Condition(){ - boolean isEffective(Component comp) {return true;} - boolean isEffective(Page page){return true;} - }; - zscript = new org.zkoss.zk.ui.metainfo.ZScript("java", "deleteMenuItem(self.getAttribute(\"menuItemId\"));", cond); - eventHandler = new org.zkoss.zk.ui.metainfo.EventHandler( zscript, cond); - deleteButton.addEventHandler("onClick", eventHandler); - hbox.appendChild(deleteButton); - Row row = new Row(); - row.appendChild(label); - row.appendChild(hbox); - myRows.appendChild(row); - } - ]]> - </attribute> - <columns> - <!-- TODO Impliment the sort --> - <column label="Item Name" sortAscending="${asc}" - sortDescending="${dsc}" /> - <column label="Item Price" /> - </columns> - <rows id="myRows" /> - </grid> - </groupbox> - -</window> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |