KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jface > databinding > viewers > ObservableListContentProvider


1 /*******************************************************************************
2  * Copyright (c) 2006, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

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 /**
29  * @since 1.1
30  *
31  */

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     /**
71      *
72      */

73     public ObservableListContentProvider() {
74         observableList = new WritableList(SWTObservables.getRealm(Display.getDefault()));
75         knownElements = new WritableSet(SWTObservables.getRealm(Display.getDefault()));
76     }
77
78     public Object JavaDoc[] getElements(Object JavaDoc inputElement) {
79         return observableList.toArray();
80     }
81
82     public void dispose() {
83         observableList.removeListChangeListener(listener);
84     }
85
86     public void inputChanged(Viewer viewer, Object JavaDoc oldInput, Object JavaDoc newInput) {
87         this.viewer = viewer;
88
89         if (!(viewer instanceof TableViewer || viewer instanceof AbstractListViewer)) {
90             // use reflection to avoid 3.3 dependency:
91
Class JavaDoc abstractTableViewerClass = null;
92             try {
93                 abstractTableViewerClass = Class.forName("org.eclipse.jface.viewers.AbstractTableViewer"); //$NON-NLS-1$
94
} catch(Exception JavaDoc ex) {
95                 // ignore, we might be running against 3.2
96
}
97             if (abstractTableViewerClass == null || !abstractTableViewerClass.isInstance(viewer)) {
98                 throw new IllegalArgumentException JavaDoc(
99                     "This content provider only works with (Abstract)TableViewer or AbstractListViewer"); //$NON-NLS-1$
100
}
101         }
102
103         if (newInput != null && !(newInput instanceof IObservableList)) {
104             throw new IllegalArgumentException JavaDoc(
105                     "This content provider only works with input of type IObservableList"); //$NON-NLS-1$
106
}
107
108         setInput((IObservableList) newInput);
109     }
110
111     /**
112      * @param list
113      */

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     /**
134      * @return the set of elements known to this content provider. Label providers may track
135      * this set if they need to be notified about additions before the viewer sees the added
136      * element, and notified about removals after the element was removed from the viewer.
137      */

138     public IObservableSet getKnownElements() {
139         return knownElements;
140     }
141
142 }
143
Popular Tags