comparison dwtx/jface/viewers/TreeViewerRow.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) 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 * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
11 * - Fix for bug 174355, 171126
12 * Port to the D programming language:
13 * Frank Benoit <benoit@tionex.de>
14 *******************************************************************************/
15
16 module dwtx.jface.viewers.TreeViewerRow;
17
18 import dwtx.jface.viewers.ViewerRow;
19 import dwtx.jface.viewers.TreePath;
20
21 import tango.util.collection.LinkSeq;
22
23 import dwt.graphics.Color;
24 import dwt.graphics.Font;
25 import dwt.graphics.Image;
26 import dwt.graphics.Rectangle;
27 import dwt.widgets.Control;
28 import dwt.widgets.Tree;
29 import dwt.widgets.TreeItem;
30 import dwt.widgets.Widget;
31 import dwtx.core.runtime.Assert;
32
33 import dwt.dwthelper.utils;
34
35 /**
36 * TreeViewerRow is the Tree implementation of ViewerRow.
37 * @since 3.3
38 *
39 */
40 public class TreeViewerRow : ViewerRow {
41 private TreeItem item;
42
43 /**
44 * Create a new instance of the receiver.
45 * @param item
46 */
47 this(TreeItem item) {
48 this.item = item;
49 }
50
51 /* (non-Javadoc)
52 * @see dwtx.jface.viewers.ViewerRow#getBounds(int)
53 */
54 public Rectangle getBounds(int columnIndex) {
55 return item.getBounds(columnIndex);
56 }
57
58 /* (non-Javadoc)
59 * @see dwtx.jface.viewers.ViewerRow#getBounds()
60 */
61 public Rectangle getBounds() {
62 return item.getBounds();
63 }
64
65 /* (non-Javadoc)
66 * @see dwtx.jface.viewers.ViewerRow#getColumnCount()
67 */
68 public int getColumnCount() {
69 return item.getParent().getColumnCount();
70 }
71
72 /* (non-Javadoc)
73 * @see dwtx.jface.viewers.ViewerRow#getItem()
74 */
75 public Widget getItem() {
76 return item;
77 }
78
79 /* (non-Javadoc)
80 * @see dwtx.jface.viewers.ViewerRow#getBackground(int)
81 */
82 public Color getBackground(int columnIndex) {
83 return item.getBackground(columnIndex);
84 }
85
86 /* (non-Javadoc)
87 * @see dwtx.jface.viewers.ViewerRow#getFont(int)
88 */
89 public Font getFont(int columnIndex) {
90 return item.getFont(columnIndex);
91 }
92
93 /* (non-Javadoc)
94 * @see dwtx.jface.viewers.ViewerRow#getForeground(int)
95 */
96 public Color getForeground(int columnIndex) {
97 return item.getForeground(columnIndex);
98 }
99
100 /* (non-Javadoc)
101 * @see dwtx.jface.viewers.ViewerRow#getImage(int)
102 */
103 public Image getImage(int columnIndex) {
104 return item.getImage(columnIndex);
105 }
106
107 /* (non-Javadoc)
108 * @see dwtx.jface.viewers.ViewerRow#getText(int)
109 */
110 public String getText(int columnIndex) {
111 return item.getText(columnIndex);
112 }
113
114 /* (non-Javadoc)
115 * @see dwtx.jface.viewers.ViewerRow#setBackground(int, dwt.graphics.Color)
116 */
117 public void setBackground(int columnIndex, Color color) {
118 item.setBackground(columnIndex, color);
119 }
120
121 /* (non-Javadoc)
122 * @see dwtx.jface.viewers.ViewerRow#setFont(int, dwt.graphics.Font)
123 */
124 public void setFont(int columnIndex, Font font) {
125 item.setFont(columnIndex, font);
126 }
127
128 /* (non-Javadoc)
129 * @see dwtx.jface.viewers.ViewerRow#setForeground(int, dwt.graphics.Color)
130 */
131 public void setForeground(int columnIndex, Color color) {
132 item.setForeground(columnIndex, color);
133 }
134
135 /* (non-Javadoc)
136 * @see dwtx.jface.viewers.ViewerRow#setImage(int, dwt.graphics.Image)
137 */
138 public void setImage(int columnIndex, Image image) {
139 Image oldImage = item.getImage(columnIndex);
140 if (image !is oldImage) {
141 item.setImage(columnIndex, image);
142 }
143 }
144
145 /* (non-Javadoc)
146 * @see dwtx.jface.viewers.ViewerRow#setText(int, java.lang.String)
147 */
148 public void setText(int columnIndex, String text) {
149 item.setText(columnIndex, text is null ? "" : text); //$NON-NLS-1$
150 }
151
152 /* (non-Javadoc)
153 * @see dwtx.jface.viewers.ViewerRow#getControl()
154 */
155 public Control getControl() {
156 return item.getParent();
157 }
158
159
160 public ViewerRow getNeighbor(int direction, bool sameLevel) {
161 if( direction is ViewerRow.ABOVE ) {
162 return getRowAbove(sameLevel);
163 } else if( direction is ViewerRow.BELOW ) {
164 return getRowBelow(sameLevel);
165 } else {
166 throw new IllegalArgumentException("Illegal value of direction argument."); //$NON-NLS-1$
167 }
168 }
169
170 private ViewerRow getRowBelow(bool sameLevel) {
171 Tree tree = item.getParent();
172
173 // This means we have top-level item
174 if( item.getParentItem() is null ) {
175 if( sameLevel || ! item.getExpanded() ) {
176 int index = tree.indexOf(item) + 1;
177
178 if( index < tree.getItemCount() ) {
179 return new TreeViewerRow(tree.getItem(index));
180 }
181 } else if( item.getExpanded() && item.getItemCount() > 0 ) {
182 return new TreeViewerRow(item.getItem(0));
183 }
184 } else {
185 if( sameLevel || ! item.getExpanded() ) {
186 TreeItem parentItem = item.getParentItem();
187
188 int nextIndex = parentItem.indexOf(item) + 1;
189 int totalIndex = parentItem.getItemCount();
190
191 TreeItem itemAfter;
192
193 // This would mean that it was the last item
194 if( nextIndex is totalIndex ) {
195 itemAfter = findNextItem( parentItem );
196 } else {
197 itemAfter = parentItem.getItem(nextIndex);
198 }
199
200 if( itemAfter !is null ) {
201 return new TreeViewerRow(itemAfter);
202 }
203
204 } else if( item.getExpanded() && item.getItemCount() > 0 ) {
205 return new TreeViewerRow(item.getItem(0));
206 }
207 }
208
209 return null;
210 }
211
212 private ViewerRow getRowAbove(bool sameLevel) {
213 Tree tree = item.getParent();
214
215 // This means we have top-level item
216 if( item.getParentItem() is null ) {
217 int index = tree.indexOf(item) - 1;
218 TreeItem nextTopItem = null;
219
220 if( index >= 0 ) {
221 nextTopItem = tree.getItem(index);
222 }
223
224 if( nextTopItem !is null ) {
225 if( sameLevel ) {
226 return new TreeViewerRow(nextTopItem);
227 }
228
229 return new TreeViewerRow(findLastVisibleItem(nextTopItem));
230 }
231 } else {
232 TreeItem parentItem = item.getParentItem();
233 int previousIndex = parentItem.indexOf(item) - 1;
234
235 TreeItem itemBefore;
236 if( previousIndex >= 0 ) {
237 if( sameLevel ) {
238 itemBefore = parentItem.getItem(previousIndex);
239 } else {
240 itemBefore = findLastVisibleItem(parentItem.getItem(previousIndex));
241 }
242 } else {
243 itemBefore = parentItem;
244 }
245
246 if( itemBefore !is null ) {
247 return new TreeViewerRow(itemBefore);
248 }
249 }
250
251 return null;
252 }
253
254 private TreeItem findLastVisibleItem(TreeItem parentItem) {
255 TreeItem rv = parentItem;
256
257 while( rv.getExpanded() && rv.getItemCount() > 0 ) {
258 rv = rv.getItem(rv.getItemCount()-1);
259 }
260
261 return rv;
262 }
263
264 private TreeItem findNextItem(TreeItem item) {
265 TreeItem rv = null;
266 Tree tree = item.getParent();
267 TreeItem parentItem = item.getParentItem();
268
269 int nextIndex;
270 int totalItems;
271
272 if( parentItem is null ) {
273 nextIndex = tree.indexOf(item) + 1;
274 totalItems = tree.getItemCount();
275 } else {
276 nextIndex = parentItem.indexOf(item) + 1;
277 totalItems = parentItem.getItemCount();
278 }
279
280 // This is once more the last item in the tree
281 // Search on
282 if( nextIndex is totalItems ) {
283 if( item.getParentItem() !is null ) {
284 rv = findNextItem(item.getParentItem());
285 }
286 } else {
287 if( parentItem is null ) {
288 rv = tree.getItem(nextIndex);
289 } else {
290 rv = parentItem.getItem(nextIndex);
291 }
292 }
293
294 return rv;
295 }
296
297 public TreePath getTreePath() {
298 TreeItem tItem = item;
299 auto segments = new LinkSeq!(Object);
300 while (tItem !is null) {
301 Object segment = tItem.getData();
302 Assert.isNotNull(segment);
303 segments.prepend(segment);
304 tItem = tItem.getParentItem();
305 }
306
307 return new TreePath(segments.toArray());
308 }
309
310 void setItem(TreeItem item) {
311 this.item = item;
312 }
313
314 public Object clone() {
315 return new TreeViewerRow(item);
316 }
317
318 public Object getElement() {
319 return item.getData();
320 }
321 }