From 112d1cde58f5af9aa35be1eb450ea86f88a9817b Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 18 Oct 2010 20:37:21 +0400 Subject: [PATCH] enable native mac file open dialogs in some cases by default --- .../ProjectJdkForModuleStep.java | 2 +- .../openapi/projectRoots/ui/SdkEditor.java | 10 ++++- .../com/intellij/find/impl/FindDialog.java | 15 +++++--- .../impl/SdkConfigurationUtil.java | 38 +++++++++++-------- .../projectRoot/ProjectSdksModel.java | 31 +++++++-------- .../openapi/fileChooser/FileChooser.java | 4 +- .../fileChooser/MacFileChooserDialog.java | 2 + .../impl/FileChooserFactoryImpl.java | 9 ++--- 8 files changed, 66 insertions(+), 45 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/ProjectJdkForModuleStep.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/ProjectJdkForModuleStep.java index 823c9ef9b7e2..4681a04b372f 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/ProjectJdkForModuleStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/ProjectJdkForModuleStep.java @@ -82,7 +82,7 @@ public class ProjectJdkForModuleStep extends ModuleWizardStep { final JdkListConfigurable jdkConfig = JdkListConfigurable.getInstance(project); final ProjectSdksModel projectJdksModel = projectConfig.getProjectJdksModel(); final boolean[] successfullyAdded = new boolean[1]; - projectJdksModel.doAdd(type, myPanel, new Consumer() { + projectJdksModel.doAdd(type, new Consumer() { public void consume(final Sdk jdk) { successfullyAdded[0] = jdkConfig.addJdkNode(jdk, false); myJdkChooser.updateList(jdk, type); diff --git a/java/idea-ui/src/com/intellij/openapi/projectRoots/ui/SdkEditor.java b/java/idea-ui/src/com/intellij/openapi/projectRoots/ui/SdkEditor.java index 82b82d45f5de..5a40b043b9e0 100644 --- a/java/idea-ui/src/com/intellij/openapi/projectRoots/ui/SdkEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/projectRoots/ui/SdkEditor.java @@ -36,6 +36,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.TabbedPaneWrapper; import com.intellij.ui.navigation.History; import com.intellij.ui.navigation.Place; +import com.intellij.util.Consumer; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -274,8 +275,13 @@ public class SdkEditor implements Configurable, Place.Navigator { private void doSelectHomePath(){ final SdkType sdkType = mySdk.getSdkType(); - final String homePath = SdkConfigurationUtil.selectSdkHome(myHomeComponent, sdkType); - doSetHomePath(homePath, sdkType); + SdkConfigurationUtil.selectSdkHome(sdkType, new Consumer() { + @Override + public void consume(final String path) { + doSetHomePath(path, sdkType); + } + }); + } private void doSetHomePath(final String homePath, final SdkType sdkType) { diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java index 6f634b1374f4..2337b752c294 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java @@ -55,6 +55,7 @@ import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.util.ArrayUtil; +import com.intellij.util.Consumer; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -762,11 +763,15 @@ class FindDialog extends DialogWrapper { mySelectDirectoryButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); - VirtualFile[] files = FileChooser.chooseFiles(myProject, descriptor); - if (files.length != 0) { - myDirectoryComboBox.setSelectedItem(files[0].getPresentableUrl()); - validateFindButton(); - } + FileChooser.chooseFilesWithSlideEffect(descriptor, myProject, null, new Consumer() { + @Override + public void consume(final VirtualFile[] files) { + if (files.length != 0) { + myDirectoryComboBox.setSelectedItem(files[0].getPresentableUrl()); + validateFindButton(); + } + } + }); } }); diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java index ba29ba95d3f3..3a4b490bc5c4 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/SdkConfigurationUtil.java @@ -18,10 +18,7 @@ package com.intellij.openapi.projectRoots.impl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.fileChooser.FileChooserDialog; -import com.intellij.openapi.fileChooser.FileChooserFactory; +import com.intellij.openapi.fileChooser.*; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; @@ -41,6 +38,7 @@ import com.intellij.openapi.ui.popup.ListPopupStep; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -50,9 +48,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.*; import java.util.*; -import java.util.List; /** * @author yole @@ -240,17 +236,27 @@ public class SdkConfigurationUtil { return newSdkName; } - @Nullable - public static String selectSdkHome(final Component parentComponent, final SdkType sdkType){ + public static void selectSdkHome(final SdkType sdkType, @NotNull final Consumer consumer){ final FileChooserDescriptor descriptor = sdkType.getHomeChooserDescriptor(); - VirtualFile[] files = FileChooser.chooseFiles(parentComponent, descriptor, getSuggestedSdkRoot(sdkType)); - if (files.length != 0){ - final String path = files[0].getPath(); - if (sdkType.isValidSdkHome(path)) return path; - String adjustedPath = sdkType.adjustSelectedSdkHome(path); - return sdkType.isValidSdkHome(adjustedPath) ? adjustedPath : null; - } - return null; + if (SystemInfo.isMac) descriptor.putUserData(MacFileChooserDialog.NATIVE_MAC_FILE_CHOOSER_ENABLED, Boolean.TRUE); + FileChooser.chooseFilesWithSlideEffect(descriptor, null, getSuggestedSdkRoot(sdkType), + new Consumer() { + @Override + public void consume(final VirtualFile[] chosen) { + if (chosen != null && chosen.length != 0) { + final String path = chosen[0].getPath(); + if (sdkType.isValidSdkHome(path)) { + consumer.consume(path); + return; + } + + String adjustedPath = sdkType.adjustSelectedSdkHome(path); + if (sdkType.isValidSdkHome(adjustedPath)) { + consumer.consume(adjustedPath); + } + } + } + }); } @Nullable diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java index 84f3f3914894..4171a12890e4 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java @@ -218,31 +218,32 @@ public class ProjectSdksModel implements SdkModel { null, type.getIconForAddAction()) { public void actionPerformed(AnActionEvent e) { - doAdd(type, parent, updateTree); + doAdd(type, updateTree); } }; group.add(addAction); } } - public void doAdd(final SdkType type, JComponent parent, final Consumer updateTree) { + public void doAdd(final SdkType type, final Consumer updateTree) { myModified = true; - final String home = SdkConfigurationUtil.selectSdkHome(parent, type); - if (home == null) { - return; - } - String newSdkName = SdkConfigurationUtil.createUniqueSdkName(type, home, myProjectSdks.values()); - final ProjectJdkImpl newJdk = new ProjectJdkImpl(newSdkName, type); - newJdk.setHomePath(home); + SdkConfigurationUtil.selectSdkHome(type, new Consumer() { + @Override + public void consume(final String home) { + String newSdkName = SdkConfigurationUtil.createUniqueSdkName(type, home, myProjectSdks.values()); + final ProjectJdkImpl newJdk = new ProjectJdkImpl(newSdkName, type); + newJdk.setHomePath(home); - if (!type.setupSdkPaths(newJdk, this)) return; + if (!type.setupSdkPaths(newJdk, ProjectSdksModel.this)) return; - if (newJdk.getVersionString() == null) { - Messages.showMessageDialog(ProjectBundle.message("sdk.java.corrupt.error", home), - ProjectBundle.message("sdk.java.corrupt.title"), Messages.getErrorIcon()); - } + if (newJdk.getVersionString() == null) { + Messages.showMessageDialog(ProjectBundle.message("sdk.java.corrupt.error", home), + ProjectBundle.message("sdk.java.corrupt.title"), Messages.getErrorIcon()); + } - doAdd(newJdk, updateTree); + doAdd(newJdk, updateTree); + } + }); } public void addSdk(Sdk sdk) { diff --git a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooser.java b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooser.java index c83154e9ae76..8dab21e8c013 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooser.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooser.java @@ -16,6 +16,7 @@ package com.intellij.openapi.fileChooser; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; @@ -62,9 +63,10 @@ public class FileChooser { @Nullable final VirtualFile toSelect, @NotNull final Consumer onChosenCallback ) { + if (SystemInfo.isMac) descriptor.putUserData(MacFileChooserDialog.NATIVE_MAC_FILE_CHOOSER_ENABLED, Boolean.TRUE); final FileChooserDialog dialog = FileChooserFactory.getInstance().createFileChooser(descriptor, project); if (dialog instanceof MacFileChooserDialog) { - ((MacFileChooserDialog)dialog).chooseWithSheet(null, project, new MacFileChooserDialog.MacFileChooserCallback() { + ((MacFileChooserDialog)dialog).chooseWithSheet(toSelect, project, new MacFileChooserDialog.MacFileChooserCallback() { public void onChosen(@NotNull final VirtualFile[] files) { onChosenCallback.consume(files); } diff --git a/platform/platform-api/src/com/intellij/openapi/fileChooser/MacFileChooserDialog.java b/platform/platform-api/src/com/intellij/openapi/fileChooser/MacFileChooserDialog.java index cef481c09fd7..3e201c51b7b7 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/MacFileChooserDialog.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/MacFileChooserDialog.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.fileChooser; +import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; @@ -24,6 +25,7 @@ import org.jetbrains.annotations.Nullable; * User: spLeaner */ public interface MacFileChooserDialog extends FileChooserDialog { + DataKey NATIVE_MAC_FILE_CHOOSER_ENABLED = DataKey.create("native.mac.file.chooser.enabled"); void chooseWithSheet(@Nullable VirtualFile toSelect, @Nullable Project project, @NotNull final MacFileChooserCallback callback); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileChooser/impl/FileChooserFactoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileChooser/impl/FileChooserFactoryImpl.java index 3869a20b37bb..8fc152deeade 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileChooser/impl/FileChooserFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileChooser/impl/FileChooserFactoryImpl.java @@ -24,7 +24,6 @@ import com.intellij.openapi.fileChooser.ex.FileSaverDialogImpl; import com.intellij.openapi.fileChooser.ex.FileTextFieldImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.mac.MacFileChooserDialogImpl; import javax.swing.*; @@ -35,8 +34,8 @@ import java.util.Set; public class FileChooserFactoryImpl extends FileChooserFactory { public FileChooserDialog createFileChooser(FileChooserDescriptor descriptor, Project project) { - if (SystemInfo.isMac && (System.getProperty("idea.use.native.mac.filechooser", Boolean.FALSE.toString()).equals(Boolean.TRUE.toString()) - || Registry.is("ide.use.native.mac.filechooser"))) { + final Object macNativeFileChooser = descriptor.getUserData(MacFileChooserDialog.NATIVE_MAC_FILE_CHOOSER_ENABLED.getName()); + if (SystemInfo.isMac && macNativeFileChooser instanceof Boolean && ((Boolean)macNativeFileChooser).booleanValue()) { return new MacFileChooserDialogImpl(descriptor, project); } @@ -44,8 +43,8 @@ public class FileChooserFactoryImpl extends FileChooserFactory { } public FileChooserDialog createFileChooser(FileChooserDescriptor descriptor, Component parent) { - if (SystemInfo.isMac && (System.getProperty("idea.use.native.mac.filechooser", Boolean.FALSE.toString()).equals(Boolean.TRUE.toString()) - || Registry.is("ide.use.native.mac.filechooser"))) { + final Object macNativeFileChooser = descriptor.getUserData(MacFileChooserDialog.NATIVE_MAC_FILE_CHOOSER_ENABLED.getName()); + if (SystemInfo.isMac && macNativeFileChooser instanceof Boolean && ((Boolean)macNativeFileChooser).booleanValue()) { return new MacFileChooserDialogImpl(descriptor, parent); }