IDEA-145568 Import Project non-native file chooser on MacOS

This commit is contained in:
Denis Fokin
2016-08-12 18:01:38 +03:00
parent 5211cb80e3
commit f8fcb79924
4 changed files with 30 additions and 11 deletions
@@ -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;
@@ -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<List<VirtualFile>> 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<List<VirtualFile>> 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<VirtualFile> callback) {
chooseFile(descriptor, project, IdeFocusManager.getInstance(project).getFocusOwner(), toSelect, callback);
chooseFile(descriptor, project, null, toSelect, callback);
}
/**
@@ -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()*/;
@@ -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<VirtualFile> virtualFilesList = getChosenFiles(Stream.of(files));
List<VirtualFile> 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);
}
}