/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.venky.swf.views.controls; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.StringTokenizer; import org.apache.commons.lang3.StringEscapeUtils; import com.venky.core.collections.LowerCaseStringCache; import com.venky.core.collections.SequenceSet; import com.venky.core.string.StringUtil; import com.venky.core.util.ObjectUtil; /** * * @author venky */ public class Control extends Properties implements _IControl{ /** * */ private static final long serialVersionUID = 1464298453429814631L; private long nextId(){ return new Object().hashCode(); } public void setForm(String formId){ setProperty("form", formId); } public void setWaterMark(String watermark){ if (!ObjectUtil.isVoid(watermark)){ setProperty("placeholder", watermark); }else { remove("placeholder"); } } public void setToolTip(String tip){ if (!ObjectUtil.isVoid(tip)){ setProperty("title", tip); }else { remove("title"); } } protected final String getDefaultCssClass(){ return LowerCaseStringCache.instance().get( StringUtil.underscorize(getClass().getSimpleName()).replace('_','-')); } public Control(String tag, String... pairs) { this.tag = tag; setProperty("id", String.valueOf(nextId())); Properties p = ObjectUtil.createProperties(true, pairs); putAll(p); addClass(getDefaultCssClass()); } SequenceSet<String> classes = new SequenceSet<String>(); public void setClass(String className){ classes.clear(); addClass(className); } public void removeClass(String className){ StringTokenizer tok = new StringTokenizer(className); while (tok.hasMoreTokens()){ classes.remove(tok.nextToken()); } finalizeClassAttribute(); } private void finalizeClassAttribute(){ StringBuilder classNames = new StringBuilder(); for (String cn: classes){ classNames.append(cn); classNames.append(" "); } if (classNames.length() > 0) { classNames.setLength(classNames.length()-1); setProperty("class", classNames); }else { remove("class"); } } public void addClass(String className){ StringTokenizer tok = new StringTokenizer(className); while (tok.hasMoreTokens()){ classes.add(tok.nextToken()); } finalizeClassAttribute(); } public void setProperty(String name, Object value) { super.setProperty(name, StringUtil.valueOf(value)); } private String tag = null; private _IControl parent = null; public void setId(String id) { setProperty("id", id); } public String getId() { return getProperty("id"); } private List<_IControl> containedControls = new ArrayList<_IControl>(); public _IControl getParent() { return parent; } public String getTag() { return tag; } protected void setTag(String tag){ this.tag = tag; } public void setParent(_IControl parent) { this.parent = parent; } public void addControl(int index,_IControl control){ containedControls.add(index,control); control.setParent(this); } public void addControl(_IControl control) { addControl(containedControls.size(), control); } public void removeControl(_IControl control){ containedControls.remove(control); control.setParent(null); } public List<_IControl> getContainedControls() { return Collections.unmodifiableList(containedControls); } public _IControl removeContainedControlAt(int index){ return containedControls.remove(index); } @Override public String toString() { StringBuilder b = new StringBuilder(); boolean closeEmptyTagMinimally = useMinimizedTagSyntax() && isTagEmpty() ; if (getTag() != null){ b.append("<").append(getTag()).append(" "); for (Object key : keySet()) { String pvalue = getProperty(key.toString()); b.append(key).append("=\"").append(pvalue).append("\" "); } if (closeEmptyTagMinimally){ b.append("/"); } b.append(">"); } if (!closeEmptyTagMinimally){ b.append(getText()); for (_IControl contained : containedControls) { b.append(contained); } if (getTag() != null){ b.append("</").append(getTag()).append(">"); } } return b.toString(); } protected boolean useMinimizedTagSyntax(){ return false; } protected boolean isTagEmpty(){ return (ObjectUtil.isVoid(getText()) && getContainedControls().isEmpty()); } private String text = ""; public String getText() { return text; } public void setText(String value) { this.text = value; } public String getName(){ return getProperty("name"); } public void setName(final String name){ setProperty("name", name); } public void setValue(final Object value){ setProperty("value", StringEscapeUtils.escapeHtml4(StringUtil.valueOf(value))); } public String getUnescapedValue(){ return StringEscapeUtils.unescapeHtml4(getValue()); } public String getValue(){ return getProperty("value"); } public void setEnabled(final boolean enabled){ if (enabled){ remove("disabled"); }else { setProperty("disabled", !enabled); } } public void setReadOnly(final boolean readonly){ if (readonly){ setProperty("readonly","readonly"); }else{ remove("readonly"); } } public boolean isReadOnly(){ return containsKey("readonly"); } public boolean isEnabled(){ return !containsKey("disabled"); } public void setVisible(final boolean visible){ if (visible){ removeClass("hidden"); }else { addClass("hidden"); } } public boolean isVisible(){ return !classes.contains("hidden"); } @SuppressWarnings("unchecked") public static <T extends _IControl> void hunt(_IControl control, Class<T> controlClass,List<T> hunted){ if (controlClass.isInstance(control)){ hunted.add((T)control); }else { for (_IControl c :control.getContainedControls()){ hunt(c,controlClass,hunted); } } } }