1 11 package org.eclipse.jface.internal.databinding.internal.viewers; 12 13 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs; 14 import org.eclipse.jface.internal.databinding.provisional.observable.value.AbstractObservableValue; 15 import org.eclipse.jface.internal.databinding.provisional.viewers.ViewersProperties; 16 import org.eclipse.jface.util.Assert; 17 import org.eclipse.jface.viewers.ISelection; 18 import org.eclipse.jface.viewers.ISelectionChangedListener; 19 import org.eclipse.jface.viewers.IStructuredSelection; 20 import org.eclipse.jface.viewers.SelectionChangedEvent; 21 import org.eclipse.jface.viewers.StructuredSelection; 22 import org.eclipse.jface.viewers.StructuredViewer; 23 24 28 public class StructuredViewerObservableValue extends AbstractObservableValue { 29 30 private final StructuredViewer viewer; 31 32 private final String attribute; 33 34 private boolean updating = false; 35 36 private Object currentSelection; 37 38 42 public StructuredViewerObservableValue(StructuredViewer viewer, 43 String attribute) { 44 this.viewer = viewer; 45 this.attribute = attribute; 46 this.currentSelection = doGetValue(); 47 if (attribute.equals(ViewersProperties.SINGLE_SELECTION)) { 48 viewer.addSelectionChangedListener(new ISelectionChangedListener() { 49 public void selectionChanged(SelectionChangedEvent event) { 50 if (!updating) { 51 Object oldSelection = currentSelection; 52 currentSelection = doGetValue(); 53 fireValueChange(Diffs.createValueDiff(oldSelection, 54 currentSelection)); 55 } 56 } 57 }); 58 } else { 59 throw new IllegalArgumentException ( 60 "Attribute name not valid: " + attribute); } 62 } 63 64 public void setValue(final Object value) { 65 try { 66 updating = true; 67 if (attribute.equals(ViewersProperties.SINGLE_SELECTION)) { 68 Object oldSelection = currentSelection; 69 viewer.setSelection(value == null ? StructuredSelection.EMPTY 70 : new StructuredSelection(value)); 71 currentSelection = doGetValue(); 72 fireValueChange(Diffs.createValueDiff(oldSelection, 73 currentSelection)); 74 } 75 } finally { 76 updating = false; 77 } 78 } 79 80 public Object doGetValue() { 81 if (attribute.equals(ViewersProperties.SINGLE_SELECTION)) { 82 ISelection selection = viewer.getSelection(); 83 if (selection instanceof IStructuredSelection) { 84 IStructuredSelection sel = (IStructuredSelection) selection; 85 return sel.getFirstElement(); 86 } 87 } 88 return null; 89 } 90 91 public Object getValueType() { 92 Assert.isTrue(attribute.equals(ViewersProperties.SINGLE_SELECTION), 93 "unexpected attribute: " + attribute); return Object .class; 95 } 96 97 } 98 | Popular Tags |