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