1 package org.simantics.document.swt.core.widget;
\r
3 import java.util.Arrays;
\r
4 import java.util.List;
\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
18 public class ComboWidget extends LeafWidgetManager<Combo> {
\r
20 private ModifyListener modifyListener = null;
\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
30 protected void doUpdateProperties(SWTDocument document, Combo combo, JSONObject object) {
\r
32 if(combo.isDisposed()) return;
\r
34 if(modifyListener != null)
\r
35 combo.removeModifyListener(modifyListener);
\r
37 StringList availableList = extractAvailable(object.getJSONField("available"));
\r
38 String selected = object.getJSONField("selected");
\r
40 String[] available = availableList.strings;
\r
41 String[] current = combo.getItems();
\r
43 if(!Arrays.equals(available, current)) {
\r
44 combo.clearSelection();
\r
46 for(String key : available) {
\r
52 for(;index<available.length;index++) if(available[index].equals(selected)) break;
\r
54 if(index == available.length) {
\r
55 combo.clearSelection();
\r
57 combo.select(index);
\r
60 if(modifyListener != null)
\r
61 combo.addModifyListener(modifyListener);
\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
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
85 combo.addModifyListener(modifyListener);
\r