1
1
package it .baeyens .arduino .ui ;
2
2
3
3
import java .util .HashMap ;
4
- import java .util .Map . Entry ;
4
+ import java .util .Map ;
5
5
6
6
import org .eclipse .core .runtime .IProgressMonitor ;
7
7
import org .eclipse .core .runtime .IStatus ;
8
8
import org .eclipse .core .runtime .MultiStatus ;
9
9
import org .eclipse .core .runtime .jobs .Job ;
10
10
import org .eclipse .jface .preference .PreferencePage ;
11
- import org .eclipse .jface .viewers .CheckStateChangedEvent ;
12
- import org .eclipse .jface .viewers .CheckboxCellEditor ;
13
11
import org .eclipse .jface .viewers .CheckboxTreeViewer ;
14
- import org .eclipse .jface .viewers .ComboBoxViewerCellEditor ;
15
- import org .eclipse .jface .viewers .ICellModifier ;
16
- import org .eclipse .jface .viewers .ICheckStateListener ;
17
12
import org .eclipse .jface .viewers .ICheckStateProvider ;
18
13
import org .eclipse .jface .viewers .ILabelProviderListener ;
19
14
import org .eclipse .jface .viewers .ITableLabelProvider ;
20
15
import org .eclipse .jface .viewers .ITreeContentProvider ;
21
- import org .eclipse .jface .viewers .LabelProvider ;
22
16
import org .eclipse .jface .viewers .TreeViewer ;
23
17
import org .eclipse .jface .viewers .Viewer ;
24
- import org .eclipse .jface .viewers .ViewerFilter ;
25
18
import org .eclipse .swt .SWT ;
26
19
import org .eclipse .swt .custom .CCombo ;
27
20
import org .eclipse .swt .custom .TreeEditor ;
28
- import org .eclipse .swt .events .FocusAdapter ;
29
- import org .eclipse .swt .events .FocusEvent ;
30
- import org .eclipse .swt .events .KeyAdapter ;
31
- import org .eclipse .swt .events .KeyEvent ;
32
- import org .eclipse .swt .events .MenuAdapter ;
33
- import org .eclipse .swt .events .MenuEvent ;
34
- import org .eclipse .swt .events .ModifyEvent ;
35
- import org .eclipse .swt .events .ModifyListener ;
36
- import org .eclipse .swt .events .MouseAdapter ;
37
- import org .eclipse .swt .events .MouseEvent ;
38
21
import org .eclipse .swt .events .SelectionAdapter ;
39
22
import org .eclipse .swt .events .SelectionEvent ;
40
23
import org .eclipse .swt .graphics .Image ;
41
- import org .eclipse .swt .graphics .Point ;
42
24
import org .eclipse .swt .layout .GridData ;
43
25
import org .eclipse .swt .layout .GridLayout ;
44
26
import org .eclipse .swt .widgets .Composite ;
45
27
import org .eclipse .swt .widgets .Control ;
46
- import org .eclipse .swt .widgets .Event ;
47
- import org .eclipse .swt .widgets .Listener ;
48
- import org .eclipse .swt .widgets .Menu ;
49
- import org .eclipse .swt .widgets .MenuItem ;
50
- import org .eclipse .swt .widgets .Table ;
51
28
import org .eclipse .swt .widgets .Text ;
52
29
import org .eclipse .swt .widgets .Tree ;
53
30
import org .eclipse .swt .widgets .TreeColumn ;
63
40
64
41
public class LibraryPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
65
42
66
- protected HashMap <String , String > ModdedLibraries = null ;
67
- private Table table ;
68
- ModifyListener tt = new ModifyListener () {
69
-
70
- @ Override
71
- public void modifyText (ModifyEvent e ) {
72
- // TODO Auto-generated method stub
73
- CCombo theCombo = (CCombo ) e .getSource ();
74
- String libname = (String ) theCombo .getData ();
75
- String version = theCombo .getText ();
76
- LibraryPreferencePage .this .ModdedLibraries .put (libname , version );
77
- }
78
- };
79
-
43
+ private Tree tree ;
44
+ private CheckboxTreeViewer viewer ;
45
+ private TreeEditor editor ;
46
+
80
47
@ Override
81
48
public void init (IWorkbench workbench ) {
82
49
// nothing needed here
83
50
}
84
51
52
+ @ Override
53
+ protected void performDefaults () {
54
+ viewer .setInput (new LibraryTree ());
55
+ editor .getEditor ().dispose ();
56
+ super .performDefaults ();
57
+ }
58
+
85
59
@ Override
86
60
protected Control createContents (Composite parent ) {
87
61
Composite control = new Composite (parent , SWT .NONE );
@@ -91,57 +65,46 @@ protected Control createContents(Composite parent) {
91
65
GridData layoutData = new GridData (SWT .FILL , SWT .FILL , true , false );
92
66
desc .setLayoutData (layoutData );
93
67
desc .setBackground (parent .getBackground ());
94
- desc .setText ("Add/remove libraries or change available versions ." ); //$NON-NLS-1$
95
- createTree (control );
68
+ desc .setText ("Add/remove libraries or change their version ." );
69
+ this . createTree (control );
96
70
97
71
return control ;
98
72
}
99
73
100
- protected IStatus updateInstallation (IProgressMonitor monitor ) {
101
- MultiStatus status = new MultiStatus (Activator .getId (), 0 , Messages .ui_installing_arduino_libraries , null );
102
-
103
- if (this .ModdedLibraries != null ) {
104
- if (this .ModdedLibraries .size () > 0 ) {
105
-
106
- for (Entry <String , String > curTableItem : this .ModdedLibraries .entrySet ()) {
107
- String Version = curTableItem .getValue ();
108
- String libName = curTableItem .getKey ();
109
- Library removeLib = Manager .getLibraryIndex ().getInstalledLibrary (libName );
110
- if (removeLib != null ) {
111
- if (!(removeLib .getVersion ().equals (Version ))) {
112
- status .add (removeLib .remove (monitor ));
113
- }
114
-
115
- }
116
- Library curLib = Manager .getLibraryIndex ().getLibrary (libName , Version );
117
- if (curLib != null ) {
118
- if (!curLib .isInstalled ()) {
119
- status .add (curLib .install (monitor ));
120
- }
121
- }
74
+ @ Override
75
+ public boolean performOk () {
76
+ final HashMap <String , String > libs = new HashMap <>();
77
+ for (TreeItem category : tree .getItems ()) {
78
+ for (TreeItem item : category .getItems ()) {
79
+ if (item .getData () instanceof LibraryTree .Library ) {
80
+ libs .put (item .getText (0 ), item .getText (1 ));
122
81
}
123
82
}
124
83
}
125
- return status ;
126
- }
127
-
128
- @ Override
129
- public boolean performOk () {
130
84
new Job (Messages .ui_Adopting_arduino_libraries ) {
131
85
132
86
@ Override
133
87
protected IStatus run (IProgressMonitor monitor ) {
134
-
135
- return updateInstallation (monitor );
136
-
88
+ MultiStatus status = new MultiStatus (Activator .getId (), 0 , Messages .ui_installing_arduino_libraries , null );
89
+ for (Map .Entry <String , String > lib : libs .entrySet ()) {
90
+ Library toRemove = Manager .getLibraryIndex ().getInstalledLibrary (lib .getKey ());
91
+ if (toRemove != null && !toRemove .getVersion ().equals (lib .getValue ())) {
92
+ status .add (toRemove .remove (monitor ));
93
+ }
94
+ Library toInstall = Manager .getLibraryIndex ().getLibrary (lib .getKey (), lib .getValue ());
95
+ if (toInstall != null && !toInstall .isInstalled ()) {
96
+ status .add (toInstall .install (monitor ));
97
+ }
98
+ }
99
+ return status ;
137
100
}
138
101
}.schedule ();
139
102
140
103
return true ;
141
104
}
142
-
105
+
143
106
public void createTree (Composite parent ) {
144
- // Filtering applied to all columns
107
+ // filtering applied to all columns
145
108
PatternFilter filter = new PatternFilter () {
146
109
protected boolean isLeafMatch (final Viewer viewer , final Object element ) {
147
110
TreeViewer treeViewer = (TreeViewer ) viewer ;
@@ -155,11 +118,11 @@ protected boolean isLeafMatch(final Viewer viewer, final Object element) {
155
118
return isMatch ;
156
119
}
157
120
};
158
- FilteredTree tree = new FilteredTree ( parent , SWT . CHECK | SWT . V_SCROLL | SWT . BORDER | SWT . FULL_SELECTION , filter ,
159
- true );
121
+
122
+ tree = new FilteredTree ( parent , SWT . CHECK | SWT . V_SCROLL | SWT . BORDER | SWT . FULL_SELECTION , filter , true ). getViewer (). getTree ( );
160
123
161
- // Trick to replace the tree viewer
162
- CheckboxTreeViewer viewer = new CheckboxTreeViewer (tree . getViewer (). getTree () );
124
+ // trick to replace the tree viewer
125
+ viewer = new CheckboxTreeViewer (tree );
163
126
viewer .setLabelProvider (new LibraryLabelProvider ());
164
127
viewer .setContentProvider (new LibraryContentProvider ());
165
128
viewer .setCheckStateProvider (new LibraryCheckProvider ());
@@ -171,25 +134,16 @@ protected boolean isLeafMatch(final Viewer viewer, final Object element) {
171
134
TreeColumn version = new TreeColumn (viewer .getTree (), SWT .LEFT );
172
135
version .setWidth (100 );
173
136
174
- // Create the editor and set its attributes
175
- final TreeEditor editor = new TreeEditor (viewer .getTree ());
137
+ // create the editor and set its attributes
138
+ editor = new TreeEditor (viewer .getTree ());
176
139
editor .horizontalAlignment = SWT .LEFT ;
177
140
editor .grabHorizontal = true ;
178
141
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
142
143
+ // this ensures the tree labels are displayed correctly
191
144
viewer .refresh (true );
192
145
146
+ // tree interactions listener
193
147
viewer .getTree ().addSelectionListener (new SelectionAdapter () {
194
148
public void widgetSelected (SelectionEvent event ) {
195
149
if (editor .getEditor () != null ) {
@@ -200,9 +154,9 @@ public void widgetSelected(SelectionEvent event) {
200
154
if (item .getItemCount () > 0 ) {
201
155
item .setGrayed (false );
202
156
for (TreeItem child : item .getItems ()) {
203
- child .setChecked (child .getChecked ());
157
+ child .setChecked (item .getChecked ());
204
158
if (child .getChecked ()) {
205
- child .setText (1 , ((LibraryTree .Library ) item .getData ()).getLatest ());
159
+ child .setText (1 , ((LibraryTree .Library ) child .getData ()).getLatest ());
206
160
} else {
207
161
child .setText (1 , "" );
208
162
}
@@ -228,9 +182,6 @@ public void widgetSelected(SelectionEvent event) {
228
182
229
183
// Compute the width for the editor
230
184
// Also, compute the column width, so that the dropdown fits
231
- // editor.minimumWidth = combo.computeSize(SWT.DEFAULT,
232
- // SWT.DEFAULT).x;
233
- // version.setWidth(editor.minimumWidth);
234
185
235
186
// Set the focus on the dropdown and set into the editor
236
187
combo .setFocus ();
@@ -250,7 +201,13 @@ public void widgetSelected(SelectionEvent event) {
250
201
});
251
202
}
252
203
253
- public void verifySubtreeCheckStatus (TreeItem item ) {
204
+ /**
205
+ * Ensures the correct checked/unchecked/greyed attributes are set
206
+ * on the category.
207
+ *
208
+ * @param item the tree item representing the category
209
+ */
210
+ private void verifySubtreeCheckStatus (TreeItem item ) {
254
211
boolean grayed = false ;
255
212
boolean checked = false ;
256
213
for (TreeItem child : item .getItems ()) {
@@ -264,7 +221,12 @@ public void verifySubtreeCheckStatus(TreeItem item) {
264
221
item .setGrayed (grayed );
265
222
}
266
223
267
- static class LibraryLabelProvider implements ITableLabelProvider {
224
+ /**
225
+ *
226
+ * Displays the tree labels for both columns: name and version
227
+ *
228
+ */
229
+ private static class LibraryLabelProvider implements ITableLabelProvider {
268
230
269
231
@ Override
270
232
public void addListener (ILabelProviderListener arg0 ) {
@@ -303,14 +265,18 @@ public String getColumnText(Object element, int col) {
303
265
return null ;
304
266
}
305
267
}
306
-
307
- static class LibraryCheckProvider implements ICheckStateProvider {
268
+
269
+ /**
270
+ * Provides the correct checked status for installed libraries
271
+ *
272
+ */
273
+ private static class LibraryCheckProvider implements ICheckStateProvider {
308
274
@ Override
309
275
public boolean isChecked (Object element ) {
310
276
if (element instanceof LibraryTree .Library ) {
311
277
return ((LibraryTree .Library ) element ).getInstalled () != null ;
312
278
} else if (element instanceof LibraryTree .Category ) {
313
- for (LibraryTree .Library library : ((LibraryTree .Category )element ).getLibraries ()) {
279
+ for (LibraryTree .Library library : ((LibraryTree .Category ) element ).getLibraries ()) {
314
280
if (library .getInstalled () != null ) {
315
281
return true ;
316
282
}
@@ -322,7 +288,7 @@ public boolean isChecked(Object element) {
322
288
@ Override
323
289
public boolean isGrayed (Object element ) {
324
290
if (element instanceof LibraryTree .Category && isChecked (element )) {
325
- for (LibraryTree .Library library : ((LibraryTree .Category )element ).getLibraries ()) {
291
+ for (LibraryTree .Library library : ((LibraryTree .Category ) element ).getLibraries ()) {
326
292
if (library .getInstalled () == null ) {
327
293
return true ;
328
294
}
@@ -332,7 +298,11 @@ public boolean isGrayed(Object element) {
332
298
}
333
299
}
334
300
335
- static class LibraryContentProvider implements ITreeContentProvider {
301
+ /**
302
+ * Provides the tree content data
303
+ *
304
+ */
305
+ private static class LibraryContentProvider implements ITreeContentProvider {
336
306
337
307
@ Override
338
308
public Object [] getChildren (Object node ) {
@@ -341,7 +311,10 @@ public Object[] getChildren(Object node) {
341
311
342
312
@ Override
343
313
public Object getParent (Object node ) {
344
- return ((LibraryTree .Node ) node ).getParent ();
314
+ if (node instanceof LibraryTree .Node ) {
315
+ return ((LibraryTree .Node ) node ).getParent ();
316
+ }
317
+ return null ;
345
318
}
346
319
347
320
@ Override
@@ -367,13 +340,5 @@ public void dispose() {
367
340
@ Override
368
341
public void inputChanged (Viewer arg0 , Object arg1 , Object arg2 ) {
369
342
}
370
-
371
- public Object [] getValue (Object node ) {
372
- if (node instanceof LibraryTree .Library ) {
373
- return ((LibraryTree .Library ) node ).getVersions ().toArray ();
374
- } else {
375
- return null ;
376
- }
377
- }
378
343
}
379
344
}
0 commit comments