14
14
import org .eclipse .jface .viewers .ComboBoxViewerCellEditor ;
15
15
import org .eclipse .jface .viewers .ICellModifier ;
16
16
import org .eclipse .jface .viewers .ICheckStateListener ;
17
+ import org .eclipse .jface .viewers .ICheckStateProvider ;
17
18
import org .eclipse .jface .viewers .ILabelProviderListener ;
18
19
import org .eclipse .jface .viewers .ITableLabelProvider ;
19
20
import org .eclipse .jface .viewers .ITreeContentProvider ;
@@ -140,74 +141,103 @@ protected IStatus run(IProgressMonitor monitor) {
140
141
}
141
142
142
143
public void createTree (Composite parent ) {
144
+ // Filtering applied to all columns
143
145
PatternFilter filter = new PatternFilter () {
144
146
protected boolean isLeafMatch (final Viewer viewer , final Object element ) {
145
- TreeViewer treeViewer = (TreeViewer )viewer ;
146
- int numberOfColumns = treeViewer .getTree ().getColumnCount ();
147
- ITableLabelProvider labelProvider = (ITableLabelProvider )treeViewer .getLabelProvider ();
148
- boolean isMatch = false ;
149
- for (int columnIndex = 0 ; columnIndex < numberOfColumns ; columnIndex ++) {
150
- String labelText = labelProvider .getColumnText (element , columnIndex );
151
- isMatch |= wordMatches (labelText );
152
- }
153
- return isMatch ;
154
- }
147
+ TreeViewer treeViewer = (TreeViewer ) viewer ;
148
+ int numberOfColumns = treeViewer .getTree ().getColumnCount ();
149
+ ITableLabelProvider labelProvider = (ITableLabelProvider ) treeViewer .getLabelProvider ();
150
+ boolean isMatch = false ;
151
+ for (int columnIndex = 0 ; columnIndex < numberOfColumns ; columnIndex ++) {
152
+ String labelText = labelProvider .getColumnText (element , columnIndex );
153
+ isMatch |= wordMatches (labelText );
154
+ }
155
+ return isMatch ;
156
+ }
155
157
};
156
- FilteredTree tree = new FilteredTree (parent , SWT .CHECK | SWT .V_SCROLL | SWT .BORDER | SWT .FULL_SELECTION , filter , true );
157
-
158
- TreeViewer viewer = tree .getViewer ();
158
+ FilteredTree tree = new FilteredTree (parent , SWT .CHECK | SWT .V_SCROLL | SWT .BORDER | SWT .FULL_SELECTION , filter ,
159
+ true );
160
+
161
+ // Trick to replace the tree viewer
162
+ CheckboxTreeViewer viewer = new CheckboxTreeViewer (tree .getViewer ().getTree ());
159
163
viewer .setLabelProvider (new LibraryLabelProvider ());
160
164
viewer .setContentProvider (new LibraryContentProvider ());
165
+ viewer .setCheckStateProvider (new LibraryCheckProvider ());
161
166
viewer .setInput (new LibraryTree ());
162
-
167
+
163
168
TreeColumn name = new TreeColumn (viewer .getTree (), SWT .LEFT );
164
- name .setText ("Column 1" );
165
169
name .setWidth (300 );
166
-
170
+
167
171
TreeColumn version = new TreeColumn (viewer .getTree (), SWT .LEFT );
168
- version .setText ("Column 2" );
169
172
version .setWidth (100 );
170
173
171
174
// Create the editor and set its attributes
172
175
final TreeEditor editor = new TreeEditor (viewer .getTree ());
173
176
editor .horizontalAlignment = SWT .LEFT ;
174
177
editor .grabHorizontal = true ;
175
178
editor .setColumn (1 );
179
+ // viewer.expandAll();
180
+ // for (TreeItem category : viewer.getTree().getItems()) {
181
+ // for (TreeItem library : category.getItems()) {
182
+ // if (((LibraryTree.Library) library.getData()).getInstalled() != null) {
183
+ // // mark library as installed
184
+ // library.setChecked(true);
185
+ // }
186
+ // verifySubtreeCheckStatus(category);
187
+ // }
188
+ // }
189
+ // viewer.collapseAll();
190
+
191
+ viewer .refresh (true );
176
192
177
193
viewer .getTree ().addSelectionListener (new SelectionAdapter () {
178
194
public void widgetSelected (SelectionEvent event ) {
179
195
if (editor .getEditor () != null ) {
180
196
editor .getEditor ().dispose ();
181
197
}
182
- final TreeItem item = event .item instanceof TreeItem ? (TreeItem )event .item : null ;
198
+ final TreeItem item = event .item instanceof TreeItem ? (TreeItem ) event .item : null ;
183
199
if (item != null && event .detail == SWT .CHECK ) {
184
200
if (item .getItemCount () > 0 ) {
185
201
item .setGrayed (false );
186
- this .setChecked (item .getItems (), item .getChecked ());
202
+ for (TreeItem child : item .getItems ()) {
203
+ child .setChecked (child .getChecked ());
204
+ if (child .getChecked ()) {
205
+ child .setText (1 , ((LibraryTree .Library ) item .getData ()).getLatest ());
206
+ } else {
207
+ child .setText (1 , "" );
208
+ }
209
+ }
187
210
} else {
188
- this .setChecked (item , item .getChecked ());
211
+ if (item .getChecked ()) {
212
+ item .setText (1 , ((LibraryTree .Library ) item .getData ()).getLatest ());
213
+ } else {
214
+ item .setText (1 , "" );
215
+ }
216
+ verifySubtreeCheckStatus (item .getParentItem ());
189
217
}
190
218
}
191
219
if (item != null && item .getItemCount () == 0 && item .getChecked ()) {
192
220
// Create the dropdown and add data to it
193
221
final CCombo combo = new CCombo (viewer .getTree (), SWT .READ_ONLY );
194
- for (LibraryTree .Version version : ((LibraryTree .Library )item .getData ()).getVersions ()) {
222
+ for (LibraryTree .Version version : ((LibraryTree .Library ) item .getData ()).getVersions ()) {
195
223
combo .add (version .toString ());
196
224
}
197
-
225
+
198
226
// Select the previously selected item from the cell
199
227
combo .select (combo .indexOf (item .getText (1 )));
200
228
201
229
// Compute the width for the editor
202
230
// Also, compute the column width, so that the dropdown fits
203
- // editor.minimumWidth = combo.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
231
+ // editor.minimumWidth = combo.computeSize(SWT.DEFAULT,
232
+ // SWT.DEFAULT).x;
204
233
// version.setWidth(editor.minimumWidth);
205
234
206
235
// Set the focus on the dropdown and set into the editor
207
236
combo .setFocus ();
208
237
editor .setEditor (combo , item , 1 );
209
238
210
- // Add a listener to set the selected item back into the cell
239
+ // Add a listener to set the selected item back into the
240
+ // cell
211
241
combo .addSelectionListener (new SelectionAdapter () {
212
242
public void widgetSelected (SelectionEvent event ) {
213
243
item .setText (1 , combo .getText ());
@@ -217,63 +247,41 @@ public void widgetSelected(SelectionEvent event) {
217
247
});
218
248
}
219
249
}
220
-
221
- public void setChecked (TreeItem [] items , boolean checked ) {
222
- for (TreeItem item : items ) {
223
- item .setChecked (checked );
224
- if (checked ) {
225
- item .setText (1 , ((LibraryTree .Library )item .getData ()).getLatest ());
226
- } else {
227
- item .setText (1 , "" );
228
- if (item .getParentItem ().getChecked ()) {
229
- item .getParentItem ().setGrayed (true );
230
- }
231
- }
232
- }
233
- }
234
-
235
- public void setChecked (TreeItem item , boolean checked ) {
236
- if (checked ) {
237
- item .setText (1 , ((LibraryTree .Library )item .getData ()).getLatest ());
238
- item .getParentItem ().setChecked (true );
239
- if (item .getParentItem ().getGrayed ()) {
240
- boolean grayed = false ;
241
- for (TreeItem child : item .getParentItem ().getItems ()) {
242
- if (!child .getChecked () && child != item ) {
243
- grayed = true ;
244
- break ;
245
- }
246
- }
247
- item .getParentItem ().setGrayed (grayed );
248
- }
249
- } else {
250
- item .setText (1 , "" );
251
- if (item .getParentItem ().getItemCount () == 1 ) {
252
- item .getParentItem ().setChecked (checked );
253
- } else {
254
- item .getParentItem ().setGrayed (true );
255
- }
256
- }
257
- }
258
250
});
259
- viewer .refresh (true );
260
251
}
261
-
252
+
253
+ public void verifySubtreeCheckStatus (TreeItem item ) {
254
+ boolean grayed = false ;
255
+ boolean checked = false ;
256
+ for (TreeItem child : item .getItems ()) {
257
+ if (child .getChecked ()) {
258
+ checked = true ;
259
+ } else {
260
+ grayed = true ;
261
+ }
262
+ }
263
+ item .setChecked (checked );
264
+ item .setGrayed (grayed );
265
+ }
266
+
262
267
static class LibraryLabelProvider implements ITableLabelProvider {
263
268
264
269
@ Override
265
- public void addListener (ILabelProviderListener arg0 ) { }
270
+ public void addListener (ILabelProviderListener arg0 ) {
271
+ }
266
272
267
273
@ Override
268
- public void dispose () { }
274
+ public void dispose () {
275
+ }
269
276
270
277
@ Override
271
278
public boolean isLabelProperty (Object arg0 , String arg1 ) {
272
279
return false ;
273
280
}
274
281
275
282
@ Override
276
- public void removeListener (ILabelProviderListener arg0 ) { }
283
+ public void removeListener (ILabelProviderListener arg0 ) {
284
+ }
277
285
278
286
@ Override
279
287
public Image getColumnImage (Object element , int col ) {
@@ -283,17 +291,46 @@ public Image getColumnImage(Object element, int col) {
283
291
@ Override
284
292
public String getColumnText (Object element , int col ) {
285
293
switch (col ) {
286
- case 0 :
287
- return ((LibraryTree .Node )element ).getName ();
288
- case 1 :
289
- if (element instanceof LibraryTree .Library ) {
290
- return ((LibraryTree .Library )element ).getInstalled ();
291
- } else {
292
- return "" ;
293
- }
294
+ case 0 :
295
+ return ((LibraryTree .Node ) element ).getName ();
296
+ case 1 :
297
+ if (element instanceof LibraryTree .Library ) {
298
+ return ((LibraryTree .Library ) element ).getInstalled ();
299
+ } else {
300
+ return "" ;
301
+ }
294
302
}
295
303
return null ;
296
- }}
304
+ }
305
+ }
306
+
307
+ static class LibraryCheckProvider implements ICheckStateProvider {
308
+ @ Override
309
+ public boolean isChecked (Object element ) {
310
+ if (element instanceof LibraryTree .Library ) {
311
+ return ((LibraryTree .Library ) element ).getInstalled () != null ;
312
+ } else if (element instanceof LibraryTree .Category ) {
313
+ for (LibraryTree .Library library : ((LibraryTree .Category )element ).getLibraries ()) {
314
+ if (library .getInstalled () != null ) {
315
+ return true ;
316
+ }
317
+ }
318
+ }
319
+ return false ;
320
+ }
321
+
322
+ @ Override
323
+ public boolean isGrayed (Object element ) {
324
+ if (element instanceof LibraryTree .Category && isChecked (element )) {
325
+ for (LibraryTree .Library library : ((LibraryTree .Category )element ).getLibraries ()) {
326
+ if (library .getInstalled () == null ) {
327
+ return true ;
328
+ }
329
+ }
330
+ }
331
+ return false ;
332
+ }
333
+ }
297
334
298
335
static class LibraryContentProvider implements ITreeContentProvider {
299
336
@@ -310,15 +347,15 @@ public Object getParent(Object node) {
310
347
@ Override
311
348
public boolean hasChildren (Object node ) {
312
349
if (node instanceof LibraryTree ) {
313
- return !((LibraryTree )node ).getCategories ().isEmpty ();
350
+ return !((LibraryTree ) node ).getCategories ().isEmpty ();
314
351
}
315
352
return ((LibraryTree .Node ) node ).hasChildren ();
316
353
}
317
354
318
355
@ Override
319
356
public Object [] getElements (Object node ) {
320
357
if (node instanceof LibraryTree ) {
321
- return ((LibraryTree )node ).getCategories ().toArray ();
358
+ return ((LibraryTree ) node ).getCategories ().toArray ();
322
359
}
323
360
return getChildren (node );
324
361
}
0 commit comments