package io.sloeber.ui.wizard.newsketch; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import io.sloeber.core.api.BoardDescriptor; import io.sloeber.core.api.BoardsManager; import io.sloeber.ui.Messages; public class SampleSelector { private static final String EXAMPLEPATH = "examplePath"; //$NON-NLS-1$ protected Tree sampleTree; protected Label myLabel; TreeMap<String, IPath> examples = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); protected Listener mylistener; protected int numSelected = 0; protected Label numSelectedLabel; public SampleSelector(Composite composite, int style, String label, int ncols) { this.myLabel = new Label(composite, SWT.NONE); this.myLabel.setText(label); GridData theGriddata = new GridData(SWT.LEFT, SWT.TOP, true, false); theGriddata.horizontalSpan = ncols; this.myLabel.setLayoutData(theGriddata); this.sampleTree = new Tree(composite, SWT.CHECK | SWT.BORDER); theGriddata = new GridData(SWT.FILL, SWT.FILL, true, true); theGriddata.horizontalSpan = ncols; this.sampleTree.setLayoutData(theGriddata); // Get the data in the tree this.sampleTree.setRedraw(false); this.sampleTree.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (event.detail == SWT.CHECK) { TreeItem thechangeItem = (TreeItem) event.item; if (thechangeItem.getItemCount() > 0) { event.detail = SWT.NONE; event.type = SWT.None; event.doit = false; thechangeItem.setChecked(!thechangeItem.getChecked()); } else { if (thechangeItem.getChecked()) { SampleSelector.this.numSelected += 1; SampleSelector.this.numSelectedLabel .setText(Integer.toString(SampleSelector.this.numSelected)); } else { SampleSelector.this.numSelected -= 1; SampleSelector.this.numSelectedLabel .setText(Integer.toString(SampleSelector.this.numSelected)); } if (SampleSelector.this.mylistener != null) { SampleSelector.this.mylistener.handleEvent(null); } setParentCheck(thechangeItem.getParentItem()); } } } private void setParentCheck(TreeItem parentItem) { if (parentItem != null) { boolean isChecked = false; for (TreeItem curItem : parentItem.getItems()) { isChecked = isChecked || curItem.getChecked(); } if (isChecked != parentItem.getChecked()) { parentItem.setChecked(isChecked); parentItem.setGrayed(isChecked); setParentCheck(parentItem.getParentItem()); } } } }); Label label1 = new Label(composite, SWT.NONE); label1.setText(Messages.SampleSelector_num_selected); this.numSelectedLabel = new Label(composite, SWT.NONE); this.numSelectedLabel.setText(Integer.toString(this.numSelected)); theGriddata = new GridData(SWT.LEFT, SWT.TOP, true, false); theGriddata.horizontalSpan = ncols - 2; this.numSelectedLabel.setLayoutData(theGriddata); this.sampleTree.setRedraw(true); } /** * This method adds all examples to the selection listbox All examples * already in the listbox are removed first. * * @param paths * * @param arduinoExample * The folder with the arduino samples * @param privateLibrary * The folder with the private libraries * @param hardwareLibrary * The folder with the hardware libraries * @param mPlatformPathPath */ public void AddAllExamples(BoardDescriptor platformPath, ArrayList<Path> arrayList) { this.numSelected = 0; this.examples = BoardsManager.getAllExamples(platformPath); this.sampleTree.removeAll(); // Add the examples to the tree for (Map.Entry<String, IPath> entry : this.examples.entrySet()) { String keys[] = entry.getKey().split("\\?"); //$NON-NLS-1$ TreeItem curItems[] = this.sampleTree.getItems(); TreeItem curItem = findItem(curItems, keys[0]); if (curItem == null) { curItem = new TreeItem(this.sampleTree, SWT.NONE); curItem.setText(keys[0]); } curItems = this.sampleTree.getItems(); TreeItem prefItem = curItem; for (String curKey : keys) { curItem = findItem(curItems, curKey); if (curItem == null) { curItem = new TreeItem(prefItem, SWT.NONE); curItem.setText(curKey); } prefItem = curItem; curItems = curItem.getItems(); } curItem.setData(EXAMPLEPATH, entry.getValue()); } // Mark the examples selected setLastUsedExamples(arrayList); } private static TreeItem findItem(TreeItem items[], String text) { for (TreeItem curitem : items) { if (text.equals(curitem.getText())) { return curitem; } } return null; } public void setEnabled(boolean enable) { this.sampleTree.setEnabled(enable); this.myLabel.setEnabled(enable); } /** * is at least 1 sample selected in this tree * * @return true if at least one sample is selected. else false */ public boolean isSampleSelected() { return this.numSelected > 0; } /** * you can only set 1 listener. The listener is triggered each time a item * is selected or deselected * * @param listener */ public void addchangeListener(Listener listener) { this.mylistener = listener; } /** * Marks the previous selected example(s) as selected and expands the items * plus all parent items * * @param arrayList */ private void setLastUsedExamples(ArrayList<Path> arrayList) { TreeItem[] startIems = this.sampleTree.getItems(); for (TreeItem curItem : startIems) { recursiveSetExamples(curItem, arrayList); } this.numSelectedLabel.setText(Integer.toString(this.numSelected)); } private void recursiveSetExamples(TreeItem curTreeItem, ArrayList<Path> arrayList) { for (TreeItem curchildTreeItem : curTreeItem.getItems()) { if (curchildTreeItem.getItems().length == 0) { for (Path curLastUsedExample : arrayList) { Path ss = (Path) curchildTreeItem.getData(EXAMPLEPATH); if (curLastUsedExample.equals(ss)) { curchildTreeItem.setChecked(true); curchildTreeItem.setExpanded(true); TreeItem parentTreeItem = curTreeItem; while (parentTreeItem != null) { parentTreeItem.setExpanded(true); parentTreeItem.setChecked(true); parentTreeItem.setGrayed(true); parentTreeItem = parentTreeItem.getParentItem(); } this.numSelected += 1; } } } else { recursiveSetExamples(curchildTreeItem, arrayList); } } } public ArrayList<Path> GetSampleFolders() { this.sampleTree.getItems(); ArrayList<Path> ret = new ArrayList<>(); for (TreeItem curTreeItem : this.sampleTree.getItems()) { ret.addAll(recursiveGetSelectedExamples(curTreeItem)); } return ret; } private List<Path> recursiveGetSelectedExamples(TreeItem TreeItem) { List<Path> ret = new ArrayList<>(); for (TreeItem curchildTreeItem : TreeItem.getItems()) { if (curchildTreeItem.getChecked() && (curchildTreeItem.getData(EXAMPLEPATH) != null)) { Path location = (Path) curchildTreeItem.getData(EXAMPLEPATH); ret.add(location); } ret.addAll(recursiveGetSelectedExamples(curchildTreeItem)); } return ret; } }