package javaforce.webui; /** WebClient.java * * Tracks web page state for one client. * * @author pquiring */ import java.util.*; import javaforce.*; import javaforce.service.*; public class WebUIClient { public WebSocket socket; public Panel root; public String hash; public int nextID; public int zIndex = 1; public boolean popupMenuMouseDown; public PopupMenu topPopupMenu; public WebUIClient() { hash = Integer.toString(this.hashCode(), 16); } public synchronized int getNextID() { return nextID++; } public void setSocket(WebSocket socket) { this.socket = socket; } public Panel getPanel() { return root; } public void setPanel(Panel root) { this.root = root; if (socket != null) { initPanel(); dispatchEvent("", "load", null); } } public void refresh() { sendEvent("body", "redir", null); } public void initPanel() { root.setClient(this); root.init(); } public void dispatchEvent(String id, String event, String args[]) { if (id.length() == 0 || id.equals("body")) { switch (event) { case "load": String html = root.html(); sendEvent("body", "sethtml", new String[] {"html=" + html}); break; case "mousedown": Menu.onMouseDownBody(this, args); break; case "ack": root.dispatchEvent(event, args); break; } } else { Component c = root.get(id); if (c != null) { c.dispatchEvent(event, args); } else { JFLog.log("Error:Component not found:" + id); } } } private String stringify(String in) { StringBuilder sb = new StringBuilder(); char ca[] = in.toCharArray(); int len = ca.length; sb.append("\""); for(int a=0;a<len;a++) { char ch = ca[a]; switch (ch) { case '\"': sb.append("\\\""); break; case '\r': sb.append("\\r"); break; case '\n': sb.append("\\n"); break; case '\\': sb.append("\\\\"); break; default: sb.append(ch); break; } } sb.append("\""); return sb.toString(); } public void sendData(byte data[]) { socket.write(data, WebSocket.TYPE_BINARY); } public synchronized void sendEvent(String id, String event, String args[]) { if (socket == null) return; StringBuffer sb = new StringBuffer(); sb.append("{\"event\":\"" + event + "\""); if (id != null) { sb.append(",\"id\":\"" + id + "\""); } if (args != null) { int cnt = args.length; for(int a=0;a<cnt;a++) { String arg = args[a]; int idx = arg.indexOf("="); if (idx == -1) { idx = arg.length(); arg += "=true"; } String key = arg.substring(0, idx); String value = arg.substring(idx+1); sb.append(",\"" + key + "\":" + stringify(value)); } } sb.append("}"); byte json[] = sb.toString().getBytes(); if (!event.equals("sethtml")) { JFLog.log("SEND=" + new String(json)); } else { JFLog.log("SEND={html...}"); } socket.write(json); } public String html() { return root.html(); } public void close() { //TODO - cleanup resources } 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); } public HashMap<String,Object> getProperties() { return map; } public int getZIndex() { return zIndex++; } public void releaseZIndex() { zIndex--; } }