Feature Requests item #1423268, was opened at 2006-02-03 11:54
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=684978&aid=1423268&group_id=119783

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Priority: 5
Submitted By: Juergen Donnerstag (jdonnerstag)
Assigned to: Nobody/Anonymous (nobody)
Summary: externaize javascript strings + some more ideas

Initial Comment:
Some ideas from Gavin: 

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","dat
eProp":{"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


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=684978&aid=1423268&group_id=119783


-------------------------------------------------------
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

Reply via email to