1 11 12 package org.eclipse.jface.databinding.viewers; 13 14 import org.eclipse.core.databinding.observable.list.IListChangeListener; 15 import org.eclipse.core.databinding.observable.list.IObservableList; 16 import org.eclipse.core.databinding.observable.list.ListChangeEvent; 17 import org.eclipse.core.databinding.observable.list.ListDiffEntry; 18 import org.eclipse.core.databinding.observable.list.WritableList; 19 import org.eclipse.core.databinding.observable.set.IObservableSet; 20 import org.eclipse.core.databinding.observable.set.WritableSet; 21 import org.eclipse.jface.databinding.swt.SWTObservables; 22 import org.eclipse.jface.viewers.AbstractListViewer; 23 import org.eclipse.jface.viewers.IStructuredContentProvider; 24 import org.eclipse.jface.viewers.TableViewer; 25 import org.eclipse.jface.viewers.Viewer; 26 import org.eclipse.swt.widgets.Display; 27 28 32 public class ObservableListContentProvider implements 33 IStructuredContentProvider { 34 35 private IObservableList observableList; 36 37 private Viewer viewer; 38 39 private IListChangeListener listener = new IListChangeListener() { 40 public void handleListChange(ListChangeEvent event) { 41 if (viewer.getControl().isDisposed()) { 42 return; 43 } 44 ListDiffEntry[] differences = event.diff.getDifferences(); 45 for (int i = 0; i < differences.length; i++) { 46 ListDiffEntry entry = differences[i]; 47 if (entry.isAddition()) { 48 knownElements.add(entry.getElement()); 49 if (viewer instanceof AbstractListViewer) { 50 ((AbstractListViewer) viewer).add(entry.getElement()); 51 } else { 52 ((TableViewer) viewer).insert(entry.getElement(), entry 53 .getPosition()); 54 } 55 } else { 56 if (viewer instanceof AbstractListViewer) { 57 ((AbstractListViewer) viewer) 58 .remove(entry.getElement()); 59 } else { 60 ((TableViewer) viewer).remove(entry.getElement()); 61 } 62 knownElements.remove(entry.getElement()); 63 } 64 } 65 } 66 }; 67 68 private IObservableSet knownElements; 69 70 73 public ObservableListContentProvider() { 74 observableList = new WritableList(SWTObservables.getRealm(Display.getDefault())); 75 knownElements = new WritableSet(SWTObservables.getRealm(Display.getDefault())); 76 } 77 78 public Object [] getElements(Object inputElement) { 79 return observableList.toArray(); 80 } 81 82 public void dispose() { 83 observableList.removeListChangeListener(listener); 84 } 85 86 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 87 this.viewer = viewer; 88 89 if (!(viewer instanceof TableViewer || viewer instanceof AbstractListViewer)) { 90 Class abstractTableViewerClass = null; 92 try { 93 abstractTableViewerClass = Class.forName("org.eclipse.jface.viewers.AbstractTableViewer"); } catch(Exception ex) { 95 } 97 if (abstractTableViewerClass == null || !abstractTableViewerClass.isInstance(viewer)) { 98 throw new IllegalArgumentException ( 99 "This content provider only works with (Abstract)TableViewer or AbstractListViewer"); } 101 } 102 103 if (newInput != null && !(newInput instanceof IObservableList)) { 104 throw new IllegalArgumentException ( 105 "This content provider only works with input of type IObservableList"); } 107 108 setInput((IObservableList) newInput); 109 } 110 111 114 private void setInput(IObservableList list) { 115 116 if (list == null) { 117 list = new WritableList(SWTObservables.getRealm(Display.getDefault())); 118 } 119 120 if (observableList != null) { 121 observableList.removeListChangeListener(listener); 122 } 123 124 knownElements.clear(); 125 126 observableList = list; 127 128 knownElements.addAll(list); 129 130 observableList.addListChangeListener(listener); 131 } 132 133 138 public IObservableSet getKnownElements() { 139 return knownElements; 140 } 141 142 } 143 | Popular Tags |