I have been playing with Wicket and had a few ideas for improvements. 1) Introduce JSON. This converts java objects (models, maps, etc) into javascript objects. This is a much easier way of initialising javascript (ajax) components. All this code exists in open source already (see Java JSON-RPC)
For example List list = new ArrayList(); list.add("string"); list.add(new Integer(100)); list.add(new Double(100)); list.add(new Date()); Map firstMap = new LinkedHashMap(); firstMap.put("stringProp", "string"); firstMap.put("intProp", new Integer(100)); firstMap.put("doubleProp", new Double(100)); firstMap.put("dateProp", new Date()); firstMap.put("booleanProp", Boolean.TRUE); firstMap.put("beanProp", new Bean()); firstMap.put("trickyStringProp", "_\"_'_\t_\n_\\_"); firstMap.put("listProp", list); String jsonString = ser.toJSONString(firstMap); Creates.... {"javaClass":"java.util.LinkedHashMap","map":{"doubleProp":100,"trickyString Prop":"_\"_'_\t_\n_\\_","listProp":{"list":["string",100,100,{"javaClass":"j ava.util.Date","time":1.138678457762e12}],"javaClass":"java.util.ArrayList"} ,"intProp":100,"stringProp":"string","beanProp":{"doubleProp":100,"javaClass ":"proj.Bean","intProp":100,"stringProp":"string","dateProp":{"javaClass":"j ava.util.Date","time":1.138678457762e12}},"booleanProp":true,"dateProp":{"ja vaClass":"java.util.Date","time":1.138678457762e12}}}; which can then be inserted into the html page and used by the javascript code. It can even be sent back via XmlHttpRequest (to enable easy roundtripping of models) and converted back in java objects. 2) Introducing XmlResourceBundles (as seen in Java V6). This would work very well with the Template Engine suggested in point 3. We could then move all the javascript / html stuff out of java and remove all the escaping and line wrapping. It is very easy to implement (just extend the PropertiesFactory to load from an xml file). No more...(from ImmediateTextField.java) StringBuffer s = new StringBuffer( "\t<script language=\"JavaScript\" type=\"text/javascript\">\n").append( "\tfunction immediateCheckBox(componentUrl, componentPath, val) { \n").append( "\t\tdojo.io.bind({\n").append( "\t\t\turl: componentUrl + '&' + componentPath + '=' + val,\n").append( "\t\t\tmimetype: \"text/plain\",\n").append( "\t\t\tload: function(type, data, evt) {}\n" + "\t\t});\n" + "\t}\n").append( "\t</script>\n"); just getProperty("immediateCheckBox"); 3) Introduce a template engine to remove the big (and very ugly) strings Although we can do this outside the core, having a standard template solution makes the framework more accessible and standardise the components. Template engines (Freemarker, velocity, etc) contruct strings with ease. It also means you can change strings (if you have watch and reload xml property files) without recompiling. For example..(for FXOnClickHighlighter) Map context = new HashMap(); context.put("component", this); String TemplateEngine.render("highlighterIn.ftl",context); String TemplateEngine.render("highlighterOut.ftl",context); or with XmlPropertyFiles.... String TemplateEngine.render(getProperty("highlighterIn"),context); String TemplateEngine.render(getProperty("highlighterOut"),context); could replace: // String to be written to the header String s; // dojo function calls for highlight/unhighlight String highlightInFunction; String highlightOutFunction; // set the correct dojo functions for the type of highlighter if (type == "c2c") { highlightInFunction = "dojo.fx.html.colorFade(node, " + startColor.toString() + "," + endColor.toString() + ", duration, function(){" + componentId + "_highlighterState='highlighted';});"; highlightOutFunction = "dojo.fx.html.colorFade(node, " + endColor.toString() + "," + startColor.toString() + ", duration, function(){" + componentId + "_highlighterState='unhighlighted';});"; } else { highlightInFunction = "dojo.fx.html.colorFadeOut(node, " + endColor.toString() + ", duration ,0,function(){" + componentId + "_highlighterState='highlighted';});"; highlightOutFunction = "dojo.fx.html.colorFadeOut(node, startbc, duration ,0,function(){" + componentId + "_highlighterState='unhighlighted';});"; } s = "\t<script language=\"JavaScript\" type=\"text/javascript\">\n" + "\t" + componentId + "_highlighterState = 'unhighlighted'; \n" + "\t" + componentId + "_first = false; \n" + "\tfunction " + componentId + "_highlight(id, duration) { \n" + "\t\tif(" + componentId + "_highlighterState!='highlighting'){\n" + "\t\t\tnode = document.getElementById(id);\n" + "\t\t\tif(!" + componentId + "_first){\n" + "\t\t\t" + componentId + "_first = true; \n" + "\t\t\t\tstartbc = dojo.html.getBackgroundColor(node);\n" + "\t\t\t}\n" + "\t\t\tif(" + componentId + "_highlighterState == 'unhighlighted') \n" + "\t\t\t{ \n" + "\t\t\t\t" + componentId + "_highlighterState = 'highlighting';\n" + "\t\t\t\t" + highlightInFunction + "\n" + "\t\t\t} else {\n" + "\t\t\t\t" + componentId + "_highlighterState = 'highlighting';\n" + "\t\t\t\t" + highlightOutFunction + "\n" + "\t\t\t}\n" + "\t\t}\n" + "\t}\n" + "\t</script>\n"; Cheers PS: Great framework!! ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ Wicket-develop mailing list Wicket-develop@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wicket-develop