From b84bf96211db33b88f3ba074bcb49f32305dac29 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 10 Feb 2019 21:40:25 +0000
Subject: [PATCH] Hanging of file chooser on Mac OS (using awt file dialog instead).
---
borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java | 75 +++++++++++++++++++++++++++----------
1 files changed, 54 insertions(+), 21 deletions(-)
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java
index 3e93121..5045ef2 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.java
@@ -1,6 +1,7 @@
package de.micromata.borgbutler.server.rest;
import de.micromata.borgbutler.json.JsonUtils;
+import de.micromata.borgbutler.server.RunningMode;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -13,6 +14,7 @@
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
+import java.awt.*;
import java.io.File;
@Path("/files")
@@ -35,7 +37,7 @@
log.info(msg);
return msg;
}
- if (chooser != null) {
+ if (fileDialog != null || fileChooser != null) {
log.warn("Cannot call already opened file choose twice. Close file chooser first.");
return "{\"directory\": \"\"}";
}
@@ -44,28 +46,58 @@
if (frame == null) {
frame = new JFrame("BorgButler");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- JLabel label = new JLabel("Hello World");
- frame.getContentPane().add(label);
- frame.pack();
+ frame.setSize(300, 100);
+ frame.setResizable(false);
+ frame.setLocationRelativeTo(null);
+ frame.setBackground(Color.WHITE);
+ frame.getContentPane().setBackground(Color.WHITE);
+ JLabel label = new JLabel("Click for choosing directory...", SwingConstants.CENTER);
+ frame.add(label);
}
- try {
- if (StringUtils.isNotBlank(current)) {
- chooser = new JFileChooser(current);
- } else {
- chooser = new JFileChooser();
- }
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
-
- frame.setVisible(true);
+ if (RunningMode.getOSType() == RunningMode.OSType.MAC_OS) {
+ // The JFileChooser will hang after several calls, use AWT file dialog instead for Mac OS:
+ System.setProperty("apple.awt.fileDialogForDirectories", "true");
frame.setAlwaysOnTop(true);
- int returnCode = chooser.showDialog(frame, "Choose");
- frame.setVisible(false);
- frame.setAlwaysOnTop(false);
- if (returnCode == JFileChooser.APPROVE_OPTION) {
- file = chooser.getSelectedFile();
+ frame.setVisible(true);
+ try {
+ fileDialog = new FileDialog(frame, "Choose a directory", FileDialog.LOAD);
+ if (StringUtils.isNotBlank(current)) {
+ fileDialog.setDirectory(current);
+ }
+ fileDialog.toFront();
+ fileDialog.setVisible(true);
+ String filename = fileDialog.getFile();
+ String directory = fileDialog.getDirectory();
+ frame.setVisible(false);
+ if (filename == null) {
+ return "";
+ }
+ file = new File(directory, filename);
+ if (!file.isDirectory()) {
+ file = new File(directory);
+ }
+ } finally {
+ fileDialog = null;
}
- } finally {
- chooser = null;
+ } else {
+ try {
+ if (StringUtils.isNotBlank(current)) {
+ fileChooser = new JFileChooser(current);
+ } else {
+ fileChooser = new JFileChooser();
+ }
+ fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ frame.setVisible(true);
+ frame.setAlwaysOnTop(true);
+ int returnCode = fileChooser.showDialog(frame, "Choose");
+ frame.setVisible(false);
+ frame.setAlwaysOnTop(false);
+ if (returnCode == JFileChooser.APPROVE_OPTION) {
+ file = fileChooser.getSelectedFile();
+ }
+ } finally {
+ fileChooser = null;
+ }
}
}
String filename = file != null ? JsonUtils.toJson(file.getAbsolutePath()) : "";
@@ -89,5 +121,6 @@
}
private static JFrame frame;
- private static JFileChooser chooser;
+ private static FileDialog fileDialog;
+ private static JFileChooser fileChooser;
}
--
Gitblit v1.10.0