package mediathek.mac;
import com.apple.eawt.Application;
import com.jidesoft.utils.SystemInfo;
import mSearch.tool.Listener;
import mSearch.tool.Log;
import mediathek.MediathekGui;
import mediathek.config.Daten;
import mediathek.gui.bandwidth.MVBandwidthMonitorOSX;
import mediathek.gui.filmInformation.MVFilmInformationOSX;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
@SuppressWarnings("serial")
public class MediathekGuiMac extends MediathekGui {
private final Daten daten;
/**
* Repaint-Thread for progress indicator on OS X.
*/
private Thread osxProgressIndicatorThread = null;
public MediathekGuiMac(String[] ar) {
super(ar);
daten = Daten.getInstance();
//Window must be fully initialized to become fullscreen cadidate...
setWindowFullscreenCapability();
}
/**
* Enable Fullscreen window mode on OS X.
* Depends on OS X only java classes.
*/
private void setWindowFullscreenCapability() {
try {
Class.forName("com.apple.eawt.FullScreenUtilities")
.getMethod("setWindowCanFullScreen",Window.class,boolean.class)
.invoke(null, this,true);
}
catch (Exception ignored) {
}
}
@Override
protected void initMenue() {
super.initMenue();
setupUserInterfaceForOsx();
setupAcceleratorsForOsx();
}
@Override
protected void setupHelpMenu() {
super.setupHelpMenu();
//not needed on OSX, located in apple menu
jMenuHilfe.remove(jSeparatorAboutApplication);
jMenuHilfe.remove(jMenuItemAboutApplication);
}
@Override
protected void createFilmInformationHUD(JFrame parent, JTabbedPane tabPane, Daten daten)
{
Daten.filmInfo = new MVFilmInformationOSX(parent);
}
@Override
protected void createBandwidthMonitor(JFrame parent)
{
bandwidthMonitor = new MVBandwidthMonitorOSX(this);
}
/**
* Keyboard shortcuts for some actions need to be changed for OS X
*/
private void setupAcceleratorsForOsx() {
jMenuItemFilmAbspielen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F6, InputEvent.META_MASK));
jMenuItemFilmAufzeichnen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F7, InputEvent.META_MASK));
jMenuItemFilterLoeschen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F8, InputEvent.META_MASK));
jMenuItemBlacklist.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9, InputEvent.META_MASK));
cbkBeschreibung.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F10, InputEvent.META_MASK));
jCheckBoxMenuItemVideoplayer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, InputEvent.META_MASK));
}
/**
* Setup the OS X dock icon badge handler.
*/
private void setupOsxDockIconBadge() {
//setup the badge support for displaying active downloads
Listener.addListener(new Listener(new int[]{
Listener.EREIGNIS_START_EVENT, Listener.EREIGNIS_LISTE_DOWNLOADS}, MediathekGui.class.getSimpleName()) {
@Override
public void ping() {
final int activeDownloads = daten.getDownloadInfos().downloadStarts[4];
final Application application = Application.getApplication();
if (activeDownloads > 0) {
application.setDockIconBadge(String.valueOf(activeDownloads));
if (osxProgressIndicatorThread == null) {
osxProgressIndicatorThread = new OsxIndicatorThread();
osxProgressIndicatorThread.start();
}
} else {
application.setDockIconBadge("");
if (osxProgressIndicatorThread != null) {
osxProgressIndicatorThread.interrupt();
osxProgressIndicatorThread = null;
}
}
}
});
}
/**
* Setup the UI for OS X
*/
private void setupUserInterfaceForOsx() {
final Application application = Application.getApplication();
application.disableSuddenTermination();
application.setAboutHandler(aboutEvent -> showAboutDialog());
application.setPreferencesHandler(preferencesEvent -> showSettingsDialog());
application.setQuitHandler((quitEvent, quitResponse) -> {
if (!beenden(false, false)) {
quitResponse.cancelQuit();
} else {
quitResponse.performQuit();
}
});
//setup the MediathekView Dock Icon
try {
final URL url = this.getClass().getResource("/mediathek/res/MediathekView.png");
final BufferedImage appImage = ImageIO.read(url);
application.setDockIconImage(appImage);
} catch (IOException ex) {
Log.errorLog(165623698, "OS X Application image could not be loaded");
}
//Remove all menu items which don´t need to be displayed due to OS X´s native menu support
if (SystemInfo.isMacOSX()) {
//Datei->Beenden
jMenuDatei.remove(jSeparator2);
jMenuDatei.remove(jMenuItemBeenden);
//Datei->Einstellungen
jMenuDatei.remove(jMenuItemEinstellungen);
}
setupOsxDockIconBadge();
}
@Override
protected void shutdownComputer() {
//we cannot shutdown the system while we are running...
//MV (or java) will prevent OS X shutdown process and there seems to be no way around it.
//NASTY WORKAROUND:
//use applescript to execute a scriptlet application which will wait 5 seconds until it
//asks the system to shut down
//meanwhile we MUST terminate MV WITHIN 5 seconds in order not to interrupt the
//shutdown process :(
//AND this whole shit works ONLY with osascript, not with the java script engine...
//Scriptlet(executable) content:
//delay 5
//tell application "system events" to shut down
//EOF
//The OSX_Shutdown scriptlet application is provided in the official MV app bundle.
try {
final ProcessBuilder builder = new ProcessBuilder("/usr/bin/osascript", "-e");
builder.command().add("tell application \"OSX_Shutdown\" to activate");
builder.start();
} catch (Exception ignored) {
}
}
}