diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryTypeServiceImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryTypeServiceImpl.java index 93748fd81c4f..9a22d3105e8e 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryTypeServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryTypeServiceImpl.java @@ -15,8 +15,7 @@ */ package com.intellij.openapi.roots.impl.libraries; -import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.libraries.*; import com.intellij.openapi.roots.libraries.ui.LibraryRootsComponentDescriptor; 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 65d8582e2d28..f3b4bfe7101c 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooser.java +++ b/platform/platform-api/src/com/intellij/openapi/fileChooser/FileChooser.java @@ -68,8 +68,9 @@ public class FileChooser { @Nullable final Component parent, @Nullable final Project project, @Nullable final VirtualFile toSelect) { + Component parentComponent = (parent == null) ? KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() : parent; LOG.assertTrue(!descriptor.isChooseMultiple()); - return ArrayUtil.getFirstElement(chooseFiles(descriptor, parent, project, toSelect)); + return ArrayUtil.getFirstElement(chooseFiles(descriptor, parentComponent, project, toSelect)); } /** @@ -87,7 +88,7 @@ public class FileChooser { @Nullable final Project project, @Nullable final VirtualFile toSelect, @NotNull final Consumer> callback) { - chooseFiles(descriptor, project, KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(), toSelect, callback); + chooseFiles(descriptor, project, null, toSelect, callback); } /** @@ -107,8 +108,9 @@ public class FileChooser { @Nullable final Component parent, @Nullable final VirtualFile toSelect, @NotNull final Consumer> callback) { + Component parentComponent = (parent == null) ? KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() : parent; final FileChooserFactory factory = FileChooserFactory.getInstance(); - final PathChooserDialog pathChooser = factory.createPathChooser(descriptor, project, parent); + final PathChooserDialog pathChooser = factory.createPathChooser(descriptor, project, parentComponent); pathChooser.choose(toSelect, callback); } @@ -126,7 +128,7 @@ public class FileChooser { @Nullable final Project project, @Nullable final VirtualFile toSelect, @NotNull final Consumer callback) { - chooseFile(descriptor, project, IdeFocusManager.getInstance(project).getFocusOwner(), toSelect, callback); + chooseFile(descriptor, project, null, toSelect, 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 60fff3e21457..0dcf3a03f092 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 @@ -43,6 +43,9 @@ public class FileChooserFactoryImpl extends FileChooserFactory { public FileChooserDialog createFileChooser(@NotNull FileChooserDescriptor descriptor, @Nullable Project project, @Nullable Component parent) { + if (useNativeMacChooser(descriptor)) { + return new MacPathChooserDialog(descriptor, parent, project); + } if (parent != null) { return new FileChooserDialogImpl(descriptor, parent, project); } @@ -69,7 +72,6 @@ public class FileChooserFactoryImpl extends FileChooserFactory { private static boolean useNativeMacChooser(final FileChooserDescriptor descriptor) { return SystemInfo.isMac && - !descriptor.isChooseJarContents() && SystemProperties.getBooleanProperty("native.mac.file.chooser.enabled", true) && Registry.is("ide.mac.file.chooser.native") /*&& !DialogWrapper.isMultipleModalDialogs()*/; diff --git a/platform/platform-impl/src/com/intellij/ui/mac/MacPathChooserDialog.java b/platform/platform-impl/src/com/intellij/ui/mac/MacPathChooserDialog.java index 37f85924d2e8..3eaafe80aec1 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/MacPathChooserDialog.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/MacPathChooserDialog.java @@ -23,6 +23,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.CommandProcessorEx; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDialog; import com.intellij.openapi.fileChooser.PathChooserDialog; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; @@ -49,12 +50,13 @@ import java.util.stream.Stream; * @author Denis Fokin */ -public class MacPathChooserDialog implements PathChooserDialog { +public class MacPathChooserDialog implements PathChooserDialog, FileChooserDialog{ private FileDialog myFileDialog; private final FileChooserDescriptor myFileChooserDescriptor; private final Component myParent; private final String myTitle; + private VirtualFile [] virtualFiles; public MacPathChooserDialog(FileChooserDescriptor descriptor, Component parent, Project project) { @@ -120,10 +122,11 @@ public class MacPathChooserDialog implements PathChooserDialog { } File[] files = myFileDialog.getFiles(); - List virtualFilesList = getChosenFiles(Stream.of(files)); + List virtualFileList = getChosenFiles(Stream.of(files)); + virtualFiles = virtualFileList.toArray(VirtualFile.EMPTY_ARRAY); try { - myFileChooserDescriptor.validateSelectedFiles(virtualFilesList.toArray(VirtualFile.EMPTY_ARRAY)); + myFileChooserDescriptor.validateSelectedFiles(virtualFiles); } catch (Exception e) { Messages.showErrorDialog(myParent, e.getMessage(), myTitle); @@ -131,7 +134,7 @@ public class MacPathChooserDialog implements PathChooserDialog { } if (!ArrayUtil.isEmpty(files)) { - callback.consume(virtualFilesList); + callback.consume(virtualFileList); } else if (callback instanceof FileChooser.FileChooserConsumer) { ((FileChooser.FileChooserConsumer)callback).cancelled(); @@ -145,4 +148,17 @@ public class MacPathChooserDialog implements PathChooserDialog { // Therefore we should minimize usage of this case. return new FileDialog((Frame)null, title, load); } + + @NotNull + @Override + public VirtualFile[] choose(@Nullable VirtualFile toSelect, @Nullable Project project) { + choose(toSelect, files -> {}); + return virtualFiles; + } + + @NotNull + @Override + public VirtualFile[] choose(@Nullable Project project, @NotNull VirtualFile... toSelect) { + return choose((toSelect.length > 0 ? toSelect[0] : null), project); + } }