1 15 16 package org.eclipse.jface.internal.databinding.internal.viewers; 17 18 import org.eclipse.core.databinding.observable.Diffs; 19 import org.eclipse.core.databinding.observable.Realm; 20 import org.eclipse.core.databinding.observable.value.AbstractObservableValue; 21 import org.eclipse.jface.util.Util; 22 import org.eclipse.jface.viewers.ISelection; 23 import org.eclipse.jface.viewers.ISelectionChangedListener; 24 import org.eclipse.jface.viewers.ISelectionProvider; 25 import org.eclipse.jface.viewers.IStructuredSelection; 26 import org.eclipse.jface.viewers.SelectionChangedEvent; 27 import org.eclipse.jface.viewers.StructuredSelection; 28 29 34 public class SelectionProviderSingleSelectionObservableValue extends 35 AbstractObservableValue { 36 37 private final ISelectionProvider selectionProvider; 38 39 private boolean updating = false; 40 41 private Object currentSelection; 42 43 private ISelectionChangedListener selectionChangedListener; 44 45 56 public SelectionProviderSingleSelectionObservableValue(Realm realm, 57 ISelectionProvider selectionProvider) { 58 super(realm); 59 if (selectionProvider == null) { 60 throw new IllegalArgumentException ( 61 "The 'selectionProvider' parameter is null."); } 63 64 this.selectionProvider = selectionProvider; 65 this.currentSelection = doGetValue(); 66 67 selectionChangedListener = new ISelectionChangedListener() { 68 public void selectionChanged(SelectionChangedEvent event) { 69 if (!updating) { 70 Object oldSelection = currentSelection; 71 currentSelection = doGetValue(); 72 fireValueChange(Diffs.createValueDiff(oldSelection, 73 currentSelection)); 74 } 75 } 76 }; 77 selectionProvider.addSelectionChangedListener(selectionChangedListener); 78 } 79 80 88 public void doSetValue(final Object value) { 89 try { 90 updating = true; 91 92 Object oldSelection = currentSelection; 93 selectionProvider 94 .setSelection(value == null ? StructuredSelection.EMPTY 95 : new StructuredSelection(value)); 96 currentSelection = doGetValue(); 97 if (!Util.equals(oldSelection, currentSelection)) { 98 fireValueChange(Diffs.createValueDiff(oldSelection, 99 currentSelection)); 100 } 101 } finally { 102 updating = false; 103 } 104 } 105 106 123 protected Object doGetValue() { 124 ISelection selection = selectionProvider.getSelection(); 125 if (selection instanceof IStructuredSelection) { 126 IStructuredSelection sel = (IStructuredSelection) selection; 127 return sel.getFirstElement(); 128 } 129 130 return null; 131 } 132 133 public Object getValueType() { 134 return null; 135 } 136 137 142 public synchronized void dispose() { 143 selectionProvider 144 .removeSelectionChangedListener(selectionChangedListener); 145 super.dispose(); 146 } 147 } 148 | Popular Tags |