package javaforce.webui;
/** Base class for all components.
*
* @author pquiring
*/
import java.util.*;
import javaforce.webui.event.*;
public abstract class Component {
public String id;
public Container parent;
public WebUIClient client;
public String name;
public ArrayList<String> classes = new ArrayList<String>();
public HashMap<String, String> attrs = new HashMap<String, String>();
public HashMap<String, String> styles = new HashMap<String, String>();
public int x,y,width,height; //position and size (updated with mouseenter event)
private static class OnEvent {
public String event;
public String js;
}
public ArrayList<OnEvent> events = new ArrayList<OnEvent>();
/** Component constructor.
* @param parent = Panel
* @param name = name of component
*/
public Component() {}
/** Sets Component's name. */
public void setName(String name) {
this.name = name;
}
/** Gets Component's name. */
public String getName() {
return name;
}
/** Returns Component's parent Container. */
public Container getParent() {
return parent;
}
/** Returns Component's top-most parent Container. */
public Container getTopParent() {
Container top = parent;
do {
Container next = top.getParent();
if (next == null) return top;
top = next;
} while (true);
}
/** Provides the client (connection to web browser side) and init other variables. */
public void setClient(WebUIClient client) {
if (id != null) return;
this.client = client;
id = "c" + client.getNextID();
}
/** Returns client. */
public WebUIClient getClient() {
return client;
}
/** Perform any initialization with the client.
* Containers should call init() on all sub-components.
*/
public void init() {}
/** Returns HTML to render component. */
public abstract String html();
private HashMap<String,Object> map = new HashMap<>();
/** Set user define property. */
public void setProperty(String key, Object value) {
map.put(key, value);
}
/** Get user define property. */
public Object getProperty(String key) {
return map.get(key);
}
/** Invokes getClient().sendEvent() */
public void sendEvent(String event, String args[]) {
if (client != null) {
client . sendEvent(id, event, args);
}
}
/** Invokes getClient().sendData() */
public void sendData(byte data[]) {
if (client != null) {
client . sendData(data);
}
}
public void setClass(String cls) {
classes.clear();
classes.add(cls);
sendEvent("setclass", new String [] {"cls=" + cls});
}
public boolean hasClass(String cls) {
return classes.contains(cls);
}
public void addClass(String cls) {
if (hasClass(cls)) return;
classes.add(cls);
}
public void removeClass(String cls) {
classes.remove(cls);
}
public void setFlex(boolean state) {
if (state) addClass("pad"); else removeClass("pad");
}
public boolean hasAttr(String attr) {
return attrs.containsKey(attr);
}
public void addAttr(String attr, String value) {
attrs.put(attr, value);
}
public void removeAttr(String attr) {
attrs.remove(attr);
}
public boolean hasStyle(String style) {
return styles.containsKey(style);
}
public void setStyle(String style, String value) {
styles.put(style, value);
}
public void removeStyle(String style) {
styles.remove(style);
}
public void setFontSize(int size) {
setStyle("font-size", size + "pt");
}
public final static int LEFT = 0;
public final static int CENTER = 1;
public final static int RIGHT = 2;
public void setAlign(int align) {
switch (align) {
case LEFT:
setStyle("text-align", "left");
break;
case CENTER:
setStyle("text-align", "center");
break;
case RIGHT:
setStyle("text-align", "right");
break;
}
}
private OnEvent getEvent(String onX) {
int cnt = events.size();
for(int a=0;a<cnt;a++) {
OnEvent event = events.get(a);
if (event.event.equals(onX)) return event;
}
return null;
}
public void addEvent(String onX, String js) {
OnEvent event;
event = getEvent(onX);
if (event != null) {
event.js = js;
} else {
event = new OnEvent();
event.event = onX;
event.js = js;
events.add(event);
}
}
public String getEvents() {
StringBuffer sb = new StringBuffer();
int cnt = events.size();
for(int a=0;a<cnt;a++) {
sb.append(' ');
OnEvent event = events.get(a);
sb.append(event.event);
sb.append("='");
sb.append(event.js);
sb.append("'");
}
return sb.toString();
}
public void setWidth(String width) {
// this.width = Integer.valueOf(width);
setStyle("width", width);
}
public void setHeight(String height) {
// this.height = Integer.valueOf(height);
setStyle("height", height);
}
public void setColor(String clr) {
setStyle("color", clr);
sendEvent("setclr", new String[] {"clr=" + clr});
}
public void setBackColor(String clr) {
setStyle("background-color", clr);
sendEvent("setbackclr", new String[] {"clr=" + clr});
}
public void setBorderColor(String clr) {
setStyle("border-color", clr);
sendEvent("setborderclr", new String[] {"clr=" + clr});
}
/** Returns all attributes defined for a component (id, attrs, class, styles) */
public String getAttrs() {
StringBuffer sb = new StringBuffer();
sb.append(" id='" + id + "'");
if (attrs.size() > 0) {
int size = attrs.size();
String keys[] = attrs.keySet().toArray(new String[size]);
String vals[] = attrs.values().toArray(new String[size]);
for(int a=0;a<size;a++) {
sb.append(" " + keys[a] + "='" + vals[a] + "'");
}
}
if (classes.size() > 0) {
sb.append(" class='");
for(int a=0;a<classes.size();a++) {
if (a > 0) sb.append(' ');
sb.append(classes.get(a));
}
sb.append("'");
}
sb.append(getEvents());
if (styles.size() > 0) {
sb.append(" style='");
int size = styles.size();
String keys[] = styles.keySet().toArray(new String[size]);
String vals[] = styles.values().toArray(new String[size]);
for(int a=0;a<size;a++) {
sb.append(keys[a] + ":" + vals[a] + ";");
}
sb.append("'");
}
return sb.toString();
}
public String display = "inline-block";
public void setVisible(boolean state) {
if (state)
sendEvent("display", new String[] {"val=" + display});
else
sendEvent("display", new String[] {"val=none"});
if (visible != null) {
visible.onVisible(this, state);
}
}
public void setPosition(int x, int y) {
sendEvent("setpos", new String[] {"x=" + x, "y=" + y});
this.x = x;
this.y = y;
setStyle("left", Integer.toString(x));
setStyle("top", Integer.toString(y));
}
public void setReadonly(boolean state) {
if (state) {
addAttr("readonly", "readonly");
} else {
removeAttr("readonly");
}
}
public void setDisabled(boolean state) {
if (state) {
addAttr("disabled", "true");
} else {
removeAttr("disabled");
}
}
public String toString() {
return getClass().getName() + ":" + id;
}
//event handlers
/** Dispatches event. */
public void dispatchEvent(String event, String args[]) {
MouseEvent e = new MouseEvent();
for(int a=0;a<args.length;a++) {
if (args[a].equals("ck=true")) {
e.ctrlKey = true;
}
if (args[a].equals("ak=true")) {
e.altKey = true;
}
if (args[a].equals("sk=true")) {
e.shiftKey = true;
}
}
switch (event) {
case "click":
onClick(args);
if (click != null) click.onClick(e, this);
break;
case "changed":
onChanged(args);
if (changed != null) changed.onChanged(this);
break;
case "mousedown":
onMouseDown(args);
if (mouseDown != null) mouseDown.onMouseDown(this);
break;
case "mouseup":
onMouseUp(args);
if (mouseUp != null) mouseUp.onMouseUp(this);
break;
case "mousemove":
onMouseMove(args);
if (mouseMove != null) mouseMove.onMouseMove(this);
break;
case "mouseenter":
onMouseEnter(args);
if (mouseEnter != null) mouseEnter.onMouseEnter(this);
break;
case "possize":
onPosSize(args);
break;
case "pos":
onPos(args);
break;
case "size":
onSize(args);
break;
case "ack":
onLoaded(args);
break;
}
}
public void onPosSize(String args[]) {
for(int c=0;c<args.length;c++) {
String a = args[c];
if (a.startsWith("x=")) {
x = Integer.valueOf(a.substring(2));
}
if (a.startsWith("y=")) {
y = Integer.valueOf(a.substring(2));
}
if (a.startsWith("w=")) {
width = Integer.valueOf(a.substring(2));
}
if (a.startsWith("h=")) {
height = Integer.valueOf(a.substring(2));
}
}
}
public void onSize(String args[]) {
for(int c=0;c<args.length;c++) {
String a = args[c];
if (a.startsWith("w=")) {
width = Integer.valueOf(a.substring(2));
}
if (a.startsWith("h=")) {
height = Integer.valueOf(a.substring(2));
}
}
}
public void onPos(String args[]) {
for(int c=0;c<args.length;c++) {
String a = args[c];
if (a.startsWith("x=")) {
x = Integer.valueOf(a.substring(2));
}
if (a.startsWith("y=")) {
y = Integer.valueOf(a.substring(2));
}
}
}
public void onLoaded(String args[]) {}
protected void onClick(String args[]) {}
private Click click;
public void addClickListener(Click handler) {
addEvent("onclick", "onClick(event, this);");
click = handler;
}
protected void onMouseUp(String args[]) {}
private MouseUp mouseUp;
public void addMouseUpListener(MouseUp handler) {
mouseUp = handler;
}
protected void onMouseDown(String args[]) {}
private MouseDown mouseDown;
public void addMouseDownListener(MouseDown handler) {
mouseDown = handler;
}
protected void onMouseMove(String args[]) {}
private MouseMove mouseMove;
public void addMouseMoveListener(MouseMove handler) {
mouseMove = handler;
}
protected void onMouseEnter(String args[]) {}
private MouseEnter mouseEnter;
public void addMouseEnterListener(MouseEnter handler) {
mouseEnter = handler;
}
protected void onChanged(String args[]) {}
private Changed changed;
public void addChangedListener(Changed handler) {
changed = handler;
}
private Visible visible;
public void addVisibleListener(Visible handler) {
visible = handler;
}
private Validate validate;
public void addValidateListener(Validate handler) {
validate = handler;
}
public boolean validate() {
if (validate == null) return true;
return validate.validate(this);
}
private Action action;
public void addActionListener(Action handler) {
action = handler;
}
public void action() {
if (action == null) return;
action.action(this);
}
}