--- /dev/null
+package org.simantics.document.swt.core.widget;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
+import org.eclipse.swt.widgets.Combo;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.simantics.document.server.JSONObject;\r
+import org.simantics.document.server.handler.AbstractEventHandler;\r
+import org.simantics.document.server.io.CommandContextImpl;\r
+import org.simantics.document.swt.core.SWTDocument;\r
+import org.simantics.document.swt.core.base.LeafWidgetManager;\r
+import org.simantics.document.swt.core.bean.StringList;\r
+\r
+public class ComboWidget extends LeafWidgetManager<Combo> {\r
+ \r
+ private ModifyListener modifyListener = null;\r
+\r
+ private StringList extractAvailable(Object o) {\r
+ if(o instanceof StringList) return (StringList)o;\r
+ if(o instanceof List) return new StringList((List)o);\r
+ if(o instanceof String[]) return new StringList((String[])o);\r
+ throw new IllegalArgumentException("Unaccepted format for available " + o.getClass().getName());\r
+ }\r
+ \r
+ @Override\r
+ protected void doUpdateProperties(SWTDocument document, Combo combo, JSONObject object) {\r
+\r
+ if(combo.isDisposed()) return;\r
+ \r
+ if(modifyListener != null)\r
+ combo.removeModifyListener(modifyListener);\r
+ \r
+ StringList availableList = extractAvailable(object.getJSONField("available"));\r
+ String selected = object.getJSONField("selected");\r
+\r
+ String[] available = availableList.strings;\r
+ String[] current = combo.getItems();\r
+ \r
+ if(!Arrays.equals(available, current)) {\r
+ combo.clearSelection();\r
+ combo.removeAll();\r
+ for(String key : available) {\r
+ combo.add(key);\r
+ }\r
+ }\r
+ \r
+ int index = 0;\r
+ for(;index<available.length;index++) if(available[index].equals(selected)) break;\r
+\r
+ if(index == available.length) {\r
+ combo.clearSelection();\r
+ } else {\r
+ combo.select(index);\r
+ }\r
+\r
+ if(modifyListener != null)\r
+ combo.addModifyListener(modifyListener);\r
+\r
+ }\r
+\r
+ @Override\r
+ protected Combo doCreateControl(final SWTDocument document, Composite parent, JSONObject object) {\r
+ final Combo combo = new Combo(parent, SWT.READ_ONLY);\r
+ final AbstractEventHandler onModify = object.getJSONField("onModify");\r
+ if(onModify != null) {\r
+ modifyListener = new ModifyListener() {\r
+ \r
+ @Override\r
+ public void modifyText(ModifyEvent e) {\r
+ String[] items = combo.getItems();\r
+ int index = combo.getSelectionIndex();\r
+ if(index >=0 && index < items.length) {\r
+ CommandContextImpl parameters = new CommandContextImpl();\r
+ parameters.putString("selected", items[index]);\r
+ document.post(onModify, parameters);\r
+ }\r
+ \r
+ }\r
+ \r
+ };\r
+ combo.addModifyListener(modifyListener);\r
+ }\r
+ return combo;\r
+ }\r
+ \r
+}\r