1 11 12 package org.eclipse.jface.internal.databinding.provisional.viewers; 13 14 import org.eclipse.jface.internal.databinding.provisional.observable.list.IListChangeListener; 15 import org.eclipse.jface.internal.databinding.provisional.observable.list.IObservableList; 16 import org.eclipse.jface.internal.databinding.provisional.observable.list.ListDiff; 17 import org.eclipse.jface.internal.databinding.provisional.observable.list.ListDiffEntry; 18 import org.eclipse.jface.internal.databinding.provisional.observable.list.WritableList; 19 import org.eclipse.jface.internal.databinding.provisional.observable.set.IObservableSet; 20 import org.eclipse.jface.internal.databinding.provisional.observable.set.WritableSet; 21 import org.eclipse.jface.viewers.AbstractListViewer; 22 import org.eclipse.jface.viewers.IStructuredContentProvider; 23 import org.eclipse.jface.viewers.TableViewer; 24 import org.eclipse.jface.viewers.Viewer; 25 26 30 public class ObservableListContentProvider implements 31 IStructuredContentProvider { 32 33 private IObservableList observableList = new WritableList(); 34 35 private Viewer viewer; 36 37 private IListChangeListener listener = new IListChangeListener() { 38 public void handleListChange(IObservableList source, ListDiff diff) { 39 if (viewer.getControl().isDisposed()) { 40 return; 41 } 42 ListDiffEntry[] differences = diff.getDifferences(); 43 for (int i = 0; i < differences.length; i++) { 44 ListDiffEntry entry = differences[i]; 45 if (entry.isAddition()) { 46 knownElements.add(entry.getElement()); 47 if (viewer instanceof AbstractListViewer) { 48 ((AbstractListViewer) viewer).add(entry.getElement()); 49 } else { 50 ((TableViewer) viewer).insert(entry.getElement(), entry 51 .getPosition()); 52 } 53 } else { 54 if (viewer instanceof AbstractListViewer) { 55 ((AbstractListViewer) viewer) 56 .remove(entry.getElement()); 57 } else { 58 ((TableViewer) viewer).remove(entry.getElement()); 59 } 60 knownElements.remove(entry.getElement()); 61 } 62 } 63 } 64 }; 65 66 private IObservableSet knownElements = new WritableSet(); 67 68 71 public ObservableListContentProvider() { 72 } 73 74 public Object [] getElements(Object inputElement) { 75 return observableList.toArray(); 76 } 77 78 public void dispose() { 79 observableList.removeListChangeListener(listener); 80 } 81 82 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 83 this.viewer = viewer; 84 85 if (!(viewer instanceof TableViewer || viewer instanceof AbstractListViewer)) { 86 throw new IllegalArgumentException ( 87 "This content provider only works with TableViewer or AbstractListViewer"); } 89 90 if (newInput != null && !(newInput instanceof IObservableList)) { 91 throw new IllegalArgumentException ( 92 "This content provider only works with input of type IObservableList"); } 94 95 setInput((IObservableList) newInput); 96 } 97 98 101 private void setInput(IObservableList list) { 102 103 if (list == null) { 104 list = new WritableList(); 105 } 106 107 if (observableList != null) { 108 observableList.removeListChangeListener(listener); 109 } 110 111 knownElements.clear(); 112 113 observableList = list; 114 115 knownElements.addAll(list); 116 117 observableList.addListChangeListener(listener); 118 } 119 120 125 public IObservableSet getKnownElements() { 126 return knownElements; 127 } 128 129 } 130 | Popular Tags |