KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*******************************************************************************
2  * Copyright (c) 2006 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.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 /**
27  * @since 1.0
28  *
29  */

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     /**
69      *
70      */

71     public ObservableListContentProvider() {
72     }
73
74     public Object JavaDoc[] getElements(Object JavaDoc inputElement) {
75         return observableList.toArray();
76     }
77
78     public void dispose() {
79         observableList.removeListChangeListener(listener);
80     }
81
82     public void inputChanged(Viewer viewer, Object JavaDoc oldInput, Object JavaDoc newInput) {
83         this.viewer = viewer;
84
85         if (!(viewer instanceof TableViewer || viewer instanceof AbstractListViewer)) {
86             throw new IllegalArgumentException JavaDoc(
87                     "This content provider only works with TableViewer or AbstractListViewer"); //$NON-NLS-1$
88
}
89
90         if (newInput != null && !(newInput instanceof IObservableList)) {
91             throw new IllegalArgumentException JavaDoc(
92                     "This content provider only works with input of type IObservableList"); //$NON-NLS-1$
93
}
94
95         setInput((IObservableList) newInput);
96     }
97
98     /**
99      * @param list
100      */

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

125     public IObservableSet getKnownElements() {
126         return knownElements;
127     }
128
129 }
130
Popular Tags