/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.webui.form.ext;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormInputBase;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by The eXo Platform SARL
* Author : Tuan Pham
* tuan.pham@exoplatform.com
* Dec 3, 2007
*/
public class UIFormComboBox extends UIFormInputBase<String>
{
/**
* The size of the list (number of select options)
*/
protected int size_ = 1;
/**
* The list of options
*/
private List<SelectItemOption<String>> options_;
/**
* The javascript expression executed when an onChange event fires
*/
private String onchange_;
/**
* The javascript expression executed when an client onChange event fires
*/
public static final String ON_CHANGE = "onchange".intern();
/**
* The javascript expression executed when an client event fires
*/
public static final String ON_BLUR = "onblur".intern();
/**
* The javascript expression executed when an client event fires
*/
public static final String ON_FOCUS = "onfocus".intern();
/**
* The javascript expression executed when an client event fires
*/
public static final String ON_KEYUP = "onkeyup".intern();
/**
* The javascript expression executed when an client event fires
*/
public static final String ON_KEYDOWN = "onkeydown".intern();
/**
* The javascript expression executed when an client event fires
*/
public static final String ON_CLICK = "onclick".intern();
private Map<String, String> jsActions_ = new HashMap<String, String>();
public UIFormComboBox(String name, String bindingExpression, String value)
{
super(name, bindingExpression, String.class);
this.value_ = value;
}
public UIFormComboBox(String name, String bindingExpression, List<SelectItemOption<String>> options)
{
super(name, bindingExpression, null);
setOptions(options);
}
public void setJsActions(Map<String, String> jsActions)
{
if (jsActions != null)
jsActions_ = jsActions;
}
public Map<String, String> getJsActions()
{
return jsActions_;
}
public void addJsActions(String action, String javaScript)
{
jsActions_.put(action, javaScript);
}
public UIFormComboBox(String name, String bindingExpression, List<SelectItemOption<String>> options,
Map<String, String> jsActions)
{
super(name, bindingExpression, null);
setOptions(options);
setJsActions(jsActions);
}
public UIFormComboBox(String name, String value)
{
this(name, null, value);
}
final public UIFormComboBox setOptions(List<SelectItemOption<String>> options)
{
options_ = options;
if (options_ == null || options_.size() < 1)
return this;
value_ = options_.get(0).getValue();
return this;
}
@SuppressWarnings("unused")
public void decode(Object input, WebuiRequestContext context) throws Exception
{
value_ = (String)input;
if (value_ != null && value_.length() == 0)
value_ = null;
}
public void setOnChange(String onchange)
{
onchange_ = onchange;
}
protected String renderOnChangeEvent(UIForm uiForm) throws Exception
{
return uiForm.event(onchange_, (String)null);
}
public UIForm getUIform()
{
return getAncestorOfType(UIForm.class);
}
private String renderJsActions()
{
StringBuffer sb = new StringBuffer();
for (String k : jsActions_.keySet())
{
if (sb != null && sb.length() > 0)
sb.append(" ");
if (jsActions_.get(k) != null)
{
sb.append(k).append("=\"").append(jsActions_.get(k)).append("\"");
}
}
return sb.toString();
}
public void processRender(WebuiRequestContext context) throws Exception
{
context.getJavascriptManager().addJavascript("eXo.webui.UICombobox.init('" + getId() + "');");
Writer w = context.getWriter();
String options = "[";
String text =
"<div class='UIComboboxComponent'><div class='UIComboboxList'><div class='UIComboboxContainer'><div class='UIComboboxItemContainer'>";
for (SelectItemOption item : options_)
{
options += "'" + item.getLabel() + "',";
text +=
"<a href='javascript:void(0);' onclick='eXo.webui.UICombobox.getValue(this);' value='" + item.getValue()
+ "' class='UIComboboxItem'>";
text += "<div class='UIComboboxIcon'>";
text += "<div class='UIComboboxLabel'>" + item.getLabel() + "</div>";
text += "</div>";
text += "</a>";
}
text += "</div></div></div>";
options = options.substring(0, options.length() - 1) + "]";
text += "<input type='hidden' name='" + getName() + "' id='" + getId() + "'";
if (value_ != null && value_.trim().length() > 0)
{
text += " value='" + encodeValue(value_).toString() + "'";
}
text += " />";
text +=
"<input class='UIComboboxInput' options=\"" + options
+ "\" onkeyup='eXo.webui.UICombobox.complete(this,event);' type='text' " + renderJsActions();
if(value_ != null && value_.trim().length() > 0)
{
text += "value='" + encodeValue(value_).toString() + "'";
}
text += " /></div>";
w.write(text);
}
private StringBuilder encodeValue(String value)
{
char[] chars = {'\'', '"'};
String[] refs = {"'", """};
StringBuilder builder = new StringBuilder(value);
int idx;
for (int i = 0; i < chars.length; i++)
{
idx = indexOf(builder, chars[i], 0);
while (idx > -1)
{
builder = builder.replace(idx, idx + 1, refs[i]);
idx = indexOf(builder, chars[i], idx);
}
}
return builder;
}
private int indexOf(StringBuilder builder, char c, int from)
{
int i = from;
while (i < builder.length())
{
if (builder.charAt(i) == c)
return i;
i++;
}
return -1;
}
}