]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.document.swt.core.widget;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.List;\r
5 \r
6 import org.eclipse.swt.SWT;\r
7 import org.eclipse.swt.events.ModifyEvent;\r
8 import org.eclipse.swt.events.ModifyListener;\r
9 import org.eclipse.swt.widgets.Combo;\r
10 import org.eclipse.swt.widgets.Composite;\r
11 import org.simantics.document.server.JSONObject;\r
12 import org.simantics.document.server.handler.AbstractEventHandler;\r
13 import org.simantics.document.server.io.CommandContextImpl;\r
14 import org.simantics.document.swt.core.SWTDocument;\r
15 import org.simantics.document.swt.core.base.LeafWidgetManager;\r
16 import org.simantics.document.swt.core.bean.StringList;\r
17 \r
18 public class ComboWidget extends LeafWidgetManager<Combo> {\r
19         \r
20         private ModifyListener modifyListener = null;\r
21 \r
22         private StringList extractAvailable(Object o) {\r
23                 if(o instanceof StringList) return (StringList)o;\r
24                 if(o instanceof List) return new StringList((List)o);\r
25                 if(o instanceof String[]) return new StringList((String[])o);\r
26                 throw new IllegalArgumentException("Unaccepted format for available " + o.getClass().getName());\r
27         }\r
28         \r
29         @Override\r
30         protected void doUpdateProperties(SWTDocument document, Combo combo, JSONObject object) {\r
31 \r
32                 if(combo.isDisposed()) return;\r
33                 \r
34                 if(modifyListener != null)\r
35                         combo.removeModifyListener(modifyListener);\r
36                 \r
37                 StringList availableList = extractAvailable(object.getJSONField("available"));\r
38                 String selected = object.getJSONField("selected");\r
39 \r
40                 String[] available = availableList.strings;\r
41                 String[] current = combo.getItems();\r
42                 \r
43                 if(!Arrays.equals(available, current)) {\r
44                 combo.clearSelection();\r
45                 combo.removeAll();\r
46                 for(String key : available) {\r
47                         combo.add(key);\r
48                 }\r
49                 }\r
50                 \r
51                 int index = 0;\r
52                 for(;index<available.length;index++) if(available[index].equals(selected)) break;\r
53 \r
54                 if(index == available.length) {\r
55                         combo.clearSelection();\r
56                 } else {\r
57                         combo.select(index);\r
58                 }\r
59 \r
60                 if(modifyListener != null)\r
61                         combo.addModifyListener(modifyListener);\r
62 \r
63         }\r
64 \r
65         @Override\r
66         protected Combo doCreateControl(final SWTDocument document, Composite parent, JSONObject object) {\r
67                 final Combo combo = new Combo(parent, SWT.READ_ONLY);\r
68                 final AbstractEventHandler onModify = object.getJSONField("onModify");\r
69                 if(onModify != null) {\r
70                         modifyListener = new ModifyListener() {\r
71                                 \r
72                                 @Override\r
73                                 public void modifyText(ModifyEvent e) {\r
74                                         String[] items = combo.getItems();\r
75                                         int index = combo.getSelectionIndex();\r
76                                         if(index >=0 && index < items.length) {\r
77                                 CommandContextImpl parameters = new CommandContextImpl();\r
78                                 parameters.putString("selected", items[index]);\r
79                                                 document.post(onModify, parameters);\r
80                                         }\r
81                                         \r
82                                 }\r
83                                 \r
84                         };\r
85                         combo.addModifyListener(modifyListener);\r
86                 }\r
87                 return combo;\r
88         }\r
89         \r
90 }\r