jafea7-ctbrec-v5.3.2-based/client/src/main/java/ctbrec/ui/DesktopIntegration.java

173 lines
6.0 KiB
Java

package ctbrec.ui;
import java.awt.AWTException;
import java.awt.Desktop;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ctbrec.OS;
import ctbrec.io.StreamRedirectThread;
import javafx.geometry.Insets;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
public class DesktopIntegration {
private DesktopIntegration() {}
private static final Logger LOG = LoggerFactory.getLogger(DesktopIntegration.class);
private static SystemTray tray;
private static TrayIcon trayIcon;
public static void open(String uri) {
try {
CamrecApplication.hostServices.showDocument(uri);
return;
} catch (Exception e) {
LOG.debug("Couldn't open URL with host services {}", uri);
}
// opening with HostServices failed, now try Desktop
try {
Desktop.getDesktop().browse(new URI(uri));
return;
} catch (Exception e) {
LOG.debug("Couldn't open URL with Desktop {}", uri);
}
// try external helpers
String[] externalHelpers = { "kde-open5", "kde-open", "gnome-open", "xdg-open" };
Runtime rt = Runtime.getRuntime();
for (String helper : externalHelpers) {
try {
rt.exec(helper + " " + uri);
return;
} catch (IOException e) {
LOG.debug("Couldn't open URL with {} {}", helper, uri);
}
}
// all attempts failed, show a dialog with URL at least
Alert info = new AutosizeAlert(Alert.AlertType.ERROR);
info.setTitle("Open URL");
info.setContentText("Couldn't open URL");
BorderPane pane = new BorderPane();
pane.setTop(new Label());
TextField urlField = new TextField(uri);
urlField.setPadding(new Insets(10));
urlField.setEditable(false);
pane.setCenter(urlField);
info.getDialogPane().setExpandableContent(pane);
info.getDialogPane().setExpanded(true);
info.show();
}
public static void open(File f) {
try {
Desktop.getDesktop().open(f);
return;
} catch (Exception e) {
LOG.debug("Couldn't open file with Desktop {}", f);
}
// try external helpers
String[] externalHelpers = { "kde-open5", "kde-open", "gnome-open", "xdg-open" };
Runtime rt = Runtime.getRuntime();
for (String helper : externalHelpers) {
try {
rt.exec(helper + " " + f.getAbsolutePath());
return;
} catch (IOException e) {
LOG.debug("Couldn't open file with {} {}", helper, f);
}
}
// all attempts failed, show a dialog with path at least
Alert info = new AutosizeAlert(Alert.AlertType.ERROR);
info.setTitle("Open file");
info.setContentText("Couldn't open file");
BorderPane pane = new BorderPane();
pane.setTop(new Label());
TextField urlField = new TextField(f.toString());
urlField.setPadding(new Insets(10));
urlField.setEditable(false);
pane.setCenter(urlField);
info.getDialogPane().setExpandableContent(pane);
info.getDialogPane().setExpanded(true);
info.show();
}
public static void notification(String title, String header, String msg) {
if (OS.getOsType() == OS.TYPE.LINUX) {
notifyLinux(title, header, msg);
} else if (OS.getOsType() == OS.TYPE.WINDOWS) {
notifyWindows(title, header, msg);
} else if (OS.getOsType() == OS.TYPE.MAC) {
notifyMac(title, header, msg);
} else {
// unknown system, try systemtray notification anyways
notifySystemTray(title, header, msg);
}
}
private static void notifyLinux(String title, String header, String msg) {
try {
Process p = Runtime.getRuntime().exec(new String[] {
"notify-send",
"-u", "normal",
"-t", "5000",
"-a", title,
header,
msg.replace("-", "\\\\-").replace("\\s", "\\\\ "),
"--icon=dialog-information"
});
new Thread(new StreamRedirectThread(p.getInputStream(), System.out)).start(); // NOSONAR
new Thread(new StreamRedirectThread(p.getErrorStream(), System.err)).start(); // NOSONAR
} catch (IOException e1) {
LOG.error("Notification failed", e1);
}
}
private static void notifyWindows(String title, String header, String msg) {
notifySystemTray(title, header, msg);
}
private static void notifyMac(String title, String header, String msg) {
notifySystemTray(title, header, msg);
}
private static synchronized void notifySystemTray(String title, String header, String msg) {
if (SystemTray.isSupported()) {
if (tray == null) {
LOG.debug("Creating tray icon");
tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().createImage(DesktopIntegration.class.getResource("/icon64.png"));
trayIcon = new TrayIcon(image, title);
trayIcon.setImageAutoSize(true);
trayIcon.setToolTip(title);
try {
tray.add(trayIcon);
} catch (AWTException e) {
LOG.error("Coulnd't add tray icon", e);
}
}
LOG.debug("Display tray message");
trayIcon.displayMessage(header, msg, MessageType.INFO);
} else {
LOG.error("SystemTray notifications not supported by this OS");
}
}
}