comparison dwtx/jface/viewers/deferred/DeferredContentProvider.d @ 10:b6c35faf97c8

Viewers
author Frank Benoit <benoit@tionex.de>
date Mon, 31 Mar 2008 00:47:19 +0200
parents
children ea8ff534f622
comparison
equal deleted inserted replaced
9:6c14e54dfc11 10:b6c35faf97c8
1 /*******************************************************************************
2 * Copyright (c) 2004, 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 * Port to the D programming language:
11 * Frank Benoit <benoit@tionex.de>
12 *******************************************************************************/
13 module dwtx.jface.viewers.deferred.DeferredContentProvider;
14
15 import dwtx.jface.viewers.ILazyContentProvider;
16 import dwtx.jface.viewers.deferred.AbstractVirtualTable;
17 import dwtx.jface.viewers.deferred.BackgroundContentProvider;
18 import dwtx.jface.viewers.deferred.IConcurrentModel;
19
20 import dwt.widgets.Control;
21 import dwt.widgets.Table;
22 import dwtx.core.runtime.Assert;
23 import dwtx.jface.viewers.AcceptAllFilter;
24 import dwtx.jface.viewers.IFilter;
25 import dwtx.jface.viewers.ILazyContentProvider;
26 import dwtx.jface.viewers.TableViewer;
27 import dwtx.jface.viewers.Viewer;
28
29 import dwt.dwthelper.utils;
30
31 /**
32 * Content provider that performs sorting and filtering in a background thread.
33 * Requires a <code>TableViewer</code> created with the <code>DWT.VIRTUAL</code>
34 * flag and an <code>IConcurrentModel</code> as input.
35 * <p>
36 * The sorter and filter must be set directly on the content provider.
37 * Any sorter or filter on the TableViewer will be ignored.
38 * </p>
39 *
40 * <p>
41 * The real implementation is in <code>BackgroundContentProvider</code>. This
42 * object is a lightweight wrapper that adapts the algorithm to work with
43 * <code>TableViewer</code>.
44 * </p>
45 *
46 * @since 3.1
47 */
48 public class DeferredContentProvider : ILazyContentProvider {
49
50 private int limit = -1;
51 private BackgroundContentProvider provider;
52 private Comparator sortOrder;
53 private IFilter filter;
54
55 private AbstractVirtualTable table;
56
57 private static final class TableViewerAdapter : AbstractVirtualTable {
58
59 private TableViewer viewer;
60
61 /**
62 * @param viewer
63 */
64 public this(TableViewer viewer) {
65 this.viewer = viewer;
66 }
67
68 /* (non-Javadoc)
69 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#flushCache(java.lang.Object)
70 */
71 public void clear(int index) {
72 viewer.clear(index);
73 }
74
75 /* (non-Javadoc)
76 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#replace(java.lang.Object, int)
77 */
78 public void replace(Object element, int itemIndex) {
79 viewer.replace(element, itemIndex);
80 }
81
82 /* (non-Javadoc)
83 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#setItemCount(int)
84 */
85 public void setItemCount(int total) {
86 viewer.setItemCount(total);
87 }
88
89 /* (non-Javadoc)
90 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#getItemCount()
91 */
92 public int getItemCount() {
93 return viewer.getTable().getItemCount();
94 }
95
96 /* (non-Javadoc)
97 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#getTopIndex()
98 */
99 public int getTopIndex() {
100 return Math.max(viewer.getTable().getTopIndex() - 1, 0);
101 }
102
103 /* (non-Javadoc)
104 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#getVisibleItemCount()
105 */
106 public int getVisibleItemCount() {
107 int start = getTopIndex();
108 int itemCount = getItemCount();
109 Table table = viewer.getTable();
110 return Math.min(table.getBounds().height / table.getItemHeight() + 2,
111 itemCount - start);
112 }
113
114 /* (non-Javadoc)
115 * @see dwtx.jface.viewers.deferred.AbstractVirtualTable#getControl()
116 */
117 public Control getControl() {
118 return viewer.getControl();
119 }
120
121 }
122
123 /**
124 * Create a DeferredContentProvider with the given sort order.
125 * @param sortOrder a comparator that sorts the content.
126 */
127 public this(Comparator sortOrder) {
128 this.filter = AcceptAllFilter.getInstance();
129 this.sortOrder = sortOrder;
130 }
131
132 /* (non-Javadoc)
133 * @see dwtx.jface.viewers.IContentProvider#dispose()
134 */
135 public void dispose() {
136 setProvider(null);
137 }
138
139 /* (non-Javadoc)
140 * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
141 */
142 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
143 if (newInput is null) {
144 setProvider(null);
145 return;
146 }
147
148 Assert.isTrue(null !is cast(IConcurrentModel)newInput );
149 Assert.isTrue(null !is cast(TableViewer)viewer );
150 IConcurrentModel model = cast(IConcurrentModel)newInput;
151
152 this.table = new TableViewerAdapter(cast(TableViewer)viewer);
153
154 BackgroundContentProvider newProvider = new BackgroundContentProvider(
155 table,
156 model, sortOrder);
157
158 setProvider(newProvider);
159
160 newProvider.setLimit(limit);
161 newProvider.setFilter(filter);
162 }
163
164 /**
165 * Sets the sort order for this content provider. This sort order takes priority
166 * over anything that was supplied to the <code>TableViewer</code>.
167 *
168 * @param sortOrder new sort order. The comparator must be able to support being
169 * used in a background thread.
170 */
171 public void setSortOrder(Comparator sortOrder) {
172 Assert.isNotNull(cast(Object)sortOrder);
173 this.sortOrder = sortOrder;
174 if (provider !is null) {
175 provider.setSortOrder(sortOrder);
176 }
177 }
178
179 /**
180 * Sets the filter for this content provider. This filter takes priority over
181 * anything that was supplied to the <code>TableViewer</code>. The filter
182 * must be capable of being used in a background thread.
183 *
184 * @param toSet filter to set
185 */
186 public void setFilter(IFilter toSet) {
187 this.filter = toSet;
188 if (provider !is null) {
189 provider.setFilter(toSet);
190 }
191 }
192
193 /**
194 * Sets the maximum number of rows in the table. If the model contains more
195 * than this number of elements, only the top elements will be shown based on
196 * the current sort order.
197 *
198 * @param limit maximum number of rows to show or -1 if unbounded
199 */
200 public void setLimit(int limit) {
201 this.limit = limit;
202 if (provider !is null) {
203 provider.setLimit(limit);
204 }
205 }
206
207 /**
208 * Returns the current maximum number of rows or -1 if unbounded
209 *
210 * @return the current maximum number of rows or -1 if unbounded
211 */
212 public int getLimit() {
213 return limit;
214 }
215
216 /* (non-Javadoc)
217 * @see dwtx.jface.viewers.ILazyContentProvider#updateElement(int)
218 */
219 public void updateElement(int element) {
220 if (provider !is null) {
221 provider.checkVisibleRange(element);
222 }
223 }
224
225 private void setProvider(BackgroundContentProvider newProvider) {
226 if (provider !is null) {
227 provider.dispose();
228 }
229
230 provider = newProvider;
231 }
232
233 }