11package it .baeyens .arduino .ui ;
22
33import java .util .HashMap ;
4- import java .util .Map . Entry ;
4+ import java .util .Map ;
55
66import org .eclipse .core .runtime .IProgressMonitor ;
77import org .eclipse .core .runtime .IStatus ;
88import org .eclipse .core .runtime .MultiStatus ;
99import org .eclipse .core .runtime .jobs .Job ;
1010import org .eclipse .jface .preference .PreferencePage ;
11- import org .eclipse .jface .viewers .CheckStateChangedEvent ;
12- import org .eclipse .jface .viewers .CheckboxCellEditor ;
1311import 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 ;
1712import org .eclipse .jface .viewers .ICheckStateProvider ;
1813import org .eclipse .jface .viewers .ILabelProviderListener ;
1914import org .eclipse .jface .viewers .ITableLabelProvider ;
2015import org .eclipse .jface .viewers .ITreeContentProvider ;
21- import org .eclipse .jface .viewers .LabelProvider ;
2216import org .eclipse .jface .viewers .TreeViewer ;
2317import org .eclipse .jface .viewers .Viewer ;
24- import org .eclipse .jface .viewers .ViewerFilter ;
2518import org .eclipse .swt .SWT ;
2619import org .eclipse .swt .custom .CCombo ;
2720import 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 ;
3821import org .eclipse .swt .events .SelectionAdapter ;
3922import org .eclipse .swt .events .SelectionEvent ;
4023import org .eclipse .swt .graphics .Image ;
41- import org .eclipse .swt .graphics .Point ;
4224import org .eclipse .swt .layout .GridData ;
4325import org .eclipse .swt .layout .GridLayout ;
4426import org .eclipse .swt .widgets .Composite ;
4527import 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 ;
5128import org .eclipse .swt .widgets .Text ;
5229import org .eclipse .swt .widgets .Tree ;
5330import org .eclipse .swt .widgets .TreeColumn ;
6340
6441public class LibraryPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
6542
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+
8047 @ Override
8148 public void init (IWorkbench workbench ) {
8249 // nothing needed here
8350 }
8451
52+ @ Override
53+ protected void performDefaults () {
54+ viewer .setInput (new LibraryTree ());
55+ editor .getEditor ().dispose ();
56+ super .performDefaults ();
57+ }
58+
8559 @ Override
8660 protected Control createContents (Composite parent ) {
8761 Composite control = new Composite (parent , SWT .NONE );
@@ -91,57 +65,46 @@ protected Control createContents(Composite parent) {
9165 GridData layoutData = new GridData (SWT .FILL , SWT .FILL , true , false );
9266 desc .setLayoutData (layoutData );
9367 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 );
9670
9771 return control ;
9872 }
9973
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 ));
12281 }
12382 }
12483 }
125- return status ;
126- }
127-
128- @ Override
129- public boolean performOk () {
13084 new Job (Messages .ui_Adopting_arduino_libraries ) {
13185
13286 @ Override
13387 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 ;
137100 }
138101 }.schedule ();
139102
140103 return true ;
141104 }
142-
105+
143106 public void createTree (Composite parent ) {
144- // Filtering applied to all columns
107+ // filtering applied to all columns
145108 PatternFilter filter = new PatternFilter () {
146109 protected boolean isLeafMatch (final Viewer viewer , final Object element ) {
147110 TreeViewer treeViewer = (TreeViewer ) viewer ;
@@ -155,11 +118,11 @@ protected boolean isLeafMatch(final Viewer viewer, final Object element) {
155118 return isMatch ;
156119 }
157120 };
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 ( );
160123
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 );
163126 viewer .setLabelProvider (new LibraryLabelProvider ());
164127 viewer .setContentProvider (new LibraryContentProvider ());
165128 viewer .setCheckStateProvider (new LibraryCheckProvider ());
@@ -171,25 +134,16 @@ protected boolean isLeafMatch(final Viewer viewer, final Object element) {
171134 TreeColumn version = new TreeColumn (viewer .getTree (), SWT .LEFT );
172135 version .setWidth (100 );
173136
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 ());
176139 editor .horizontalAlignment = SWT .LEFT ;
177140 editor .grabHorizontal = true ;
178141 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();
190142
143+ // this ensures the tree labels are displayed correctly
191144 viewer .refresh (true );
192145
146+ // tree interactions listener
193147 viewer .getTree ().addSelectionListener (new SelectionAdapter () {
194148 public void widgetSelected (SelectionEvent event ) {
195149 if (editor .getEditor () != null ) {
@@ -200,9 +154,9 @@ public void widgetSelected(SelectionEvent event) {
200154 if (item .getItemCount () > 0 ) {
201155 item .setGrayed (false );
202156 for (TreeItem child : item .getItems ()) {
203- child .setChecked (child .getChecked ());
157+ child .setChecked (item .getChecked ());
204158 if (child .getChecked ()) {
205- child .setText (1 , ((LibraryTree .Library ) item .getData ()).getLatest ());
159+ child .setText (1 , ((LibraryTree .Library ) child .getData ()).getLatest ());
206160 } else {
207161 child .setText (1 , "" );
208162 }
@@ -228,9 +182,6 @@ public void widgetSelected(SelectionEvent event) {
228182
229183 // Compute the width for the editor
230184 // 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);
234185
235186 // Set the focus on the dropdown and set into the editor
236187 combo .setFocus ();
@@ -250,7 +201,13 @@ public void widgetSelected(SelectionEvent event) {
250201 });
251202 }
252203
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 ) {
254211 boolean grayed = false ;
255212 boolean checked = false ;
256213 for (TreeItem child : item .getItems ()) {
@@ -264,7 +221,12 @@ public void verifySubtreeCheckStatus(TreeItem item) {
264221 item .setGrayed (grayed );
265222 }
266223
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 {
268230
269231 @ Override
270232 public void addListener (ILabelProviderListener arg0 ) {
@@ -303,14 +265,18 @@ public String getColumnText(Object element, int col) {
303265 return null ;
304266 }
305267 }
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 {
308274 @ Override
309275 public boolean isChecked (Object element ) {
310276 if (element instanceof LibraryTree .Library ) {
311277 return ((LibraryTree .Library ) element ).getInstalled () != null ;
312278 } else if (element instanceof LibraryTree .Category ) {
313- for (LibraryTree .Library library : ((LibraryTree .Category )element ).getLibraries ()) {
279+ for (LibraryTree .Library library : ((LibraryTree .Category ) element ).getLibraries ()) {
314280 if (library .getInstalled () != null ) {
315281 return true ;
316282 }
@@ -322,7 +288,7 @@ public boolean isChecked(Object element) {
322288 @ Override
323289 public boolean isGrayed (Object element ) {
324290 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 ()) {
326292 if (library .getInstalled () == null ) {
327293 return true ;
328294 }
@@ -332,7 +298,11 @@ public boolean isGrayed(Object element) {
332298 }
333299 }
334300
335- static class LibraryContentProvider implements ITreeContentProvider {
301+ /**
302+ * Provides the tree content data
303+ *
304+ */
305+ private static class LibraryContentProvider implements ITreeContentProvider {
336306
337307 @ Override
338308 public Object [] getChildren (Object node ) {
@@ -341,7 +311,10 @@ public Object[] getChildren(Object node) {
341311
342312 @ Override
343313 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 ;
345318 }
346319
347320 @ Override
@@ -367,13 +340,5 @@ public void dispose() {
367340 @ Override
368341 public void inputChanged (Viewer arg0 , Object arg1 , Object arg2 ) {
369342 }
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- }
378343 }
379344}
0 commit comments