1 13 package org.eclipse.jface.internal.databinding.internal.swt; 14 15 import org.eclipse.core.databinding.observable.Diffs; 16 import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue; 17 import org.eclipse.swt.SWT; 18 import org.eclipse.swt.widgets.Event; 19 import org.eclipse.swt.widgets.List; 20 import org.eclipse.swt.widgets.Listener; 21 22 26 public class ListObservableValue extends AbstractSWTObservableValue { 27 28 private final List list; 29 30 private boolean updating = false; 31 32 private String currentValue; 33 34 private Listener listener; 35 36 39 public ListObservableValue(List list) { 40 super(list); 41 this.list = list; 42 this.currentValue = (String ) doGetValue(); 43 44 if ((list.getStyle() & SWT.MULTI) > 0) 45 throw new IllegalArgumentException ( 46 "SWT.SINGLE support only for a List selection"); 48 listener = new Listener() { 49 50 public void handleEvent(Event event) { 51 if (!updating) { 52 Object oldValue = currentValue; 53 currentValue = (String ) doGetValue(); 54 fireValueChange(Diffs.createValueDiff(oldValue, 55 currentValue)); 56 } 57 } 58 59 }; 60 list.addListener(SWT.Selection, listener); 61 } 62 63 public void doSetValue(Object value) { 64 String oldValue = null; 65 if (list.getSelection() != null && list.getSelection().length > 0) 66 oldValue = list.getSelection()[0]; 67 try { 68 updating = true; 69 String items[] = list.getItems(); 70 int index = -1; 71 if (items != null && value != null) { 72 for (int i = 0; i < items.length; i++) { 73 if (value.equals(items[i])) { 74 index = i; 75 break; 76 } 77 } 78 list.select(index); } 80 currentValue = (String ) value; 81 } finally { 82 updating = false; 83 } 84 fireValueChange(Diffs.createValueDiff(oldValue, value)); 85 } 86 87 public Object doGetValue() { 88 int index = list.getSelectionIndex(); 89 if (index >= 0) 90 return list.getItem(index); 91 return null; 92 } 93 94 public Object getValueType() { 95 return String .class; 96 } 97 98 103 public synchronized void dispose() { 104 super.dispose(); 105 if (listener != null && !list.isDisposed()) { 106 list.removeListener(SWT.Selection, listener); 107 } 108 } 109 } 110 | Popular Tags |