package mediathek.gui.bandwidth; import info.monitorenter.gui.chart.Chart2D; import info.monitorenter.gui.chart.IAxis; import info.monitorenter.gui.chart.labelformatters.LabelFormatterAutoUnits; import info.monitorenter.gui.chart.rangepolicies.RangePolicyForcedPoint; import info.monitorenter.gui.chart.traces.Trace2DLtd; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.text.DecimalFormat; import java.util.LinkedList; import java.util.TimerTask; import javax.swing.*; import mSearch.tool.DbgMsg; import mSearch.tool.Listener; import mediathek.config.Daten; import mediathek.config.MVConfig; import mediathek.controller.starter.Start; import mediathek.daten.DatenDownload; /** * This class will manage and display the download bandwidth chart display. */ public class MVBandwidthMonitorOSX implements IBandwidthMonitor { private double counter = 0; // double sonst "läuft" die Chart nicht private JDialog hudDialog = null; private final Trace2DLtd m_trace = new Trace2DLtd(300); private IAxis<?> x_achse = null; /** * Timer for collecting sample data. */ private final java.util.Timer timer = new java.util.Timer(false); private TimerTask timerTask = null; private void createDialog(JFrame parent) { hudDialog = new JDialog(parent); hudDialog.setTitle("Bandbreite"); hudDialog.setResizable(true); hudDialog.setType(Window.Type.UTILITY); hudDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); hudDialog.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { beenden(); } }); } private void calculateHudPosition() { final GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); final DisplayMode dm = gd.getDisplayMode(); hudDialog.setLocation(dm.getWidth() - DEFAULT_WIDTH, 0); } private Chart2D createChart() { Chart2D chart = new Chart2D(); chart.setPaintLabels(true); chart.setUseAntialiasing(true); chart.setToolTipType(Chart2D.ToolTipType.VALUE_SNAP_TO_TRACEPOINTS); x_achse = chart.getAxisX(); x_achse.getAxisTitle().setTitle("Minuten"); x_achse.setPaintScale(true); x_achse.setVisible(true); x_achse.setPaintGrid(false); x_achse.setMajorTickSpacing(10); x_achse.setMinorTickSpacing(1); IAxis<?> y_achse = chart.getAxisY(); y_achse.getAxisTitle().setTitle(""); y_achse.setPaintScale(true); y_achse.setVisible(true); y_achse.setPaintGrid(true); y_achse.setMajorTickSpacing(5); y_achse.setMinorTickSpacing(1); y_achse.setFormatter(new LabelFormatterAutoUnits()); y_achse.setRangePolicy(new RangePolicyForcedPoint()); m_trace.setName(""); m_trace.setColor(Color.RED); chart.addTrace(m_trace); return chart; } public MVBandwidthMonitorOSX(JFrame parent) { createDialog(parent); hudDialog.setLayout(new BorderLayout(0, 0)); hudDialog.getContentPane().add(createChart(),BorderLayout.CENTER); hudDialog.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); Listener.addListener(new Listener(Listener.EREIGNIS_BANDWIDTH_MONITOR, MVBandwidthMonitorOSX.class.getSimpleName()) { @Override public void ping() { setVisibility(); } }); calculateHudPosition(); setVisibility(); } private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 150; private void beenden() { MVConfig.add(MVConfig.Configs.SYSTEM_BANDWIDTH_MONITOR_VISIBLE, Boolean.toString(false)); Listener.notify(Listener.EREIGNIS_BANDWIDTH_MONITOR, MVBandwidthMonitorLWin.class.getSimpleName()); setVisibility(); } /** * Show/hide bandwidth display. Take also care about the used timer. */ public void setVisibility() { final boolean isVis = Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_BANDWIDTH_MONITOR_VISIBLE)); hudDialog.setVisible(isVis); try { if (isVis) { timerTask = new TimerTask() { @Override public void run() { double bandwidth = 0.0; // bytes per second //only count running/active downloads and calc accumulated progress.. LinkedList<DatenDownload> activeDownloadList = Daten.getInstance().getListeDownloads().getListOfStartsNotFinished(DatenDownload.QUELLE_ALLE); for (DatenDownload download : activeDownloadList) { if (download.start != null && download.start.status == Start.STATUS_RUN) { bandwidth += download.start.bandbreite; } } if (bandwidth < 0.0) { bandwidth = 0.0; } counter++; m_trace.addPoint(counter / 60, bandwidth); // minutes x_achse.getAxisTitle().setTitle(roundBandwidth(bandwidth, (long) counter)); } }; timer.schedule(timerTask, 0, 1_000); } else { if (timerTask != null) { timerTask.cancel(); } timer.purge(); } } catch (IllegalStateException ignored) { DbgMsg.print(ignored.getMessage()); } if (!isVis) { hudDialog.dispose(); } } private String roundBandwidth(double bandw, long time) { if (bandw > 1_000_000.0) { return time / 60 + ":" + (time % 60 < 10 ? "0" + time % 60 : time % 60) + " Minuten / " + new DecimalFormat("####0.00").format(bandw / 1_000_000.0) + " MByte/s"; } else if (bandw > 1_000.0) { return time / 60 + ":" + (time % 60 < 10 ? "0" + time % 60 : time % 60) + " Minuten / " + Math.round(bandw / 1_000.0) + " kByte/s"; } else { return time / 60 + ":" + (time % 60 < 10 ? "0" + time % 60 : time % 60) + " Minuten / " + Math.round(bandw) + " Byte/s"; } } @Override public void writeConfig() { //do nothing for OSX } }