package io.sloeber.ui.wizard.newsketch; import java.io.File; import java.util.ArrayList; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.preference.DirectoryFieldEditor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import io.sloeber.core.api.BoardDescriptor; import io.sloeber.core.api.CodeDescriptor; import io.sloeber.core.api.CodeDescriptor.CodeTypes; import io.sloeber.ui.LabelCombo; import io.sloeber.ui.Messages; public class NewSketchWizardCodeSelectionPage extends WizardPage { final Shell shell = new Shell(); Composite mParentComposite = null; protected LabelCombo mCodeSourceOptionsCombo; // ComboBox Containing all the // sketch creation options protected DirectoryFieldEditor mTemplateFolderEditor; protected SampleSelector mExampleEditor = null; protected Button mCheckBoxUseCurrentLinkSample; private BoardDescriptor myBoardDescriptor = null; private CodeDescriptor myCodedescriptor = CodeDescriptor.createLastUsed(); public void setBoardDescriptor(BoardDescriptor boardDescriptor) { if (this.myBoardDescriptor == null) { this.myBoardDescriptor = boardDescriptor; boardDescriptor.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { handleBoarDescriptorChange(); } }); } handleBoarDescriptorChange(); } public void handleBoarDescriptorChange() { if (this.mExampleEditor != null) { if (!this.myBoardDescriptor.getBoardsFile().isEmpty()) { this.mExampleEditor.AddAllExamples(this.myBoardDescriptor, this.myCodedescriptor.getExamples()); } } validatePage(); } public NewSketchWizardCodeSelectionPage(String pageName) { super(pageName); setPageComplete(true); } public NewSketchWizardCodeSelectionPage(String pageName, String title, ImageDescriptor titleImage) { super(pageName, title, titleImage); setPageComplete(true); } @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); this.mParentComposite = composite; GridLayout theGridLayout = new GridLayout(); theGridLayout.numColumns = 4; composite.setLayout(theGridLayout); Listener comboListener = new Listener() { @Override public void handleEvent(Event event) { SetControls(); validatePage(); } }; this.mCodeSourceOptionsCombo = new LabelCombo(composite, Messages.ui_new_sketch_selecy_code, null, 4, true); this.mCodeSourceOptionsCombo.addListener(comboListener); this.mCodeSourceOptionsCombo.setItems(getCodeTypeDescriptions()); this.mTemplateFolderEditor = new DirectoryFieldEditor("temp1", Messages.ui_new_sketch_custom_template_location, //$NON-NLS-1$ composite); this.mExampleEditor = new SampleSelector(composite, SWT.FILL, Messages.ui_new_sketch_select_example_code, 4); this.mExampleEditor.addchangeListener(new Listener() { @Override public void handleEvent(Event event) { validatePage(); } }); this.mTemplateFolderEditor.getTextControl(composite).addListener(SWT.Modify, comboListener); this.mCheckBoxUseCurrentLinkSample = new Button(composite, SWT.CHECK); this.mCheckBoxUseCurrentLinkSample.setText(Messages.ui_new_sketch_link_to_sample_code); // // End of special controls // restoreAllSelections();// load the default settings SetControls();// set the controls according to the setting validatePage();// validate the page handleBoarDescriptorChange(); setControl(composite); } /** * @name SetControls() Enables or disables the controls based on the * Checkbox settings */ protected void SetControls() { switch (CodeTypes.values()[Math.max(0, this.mCodeSourceOptionsCombo.mCombo.getSelectionIndex())]) { case defaultIno: this.mTemplateFolderEditor.setEnabled(false, this.mParentComposite); this.mExampleEditor.setEnabled(false); this.mCheckBoxUseCurrentLinkSample.setEnabled(false); break; case defaultCPP: this.mTemplateFolderEditor.setEnabled(false, this.mParentComposite); this.mExampleEditor.setEnabled(false); this.mCheckBoxUseCurrentLinkSample.setEnabled(false); break; case CustomTemplate: this.mTemplateFolderEditor.setEnabled(true, this.mParentComposite); this.mExampleEditor.setEnabled(false); this.mCheckBoxUseCurrentLinkSample.setEnabled(false); break; case sample: this.mTemplateFolderEditor.setEnabled(false, this.mParentComposite); this.mExampleEditor.setEnabled(true); this.mCheckBoxUseCurrentLinkSample.setEnabled(true); break; default: break; } } /** * @name validatePage() Check if the user has provided all the info to * create the project. If so enable the finish button. */ protected void validatePage() { if (this.mCodeSourceOptionsCombo == null) { return; } switch (CodeTypes.values()[Math.max(0, this.mCodeSourceOptionsCombo.mCombo.getSelectionIndex())]) { case defaultIno: case defaultCPP: setPageComplete(true);// default always works break; case CustomTemplate: IPath templateFolder = new Path(this.mTemplateFolderEditor.getStringValue()); File cppFile = templateFolder.append(CodeDescriptor.DEFAULT_SKETCH_CPP).toFile(); File headerFile = templateFolder.append(CodeDescriptor.DEFAULT_SKETCH_H).toFile(); File inoFile = templateFolder.append(CodeDescriptor.DEFAULT_SKETCH_INO).toFile(); boolean existFile = inoFile.isFile() || (cppFile.isFile() && headerFile.isFile()); setPageComplete(existFile); break; case sample: setPageComplete(this.mExampleEditor.isSampleSelected()); break; default: setPageComplete(false); break; } } /** * @name restoreAllSelections() Restore all necessary variables into the * respective controls */ private void restoreAllSelections() { // // get the settings for the Use Default checkbox and foldername from the // environment settings // settings are saved when the files are created and the use this as // default flag is set // this.mTemplateFolderEditor.setStringValue(this.myCodedescriptor.getTemPlateFoldername().toString()); this.mCodeSourceOptionsCombo.mCombo.select(this.myCodedescriptor.getCodeType().ordinal()); } public CodeDescriptor getCodeDescription() { switch (CodeTypes.values()[this.mCodeSourceOptionsCombo.mCombo.getSelectionIndex()]) { case defaultIno: return CodeDescriptor.createDefaultIno(); case defaultCPP: return CodeDescriptor.createDefaultCPP(); case CustomTemplate: return CodeDescriptor.createCustomTemplate(new Path(this.mTemplateFolderEditor.getStringValue())); case sample: ArrayList<Path> sampleFolders = this.mExampleEditor.GetSampleFolders(); boolean link = this.mCheckBoxUseCurrentLinkSample.getSelection(); return CodeDescriptor.createExample(link, sampleFolders); } // make sure this never happens return null; } public static String getCodeTypeDescription(CodeTypes codeType) { switch (codeType) { case defaultIno: return Messages.ui_new_sketch_default_ino; case defaultCPP: return Messages.ui_new_sketch_default_cpp; case CustomTemplate: return Messages.ui_new_sketch_custom_template; case sample: return Messages.ui_new_sketch_sample_sketch; } return null; } public static String[] getCodeTypeDescriptions() { String[] ret = new String[CodeTypes.values().length]; for (CodeTypes codeType : CodeTypes.values()) { ret[codeType.ordinal()] = getCodeTypeDescription(codeType); } return ret; } }