package mediathek.mac; import com.apple.eawt.Application; import mediathek.controller.starter.Start; import mediathek.config.Daten; import mediathek.daten.DatenDownload; import java.awt.*; import java.awt.image.BufferedImage; import java.util.LinkedList; /** * This thread will update the percentage drawn on the dock icon on OS X. */ class OsxIndicatorThread extends Thread { private final Daten daten; /** * The Image of the OS X application icon. */ private Image OsxApplicationIconImage = null; /** * Stores the application image with the progress drawn on it */ private BufferedImage newApplicationIcon = null; private final int appIconWidth; private final int appIconHeight; private double oldPercentage; private boolean bFirstUpdate = true; private final Application application = Application.getApplication(); public OsxIndicatorThread() { setName("OSX dock icon update thread"); daten = Daten.getInstance(); OsxApplicationIconImage = application.getDockIconImage(); appIconWidth = OsxApplicationIconImage.getWidth(null); appIconHeight = OsxApplicationIconImage.getHeight(null); newApplicationIcon = new BufferedImage(appIconWidth, appIconHeight, BufferedImage.TYPE_INT_ARGB); } /** * Draw the progress bar into the application icon and set dock icon. * * @param progressBarWidth width of the bar. */ private void drawAndSetApplicationIconWithProgress(int progressBarWidth) { Graphics g = newApplicationIcon.getGraphics(); g.drawImage(OsxApplicationIconImage, 0, 0, null); g.setColor(Color.RED); g.fillRect(0, appIconHeight - 20, appIconWidth, 20); g.setColor(Color.GREEN); g.fillRect(0, appIconHeight - 20, progressBarWidth, 20); g.dispose(); application.setDockIconImage(newApplicationIcon); } @Override public void run() { try { while (!isInterrupted()) { int numOfDownloadsActive = 0; double accumPercentage = 0.0; //only count running/active downloads and calc accumulated progress.. LinkedList<DatenDownload> activeDownloadList = daten.getListeDownloads().getListOfStartsNotFinished(DatenDownload.QUELLE_ALLE); for (DatenDownload download : activeDownloadList) { if (download.start != null && download.start.status == Start.STATUS_RUN) { numOfDownloadsActive++; accumPercentage += download.start.percent / 10.0; } } final double percentage = accumPercentage / numOfDownloadsActive; final int progressBarWidth = (int) ((appIconWidth / 100.0) * percentage); if (bFirstUpdate) { drawAndSetApplicationIconWithProgress(progressBarWidth); bFirstUpdate = false; } //update in 1pct steps... if (percentage % 1 == 0) { //if icon was already drawn, don“ do it again if (oldPercentage != percentage) { drawAndSetApplicationIconWithProgress(progressBarWidth); } oldPercentage = percentage; } sleep(500); } } catch (Exception ignored) { } finally { //reset the application dock icon application.setDockIconImage(OsxApplicationIconImage); } } }