/* * Copyright (c) 2011-2014 Fernando Petrola * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.dragome.render.html.renderers; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.w3c.dom.Element; import com.dragome.commons.javascript.ScriptHelper; import com.dragome.guia.GuiaServiceLocator; import com.dragome.guia.components.interfaces.VisualComponent; import com.dragome.guia.components.interfaces.VisualListBox; import com.dragome.guia.events.listeners.interfaces.ClickListener; import com.dragome.helpers.DragomeEntityManager; import com.dragome.model.interfaces.Renderer; import com.dragome.model.interfaces.ValueChangeEvent; import com.dragome.model.interfaces.ValueChangeHandler; import com.dragome.render.canvas.interfaces.Canvas; public class HTMLListRenderer extends AbstractHTMLComponentRenderer<VisualListBox<Object>> { public HTMLListRenderer() { } public Canvas<Element> render(final VisualListBox<Object> visualList) { Canvas<Element> canvas= GuiaServiceLocator.getInstance().getTemplateManager().getCanvasFactory().createCanvas(); canvas.setContent(new MergeableElement() { public void mergeWith(final Element selectElement) { final String id= DragomeEntityManager.add(visualList); // visualList.addValueChangeHandler(new ValueChangeHandler<Object>() // { // public void onValueChange(ValueChangeEvent<Object> event) // { // final DomHandler domHandler= ServiceLocator.getInstance().getDomHandler(); // Element elementById= domHandler.getDocument().getElementById(id); // elementById.setAttribute("value", (String) event.getValue()); // } // }); // final Element selectElement= ServiceLocator.getInstance().getDomHandler().getDocument().createElement("select"); visualList.addValueChangeHandler(new ValueChangeHandler<Object>() { public void onValueChange(ValueChangeEvent<Object> event) { if (event.getValue() instanceof Collection) selectValue(selectElement, (Collection) event.getValue()); else selectValue(selectElement, Arrays.asList(event.getValue())); } private void selectValue(final Element selectElement, Collection<Object> values) { Renderer<Object> renderer= visualList.getRenderer(); ScriptHelper.put("renderedValues", new Object(), this); ScriptHelper.eval("renderedValues={}", this); for (Object object : values) { ScriptHelper.put("value", renderer.render(object), this); ScriptHelper.evalNoResult("renderedValues[value]=true", this); } ScriptHelper.put("sel", selectElement, this); ScriptHelper.evalNoResult("for(var opt, j = 0; opt = sel.node.options[j]; j++) {opt.selected= renderedValues[opt.value]; }", this); } }); visualList.addListener(ClickListener.class, new ClickListener() { public void clickPerformed(VisualComponent aVisualComponent) { ScriptHelper.put("e", selectElement, this); if (ScriptHelper.evalBoolean("e.node.multiple", this)) { String values= (String) ScriptHelper.eval("(function (){for (var options = e.node.options, values= [], i = 0, len = options.length; i < len;i++) if (options[i].selected) values.push(options[i].value); return values.join(',')})()", this); visualList.setSelectedValues((List) Arrays.asList(values.split(","))); } else { String value= (String) ScriptHelper.eval("e.node.options[e.node.selectedIndex].value", this); Renderer<Object> renderer= visualList.getRenderer(); Collection<Object> acceptableValues= visualList.getAcceptableValues(); for (Object object : acceptableValues) { String render= renderer.render(object); if (render.equals(value)) visualList.setValue(object); } } } }); selectElement.setAttribute("size", getSelectElementSize() + ""); // selectElement.setAttribute("style", "min-width:300px;"); if (visualList.isMultipleItems()) selectElement.setAttribute("multiple", "multiple"); int i= 1; String options= ""; for (Object element : visualList.getAcceptableValues()) { Renderer<Object> renderer= visualList.getRenderer(); String rendered= renderer.render(element); Object value= visualList.getValue(); String selected= ""; boolean isSelected= visualList.isMultipleItems() && visualList.getSelectedValues().contains(element); isSelected|= !visualList.isMultipleItems() && element.equals(value); if (isSelected) selected= "selected=\"selected\""; String option= "<option value=\"" + rendered + "\" " + selected + ">" + rendered + "</option>\n"; options+= option; } setElementInnerHTML(selectElement, options); addListeners(visualList, selectElement); } }); return canvas; } protected int getSelectElementSize() { return 5; } }