client.registerRenderer(this,"datefield","calendar",this.renderDateFieldCalendar);\r
client.registerRenderer(this,"select",null,this.renderSelect);\r
client.registerRenderer(this,"select","optiongroup",this.renderSelectOptionGroup);\r
+ client.registerRenderer(this,"select","twincol",this.renderSelectTwincol);\r
client.registerRenderer(this,"upload",null,this.renderUpload);\r
client.registerRenderer(this,"embedded",null,this.renderEmbedded);\r
\r
// Selected options\r
if (options != null && options.length >0) {\r
for (var i=0; i<options.length;i++) {\r
- var optionNode = theme.createElementTo(select,"option");\r
- optionNode.setAttribute("value", options[i].getAttribute("key")); \r
+ var optionNode = new Option(\r
+ options[i].getAttribute("caption"),\r
+ options[i].getAttribute("key")\r
+ );\r
+ select.options[select.options.length] = optionNode;\r
if (options[i].getAttribute("selected") == "true") {\r
- optionNode.selected="true"; \r
+ optionNode.selected = true;\r
+ // IE bug workaraund to preserve selection in multiselect\r
+ if(document.all) {\r
+ window.scrollBy(0,0);\r
+ }\r
}\r
- theme.createTextNodeTo(optionNode,options[i].getAttribute("caption"));\r
}\r
}\r
\r
}\r
}\r
\r
+DefaultTheme.prototype.renderSelectTwincol = function(renderer,uidl,target,layoutInfo) {\r
+ function deleteOptionFromSelectByOptionValue(select, value) {\r
+ for(var i = 0; i < select.options.length; i++) {\r
+ if(select.options[i].value == value) {\r
+ select.options[i] = null;\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ function setSelectedOfOptionFromSelectByOptionValue(select, value, sel) {\r
+ for(var i = 0; i < select.options.length; i++) {\r
+ if(select.options[i].value == value) {\r
+ select.options[i].selected = sel;\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ var theme = renderer.theme;\r
+ var client = renderer.client;\r
+ \r
+ // Create containing element\r
+ var div = renderer.theme.createPaintableElement(renderer,uidl,target,layoutInfo); \r
+ if (uidl.getAttribute("invisible")) return; // Don't render content if invisible\r
+\r
+ // Create selection variable\r
+ var selectMode = uidl.getAttribute("selectmode");\r
+ var selectable = selectMode == "multi" || selectMode == "single";\r
+ var immediate = ("true" == uidl.getAttribute("immediate"));\r
+ var disabled = ("true" == uidl.getAttribute("disabled"));\r
+ var readonly = ("true" == uidl.getAttribute("readonly"));\r
+ var newitem = ("true" == uidl.getAttribute("allownewitem"));\r
+ var focusid = uidl.getAttribute("focusid");\r
+ var tabindex = uidl.getAttribute("tabindex");\r
+ \r
+ var selectionVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"array","selected"));\r
+\r
+ // Render default header\r
+ theme.renderDefaultComponentHeader(renderer,uidl,div,layoutInfo);\r
+\r
+ if (newitem) {\r
+ theme.createElementTo(div,"br");\r
+ }\r
+ // create two selects\r
+ var unselected = theme.createElementTo(div,"select");\r
+ unselected.setAttribute("multiple","true");\r
+ unselected.className = "unselected";\r
+ var selected = theme.createElementTo(div,"select");\r
+ selected.setAttribute("multiple","true");\r
+ selected.className = "selected";\r
+ // buttons to move selections\r
+ var buttonsDiv = theme.createElementTo(div,"div");\r
+ buttonsDiv.className = "buttons";\r
+\r
+ //set focus and tabindex to unselected select \r
+ if (focusid) unselected.focusid = focusid;\r
+ if (tabindex) unselected.tabIndex = tabindex;\r
+\r
+ var options = theme.getFirstElement(uidl,"options");\r
+ if (options != null) {\r
+ options = options.getElementsByTagName("so");\r
+ unselected.size = (options.length>7?7:options.length);\r
+ selected.size = (options.length>7?7:options.length);\r
+ }\r
+ \r
+ // Select options\r
+ if (options != null && options.length >0) {\r
+ for (var i=0; i<options.length;i++) {\r
+ var modelOptionNode;\r
+ if (options[i].getAttribute("selected") == "true") {\r
+ modelOptionNode = theme.createElementTo(selected,"option");\r
+ } else {\r
+ modelOptionNode = theme.createElementTo(unselected,"option");\r
+ }\r
+ theme.createTextNodeTo(modelOptionNode,options[i].getAttribute("caption"));\r
+ modelOptionNode.setAttribute("value", options[i].getAttribute("key"));\r
+ }\r
+ }\r
+ \r
+ if (newitem) {\r
+ var input = theme.createInputElementTo(div,"text");\r
+ var button = theme.createElementTo(div,"button");\r
+ theme.createTextNodeTo(button,"+");\r
+ var newitemVariable = theme.createVariableElementTo(div,theme.getVariableElement(uidl,"string","newitem"));\r
+ theme.addSetVarListener(theme,client,input,"change",newitemVariable,input,true);\r
+ }\r
+ var moveRightButton = theme.createElementTo(buttonsDiv, "button");\r
+ moveRightButton.innerHTML = ">>";\r
+ moveRightButton.onclick = function() {\r
+ // loop all selected options unselected-list\r
+ while(unselected.selectedIndex > -1) {\r
+ var option = unselected.options[unselected.selectedIndex];\r
+ //add selected options to end of selected-list\r
+ selected.options[selected.options.length] = \r
+ new Option(\r
+ option.text,\r
+ option.value \r
+ );\r
+ // remove from unselected-list\r
+ deleteOptionFromSelectByOptionValue(unselected,option.value)\r
+ }\r
+ if(selectMode != "multi") {\r
+ // in single select mode, ensure only one option on right side\r
+ // not ment for single select mode, just to be more compatible\r
+ while(selected.options.length > 1) {\r
+ var optionToLeft = selected.options[0];\r
+ unselected.options[unselected.options.length] = \r
+ new Option(\r
+ optionToLeft.text,\r
+ optionToLeft.value \r
+ );\r
+ selected.options[0] = null;\r
+ // remove from selected-list\r
+ deleteOptionFromSelectByOptionValue(selected,optionToLeft.value)\r
+ }\r
+ } // end checking for single variable\r
+ // fire variable change\r
+ var s = new Array();\r
+ for (var i = 0; i < selected.options.length; i++) {\r
+ s[s.length] = selected.options[i].value;\r
+ }\r
+ var value = s.join(','); \r
+ theme.setVariable(client,selectionVariable,value,immediate);\r
+ }\r
+ var moveLeftButton = theme.createElementTo(buttonsDiv, "button");\r
+ moveLeftButton.innerHTML = "<<";\r
+ moveLeftButton.onclick = function() {\r
+ // loop all selected options selected-list\r
+ while(selected.selectedIndex > -1) {\r
+ var option = selected.options[selected.selectedIndex];\r
+ //add selected options to end of selected-list\r
+ unselected.options[unselected.options.length] = \r
+ new Option(\r
+ option.text,\r
+ option.value \r
+ );\r
+ // remove from unselected-list\r
+ deleteOptionFromSelectByOptionValue(selected,option.value)\r
+ }\r
+ // fire variable change\r
+ var s = new Array();\r
+ for (var i = 0; i < selected.options.length; i++) {\r
+ s[s.length] = selected.options[i].value;\r
+ }\r
+ var value = s.join(','); \r
+ theme.setVariable(client,selectionVariable,value,immediate);\r
+ }\r
+ if (disabled||readonly) {\r
+ selected.disabled = "true";\r
+ unselected.disabled = "true";\r
+ moveLeftButton.disabled = "true";\r
+ moveRightButton.disabled = "true";\r
+ }\r
+ \r
+}\r
\r
DefaultTheme.prototype.renderSelectOptionGroup = function(renderer,uidl,target,layoutInfo) {\r
// TODO: \r