]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/widget/ComboWidget.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.swt.core / src / org / simantics / document / swt / core / widget / ComboWidget.java
diff --git a/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/widget/ComboWidget.java b/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/widget/ComboWidget.java
new file mode 100644 (file)
index 0000000..0de61cf
--- /dev/null
@@ -0,0 +1,90 @@
+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