Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/io/flutter/FlutterBundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,35 @@ 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.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:
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.getting_started_html=<html><a href="https://flutter.io/getting-started/">Getting started with your first Flutter app.</a></html>
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.

33 changes: 27 additions & 6 deletions src/io/flutter/module/FlutterModuleBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -27,14 +28,19 @@
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;
import io.flutter.sdk.FlutterSdk;
import io.flutter.sdk.FlutterSdkUtil;
import io.flutter.utils.FlutterModuleUtils;
import org.jetbrains.annotations.NotNull;
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;

Expand All @@ -46,6 +52,7 @@ public class FlutterModuleBuilder extends ModuleBuilder {
private static final String DART_GROUP_NAME = "Static Web"; // == WebModuleBuilder.GROUP_NAME

private FlutterModuleWizardStep myStep;
private FlutterCreateAddtionalSettingsFields settingsFields;

@Override
public String getName() {
Expand Down Expand Up @@ -101,7 +108,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, settingsFields.getAddtionalSettings());
if (root == null) {
final String stderr = listener.getOutput().getStderr();
final String msg = stderr.isEmpty() ? "Flutter create command was unsuccessful" : stderr;
Expand Down Expand Up @@ -172,11 +179,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).");
Expand All @@ -203,6 +210,19 @@ public boolean validateModuleName(@NotNull String moduleName) throws Configurati
return super.validateModuleName(moduleName);
}

@Nullable
@Override
public ModuleWizardStep modifySettingsStep(@NotNull SettingsStep settingsStep) {
final ModuleWizardStep wizard = super.modifySettingsStep(settingsStep);

if (settingsFields == null) {
settingsFields = new FlutterCreateAddtionalSettingsFields();
}
settingsFields.addSettingsFields(settingsStep);

return wizard;
}

@Nullable
@Override
public ModuleWizardStep getCustomOptionsStep(final WizardContext context, final Disposable parentDisposable) {
Expand Down Expand Up @@ -239,13 +259,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<PubRoot> 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();
Expand Down
16 changes: 13 additions & 3 deletions src/io/flutter/module/FlutterSmallIDEGeneratorPeer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -28,8 +29,8 @@
// (and replaced with DirectoryProjectGenerator)

public class FlutterSmallIDEGeneratorPeer implements WebProjectGenerator.GeneratorPeer<String> {
private JPanel myMainPanel;
private final ComboboxWithBrowseButton sdkPathComboWithBrowse;
private final FlutterCreateAddtionalSettingsFields settingsFields;

public FlutterSmallIDEGeneratorPeer() {
sdkPathComboWithBrowse = new ComboboxWithBrowseButton(new ComboBox<>());
Expand All @@ -40,17 +41,21 @@ public FlutterSmallIDEGeneratorPeer() {
FlutterBundle.message("flutter.sdk.browse.path.label"), null, null,
FileChooserDescriptorFactory.createSingleFolderDescriptor(),
TextComponentAccessor.STRING_COMBOBOX_WHOLE_TEXT);

settingsFields = new FlutterCreateAddtionalSettingsFields();
}

@NotNull
@Override
public JComponent getComponent() {
return myMainPanel;
return null;
}

@Override
public void buildUI(@NotNull SettingsStep settingsStep) {
settingsStep.addSettingsField("Flutter SDK", sdkPathComboWithBrowse);

settingsFields.addSettingsFields(settingsStep);
}

@NotNull
Expand Down Expand Up @@ -94,6 +99,11 @@ protected void textChanged(DocumentEvent e) {
}
}

@NotNull
public FlutterCreateAdditionalSettings getAddtionalSettings() {
return settingsFields.getAddtionalSettings();
}

@NotNull
private String getSdkComboPath() {
return FileUtilRt.toSystemIndependentName(sdkPathComboWithBrowse.getComboBox().getEditor().getItem().toString().trim());
Expand Down
13 changes: 10 additions & 3 deletions src/io/flutter/module/FlutterSmallIDEProjectGenerator.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -24,6 +29,8 @@
// https://youtrack.jetbrains.com/issue/WEB-27537

public class FlutterSmallIDEProjectGenerator extends WebProjectTemplate<String> {
private FlutterSmallIDEGeneratorPeer generatorPeer;

@NotNull
@Override
public String getName() {
Expand All @@ -38,7 +45,8 @@ public String getDescription() {
@NotNull
@Override
public GeneratorPeer<String> createPeer() {
return new FlutterSmallIDEGeneratorPeer();
generatorPeer = new FlutterSmallIDEGeneratorPeer();
return generatorPeer;
}

@Override
Expand All @@ -51,7 +59,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");
Expand All @@ -60,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);
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* 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 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"),
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(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.addSettingsComponent(new SettingsHelpForm().getComponent());
}

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;
}
}
41 changes: 41 additions & 0 deletions src/io/flutter/module/settings/RadiosForm.form
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="io.flutter.module.settings.RadiosForm">
<grid id="27dc6" binding="radiosPanel" layout-manager="GridLayoutManager" row-count="2" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="500" height="400"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="e66fc" class="javax.swing.JRadioButton" binding="radio1">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<minimum-size width="125" height="-1"/>
</grid>
</constraints>
<properties>
<text value="RadioButton"/>
</properties>
</component>
<vspacer id="54bf5">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="4c96b" class="javax.swing.JRadioButton" binding="radio2">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="RadioButton"/>
</properties>
</component>
<hspacer id="c64a5">
<constraints>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
</children>
</grid>
</form>
Loading