/*
* MediathekView
* Copyright (C) 2014 W. Xaver
* W.Xaver[at]googlemail.com
* http://zdfmediathk.sourceforge.net/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
import java.util.TimerTask;
import javax.swing.*;
import mSearch.tool.DbgMsg;
import mSearch.tool.Functions.OperatingSystemType;
import static mSearch.tool.Functions.getOs;
import mSearch.tool.Listener;
import mediathek.config.Daten;
import mediathek.config.MVConfig;
import mediathek.controller.MVBandwidthTokenBucket;
import mediathek.tool.GuiFunktionen;
@SuppressWarnings("serial")
public class MVBandwidthMonitorLWin extends JPanel implements IBandwidthMonitor {
private final Daten daten;
private double counter = 0; // double sonst "läuft" die Chart nicht
private Trace2DLtd m_trace = new Trace2DLtd(300);
private IAxis<?> x_achse = null;
private boolean stopBeob = false;
private JDialog jDialog = null;
private JFrame frameParent = null;
private static Point mouseDownCompCoords;
private JPanel panel;
/**
* Timer for collecting sample data.
*/
private final java.util.Timer timer = new java.util.Timer(false);
private TimerTask timerTask = null;
/**
* Creates new form MVBandwidthMonitorLWin
*
* @param parent
**/
public MVBandwidthMonitorLWin(JFrame parent) {
initComponents();
daten = Daten.getInstance();
this.frameParent = parent;
this.panel = this;
jDialog = new JDialog(MVConfig.getBool(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_TOP) ? parent : null, "Bandbreite");
jDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
jDialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
beenden();
}
});
Chart2D chart = new Chart2D();
chart.setPaintLabels(true);
chart.setUseAntialiasing(true);
chart.setToolTipType(Chart2D.ToolTipType.VALUE_SNAP_TO_TRACEPOINTS);
if (getOs() == OperatingSystemType.LINUX) {
jDialog.setBackground(null);
chart.setOpaque(true);
this.setOpaque(true);
} else {
//a transparent chart is a HUGE GPU performance killer and will BURN GPU resources :(
//panel.setOpaque(false);
this.setBackground(Color.WHITE);
}
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);
jPanelChart.setBackground(Color.WHITE);
jPanelChart.setLayout(new BorderLayout(0, 0));
jPanelChart.add(chart, BorderLayout.CENTER);
Listener.addListener(new Listener(Listener.EREIGNIS_BANDWIDTH_MONITOR, MVBandwidthMonitorLWin.class.getSimpleName()) {
@Override
public void ping() {
setVisibility();
}
});
jDialog.setContentPane(this);
// size
jPanelChart.setMinimumSize(new Dimension());
if (!GuiFunktionen.setSize(MVConfig.Configs.SYSTEM_GROESSE_INFODIALOG, jDialog, parent)) {
// erster Programmstart
final Dimension dim = jDialog.getSize();
dim.height = 250;
dim.width = 400;
jDialog.setSize(dim);
}
BeobMaus bom = new BeobMaus();
chart.addMouseListener(bom);
mouseDownCompCoords = null;
chart.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
mouseDownCompCoords = null;
}
@Override
public void mousePressed(MouseEvent e) {
mouseDownCompCoords = e.getPoint();
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
chart.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
Point currCoords = e.getLocationOnScreen();
jDialog.setLocation(currCoords.x - mouseDownCompCoords.x, currCoords.y - mouseDownCompCoords.y);
}
});
GuiFunktionen.setDialogDecorated(jDialog, this, MVConfig.getBool(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_DECORATED));
setVisibility();
}
private void beenden() {
MVConfig.add(MVConfig.Configs.SYSTEM_BANDWIDTH_MONITOR_VISIBLE, Boolean.toString(false));
Listener.notify(Listener.EREIGNIS_BANDWIDTH_MONITOR, MVBandwidthMonitorLWin.class.getSimpleName());
setVisibility();
}
public JDialog getDialog() {
return jDialog;
}
public static void setSliderBandwith(JSlider slider) {
int bandbreiteKByte;
try {
bandbreiteKByte = Integer.parseInt(MVConfig.get(MVConfig.Configs.SYSTEM_BANDBREITE_KBYTE));
} catch (Exception ex) {
bandbreiteKByte = MVBandwidthTokenBucket.BANDWIDTH_MAX_KBYTE;
MVConfig.add(MVConfig.Configs.SYSTEM_BANDBREITE_KBYTE, MVBandwidthTokenBucket.BANDWIDTH_MAX_KBYTE + "");
}
slider.setValue(bandbreiteKByte / 10);
}
public static String setTextBandwith(String txtBefore, JLabel label, JTextField txt) {
int bandbreiteKByte;
String ret;
try {
bandbreiteKByte = Integer.parseInt(MVConfig.get(MVConfig.Configs.SYSTEM_BANDBREITE_KBYTE));
} catch (Exception ex) {
bandbreiteKByte = MVBandwidthTokenBucket.BANDWIDTH_MAX_KBYTE;
MVConfig.add(MVConfig.Configs.SYSTEM_BANDBREITE_KBYTE, MVBandwidthTokenBucket.BANDWIDTH_MAX_KBYTE + "");
}
if (bandbreiteKByte == MVBandwidthTokenBucket.BANDWIDTH_MAX_KBYTE) {
ret = "aus";
} else {
ret = bandbreiteKByte + " kByte/s";
}
if (label != null) {
label.setText(txtBefore + ret);
if (bandbreiteKByte > MVBandwidthTokenBucket.BANDWIDTH_MAX_RED_KBYTE) {
label.setForeground(Color.red);
} else {
label.setForeground(Color.black);
}
}
if (txt != null) {
txt.setText(txtBefore + ret);
if (bandbreiteKByte > MVBandwidthTokenBucket.BANDWIDTH_MAX_RED_KBYTE) {
txt.setForeground(Color.red);
} else {
txt.setForeground(Color.black);
}
}
return ret;
}
/**
* Show/hide bandwidth display. Take also care about the used timer.
*/
private void setVisibility() {
final boolean isVis = Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_BANDWIDTH_MONITOR_VISIBLE));
jDialog.setVisible(isVis);
try {
if (isVis) {
timerTask = new TimerTask() {
@Override
public void run() {
counter++;
m_trace.addPoint(counter / 60, daten.getDownloadInfos().bandwidth); // minutes
x_achse.getAxisTitle().setTitle(daten.getDownloadInfos().roundBandwidth((long) counter));
// SwingUtilities.invokeLater(() -> setInfoText(daten.getDownloadInfos()));
}
};
timer.schedule(timerTask, 0, 1_000);
} else {
if (timerTask != null) {
timerTask.cancel();
}
timer.purge();
}
} catch (IllegalStateException ignored) {
DbgMsg.print(ignored.getMessage());
}
if (!isVis) {
jDialog.dispose();
}
}
@Override
public void writeConfig() {
GuiFunktionen.getSize(MVConfig.Configs.SYSTEM_GROESSE_INFODIALOG, getDialog());
}
// public static String setInfoText(DownloadInfos di) {
// final String HEAD = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head>"
// + "<style type=\"text/css\" .sans {font-family: Verdana, Geneva, sans-serif;}</style></head><body>";
// final String END = "</body></html>";
//
// String info = HEAD;
// info += getInfoText();
// if (di.timeRestAktDownloads > 0 && di.timeRestAllDownloads > 0) {
// info += "<span class=\"sans\"><b>Restzeit: </b>" + "laufende: " + di.getRestzeit() + ", alle: " + di.getGesamtRestzeit() + "<br /></span>";
// } else if (di.timeRestAktDownloads > 0) {
// info += "<span class=\"sans\"><b>Restzeit: </b>laufende: " + di.getRestzeit() + "<br /></span>";
// } else if (di.timeRestAllDownloads > 0) {
// info += "<span class=\"sans\"><b>Restzeit: </b>alle: " + di.getGesamtRestzeit() + "<br /></span>";
// }
//
// if (di.byteAlleDownloads > 0 || di.byteAktDownloads > 0) {
// info += "<span class=\"sans\"><b>Größe: </b>";
// if (di.byteAktDownloads > 0) {
// info += MVFilmSize.getGroesse(di.byteAktDownloads) + " von " + MVFilmSize.getGroesse(di.byteAlleDownloads) + " MByte" + "<br /></span>";
// } else {
// info += MVFilmSize.getGroesse(di.byteAlleDownloads) + " MByte" + "<br /></span>";
// }
// }
// if (di.bandwidth > 0) {
// info += "<span class=\"sans\"><b>Bandbreite: </b>";
// info += di.bandwidthStr + "<br /></span>";
// }
// info += END;
// return info;
// }
//
// private static String getInfoText() {
// String textLinks;
// // Text links: Zeilen Tabelle
// // nicht gestarted, laufen, fertig OK, fertig fehler
// int[] starts = daten.getDownloadInfos().downloadStarts;
// if (starts[0] == 1) {
// textLinks = "<span class=\"sans\"><b>Download:</b> 1";
// } else {
// textLinks = "<span class=\"sans\"><b>Downloads:</b> " + starts[0];
// }
// boolean print = false;
// for (int ii = 1; ii < starts.length; ++ii) {
// if (starts[ii] > 0) {
// print = true;
// break;
// }
// }
// if (print) {
// textLinks += " ( ";
// if (starts[4] == 1) {
// textLinks += "1 läuft";
// } else {
// textLinks += starts[4] + " laufen";
// }
// if (starts[3] == 1) {
// textLinks += ", 1 wartet";
// } else {
// textLinks += ", " + starts[3] + " warten";
// }
// if (starts[5] > 0) {
// if (starts[5] == 1) {
// textLinks += ", 1 fertig";
// } else {
// textLinks += ", " + starts[5] + " fertig";
// }
// }
// if (starts[6] > 0) {
// if (starts[6] == 1) {
// textLinks += ", 1 fehlerhaft";
// } else {
// textLinks += ", " + starts[6] + " fehlerhaft";
// }
// }
// textLinks += " )";
// }
// textLinks += "<br /></span>";
// return textLinks;
// }
private class BeobMaus extends MouseAdapter {
JCheckBox cbkTop = new JCheckBox("Immer im Vordergrund");
JCheckBox cbkBorder = new JCheckBox("Rand anzeigen");
JMenuItem itemClose = new JMenuItem("Ausblenden");
JSlider jSliderBandwidth = new JSlider();
JLabel lblBandwidth = new JLabel("Bandbreite");
public BeobMaus() {
cbkTop.setSelected(MVConfig.getBool(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_TOP));
cbkTop.addActionListener(l -> {
MVConfig.add(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_TOP, Boolean.toString(cbkTop.isSelected()));
GuiFunktionen.setParent(jDialog, MVConfig.getBool(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_TOP) ? frameParent : null);
});
cbkBorder.setSelected(MVConfig.getBool(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_DECORATED));
cbkBorder.addActionListener(l -> {
MVConfig.add(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_DECORATED, Boolean.toString(cbkBorder.isSelected()));
GuiFunktionen.setDialogDecorated(jDialog, panel, MVConfig.getBool(MVConfig.Configs.SYSTEM_DOWNLOAD_INFO_DECORATED));
});
itemClose.addActionListener(l -> beenden());
jSliderBandwidth.setMinimum(5); //50 kByte/s
jSliderBandwidth.setMaximum(100); //1_000 kByte/s
jSliderBandwidth.setToolTipText("");
setSlider();
jSliderBandwidth.addChangeListener(e -> {
if (stopBeob) {
return;
}
int b = jSliderBandwidth.getValue() * 10;
MVConfig.add(MVConfig.Configs.SYSTEM_BANDBREITE_KBYTE, String.valueOf(b));
Listener.notify(Listener.EREIGNIS_BANDBREITE, MVBandwidthMonitorLWin.class.getName());
setTextBandwith("Bandbreite: ", lblBandwidth, null);
});
// // Slider zum Einstellen der Bandbreite
// Listener.addListener(new Listener(Listener.EREIGNIS_BANDBREITE, MVBandwidthMonitorLWin.class.getSimpleName()) {
// @Override
// public void ping() {
// setSlider();
// }
// });
}
private void setSlider() {
stopBeob = true;
setSliderBandwith(jSliderBandwidth);
setTextBandwith("Bandbreite: ", lblBandwidth, null);
stopBeob = false;
}
@Override
public void mousePressed(MouseEvent arg0) {
if (arg0.isPopupTrigger()) {
showMenu(arg0);
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
if (arg0.isPopupTrigger()) {
showMenu(arg0);
}
}
private void showMenu(MouseEvent evt) {
JPopupMenu jPopupMenu = new JPopupMenu();
jPopupMenu.add(lblBandwidth);
jPopupMenu.add(jSliderBandwidth);
jPopupMenu.addSeparator();
jPopupMenu.add(cbkTop);
jPopupMenu.add(cbkBorder);
jPopupMenu.addSeparator();
jPopupMenu.add(itemClose);
//anzeigen
jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanelChart = new javax.swing.JPanel();
jPanelChart.setPreferredSize(new java.awt.Dimension(32767, 32767));
javax.swing.GroupLayout jPanelChartLayout = new javax.swing.GroupLayout(jPanelChart);
jPanelChart.setLayout(jPanelChartLayout);
jPanelChartLayout.setHorizontalGroup(
jPanelChartLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
jPanelChartLayout.setVerticalGroup(
jPanelChartLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 250, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanelChart, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanelChart, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel jPanelChart;
// End of variables declaration//GEN-END:variables
}