diff --git a/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java b/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java index 1824c0cd7b2c..7472e3d2e3fa 100644 --- a/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java +++ b/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java @@ -26,6 +26,9 @@ import java.util.LinkedHashSet; import java.util.Set; public class ActionCallback implements Disposable { + public static final ActionCallback DONE = new Done(); + public static final ActionCallback REJECTED = new Rejected(); + private final ExecutionCallback myDone; private final ExecutionCallback myRejected; diff --git a/platform/lang-api/src/com/intellij/execution/runners/BaseProgramRunner.java b/platform/lang-api/src/com/intellij/execution/runners/BaseProgramRunner.java new file mode 100644 index 000000000000..d83404f53a33 --- /dev/null +++ b/platform/lang-api/src/com/intellij/execution/runners/BaseProgramRunner.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intellij.execution.runners; + +import com.intellij.execution.ExecutionException; +import com.intellij.execution.ExecutionResult; +import com.intellij.execution.Executor; +import com.intellij.execution.RunManager; +import com.intellij.execution.configurations.*; +import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class BaseProgramRunner implements ProgramRunner { + @Override + @Nullable + public Settings createConfigurationData(ConfigurationInfoProvider settingsProvider) { + return null; + } + + @Override + public void checkConfiguration(RunnerSettings settings, ConfigurationPerRunnerSettings configurationPerRunnerSettings) + throws RuntimeConfigurationException { + } + + @Override + public void onProcessStarted(RunnerSettings settings, ExecutionResult executionResult) { + } + + @Override + @Nullable + public SettingsEditor getSettingsEditor(Executor executor, RunConfiguration configuration) { + return null; + } + + @Override + public void execute(@NotNull ExecutionEnvironment environment) throws ExecutionException { + execute(environment, null); + } + + @Override + public void execute(@NotNull ExecutionEnvironment environment, @Nullable Callback callback) + throws ExecutionException { + + RunProfileState state = environment.getState(); + if (state == null) { + return; + } + + Project project = environment.getProject(); + RunManager.getInstance(project).refreshUsagesList(environment.getRunProfile()); + startRunProfile(environment, callback, project, state); + } + + protected abstract void startRunProfile(@NotNull ExecutionEnvironment environment, + @Nullable Callback callback, + @NotNull Project project, + @NotNull RunProfileState state) throws ExecutionException; +} \ No newline at end of file diff --git a/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java b/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java index 758a5eb74fd8..87a933fdf285 100644 --- a/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java +++ b/platform/lang-api/src/com/intellij/execution/runners/GenericProgramRunner.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,6 +74,11 @@ public abstract class GenericProgramRunner impl RunManager.getInstance(project).refreshUsagesList(env.getRunProfile()); + startRunProfile(env, callback, project, state); + } + + protected void startRunProfile(@NotNull ExecutionEnvironment environment, @Nullable final Callback callback, @NotNull Project project, @NotNull RunProfileState state) + throws ExecutionException { ExecutionManager.getInstance(project).startRunProfile(new RunProfileStarter() { @Override public RunContentDescriptor execute(@NotNull Project project, @@ -81,14 +86,16 @@ public abstract class GenericProgramRunner impl @NotNull RunProfileState state, @Nullable RunContentDescriptor contentToReuse, @NotNull ExecutionEnvironment env) throws ExecutionException { - final RunContentDescriptor descriptor = doExecute(project, state, contentToReuse, env); + RunContentDescriptor descriptor = doExecute(project, state, contentToReuse, env); if (descriptor != null) { descriptor.setExecutionId(env.getExecutionId()); } - if (callback != null) callback.processStarted(descriptor); + if (callback != null) { + callback.processStarted(descriptor); + } return descriptor; } - }, state, env); + }, state, environment); } @Nullable diff --git a/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxSettingsConfigurable.java b/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxSettingsConfigurable.java index fb92f516af05..9aedd893b31d 100644 --- a/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxSettingsConfigurable.java +++ b/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxSettingsConfigurable.java @@ -16,10 +16,12 @@ package com.intellij.ide.browsers.firefox; import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.PathChooserDialog; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.DocumentAdapter; @@ -58,21 +60,24 @@ public class FirefoxSettingsConfigurable implements Configurable { } public static FileChooserDescriptor createProfilesIniChooserDescriptor() { - return new FileChooserDescriptor(true, false, false, false, false, false) { + FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) { @Override - public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { - if (!file.isDirectory() && !file.getName().equals(FirefoxUtil.PROFILES_INI_FILE)) { - return false; - } - return super.isFileVisible(file, showHiddenFiles); + public boolean isFileSelectable(VirtualFile file) { + return file.getName().equals(FirefoxUtil.PROFILES_INI_FILE) && super.isFileSelectable(file); } }; + if (SystemInfo.isMac) { + descriptor.putUserData(PathChooserDialog.NATIVE_MAC_CHOOSER_SHOW_HIDDEN_FILES, Boolean.TRUE); + } + return descriptor; } + @Override public JComponent createComponent() { return myMainPanel; } + @Override public boolean isModified() { return !Comparing.equal(mySettings.getProfile(), getConfiguredProfileName()) || !Comparing.equal(mySettings.getProfilesIniPath(), getConfiguredProfileIniPath()); @@ -96,11 +101,13 @@ public class FirefoxSettingsConfigurable implements Configurable { return selected; } + @Override public void apply() throws ConfigurationException { mySettings.setProfile(getConfiguredProfileName()); mySettings.setProfilesIniPath(getConfiguredProfileIniPath()); } + @Override public void reset() { final File defaultFile = FirefoxUtil.getDefaultProfileIniPath(); myDefaultProfilesIniPath = defaultFile != null ? defaultFile.getAbsolutePath() : ""; @@ -121,6 +128,7 @@ public class FirefoxSettingsConfigurable implements Configurable { final FirefoxProfile defaultProfile = FirefoxUtil.getDefaultProfile(profiles); myDefaultProfile = defaultProfile != null ? defaultProfile.getName() : null; for (FirefoxProfile profile : profiles) { + //noinspection unchecked myProfileCombobox.addItem(profile.getName()); } if (!profiles.isEmpty()) { @@ -129,14 +137,17 @@ public class FirefoxSettingsConfigurable implements Configurable { myLastProfilesIniPath = profilesIniPath; } + @Override public void disposeUIResources() { } + @Override @Nls public String getDisplayName() { return XmlBundle.message("display.name.firefox.settings"); } + @Override public String getHelpTopic() { return null; } diff --git a/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxUtil.java b/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxUtil.java index 5541052db955..00b83be988c4 100644 --- a/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxUtil.java +++ b/xml/impl/src/com/intellij/ide/browsers/firefox/FirefoxUtil.java @@ -18,6 +18,7 @@ package com.intellij.ide.browsers.firefox; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.SmartList; import com.intellij.util.SystemProperties; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -27,7 +28,6 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -35,7 +35,7 @@ import java.util.List; * @author nik */ public class FirefoxUtil { - private static final Logger LOG = Logger.getInstance("#com.intellij.ide.browsers.firefox.FirefoxUtil"); + private static final Logger LOG = Logger.getInstance(FirefoxUtil.class); @NonNls public static final String PROFILES_INI_FILE = "profiles.ini"; private FirefoxUtil() { @@ -70,7 +70,7 @@ public class FirefoxUtil { } @Nullable - public static FirefoxProfile findProfileByNameOrDefault(@Nullable String name, List profiles) { + public static FirefoxProfile findProfileByNameOrDefault(@Nullable String name, @NotNull List profiles) { for (FirefoxProfile profile : profiles) { if (profile.getName().equals(name)) { return profile; @@ -81,7 +81,9 @@ public class FirefoxUtil { @Nullable public static FirefoxProfile getDefaultProfile(List profiles) { - if (profiles.isEmpty()) return null; + if (profiles.isEmpty()) { + return null; + } for (FirefoxProfile profile : profiles) { if (profile.isDefault()) { @@ -92,15 +94,16 @@ public class FirefoxUtil { } @NotNull - public static List computeProfiles(File profilesFile) { - if (!profilesFile.isFile()) { + public static List computeProfiles(@Nullable File profilesFile) { + if (profilesFile == null || !profilesFile.isFile()) { return Collections.emptyList(); } try { - BufferedReader reader = new BufferedReader(new FileReader(profilesFile)); + BufferedReader reader; + reader = new BufferedReader(new FileReader(profilesFile)); try { - final List profiles = new ArrayList(); + final List profiles = new SmartList(); boolean insideProfile = false; String currentName = null; String currentPath = null; @@ -108,7 +111,7 @@ public class FirefoxUtil { boolean isRelative = false; boolean eof = false; while (!eof) { - @NonNls String line = reader.readLine(); + String line = reader.readLine(); if (line == null) { eof = true; line = "[]"; @@ -131,8 +134,8 @@ public class FirefoxUtil { final int i = line.indexOf('='); if (i != -1 && insideProfile) { - @NonNls String name = line.substring(0, i).trim(); - @NonNls String value = line.substring(i + 1).trim(); + String name = line.substring(0, i).trim(); + String value = line.substring(i + 1).trim(); if (name.equalsIgnoreCase("path")) { currentPath = value; } @@ -142,7 +145,8 @@ public class FirefoxUtil { else if (name.equalsIgnoreCase("default") && value.equals("1")) { isDefault = true; } - else if (name.equalsIgnoreCase("isrelative") && value.equals("1")) { + else //noinspection SpellCheckingInspection + if (name.equalsIgnoreCase("isrelative") && value.equals("1")) { isRelative = true; } } @@ -155,8 +159,8 @@ public class FirefoxUtil { } catch (IOException e) { LOG.info(e); + return Collections.emptyList(); } - return Collections.emptyList(); } private static File[] getProfilesDirs() {