Skip to content

Commit 6a4a41a

Browse files
committed
completed tree view
1 parent 86d2c90 commit 6a4a41a

File tree

1 file changed

+115
-78
lines changed

1 file changed

+115
-78
lines changed

it.baeyens.arduino.core/src/it/baeyens/arduino/ui/LibraryPreferencePage.java

Lines changed: 115 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
1515
import org.eclipse.jface.viewers.ICellModifier;
1616
import org.eclipse.jface.viewers.ICheckStateListener;
17+
import org.eclipse.jface.viewers.ICheckStateProvider;
1718
import org.eclipse.jface.viewers.ILabelProviderListener;
1819
import org.eclipse.jface.viewers.ITableLabelProvider;
1920
import org.eclipse.jface.viewers.ITreeContentProvider;
@@ -140,74 +141,103 @@ protected IStatus run(IProgressMonitor monitor) {
140141
}
141142

142143
public void createTree(Composite parent) {
144+
// Filtering applied to all columns
143145
PatternFilter filter = new PatternFilter() {
144146
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+
}
155157
};
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());
159163
viewer.setLabelProvider(new LibraryLabelProvider());
160164
viewer.setContentProvider(new LibraryContentProvider());
165+
viewer.setCheckStateProvider(new LibraryCheckProvider());
161166
viewer.setInput(new LibraryTree());
162-
167+
163168
TreeColumn name = new TreeColumn(viewer.getTree(), SWT.LEFT);
164-
name.setText("Column 1");
165169
name.setWidth(300);
166-
170+
167171
TreeColumn version = new TreeColumn(viewer.getTree(), SWT.LEFT);
168-
version.setText("Column 2");
169172
version.setWidth(100);
170173

171174
// Create the editor and set its attributes
172175
final TreeEditor editor = new TreeEditor(viewer.getTree());
173176
editor.horizontalAlignment = SWT.LEFT;
174177
editor.grabHorizontal = true;
175178
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);
176192

177193
viewer.getTree().addSelectionListener(new SelectionAdapter() {
178194
public void widgetSelected(SelectionEvent event) {
179195
if (editor.getEditor() != null) {
180196
editor.getEditor().dispose();
181197
}
182-
final TreeItem item = event.item instanceof TreeItem ? (TreeItem)event.item : null;
198+
final TreeItem item = event.item instanceof TreeItem ? (TreeItem) event.item : null;
183199
if (item != null && event.detail == SWT.CHECK) {
184200
if (item.getItemCount() > 0) {
185201
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+
}
187210
} 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());
189217
}
190218
}
191219
if (item != null && item.getItemCount() == 0 && item.getChecked()) {
192220
// Create the dropdown and add data to it
193221
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()) {
195223
combo.add(version.toString());
196224
}
197-
225+
198226
// Select the previously selected item from the cell
199227
combo.select(combo.indexOf(item.getText(1)));
200228

201229
// Compute the width for the editor
202230
// 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;
204233
// version.setWidth(editor.minimumWidth);
205234

206235
// Set the focus on the dropdown and set into the editor
207236
combo.setFocus();
208237
editor.setEditor(combo, item, 1);
209238

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
211241
combo.addSelectionListener(new SelectionAdapter() {
212242
public void widgetSelected(SelectionEvent event) {
213243
item.setText(1, combo.getText());
@@ -217,63 +247,41 @@ public void widgetSelected(SelectionEvent event) {
217247
});
218248
}
219249
}
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-
}
258250
});
259-
viewer.refresh(true);
260251
}
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+
262267
static class LibraryLabelProvider implements ITableLabelProvider {
263268

264269
@Override
265-
public void addListener(ILabelProviderListener arg0) { }
270+
public void addListener(ILabelProviderListener arg0) {
271+
}
266272

267273
@Override
268-
public void dispose() { }
274+
public void dispose() {
275+
}
269276

270277
@Override
271278
public boolean isLabelProperty(Object arg0, String arg1) {
272279
return false;
273280
}
274281

275282
@Override
276-
public void removeListener(ILabelProviderListener arg0) { }
283+
public void removeListener(ILabelProviderListener arg0) {
284+
}
277285

278286
@Override
279287
public Image getColumnImage(Object element, int col) {
@@ -283,17 +291,46 @@ public Image getColumnImage(Object element, int col) {
283291
@Override
284292
public String getColumnText(Object element, int col) {
285293
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+
}
294302
}
295303
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+
}
297334

298335
static class LibraryContentProvider implements ITreeContentProvider {
299336

@@ -310,15 +347,15 @@ public Object getParent(Object node) {
310347
@Override
311348
public boolean hasChildren(Object node) {
312349
if (node instanceof LibraryTree) {
313-
return !((LibraryTree)node).getCategories().isEmpty();
350+
return !((LibraryTree) node).getCategories().isEmpty();
314351
}
315352
return ((LibraryTree.Node) node).hasChildren();
316353
}
317354

318355
@Override
319356
public Object[] getElements(Object node) {
320357
if (node instanceof LibraryTree) {
321-
return ((LibraryTree)node).getCategories().toArray();
358+
return ((LibraryTree) node).getCategories().toArray();
322359
}
323360
return getChildren(node);
324361
}

0 commit comments

Comments
 (0)