From a2107de70ee1a72f852adb79a17d14aca278cf89 Mon Sep 17 00:00:00 2001 From: Brandon Donnelson Date: Sat, 22 Jul 2017 20:40:04 -0700 Subject: [PATCH 1/4] issue #1047 - Add additional settings to the project creation. --- src/io/flutter/FlutterBundle.properties | 28 ++++ .../flutter/module/FlutterModuleBuilder.java | 89 ++++++++++- .../module/FlutterSmallIDEGeneratorPeer.java | 3 +- .../FlutterSmallIDEProjectGenerator.java | 3 +- .../flutter/module/settings/RadiosForm.form | 41 ++++++ .../flutter/module/settings/RadiosForm.java | 43 ++++++ src/io/flutter/run/SdkFields.java | 1 - .../sdk/FlutterCreateAdditionalSettings.java | 130 ++++++++++++++++ src/io/flutter/sdk/FlutterSdk.java | 25 +++- .../FlutterCreateAddtionalSettingsTest.java | 139 ++++++++++++++++++ 10 files changed, 483 insertions(+), 19 deletions(-) create mode 100644 src/io/flutter/module/settings/RadiosForm.form create mode 100644 src/io/flutter/module/settings/RadiosForm.java create mode 100644 src/io/flutter/sdk/FlutterCreateAdditionalSettings.java create mode 100644 testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java diff --git a/src/io/flutter/FlutterBundle.properties b/src/io/flutter/FlutterBundle.properties index f62bd13cc9..a95611d4ad 100644 --- a/src/io/flutter/FlutterBundle.properties +++ b/src/io/flutter/FlutterBundle.properties @@ -89,3 +89,31 @@ devicelist.empty=No devices flutter.pop.frame.action.text=Drop Frame (Flutter) flutter.pop.frame.action.description=Pop the current frame off the stack + +flutter.module.create.settings.radios.type.label=Project type: +flutter.module.create.settings.radios.type.application=Application +flutter.module.create.settings.radios.type.plugin=Plugin +flutter.module.create.settings.radios.type.tip=Select a project type. +flutter.module.create.settings.radios.org.label=Organization: +flutter.module.create.settings.org.default_text=com.yourcompany +flutter.module.create.settings.org.tip=Enter a domain. +flutter.module.create.settings.description.label=Description: +flutter.module.create.settings.description.tip=Enter a project description which shows up in the pubsec.yaml. +flutter.module.create.settings.description.default_text=A new Flutter project. +flutter.module.create.settings.radios.android.label=Android language: +flutter.module.create.settings.radios.android.ios=iOS +flutter.module.create.settings.radios.android.kotlin=Kotlin +flutter.module.create.settings.radios.android.tip=Select an Android language. +flutter.module.create.settings.radios.ios.label=iOS language: +flutter.module.create.settings.radios.ios.object_c=Objective C +flutter.module.create.settings.radios.ios.swift=Swift +flutter.module.create.settings.radios.ios.tip=Select an iOS language. +flutter.module.create.settings.includedriver.label=Include driver test: +flutter.module.create.settings.includedriver.tip=Include generating a driver test. +flutter.module.create.settings.help.label=Help: +flutter.module.create.settings.help.project_name.label=Project name: +flutter.module.create.settings.help.project_name.description=Enter the project name with all lower case letters. +flutter.module.create.settings.help.org.label=Organization: +flutter.module.create.settings.help.org.description=Enter the organization domain name in reverse domain notation. + + diff --git a/src/io/flutter/module/FlutterModuleBuilder.java b/src/io/flutter/module/FlutterModuleBuilder.java index 4b0390000c..f4a3fb4219 100644 --- a/src/io/flutter/module/FlutterModuleBuilder.java +++ b/src/io/flutter/module/FlutterModuleBuilder.java @@ -9,6 +9,7 @@ import com.intellij.execution.process.ProcessListener; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.SettingsStep; import com.intellij.ide.util.projectWizard.WizardContext; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.WriteAction; @@ -27,7 +28,9 @@ import io.flutter.FlutterBundle; import io.flutter.FlutterConstants; import io.flutter.FlutterUtils; +import io.flutter.module.settings.RadiosForm; import io.flutter.pub.PubRoot; +import io.flutter.sdk.FlutterCreateAdditionalSettings; import io.flutter.sdk.FlutterSdk; import io.flutter.sdk.FlutterSdkUtil; import io.flutter.utils.FlutterModuleUtils; @@ -35,6 +38,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.IOException; import java.util.concurrent.atomic.AtomicReference; @@ -46,6 +51,12 @@ public class FlutterModuleBuilder extends ModuleBuilder { private static final String DART_GROUP_NAME = "Static Web"; // == WebModuleBuilder.GROUP_NAME private FlutterModuleWizardStep myStep; + private RadiosForm projectTypeRadios; + private JTextField orgField; + private JTextField descriptionField; + private RadiosForm androidLanguageRadios; + private RadiosForm iosLanguageRadios; + private JCheckBox includeDriverTextField; @Override public String getName() { @@ -101,7 +112,7 @@ public Module commitModule(@NotNull Project project, @Nullable ModifiableModuleM } final OutputListener listener = new OutputListener(); - final PubRoot root = runFlutterCreateWithProgress(baseDir, sdk, project, listener); + final PubRoot root = runFlutterCreateWithProgress(baseDir, sdk, project, listener, getAddtionalSettings()); if (root == null) { final String stderr = listener.getOutput().getStderr(); final String msg = stderr.isEmpty() ? "Flutter create command was unsuccessful" : stderr; @@ -172,11 +183,11 @@ public boolean validate(Project current, Project dest) { return myStep.getFlutterSdk() != null; } + /** + * @See: https://www.dartlang.org/tools/pub/pubspec#name + */ @Override public boolean validateModuleName(@NotNull String moduleName) throws ConfigurationException { - - // See: https://www.dartlang.org/tools/pub/pubspec#name - if (!FlutterUtils.isValidPackageName(moduleName)) { throw new ConfigurationException( "Invalid module name: '" + moduleName + "' - must be a valid Dart package name (lower_case_with_underscores)."); @@ -203,6 +214,71 @@ public boolean validateModuleName(@NotNull String moduleName) throws Configurati return super.validateModuleName(moduleName); } + @Nullable + @Override + public ModuleWizardStep modifySettingsStep(@NotNull SettingsStep settingsStep) { + ModuleWizardStep wizard = super.modifySettingsStep(settingsStep); + + if (projectTypeRadios == null) { + projectTypeRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.type.application"), + FlutterBundle.message("flutter.module.create.settings.radios.type.plugin")); + projectTypeRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.type.tip")); + + orgField = new JTextField(); + orgField.setText(FlutterBundle.message("flutter.module.create.settings.org.default_text")); + orgField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.org.tip")); + + descriptionField = new JTextField(); + descriptionField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.description.tip")); + descriptionField.setText(FlutterBundle.message("flutter.module.create.settings.description.default_text")); + + androidLanguageRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.android.ios"), + FlutterBundle.message("flutter.module.create.settings.radios.android.kotlin")); + androidLanguageRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.android.tip")); + + iosLanguageRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.ios.object_c"), + FlutterBundle.message("flutter.module.create.settings.radios.ios.swift")); + iosLanguageRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.ios.tip")); + + includeDriverTextField = new JCheckBox(); + includeDriverTextField.setSelected(true); + includeDriverTextField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.includedriver.tip")); + } + + settingsStep.addSettingsField(" ", new JLabel(" ")); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.type.label"), + projectTypeRadios.getComponent()); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.org.label"), orgField); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.description.label"), descriptionField); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.android.label"), + androidLanguageRadios.getComponent()); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.ios.label"), + iosLanguageRadios.getComponent()); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.includedriver.label"), includeDriverTextField); + + settingsStep.addSettingsField("", new JLabel(" ")); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.label"), new JLabel(" ")); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.project_name.label"), + new JLabel(FlutterBundle.message("flutter.module.create.settings.help.project_name.description"))); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.org.label"), + new JLabel(FlutterBundle.message("flutter.module.create.settings.help.org.description"))); + + return wizard; + } + + private FlutterCreateAdditionalSettings getAddtionalSettings() { + FlutterCreateAdditionalSettings addtionalSettings = new FlutterCreateAdditionalSettings.Builder() + .setDescription(!descriptionField.getText().trim().isEmpty() ? descriptionField.getText().trim() : null) + .setGeneratePlugin(projectTypeRadios.isRadio2Selected() ? true : null) + .setIncludeDriverTest(!includeDriverTextField.isSelected() ? null : true) + .setKotlin(androidLanguageRadios.isRadio2Selected() ? true : null) + .setOrg(!orgField.getText().trim().isEmpty() ? orgField.getText().trim() : null) + .setSwift(iosLanguageRadios.isRadio2Selected() ? true : null) + .build(); + + return addtionalSettings; + } + @Nullable @Override public ModuleWizardStep getCustomOptionsStep(final WizardContext context, final Disposable parentDisposable) { @@ -239,13 +315,14 @@ public ModuleType getModuleType() { private static PubRoot runFlutterCreateWithProgress(@NotNull VirtualFile baseDir, @NotNull FlutterSdk sdk, @NotNull Project project, - @Nullable ProcessListener processListener) { + @Nullable ProcessListener processListener, + @Nullable FlutterCreateAdditionalSettings additionalSettings) { final ProgressManager progress = ProgressManager.getInstance(); final AtomicReference result = new AtomicReference<>(null); progress.runProcessWithProgressSynchronously(() -> { progress.getProgressIndicator().setIndeterminate(true); - result.set(sdk.createFiles(baseDir, null, processListener)); + result.set(sdk.createFiles(baseDir, null, processListener, additionalSettings)); }, "Creating Flutter Project", false, project); return result.get(); diff --git a/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java b/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java index c9a849be98..c09db24c40 100644 --- a/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java +++ b/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java @@ -28,7 +28,6 @@ // (and replaced with DirectoryProjectGenerator) public class FlutterSmallIDEGeneratorPeer implements WebProjectGenerator.GeneratorPeer { - private JPanel myMainPanel; private final ComboboxWithBrowseButton sdkPathComboWithBrowse; public FlutterSmallIDEGeneratorPeer() { @@ -45,7 +44,7 @@ public FlutterSmallIDEGeneratorPeer() { @NotNull @Override public JComponent getComponent() { - return myMainPanel; + return null; } @Override diff --git a/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java b/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java index ddaccb22f7..b684a622fc 100644 --- a/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java +++ b/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java @@ -51,7 +51,6 @@ public void generateProject(@NotNull Project project, @NotNull VirtualFile baseDir, @NotNull String flutterSdkPath, @NotNull Module module) { - final FlutterSdk sdk = FlutterSdk.forPath(flutterSdkPath); if (sdk == null) { FlutterMessages.showError("Error creating project", flutterSdkPath + " is not a valid Flutter SDK"); @@ -60,7 +59,7 @@ public void generateProject(@NotNull Project project, // Run "flutter create". final OutputListener listener = new OutputListener(); - final PubRoot root = sdk.createFiles(baseDir, module, listener); + final PubRoot root = sdk.createFiles(baseDir, module, listener, null); if (root == null) { final String stderr = listener.getOutput().getStderr(); final String msg = stderr.isEmpty() ? "Flutter create command was unsuccessful" : stderr; diff --git a/src/io/flutter/module/settings/RadiosForm.form b/src/io/flutter/module/settings/RadiosForm.form new file mode 100644 index 0000000000..bc119aed83 --- /dev/null +++ b/src/io/flutter/module/settings/RadiosForm.form @@ -0,0 +1,41 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/io/flutter/module/settings/RadiosForm.java b/src/io/flutter/module/settings/RadiosForm.java new file mode 100644 index 0000000000..f32ae7a2c4 --- /dev/null +++ b/src/io/flutter/module/settings/RadiosForm.java @@ -0,0 +1,43 @@ +/* + * Copyright 2017 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.module.settings; + +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * A panel with two radios in a group. + */ +public class RadiosForm { + private JRadioButton radio1; + private JRadioButton radio2; + private JPanel radiosPanel; + + public RadiosForm(String label1, String label2) { + radio1.setText(label1); + radio1.setSelected(true); + + radio2.setText(label2); + + ButtonGroup radioGroup = new ButtonGroup(); + radioGroup.add(radio1); + radioGroup.add(radio2); + } + + @NotNull + public JComponent getComponent() { + return radiosPanel; + } + + public void setToolTipText(String text) { + radiosPanel.setToolTipText(text); + } + + public boolean isRadio2Selected() { + return radio2.isSelected(); + } +} diff --git a/src/io/flutter/run/SdkFields.java b/src/io/flutter/run/SdkFields.java index 9d84ac3e85..7f4cec470c 100644 --- a/src/io/flutter/run/SdkFields.java +++ b/src/io/flutter/run/SdkFields.java @@ -99,7 +99,6 @@ void checkRunnable(@NotNull Project project) throws RuntimeConfigurationError { public GeneralCommandLine createFlutterSdkRunCommand(@NotNull Project project, @Nullable FlutterDevice device, @NotNull RunMode mode) throws ExecutionException { - final MainFile main = MainFile.verify(filePath, project).get(); final FlutterSdk flutterSdk = FlutterSdk.getFlutterSdk(project); diff --git a/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java b/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java new file mode 100644 index 0000000000..2611dd3d73 --- /dev/null +++ b/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java @@ -0,0 +1,130 @@ +/* + * Copyright 2017 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.sdk; + +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class FlutterCreateAdditionalSettings { + + public static class Builder { + @Nullable + private Boolean includeDriverTest; + + @Nullable + private Boolean generatePlugin; + + @Nullable + private String description; + + @Nullable + private String org; + + @Nullable + private Boolean swift; + + @Nullable + private Boolean kotlin; + + public Builder() { + } + + public Builder setIncludeDriverTest(@Nullable Boolean includeDriverTest) { + this.includeDriverTest = includeDriverTest; + return this; + } + + public Builder setGeneratePlugin(@Nullable Boolean generatePlugin) { + this.generatePlugin = generatePlugin; + return this; + } + + public Builder setDescription(@Nullable String description) { + this.description = description; + return this; + } + + public Builder setOrg(@Nullable String org) { + this.org = org; + return this; + } + + public Builder setSwift(@Nullable Boolean swift) { + this.swift = swift; + return this; + } + + public Builder setKotlin(@Nullable Boolean kotlin) { + this.kotlin = kotlin; + return this; + } + + public FlutterCreateAdditionalSettings build() { + return new FlutterCreateAdditionalSettings(includeDriverTest, generatePlugin, description, org, swift, kotlin); + } + } + + @Nullable + private Boolean includeDriverTest; + @Nullable + private Boolean generatePlugin; + @Nullable + private String description; + @Nullable + private String org; + @Nullable + private Boolean swift; + @Nullable + private Boolean kotlin; + + private FlutterCreateAdditionalSettings(Boolean includeDriverTest, + Boolean generatePlugin, + String description, + String org, + Boolean swift, Boolean kotlin) { + this.includeDriverTest = includeDriverTest; + this.generatePlugin = generatePlugin; + this.description = description; + this.org = org; + this.swift = swift; + this.kotlin = kotlin; + } + + public List getArgs() { + List args = new ArrayList(); + + if (includeDriverTest != null && includeDriverTest) { + args.add("--with-driver-test"); + } + + if (generatePlugin != null && generatePlugin) { + args.add("--plugin"); + } + + if (description != null && !description.trim().isEmpty()) { + args.add("--description"); + args.add(description); + } + + if (org != null && !org.trim().isEmpty()) { + args.add("--org"); + args.add(org); + } + + if (swift != null && swift) { + args.add("--ios-language"); + args.add("swift"); + } + + if (kotlin != null && kotlin) { + args.add("--android-language"); + args.add("kotlin"); + } + + return args; + } +} diff --git a/src/io/flutter/sdk/FlutterSdk.java b/src/io/flutter/sdk/FlutterSdk.java index 8e26adb377..dc5cdf81fe 100644 --- a/src/io/flutter/sdk/FlutterSdk.java +++ b/src/io/flutter/sdk/FlutterSdk.java @@ -120,8 +120,18 @@ public FlutterCommand flutterDoctor() { return new FlutterCommand(this, getHome(), FlutterCommand.Type.DOCTOR); } - public FlutterCommand flutterCreate(@NotNull VirtualFile appDir) { - return new FlutterCommand(this, appDir.getParent(), FlutterCommand.Type.CREATE, appDir.getName()); + public FlutterCommand flutterCreate(@NotNull VirtualFile appDir, @Nullable FlutterCreateAdditionalSettings additionalSettings) { + List args = new ArrayList(); + if (additionalSettings != null) { + args.addAll(additionalSettings.getArgs()); + } + + // keep as the last argument + args.add(appDir.getName()); + + String[] vargs = args.stream().toArray(String[]::new); + + return new FlutterCommand(this, appDir.getParent(), FlutterCommand.Type.CREATE, vargs); } public FlutterCommand flutterPackagesGet(@NotNull PubRoot root) { @@ -240,14 +250,13 @@ public boolean sync(@NotNull Project project) { * Returns the PubRoot if successful. */ @Nullable - public PubRoot createFiles(@NotNull VirtualFile baseDir, @Nullable Module module, @Nullable ProcessListener listener) { - + public PubRoot createFiles(@NotNull VirtualFile baseDir, @Nullable Module module, @Nullable ProcessListener listener, + @Nullable FlutterCreateAdditionalSettings additionalSettings) { final Process process; if (module == null) { - process = flutterCreate(baseDir).start(null, listener); - } - else { - process = flutterCreate(baseDir).startInModuleConsole(module, null, listener); + process = flutterCreate(baseDir, additionalSettings).start(null, listener); + } else { + process = flutterCreate(baseDir, additionalSettings).startInModuleConsole(module, null, listener); } if (process == null) { return null; diff --git a/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java b/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java new file mode 100644 index 0000000000..98e3dd4f35 --- /dev/null +++ b/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java @@ -0,0 +1,139 @@ +/* + * Copyright 2017 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.sdk; + +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class FlutterCreateAddtionalSettingsTest { + @Test + public void includeDriverPropertyTest() { + FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(true).build(); + FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(false).build(); + FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(null).build(); + + List args1 = addtionalSettings1.getArgs(); + List args2 = addtionalSettings2.getArgs(); + List args3 = addtionalSettings3.getArgs(); + + assertTrue(args1.size() == 1); + assertEquals("--with-driver-test", args1.get(0)); + + assertTrue(args2.size() == 0); + assertTrue(args3.size() == 0); + } + + @Test + public void generatePluginPropertyTest() { + FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(true).build(); + FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(false).build(); + FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(null).build(); + + List args1 = addtionalSettings1.getArgs(); + List args2 = addtionalSettings2.getArgs(); + List args3 = addtionalSettings3.getArgs(); + + assertTrue(args1.size() == 1); + assertEquals("--plugin", args1.get(0)); + + assertTrue(args2.size() == 0); + assertTrue(args3.size() == 0); + } + + @Test + public void descriptionPropertyTest() { + String d = "My description."; + FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setDescription(d).build(); + FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setDescription(" ").build(); + FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setDescription(null).build(); + + List args1 = addtionalSettings1.getArgs(); + List args2 = addtionalSettings2.getArgs(); + List args3 = addtionalSettings3.getArgs(); + + assertTrue(args1.size() == 2); + assertEquals("--description", args1.get(0)); + assertEquals(d, args1.get(1)); + + assertTrue(args2.size() == 0); + assertTrue(args3.size() == 0); + } + + @Test + public void orgPropertyTest() { + String d = "tld.domain"; + FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setOrg(d).build(); + FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setOrg(" ").build(); + FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setOrg(null).build(); + + List args1 = addtionalSettings1.getArgs(); + List args2 = addtionalSettings2.getArgs(); + List args3 = addtionalSettings3.getArgs(); + + assertTrue(args1.size() == 2); + assertEquals("--org", args1.get(0)); + assertEquals(d, args1.get(1)); + + assertTrue(args2.size() == 0); + assertTrue(args3.size() == 0); + } + + @Test + public void iosPropertyTest() { + FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setSwift(true).build(); + FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setSwift(false).build(); + FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setSwift(null).build(); + + List args1 = addtionalSettings1.getArgs(); + List args2 = addtionalSettings2.getArgs(); + List args3 = addtionalSettings3.getArgs(); + + assertTrue(args1.size() == 2); + assertEquals("--ios-language", args1.get(0)); + + assertTrue(args2.size() == 0); + assertTrue(args3.size() == 0); + } + + @Test + public void kotlinPropertyTest() { + FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setKotlin(true).build(); + FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setKotlin(false).build(); + FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setKotlin(null).build(); + + List args1 = addtionalSettings1.getArgs(); + List args2 = addtionalSettings2.getArgs(); + List args3 = addtionalSettings3.getArgs(); + + assertTrue(args1.size() == 2); + assertEquals("--android-language", args1.get(0)); + + assertTrue(args2.size() == 0); + assertTrue(args3.size() == 0); + } + + @Test + public void testMultipleProperties() { + FlutterCreateAdditionalSettings addtionalSettings = new FlutterCreateAdditionalSettings.Builder() + .setOrg("tld.domain") + .setGeneratePlugin(true) + .setDescription("a b c") + .setSwift(true) + .setKotlin(true) + .build(); + + List args = addtionalSettings.getArgs(); + + String line = String.join(" ", args); + + assertTrue(args.size() == 9); + assertEquals("--plugin --description a b c --org tld.domain --ios-language swift --android-language kotlin", line); + } +} From ec3892fffbf39c0fd4f3c43c3d38b19b23b61b2b Mon Sep 17 00:00:00 2001 From: Brandon Donnelson Date: Sun, 23 Jul 2017 16:16:19 -0700 Subject: [PATCH 2/4] issue #1047 - add additional flutter create fields for webstorm. --- src/io/flutter/FlutterBundle.properties | 2 +- .../flutter/module/FlutterModuleBuilder.java | 68 ++-------------- .../module/FlutterSmallIDEGeneratorPeer.java | 13 ++- .../FlutterSmallIDEProjectGenerator.java | 12 ++- .../FlutterCreateAddtionalSettingsFields.java | 81 +++++++++++++++++++ 5 files changed, 110 insertions(+), 66 deletions(-) create mode 100644 src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java diff --git a/src/io/flutter/FlutterBundle.properties b/src/io/flutter/FlutterBundle.properties index a95611d4ad..6cba1135e3 100644 --- a/src/io/flutter/FlutterBundle.properties +++ b/src/io/flutter/FlutterBundle.properties @@ -101,7 +101,7 @@ flutter.module.create.settings.description.label=Description: flutter.module.create.settings.description.tip=Enter a project description which shows up in the pubsec.yaml. flutter.module.create.settings.description.default_text=A new Flutter project. flutter.module.create.settings.radios.android.label=Android language: -flutter.module.create.settings.radios.android.ios=iOS +flutter.module.create.settings.radios.android.java=Java flutter.module.create.settings.radios.android.kotlin=Kotlin flutter.module.create.settings.radios.android.tip=Select an Android language. flutter.module.create.settings.radios.ios.label=iOS language: diff --git a/src/io/flutter/module/FlutterModuleBuilder.java b/src/io/flutter/module/FlutterModuleBuilder.java index f4a3fb4219..dfc4c6af25 100644 --- a/src/io/flutter/module/FlutterModuleBuilder.java +++ b/src/io/flutter/module/FlutterModuleBuilder.java @@ -28,6 +28,7 @@ import io.flutter.FlutterBundle; import io.flutter.FlutterConstants; import io.flutter.FlutterUtils; +import io.flutter.module.settings.FlutterCreateAddtionalSettingsFields; import io.flutter.module.settings.RadiosForm; import io.flutter.pub.PubRoot; import io.flutter.sdk.FlutterCreateAdditionalSettings; @@ -51,12 +52,7 @@ public class FlutterModuleBuilder extends ModuleBuilder { private static final String DART_GROUP_NAME = "Static Web"; // == WebModuleBuilder.GROUP_NAME private FlutterModuleWizardStep myStep; - private RadiosForm projectTypeRadios; - private JTextField orgField; - private JTextField descriptionField; - private RadiosForm androidLanguageRadios; - private RadiosForm iosLanguageRadios; - private JCheckBox includeDriverTextField; + private FlutterCreateAddtionalSettingsFields settingsFields; @Override public String getName() { @@ -112,7 +108,7 @@ public Module commitModule(@NotNull Project project, @Nullable ModifiableModuleM } final OutputListener listener = new OutputListener(); - final PubRoot root = runFlutterCreateWithProgress(baseDir, sdk, project, listener, getAddtionalSettings()); + final PubRoot root = runFlutterCreateWithProgress(baseDir, sdk, project, listener, settingsFields.getAddtionalSettings()); if (root == null) { final String stderr = listener.getOutput().getStderr(); final String msg = stderr.isEmpty() ? "Flutter create command was unsuccessful" : stderr; @@ -219,66 +215,14 @@ public boolean validateModuleName(@NotNull String moduleName) throws Configurati public ModuleWizardStep modifySettingsStep(@NotNull SettingsStep settingsStep) { ModuleWizardStep wizard = super.modifySettingsStep(settingsStep); - if (projectTypeRadios == null) { - projectTypeRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.type.application"), - FlutterBundle.message("flutter.module.create.settings.radios.type.plugin")); - projectTypeRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.type.tip")); - - orgField = new JTextField(); - orgField.setText(FlutterBundle.message("flutter.module.create.settings.org.default_text")); - orgField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.org.tip")); - - descriptionField = new JTextField(); - descriptionField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.description.tip")); - descriptionField.setText(FlutterBundle.message("flutter.module.create.settings.description.default_text")); - - androidLanguageRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.android.ios"), - FlutterBundle.message("flutter.module.create.settings.radios.android.kotlin")); - androidLanguageRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.android.tip")); - - iosLanguageRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.ios.object_c"), - FlutterBundle.message("flutter.module.create.settings.radios.ios.swift")); - iosLanguageRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.ios.tip")); - - includeDriverTextField = new JCheckBox(); - includeDriverTextField.setSelected(true); - includeDriverTextField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.includedriver.tip")); + if (settingsFields == null) { + settingsFields = new FlutterCreateAddtionalSettingsFields(); } - - settingsStep.addSettingsField(" ", new JLabel(" ")); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.type.label"), - projectTypeRadios.getComponent()); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.org.label"), orgField); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.description.label"), descriptionField); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.android.label"), - androidLanguageRadios.getComponent()); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.ios.label"), - iosLanguageRadios.getComponent()); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.includedriver.label"), includeDriverTextField); - - settingsStep.addSettingsField("", new JLabel(" ")); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.label"), new JLabel(" ")); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.project_name.label"), - new JLabel(FlutterBundle.message("flutter.module.create.settings.help.project_name.description"))); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.org.label"), - new JLabel(FlutterBundle.message("flutter.module.create.settings.help.org.description"))); + settingsFields.addSettingsFields(settingsStep); return wizard; } - private FlutterCreateAdditionalSettings getAddtionalSettings() { - FlutterCreateAdditionalSettings addtionalSettings = new FlutterCreateAdditionalSettings.Builder() - .setDescription(!descriptionField.getText().trim().isEmpty() ? descriptionField.getText().trim() : null) - .setGeneratePlugin(projectTypeRadios.isRadio2Selected() ? true : null) - .setIncludeDriverTest(!includeDriverTextField.isSelected() ? null : true) - .setKotlin(androidLanguageRadios.isRadio2Selected() ? true : null) - .setOrg(!orgField.getText().trim().isEmpty() ? orgField.getText().trim() : null) - .setSwift(iosLanguageRadios.isRadio2Selected() ? true : null) - .build(); - - return addtionalSettings; - } - @Nullable @Override public ModuleWizardStep getCustomOptionsStep(final WizardContext context, final Disposable parentDisposable) { diff --git a/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java b/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java index c09db24c40..967db62d2f 100644 --- a/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java +++ b/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java @@ -3,7 +3,6 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ - package io.flutter.module; import com.intellij.ide.util.projectWizard.SettingsStep; @@ -16,6 +15,8 @@ import com.intellij.ui.ComboboxWithBrowseButton; import com.intellij.ui.DocumentAdapter; import io.flutter.FlutterBundle; +import io.flutter.module.settings.FlutterCreateAddtionalSettingsFields; +import io.flutter.sdk.FlutterCreateAdditionalSettings; import io.flutter.sdk.FlutterSdkUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,6 +30,7 @@ public class FlutterSmallIDEGeneratorPeer implements WebProjectGenerator.GeneratorPeer { private final ComboboxWithBrowseButton sdkPathComboWithBrowse; + private FlutterCreateAddtionalSettingsFields settingsFields; public FlutterSmallIDEGeneratorPeer() { sdkPathComboWithBrowse = new ComboboxWithBrowseButton(new ComboBox<>()); @@ -50,6 +52,11 @@ public JComponent getComponent() { @Override public void buildUI(@NotNull SettingsStep settingsStep) { settingsStep.addSettingsField("Flutter SDK", sdkPathComboWithBrowse); + + if (settingsFields == null) { + settingsFields = new FlutterCreateAddtionalSettingsFields(); + } + settingsFields.addSettingsFields(settingsStep); } @NotNull @@ -93,6 +100,10 @@ protected void textChanged(DocumentEvent e) { } } + public FlutterCreateAdditionalSettings getAddtionalSettings() { + return settingsFields.getAddtionalSettings(); + } + @NotNull private String getSdkComboPath() { return FileUtilRt.toSystemIndependentName(sdkPathComboWithBrowse.getComboBox().getEditor().getItem().toString().trim()); diff --git a/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java b/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java index b684a622fc..1eb894095f 100644 --- a/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java +++ b/src/io/flutter/module/FlutterSmallIDEProjectGenerator.java @@ -1,3 +1,8 @@ +/* + * Copyright 2016 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ package io.flutter.module; import com.intellij.execution.OutputListener; @@ -24,6 +29,8 @@ // https://youtrack.jetbrains.com/issue/WEB-27537 public class FlutterSmallIDEProjectGenerator extends WebProjectTemplate { + private FlutterSmallIDEGeneratorPeer generatorPeer; + @NotNull @Override public String getName() { @@ -38,7 +45,8 @@ public String getDescription() { @NotNull @Override public GeneratorPeer createPeer() { - return new FlutterSmallIDEGeneratorPeer(); + generatorPeer = new FlutterSmallIDEGeneratorPeer(); + return generatorPeer; } @Override @@ -59,7 +67,7 @@ public void generateProject(@NotNull Project project, // Run "flutter create". final OutputListener listener = new OutputListener(); - final PubRoot root = sdk.createFiles(baseDir, module, listener, null); + final PubRoot root = sdk.createFiles(baseDir, module, listener, generatorPeer.getAddtionalSettings()); if (root == null) { final String stderr = listener.getOutput().getStderr(); final String msg = stderr.isEmpty() ? "Flutter create command was unsuccessful" : stderr; diff --git a/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java b/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java new file mode 100644 index 0000000000..dcf0e0c1d6 --- /dev/null +++ b/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java @@ -0,0 +1,81 @@ +/* + * Copyright 2017 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.module.settings; + +import com.intellij.ide.util.projectWizard.SettingsStep; +import io.flutter.FlutterBundle; +import io.flutter.sdk.FlutterCreateAdditionalSettings; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public class FlutterCreateAddtionalSettingsFields { + private RadiosForm projectTypeRadios; + private JTextField orgField; + private JTextField descriptionField; + private RadiosForm androidLanguageRadios; + private RadiosForm iosLanguageRadios; + private JCheckBox includeDriverTextField; + + public FlutterCreateAddtionalSettingsFields() { + projectTypeRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.type.application"), + FlutterBundle.message("flutter.module.create.settings.radios.type.plugin")); + projectTypeRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.type.tip")); + + orgField = new JTextField(); + orgField.setText(FlutterBundle.message("flutter.module.create.settings.org.default_text")); + orgField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.org.tip")); + + descriptionField = new JTextField(); + descriptionField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.description.tip")); + descriptionField.setText(FlutterBundle.message("flutter.module.create.settings.description.default_text")); + + androidLanguageRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.android.java"), + FlutterBundle.message("flutter.module.create.settings.radios.android.kotlin")); + androidLanguageRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.android.tip")); + + iosLanguageRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.ios.object_c"), + FlutterBundle.message("flutter.module.create.settings.radios.ios.swift")); + iosLanguageRadios.setToolTipText(FlutterBundle.message("flutter.module.create.settings.radios.ios.tip")); + + includeDriverTextField = new JCheckBox(); + includeDriverTextField.setSelected(true); + includeDriverTextField.setToolTipText(FlutterBundle.message("flutter.module.create.settings.includedriver.tip")); + } + + public void addSettingsFields(@NotNull SettingsStep settingsStep) { + settingsStep.addSettingsField("", new JLabel(" ")); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.type.label"), + projectTypeRadios.getComponent()); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.org.label"), orgField); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.description.label"), descriptionField); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.android.label"), + androidLanguageRadios.getComponent()); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.ios.label"), + iosLanguageRadios.getComponent()); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.includedriver.label"), includeDriverTextField); + + settingsStep.addSettingsField("", new JLabel(" ")); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.label"), new JLabel(" ")); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.project_name.label"), + new JLabel(FlutterBundle.message("flutter.module.create.settings.help.project_name.description"))); + settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.org.label"), + new JLabel(FlutterBundle.message("flutter.module.create.settings.help.org.description"))); + } + + public FlutterCreateAdditionalSettings getAddtionalSettings() { + FlutterCreateAdditionalSettings addtionalSettings = new FlutterCreateAdditionalSettings.Builder() + .setDescription(!descriptionField.getText().trim().isEmpty() ? descriptionField.getText().trim() : null) + .setGeneratePlugin(projectTypeRadios.isRadio2Selected() ? true : null) + .setIncludeDriverTest(!includeDriverTextField.isSelected() ? null : true) + .setKotlin(androidLanguageRadios.isRadio2Selected() ? true : null) + .setOrg(!orgField.getText().trim().isEmpty() ? orgField.getText().trim() : null) + .setSwift(iosLanguageRadios.isRadio2Selected() ? true : null) + .build(); + + return addtionalSettings; + } +} From b5bcb282dea3b7ba9e6f2aa91daa39100d493e56 Mon Sep 17 00:00:00 2001 From: Brandon Donnelson Date: Mon, 24 Jul 2017 22:20:12 -0700 Subject: [PATCH 3/4] issue #1047 - Fixing nits and adding a help section to additional create settings. --- src/io/flutter/FlutterBundle.properties | 5 +- .../flutter/module/FlutterModuleBuilder.java | 2 +- .../module/FlutterSmallIDEGeneratorPeer.java | 8 +- .../FlutterCreateAddtionalSettingsFields.java | 19 +-- .../flutter/module/settings/RadiosForm.java | 2 +- .../module/settings/SettingsHelpForm.form | 105 ++++++++++++++ .../module/settings/SettingsHelpForm.java | 50 +++++++ .../sdk/FlutterCreateAdditionalSettings.java | 25 ++-- src/io/flutter/sdk/FlutterSdk.java | 4 +- .../FlutterCreateAddtionalSettingsTest.java | 136 +++++++++--------- 10 files changed, 256 insertions(+), 100 deletions(-) create mode 100644 src/io/flutter/module/settings/SettingsHelpForm.form create mode 100644 src/io/flutter/module/settings/SettingsHelpForm.java diff --git a/src/io/flutter/FlutterBundle.properties b/src/io/flutter/FlutterBundle.properties index 6cba1135e3..080c73c28f 100644 --- a/src/io/flutter/FlutterBundle.properties +++ b/src/io/flutter/FlutterBundle.properties @@ -110,10 +110,13 @@ flutter.module.create.settings.radios.ios.swift=Swift flutter.module.create.settings.radios.ios.tip=Select an iOS language. flutter.module.create.settings.includedriver.label=Include driver test: flutter.module.create.settings.includedriver.tip=Include generating a driver test. + flutter.module.create.settings.help.label=Help: flutter.module.create.settings.help.project_name.label=Project name: flutter.module.create.settings.help.project_name.description=Enter the project name with all lower case letters. flutter.module.create.settings.help.org.label=Organization: flutter.module.create.settings.help.org.description=Enter the organization domain name in reverse domain notation. - +flutter.module.create.settings.help.project_type.label=Project type: +flutter.module.create.settings.help.project_type.description.app=Select an "Application" when building for end users. +flutter.module.create.settings.help.project_type.description.plugin=Select a "Plugin" when building system hooks for developers. diff --git a/src/io/flutter/module/FlutterModuleBuilder.java b/src/io/flutter/module/FlutterModuleBuilder.java index dfc4c6af25..19aac081f5 100644 --- a/src/io/flutter/module/FlutterModuleBuilder.java +++ b/src/io/flutter/module/FlutterModuleBuilder.java @@ -213,7 +213,7 @@ public boolean validateModuleName(@NotNull String moduleName) throws Configurati @Nullable @Override public ModuleWizardStep modifySettingsStep(@NotNull SettingsStep settingsStep) { - ModuleWizardStep wizard = super.modifySettingsStep(settingsStep); + final ModuleWizardStep wizard = super.modifySettingsStep(settingsStep); if (settingsFields == null) { settingsFields = new FlutterCreateAddtionalSettingsFields(); diff --git a/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java b/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java index 967db62d2f..d174f7f4a9 100644 --- a/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java +++ b/src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java @@ -30,7 +30,7 @@ public class FlutterSmallIDEGeneratorPeer implements WebProjectGenerator.GeneratorPeer { private final ComboboxWithBrowseButton sdkPathComboWithBrowse; - private FlutterCreateAddtionalSettingsFields settingsFields; + private final FlutterCreateAddtionalSettingsFields settingsFields; public FlutterSmallIDEGeneratorPeer() { sdkPathComboWithBrowse = new ComboboxWithBrowseButton(new ComboBox<>()); @@ -41,6 +41,8 @@ public FlutterSmallIDEGeneratorPeer() { FlutterBundle.message("flutter.sdk.browse.path.label"), null, null, FileChooserDescriptorFactory.createSingleFolderDescriptor(), TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT); + + settingsFields = new FlutterCreateAddtionalSettingsFields(); } @NotNull @@ -53,9 +55,6 @@ public JComponent getComponent() { public void buildUI(@NotNull SettingsStep settingsStep) { settingsStep.addSettingsField("Flutter SDK", sdkPathComboWithBrowse); - if (settingsFields == null) { - settingsFields = new FlutterCreateAddtionalSettingsFields(); - } settingsFields.addSettingsFields(settingsStep); } @@ -100,6 +99,7 @@ protected void textChanged(DocumentEvent e) { } } + @NotNull public FlutterCreateAdditionalSettings getAddtionalSettings() { return settingsFields.getAddtionalSettings(); } diff --git a/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java b/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java index dcf0e0c1d6..58ccbd0c24 100644 --- a/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java +++ b/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java @@ -13,12 +13,12 @@ import javax.swing.*; public class FlutterCreateAddtionalSettingsFields { - private RadiosForm projectTypeRadios; - private JTextField orgField; - private JTextField descriptionField; - private RadiosForm androidLanguageRadios; - private RadiosForm iosLanguageRadios; - private JCheckBox includeDriverTextField; + private final RadiosForm projectTypeRadios; + private final JTextField orgField; + private final JTextField descriptionField; + private final RadiosForm androidLanguageRadios; + private final RadiosForm iosLanguageRadios; + private final JCheckBox includeDriverTextField; public FlutterCreateAddtionalSettingsFields() { projectTypeRadios = new RadiosForm(FlutterBundle.message("flutter.module.create.settings.radios.type.application"), @@ -58,12 +58,7 @@ public void addSettingsFields(@NotNull SettingsStep settingsStep) { iosLanguageRadios.getComponent()); settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.includedriver.label"), includeDriverTextField); - settingsStep.addSettingsField("", new JLabel(" ")); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.label"), new JLabel(" ")); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.project_name.label"), - new JLabel(FlutterBundle.message("flutter.module.create.settings.help.project_name.description"))); - settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.help.org.label"), - new JLabel(FlutterBundle.message("flutter.module.create.settings.help.org.description"))); + settingsStep.addSettingsComponent(new SettingsHelpForm().getComponent()); } public FlutterCreateAdditionalSettings getAddtionalSettings() { diff --git a/src/io/flutter/module/settings/RadiosForm.java b/src/io/flutter/module/settings/RadiosForm.java index f32ae7a2c4..81f9592a36 100644 --- a/src/io/flutter/module/settings/RadiosForm.java +++ b/src/io/flutter/module/settings/RadiosForm.java @@ -23,7 +23,7 @@ public RadiosForm(String label1, String label2) { radio2.setText(label2); - ButtonGroup radioGroup = new ButtonGroup(); + final ButtonGroup radioGroup = new ButtonGroup(); radioGroup.add(radio1); radioGroup.add(radio2); } diff --git a/src/io/flutter/module/settings/SettingsHelpForm.form b/src/io/flutter/module/settings/SettingsHelpForm.form new file mode 100644 index 0000000000..1f8842aa07 --- /dev/null +++ b/src/io/flutter/module/settings/SettingsHelpForm.form @@ -0,0 +1,105 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/io/flutter/module/settings/SettingsHelpForm.java b/src/io/flutter/module/settings/SettingsHelpForm.java new file mode 100644 index 0000000000..6811109b64 --- /dev/null +++ b/src/io/flutter/module/settings/SettingsHelpForm.java @@ -0,0 +1,50 @@ +/* + * Copyright 2017 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.module.settings; + +import io.flutter.FlutterBundle; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * The settings panel that list helps. + */ +public class SettingsHelpForm { + private JPanel mainPanel; + private JPanel helpPanel; + + private JLabel helpLabel; + + private JLabel projectNameLabel; + private JLabel projectNameDescription; + + private JLabel projectTypeLabel; + private JLabel projectTypeDescriptionForApp; + private JLabel projectTypeDescriptionForPlugin; + + private JLabel orgLabel; + private JLabel orgDescription; + + public SettingsHelpForm() { + projectNameLabel.setText(FlutterBundle.message("flutter.module.create.settings.help.label")); + + projectNameLabel.setText(FlutterBundle.message("flutter.module.create.settings.help.project_name.label")); + projectNameDescription.setText(FlutterBundle.message("flutter.module.create.settings.help.project_name.description")); + + projectTypeLabel.setText(FlutterBundle.message("flutter.module.create.settings.help.project_type.label")); + projectTypeDescriptionForApp.setText(FlutterBundle.message("flutter.module.create.settings.help.project_type.description.app")); + projectTypeDescriptionForPlugin.setText(FlutterBundle.message("flutter.module.create.settings.help.project_type.description.plugin")); + + orgLabel.setText(FlutterBundle.message("flutter.module.create.settings.help.org.label")); + orgDescription.setText(FlutterBundle.message("flutter.module.create.settings.help.org.description")); + } + + @NotNull + public JComponent getComponent() { + return mainPanel; + } +} diff --git a/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java b/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java index 2611dd3d73..511eb4caca 100644 --- a/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java +++ b/src/io/flutter/sdk/FlutterCreateAdditionalSettings.java @@ -5,28 +5,24 @@ */ package io.flutter.sdk; +import com.intellij.openapi.util.text.StringUtil; +import org.apache.commons.lang3.BooleanUtils; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; public class FlutterCreateAdditionalSettings { - public static class Builder { @Nullable private Boolean includeDriverTest; - @Nullable private Boolean generatePlugin; - @Nullable private String description; - @Nullable private String org; - @Nullable private Boolean swift; - @Nullable private Boolean kotlin; @@ -85,7 +81,8 @@ private FlutterCreateAdditionalSettings(Boolean includeDriverTest, Boolean generatePlugin, String description, String org, - Boolean swift, Boolean kotlin) { + Boolean swift, + Boolean kotlin) { this.includeDriverTest = includeDriverTest; this.generatePlugin = generatePlugin; this.description = description; @@ -95,32 +92,32 @@ private FlutterCreateAdditionalSettings(Boolean includeDriverTest, } public List getArgs() { - List args = new ArrayList(); + final List args = new ArrayList<>(); - if (includeDriverTest != null && includeDriverTest) { + if (BooleanUtils.isTrue(includeDriverTest)) { args.add("--with-driver-test"); } - if (generatePlugin != null && generatePlugin) { + if (BooleanUtils.isTrue(generatePlugin)) { args.add("--plugin"); } - if (description != null && !description.trim().isEmpty()) { + if (!StringUtil.isEmptyOrSpaces(description) ) { args.add("--description"); args.add(description); } - if (org != null && !org.trim().isEmpty()) { + if (!StringUtil.isEmptyOrSpaces(org)) { args.add("--org"); args.add(org); } - if (swift != null && swift) { + if (BooleanUtils.isTrue(swift)) { args.add("--ios-language"); args.add("swift"); } - if (kotlin != null && kotlin) { + if (BooleanUtils.isTrue(kotlin)) { args.add("--android-language"); args.add("kotlin"); } diff --git a/src/io/flutter/sdk/FlutterSdk.java b/src/io/flutter/sdk/FlutterSdk.java index dc5cdf81fe..f5cf1b5e78 100644 --- a/src/io/flutter/sdk/FlutterSdk.java +++ b/src/io/flutter/sdk/FlutterSdk.java @@ -121,7 +121,7 @@ public FlutterCommand flutterDoctor() { } public FlutterCommand flutterCreate(@NotNull VirtualFile appDir, @Nullable FlutterCreateAdditionalSettings additionalSettings) { - List args = new ArrayList(); + final List args = new ArrayList<>(); if (additionalSettings != null) { args.addAll(additionalSettings.getArgs()); } @@ -129,7 +129,7 @@ public FlutterCommand flutterCreate(@NotNull VirtualFile appDir, @Nullable Flutt // keep as the last argument args.add(appDir.getName()); - String[] vargs = args.stream().toArray(String[]::new); + final String[] vargs = args.stream().toArray(String[]::new); return new FlutterCommand(this, appDir.getParent(), FlutterCommand.Type.CREATE, vargs); } diff --git a/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java b/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java index 98e3dd4f35..8fdb2e2319 100644 --- a/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java +++ b/testSrc/unit/io/flutter/sdk/FlutterCreateAddtionalSettingsTest.java @@ -10,118 +10,124 @@ import java.util.List; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; public class FlutterCreateAddtionalSettingsTest { @Test public void includeDriverPropertyTest() { - FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(true).build(); - FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(false).build(); - FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(null).build(); - - List args1 = addtionalSettings1.getArgs(); - List args2 = addtionalSettings2.getArgs(); - List args3 = addtionalSettings3.getArgs(); - - assertTrue(args1.size() == 1); + final FlutterCreateAdditionalSettings addtionalSettings1 = + new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(true).build(); + final FlutterCreateAdditionalSettings addtionalSettings2 = + new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(false).build(); + final FlutterCreateAdditionalSettings addtionalSettings3 = + new FlutterCreateAdditionalSettings.Builder().setIncludeDriverTest(null).build(); + + final List args1 = addtionalSettings1.getArgs(); + final List args2 = addtionalSettings2.getArgs(); + final List args3 = addtionalSettings3.getArgs(); + + assertEquals(1, args1.size()); assertEquals("--with-driver-test", args1.get(0)); - assertTrue(args2.size() == 0); - assertTrue(args3.size() == 0); + assertEquals(0, args2.size()); + assertEquals(0, args3.size()); } @Test public void generatePluginPropertyTest() { - FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(true).build(); - FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(false).build(); - FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(null).build(); - - List args1 = addtionalSettings1.getArgs(); - List args2 = addtionalSettings2.getArgs(); - List args3 = addtionalSettings3.getArgs(); - - assertTrue(args1.size() == 1); + final FlutterCreateAdditionalSettings addtionalSettings1 = + new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(true).build(); + final FlutterCreateAdditionalSettings addtionalSettings2 = + new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(false).build(); + final FlutterCreateAdditionalSettings addtionalSettings3 = + new FlutterCreateAdditionalSettings.Builder().setGeneratePlugin(null).build(); + + final List args1 = addtionalSettings1.getArgs(); + final List args2 = addtionalSettings2.getArgs(); + final List args3 = addtionalSettings3.getArgs(); + + assertEquals(1, args1.size()); assertEquals("--plugin", args1.get(0)); - assertTrue(args2.size() == 0); - assertTrue(args3.size() == 0); + assertEquals(0, args2.size()); + assertEquals(0, args3.size()); } @Test public void descriptionPropertyTest() { - String d = "My description."; - FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setDescription(d).build(); - FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setDescription(" ").build(); - FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setDescription(null).build(); + final String d = "My description."; + final FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setDescription(d).build(); + final FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setDescription(" ").build(); + final FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setDescription(null).build(); - List args1 = addtionalSettings1.getArgs(); - List args2 = addtionalSettings2.getArgs(); - List args3 = addtionalSettings3.getArgs(); + final List args1 = addtionalSettings1.getArgs(); + final List args2 = addtionalSettings2.getArgs(); + final List args3 = addtionalSettings3.getArgs(); - assertTrue(args1.size() == 2); + assertEquals(2, args1.size()); assertEquals("--description", args1.get(0)); assertEquals(d, args1.get(1)); - assertTrue(args2.size() == 0); - assertTrue(args3.size() == 0); + assertEquals(0, args2.size()); + assertEquals(0, args3.size()); } @Test public void orgPropertyTest() { - String d = "tld.domain"; - FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setOrg(d).build(); - FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setOrg(" ").build(); - FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setOrg(null).build(); + final String d = "tld.domain"; + final FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setOrg(d).build(); + final FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setOrg(" ").build(); + final FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setOrg(null).build(); - List args1 = addtionalSettings1.getArgs(); - List args2 = addtionalSettings2.getArgs(); - List args3 = addtionalSettings3.getArgs(); + final List args1 = addtionalSettings1.getArgs(); + final List args2 = addtionalSettings2.getArgs(); + final List args3 = addtionalSettings3.getArgs(); - assertTrue(args1.size() == 2); + assertEquals(2, args1.size()); assertEquals("--org", args1.get(0)); assertEquals(d, args1.get(1)); - assertTrue(args2.size() == 0); - assertTrue(args3.size() == 0); + assertEquals(0, args2.size()); + assertEquals(0, args3.size()); } @Test public void iosPropertyTest() { - FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setSwift(true).build(); - FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setSwift(false).build(); - FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setSwift(null).build(); + final FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setSwift(true).build(); + final FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setSwift(false).build(); + final FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setSwift(null).build(); - List args1 = addtionalSettings1.getArgs(); - List args2 = addtionalSettings2.getArgs(); - List args3 = addtionalSettings3.getArgs(); + final List args1 = addtionalSettings1.getArgs(); + final List args2 = addtionalSettings2.getArgs(); + final List args3 = addtionalSettings3.getArgs(); - assertTrue(args1.size() == 2); + assertEquals(2, args1.size()); assertEquals("--ios-language", args1.get(0)); - assertTrue(args2.size() == 0); - assertTrue(args3.size() == 0); + assertEquals(0, args2.size()); + assertEquals(0, args3.size()); } @Test public void kotlinPropertyTest() { - FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setKotlin(true).build(); - FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setKotlin(false).build(); - FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setKotlin(null).build(); + final FlutterCreateAdditionalSettings addtionalSettings1 = new FlutterCreateAdditionalSettings.Builder().setKotlin(true).build(); + final FlutterCreateAdditionalSettings addtionalSettings2 = new FlutterCreateAdditionalSettings.Builder().setKotlin(false).build(); + final FlutterCreateAdditionalSettings addtionalSettings3 = new FlutterCreateAdditionalSettings.Builder().setKotlin(null).build(); - List args1 = addtionalSettings1.getArgs(); - List args2 = addtionalSettings2.getArgs(); - List args3 = addtionalSettings3.getArgs(); + final List args1 = addtionalSettings1.getArgs(); + final List args2 = addtionalSettings2.getArgs(); + final List args3 = addtionalSettings3.getArgs(); - assertTrue(args1.size() == 2); + assertEquals(2, args1.size()); assertEquals("--android-language", args1.get(0)); - assertTrue(args2.size() == 0); - assertTrue(args3.size() == 0); + assertEquals(0, args2.size()); + assertEquals(0, args3.size()); } @Test public void testMultipleProperties() { - FlutterCreateAdditionalSettings addtionalSettings = new FlutterCreateAdditionalSettings.Builder() + final FlutterCreateAdditionalSettings addtionalSettings = new FlutterCreateAdditionalSettings.Builder() .setOrg("tld.domain") .setGeneratePlugin(true) .setDescription("a b c") @@ -129,11 +135,11 @@ public void testMultipleProperties() { .setKotlin(true) .build(); - List args = addtionalSettings.getArgs(); + final List args = addtionalSettings.getArgs(); - String line = String.join(" ", args); + final String line = String.join(" ", args); - assertTrue(args.size() == 9); + assertEquals(9, args.size()); assertEquals("--plugin --description a b c --org tld.domain --ios-language swift --android-language kotlin", line); } } From 5f793efebdef92bcc02ed3e0d330a8ccfa9efa25 Mon Sep 17 00:00:00 2001 From: Brandon Donnelson Date: Mon, 24 Jul 2017 23:06:15 -0700 Subject: [PATCH 4/4] issue #1047 - Add a getting started link to the wizard. --- src/io/flutter/FlutterBundle.properties | 1 + .../FlutterCreateAddtionalSettingsFields.java | 1 - .../module/settings/SettingsHelpForm.form | 49 ++++++++++++++++--- .../module/settings/SettingsHelpForm.java | 30 ++++++++++++ 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/src/io/flutter/FlutterBundle.properties b/src/io/flutter/FlutterBundle.properties index 080c73c28f..23d62c9243 100644 --- a/src/io/flutter/FlutterBundle.properties +++ b/src/io/flutter/FlutterBundle.properties @@ -112,6 +112,7 @@ flutter.module.create.settings.includedriver.label=Include driver test: flutter.module.create.settings.includedriver.tip=Include generating a driver test. flutter.module.create.settings.help.label=Help: +flutter.module.create.settings.help.getting_started_html=Getting started with your first Flutter app. flutter.module.create.settings.help.project_name.label=Project name: flutter.module.create.settings.help.project_name.description=Enter the project name with all lower case letters. flutter.module.create.settings.help.org.label=Organization: diff --git a/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java b/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java index 58ccbd0c24..053bb9132c 100644 --- a/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java +++ b/src/io/flutter/module/settings/FlutterCreateAddtionalSettingsFields.java @@ -47,7 +47,6 @@ public FlutterCreateAddtionalSettingsFields() { } public void addSettingsFields(@NotNull SettingsStep settingsStep) { - settingsStep.addSettingsField("", new JLabel(" ")); settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.type.label"), projectTypeRadios.getComponent()); settingsStep.addSettingsField(FlutterBundle.message("flutter.module.create.settings.radios.org.label"), orgField); diff --git a/src/io/flutter/module/settings/SettingsHelpForm.form b/src/io/flutter/module/settings/SettingsHelpForm.form index 1f8842aa07..e220ace248 100644 --- a/src/io/flutter/module/settings/SettingsHelpForm.form +++ b/src/io/flutter/module/settings/SettingsHelpForm.form @@ -1,7 +1,7 @@
- + @@ -14,10 +14,9 @@ - - + @@ -29,11 +28,6 @@ - - - - - @@ -98,6 +92,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/io/flutter/module/settings/SettingsHelpForm.java b/src/io/flutter/module/settings/SettingsHelpForm.java index 6811109b64..12046b2513 100644 --- a/src/io/flutter/module/settings/SettingsHelpForm.java +++ b/src/io/flutter/module/settings/SettingsHelpForm.java @@ -9,6 +9,12 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; /** * The settings panel that list helps. @@ -29,6 +35,8 @@ public class SettingsHelpForm { private JLabel orgLabel; private JLabel orgDescription; + private JTextPane gettingStartedUrl; + public SettingsHelpForm() { projectNameLabel.setText(FlutterBundle.message("flutter.module.create.settings.help.label")); @@ -41,6 +49,28 @@ public SettingsHelpForm() { orgLabel.setText(FlutterBundle.message("flutter.module.create.settings.help.org.label")); orgDescription.setText(FlutterBundle.message("flutter.module.create.settings.help.org.description")); + + gettingStartedUrl.setText(FlutterBundle.message("flutter.module.create.settings.help.getting_started_html")); + gettingStartedUrl.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + gettingStartedUrl.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() > 0) { + if (Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + try { + URI uri = new URI("https://flutter.io/getting-started/"); + desktop.browse(uri); + } catch (IOException ex) { + // do nothing + } catch (URISyntaxException ex) { + //do nothing + } + } else { + //do nothing + } + } + } + }); } @NotNull