/*
* MediathekView
* Copyright (C) 2008 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;
import com.jidesoft.utils.SystemInfo;
import mSearch.daten.DatenFilm;
import mSearch.filmeSuchen.ListenerFilmeLaden;
import mSearch.filmeSuchen.ListenerFilmeLadenEvent;
import mSearch.tool.*;
import mediathek.MediathekGui;
import mediathek.config.Daten;
import mediathek.config.Icons;
import mediathek.config.MVConfig;
import mediathek.controller.MVUsedUrl;
import mediathek.controller.starter.Start;
import mediathek.daten.DatenAbo;
import mediathek.daten.DatenDownload;
import mediathek.daten.DatenPset;
import mediathek.gui.bandwidth.MVBandwidthMonitorLWin;
import mediathek.gui.dialog.DialogBeendenZeit;
import mediathek.gui.dialog.DialogEditAbo;
import mediathek.gui.dialog.DialogEditDownload;
import mediathek.tool.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.TimerTask;
@SuppressWarnings("serial")
public class GuiDownloads extends PanelVorlage {
private long lastUpdate = 0;
private boolean onlyAbos = false;
private boolean onlyDownloads = false;
private boolean onlyWaiting = false;
private boolean onlyNotStarted = false;
private boolean onlyStarted = false;
private boolean onlyFinished = false;
private boolean onlyRun = false;
private static final String COMBO_DISPLAY_ALL = "alles";
private static final String COMBO_DISPLAY_DOWNLOADS_ONLY = "nur Downloads";
private static final String COMBO_DISPLAY_ABOS_ONLY = "nur Abos";
private static final String COMBO_VIEW_ALL = "alles ";
private static final String COMBO_VIEW_NOT_STARTED = "nicht gestartet";
private static final String COMBO_VIEW_STARTED = "gestartet";
private static final String COMBO_VIEW_WAITING = "nur wartende";
private static final String COMBO_VIEW_RUN_ONLY = "nur laufende";
private static final String COMBO_VIEW_FINISHED_ONLY = "nur abgeschlossene";
private final ToolBar toolBar;
private boolean loadFilmlist = false;
private final java.util.Timer timer = new java.util.Timer(false);
private TimerTask timerTask = null;
/**
* The internally used model.
*/
private TModelDownload model;
public GuiDownloads(Daten aDaten, MediathekGui aMediathekGui) {
super(aDaten, aMediathekGui);
initComponents();
if (SystemInfo.isWindows()) {
// zum Abfangen der Win-F4 für comboboxen
InputMap im = cbDisplayCategories.getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, 0), "einstellungen");
ActionMap am = cbDisplayCategories.getActionMap();
am.put("einstellungen", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
aMediathekGui.showSettingsDialog();
}
});
}
tabelle = new MVTable(MVTable.TableType.DOWNLOADS);
jScrollPane1.setViewportView(tabelle);
setupDescriptionPanel();
init();
tabelle.initTabelle();
tabelle.setSpalten();
if (tabelle.getRowCount() > 0) {
tabelle.setRowSelectionInterval(0, 0);
}
addListenerMediathekView();
cbDisplayCategories.setModel(getDisplaySelectionModel());
cbDisplayCategories.addActionListener(new DisplayCategoryListener());
cbView.setModel(getViewModel());
cbView.addActionListener(new DisplayCategoryListener());
toolBar = new ToolBar(daten, MediathekGui.TABS.TAB_DOWNLOADS);
jPanelToolBar.setLayout(new BorderLayout());
jPanelToolBar.add(toolBar, BorderLayout.CENTER);
setToolbarVisible();
}
private void setupDescriptionPanel() {
PanelFilmBeschreibung panelBeschreibung = new PanelFilmBeschreibung(daten, tabelle, false/*film*/);
jPanelBeschreibung.add(panelBeschreibung, BorderLayout.CENTER);
}
@Override
public void isShown() {
super.isShown();
if (!solo) {
daten.getMediathekGui().getStatusBar().setIndexForLeftDisplay(MVStatusBar.StatusbarIndex.DOWNLOAD);
}
updateFilmData();
Listener.notify(Listener.EREIGNIS_DOWNLOAD_BESCHREIBUNG_ANZEIGEN, PanelFilmBeschreibung.class.getSimpleName());
}
public void aktualisieren() {
downloadsAktualisieren();
}
public void filmAbspielen() {
filmAbspielen_();
}
public void guiFilmMediensammlung() {
mediensammlung();
}
public void starten(boolean alle) {
filmStartenWiederholenStoppen(alle, true /* starten */);
}
public void startAtTime() {
filmStartAtTime();
}
public void stoppen(boolean alle) {
filmStartenWiederholenStoppen(alle, false /* starten */);
}
public void wartendeStoppen() {
wartendeDownloadsStoppen();
}
public void vorziehen() {
downloadsVorziehen();
}
public void zurueckstellen() {
downloadLoeschen(false);
}
public void loeschen() {
downloadLoeschen(true);
}
public void aufraeumen() {
downloadsAufraeumen();
}
public void aendern() {
downloadAendern();
}
public void filmGesehen() {
daten.history.setGesehen(true, getSelFilme(), daten.getListeFilmeHistory());
}
public void filmUngesehen() {
daten.history.setGesehen(false, getSelFilme(), daten.getListeFilmeHistory());
}
public void invertSelection() {
tabelle.invertSelection();
}
//===================================
//private
//===================================
private void setToolbarVisible() {
toolBar.setVisible(Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_TOOLBAR_ALLES_ANZEIGEN)));
}
private void init() {
//Tabelle einrichten
ActionMap am = tabelle.getActionMap();
InputMap im = tabelle.getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "aendern");
am.put("aendern", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
downloadAendern();
}
});
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "loeschen");
am.put("loeschen", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
downloadLoeschen(true);
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "tabelle");
this.getActionMap().put("tabelle", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
tabelle.requestFocusSelelct(jScrollPane1);
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "download");
this.getActionMap().put("download", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
filmStartenWiederholenStoppen(false, true /* starten */);
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_I, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "info");
this.getActionMap().put("info", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (!Daten.filmInfo.isVisible()) {
Daten.filmInfo.showInfo();
}
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_U, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "url-copy");
this.getActionMap().put("url-copy", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
int row = tabelle.getSelectedRow();
if (row >= 0) {
GuiFunktionen.copyToClipboard(tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row),
DatenDownload.DOWNLOAD_URL).toString());
}
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_M, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "mediensammlung");
this.getActionMap().put("mediensammlung", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
int row = tabelle.getSelectedRow();
if (row >= 0) {
MVConfig.add(MVConfig.Configs.SYSTEM_MEDIA_DB_DIALOG_ANZEIGEN, Boolean.TRUE.toString());
daten.getDialogMediaDB().setVis();
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
if (datenDownload != null) {
daten.getDialogMediaDB().setFilter(datenDownload.arr[DatenDownload.DOWNLOAD_TITEL]);
}
}
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_G, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "gesehen");
this.getActionMap().put("gesehen", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
filmGesehen();
}
});
this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "ungesehen");
this.getActionMap().put("ungesehen", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
filmUngesehen();
}
});
panelBeschreibungSetzen();
final CellRendererDownloads cellRenderer = new CellRendererDownloads();
tabelle.setDefaultRenderer(Object.class, cellRenderer);
tabelle.setDefaultRenderer(Datum.class, cellRenderer);
tabelle.setDefaultRenderer(MVFilmSize.class, cellRenderer);
tabelle.setDefaultRenderer(Integer.class, cellRenderer);
model = new TModelDownload(new Object[][]{}, DatenDownload.COLUMN_NAMES);
tabelle.setModel(model);
tabelle.addMouseListener(new BeobMausTabelle());
tabelle.getSelectionModel().addListSelectionListener(event -> {
if (!event.getValueIsAdjusting()) {
updateFilmData();
}
});
tabelle.lineBreak = MVConfig.getBool(MVConfig.Configs.SYSTEM_TAB_DOWNLOAD_LINEBREAK);
tabelle.getTableHeader().addMouseListener(new BeobTableHeader(tabelle, DatenDownload.COLUMN_NAMES, DatenDownload.spaltenAnzeigen,
new int[]{DatenDownload.DOWNLOAD_BUTTON_START, DatenDownload.DOWNLOAD_BUTTON_DEL, DatenDownload.DOWNLOAD_REF},
new int[]{DatenDownload.DOWNLOAD_BUTTON_START, DatenDownload.DOWNLOAD_BUTTON_DEL},
true /*Icon*/, MVConfig.Configs.SYSTEM_TAB_DOWNLOAD_LINEBREAK));
btnClear.setIcon(Icons.ICON_BUTTON_CLEAR);
btnClear.addActionListener(l -> {
cbDisplayCategories.setSelectedIndex(0);
cbView.setSelectedIndex(0);
});
jSpinnerAnzahlDownloads.setModel(new javax.swing.SpinnerNumberModel(1, 1, 9, 1));
jSpinnerAnzahlDownloads.setValue(Integer.parseInt(MVConfig.get(MVConfig.Configs.SYSTEM_MAX_DOWNLOAD)));
jSpinnerAnzahlDownloads.addChangeListener(l -> {
MVConfig.add(MVConfig.Configs.SYSTEM_MAX_DOWNLOAD,
String.valueOf(((Number) jSpinnerAnzahlDownloads.getModel().getValue()).intValue()));
Listener.notify(Listener.EREIGNIS_ANZAHL_DOWNLOADS, GuiDownloads.class.getSimpleName());
});
jSplitPane1.setDividerLocation(MVConfig.getInt(MVConfig.Configs.SYSTEM_PANEL_DOWNLOAD_DIVIDER));
jSplitPane1.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, pce -> {
if (jScrollPaneFilter.isVisible()) {
MVConfig.add(MVConfig.Configs.SYSTEM_PANEL_DOWNLOAD_DIVIDER, String.valueOf(jSplitPane1.getDividerLocation()));
}
// setTimer();
});
jScrollPaneFilter.setVisible(MVConfig.getBool(MVConfig.Configs.SYSTEM_TAB_DOWNLOAD_FILTER_VIS));
Listener.addListener(new Listener(Listener.EREIGNIS_PANEL_DOWNLOAD_FILTER_ANZEIGEN, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
setFilter();
}
});
jSliderBandwidth.setMinimum(5); //50 kByte/s
jSliderBandwidth.setMaximum(100); //1.000 kByte/s
jSliderBandwidth.setMajorTickSpacing(10);
jSliderBandwidth.setMinorTickSpacing(10);
MVBandwidthMonitorLWin.setSliderBandwith(jSliderBandwidth);
MVBandwidthMonitorLWin.setTextBandwith("", null, txtBandwidth);
jSliderBandwidth.addChangeListener(e -> {
if (stopBeob) {
return;
}
int KByte = jSliderBandwidth.getValue() * 10;
txtBandwidth.setText(KByte + " kByte/s");
MVConfig.add(MVConfig.Configs.SYSTEM_BANDBREITE_KBYTE, String.valueOf(KByte));
Listener.notify(Listener.EREIGNIS_BANDBREITE, GuiDownloads.class.getName());
});
Listener.addListener(new Listener(Listener.EREIGNIS_BANDBREITE, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
MVBandwidthMonitorLWin.setSliderBandwith(jSliderBandwidth);
MVBandwidthMonitorLWin.setTextBandwith("", null, txtBandwidth);
}
});
// Chart2D chart = new Chart2D();
// chart.setPaintLabels(true);
// chart.setUseAntialiasing(true);
// chart.setToolTipType(Chart2D.ToolTipType.VALUE_SNAP_TO_TRACEPOINTS);
// if (getOs() == OperatingSystemType.LINUX) {
// chart.setOpaque(false);
// } else {
// //a transparent chart is a HUGE GPU performance killer and will BURN GPU resources :(
// }
//
// 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.setMinimumSize(new java.awt.Dimension(100, 100));
// jPanelChart.setPreferredSize(new java.awt.Dimension(100, 250));
//// jPanelChart.setBackground(Color.WHITE);
// jPanelChart.setLayout(new BorderLayout(0, 0));
// jPanelChart.add(chart, BorderLayout.CENTER);
setTimer();
daten.getFilmeLaden().addAdListener(new ListenerFilmeLaden() {
@Override
public void start(ListenerFilmeLadenEvent event) {
loadFilmlist = true;
}
@Override
public void fertig(ListenerFilmeLadenEvent event) {
loadFilmlist = false;
daten.getListeDownloads().filmEintragen();
if (Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_ABOS_SOFORT_SUCHEN))) {
downloadsAktualisieren();
} else {
reloadTable(); // damit die Filmnummern richtig angezeigt werden
// ToDo beim Neuladen ändert sich die Filmnummer aber der Link datenDonwnload.film existiert ja
// noch, funktioniert auch damit, stimmt nur die FilmNr nicht
}
}
});
}
private void setFilter() {
// Panel anzeigen und die Filmliste anpassen
jScrollPaneFilter.setVisible(MVConfig.getBool(MVConfig.Configs.SYSTEM_TAB_DOWNLOAD_FILTER_VIS));
if (jScrollPaneFilter.isVisible()) {
jSplitPane1.setDividerLocation(MVConfig.getInt(MVConfig.Configs.SYSTEM_PANEL_DOWNLOAD_DIVIDER));
}
this.updateUI();
}
private void setTimer() {
txtDownload.setText("");
txtDownload.setEditable(false);
txtDownload.setFocusable(false);
txtDownload.setContentType("text/html");
try {
if (jScrollPaneFilter.isVisible()) {
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());
}
};
timer.schedule(timerTask, 0, 1_000);
} else {
if (timerTask != null) {
timerTask.cancel();
}
timer.purge();
}
} catch (IllegalStateException ignored) {
DbgMsg.print(ignored.getMessage());
}
}
private void setInfoText() {
int[] starts = daten.getDownloadInfos().downloadStarts;
if (starts[0] == 0) {
txtDownload.setText("");
return;
}
final String HEAD = "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+ "<head><style type=\"text/css\"> .sans { font-family: Verdana, Geneva, sans-serif; }</style></head>\n"
+ "<body>\n";
final String END = "</body></html>";
String info = HEAD;
// Downloads
info += getInfoText();
// Größe
if (daten.getDownloadInfos().byteAlleDownloads > 0 || daten.getDownloadInfos().byteAktDownloads > 0) {
info += "<br />";
info += "<span class=\"sans\"><b>Größe:</b><br />";
if (daten.getDownloadInfos().byteAktDownloads > 0) {
info += MVFilmSize.getGroesse(daten.getDownloadInfos().byteAktDownloads) + " von "
+ MVFilmSize.getGroesse(daten.getDownloadInfos().byteAlleDownloads) + " MByte" + "</span>";
} else {
info += MVFilmSize.getGroesse(daten.getDownloadInfos().byteAlleDownloads) + " MByte" + "</span>";
}
}
// Restzeit
if (daten.getDownloadInfos().timeRestAktDownloads > 0 && daten.getDownloadInfos().timeRestAllDownloads > 0) {
info += "<br />";
info += "<span class=\"sans\"><b>Restzeit:</b><br />" + "laufende: "
+ daten.getDownloadInfos().getRestzeit() + ",<br />alle: " + daten.getDownloadInfos().getGesamtRestzeit() + "</span>";
} else if (daten.getDownloadInfos().timeRestAktDownloads > 0) {
info += "<br />";
info += "<span class=\"sans\"><b>Restzeit:</b><br />laufende: " + daten.getDownloadInfos().getRestzeit() + "</span>";
} else if (daten.getDownloadInfos().timeRestAllDownloads > 0) {
info += "<br />";
info += "<span class=\"sans\"><b>Restzeit:</b><br />alle: " + daten.getDownloadInfos().getGesamtRestzeit() + "</span>";
}
// Bandbreite
if (daten.getDownloadInfos().bandwidth > 0) {
info += "<br />";
info += "<span class=\"sans\"><b>Bandbreite:</b><br />";
info += daten.getDownloadInfos().bandwidthStr + "</span>";
}
info += END;
txtDownload.setText(info);
}
private 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<br />";
// } else {
textLinks = "<span class=\"sans\"><b>Downloads: </b>" + starts[0] + "<br />";
// }
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 void addListenerMediathekView() {
Listener.addListener(new Listener(Listener.EREIGNIS_TOOLBAR_VIS, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
setToolbarVisible();
}
});
Listener.addListener(new Listener(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
if (Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_ABOS_SOFORT_SUCHEN))
&& Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_BLACKLIST_AUCH_ABO))) {
// nur auf Blacklist reagieren, wenn auch für Abos eingeschaltet
downloadsAktualisieren();
}
}
});
Listener.addListener(new Listener(new int[]{Listener.EREIGNIS_BLACKLIST_AUCH_FUER_ABOS,
Listener.EREIGNIS_LISTE_ABOS}, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
if (Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_ABOS_SOFORT_SUCHEN))) {
downloadsAktualisieren();
}
}
});
Listener.addListener(new Listener(new int[]{Listener.EREIGNIS_LISTE_DOWNLOADS,
Listener.EREIGNIS_REIHENFOLGE_DOWNLOAD, Listener.EREIGNIS_RESET_INTERRUPT}, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
reloadTable();
daten.allesSpeichern(); // damit nichts verloren geht
}
});
Listener.addListener(new Listener(new int[]{Listener.EREIGNIS_START_EVENT}, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
reloadTable();
// daten.getListeDownloads().setModelProgressAlleStart(model);
// tabelle.fireTableDataChanged(true /*setSpalten*/);
// setInfo();
}
});
Listener.addListener(new Listener(Listener.EREIGNIS_GEO, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
tabelle.fireTableDataChanged(true /*setSpalten*/);
setInfo();
}
});
Listener.addListener(new Listener(new int[]{Listener.EREIGNIS_ART_DOWNLOAD_PROZENT}, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
if (lastUpdate < (new Date().getTime() - 500)) {
// nur alle 500ms aufrufen
lastUpdate = new Date().getTime();
daten.getListeDownloads().setModelProgress(model);
// ist ein Kompromiss: beim Sortieren nach Progress wird die Tabelle nicht neu sortiert!
//tabelle.fireTableDataChanged(true /*setSpalten*/);
}
}
});
Listener.addListener(new Listener(Listener.EREIGNIS_DOWNLOAD_BESCHREIBUNG_ANZEIGEN, GuiDownloads.class.getSimpleName()) {
@Override
public void ping() {
panelBeschreibungSetzen();
}
});
}
private void panelBeschreibungSetzen() {
jPanelBeschreibung.setVisible(Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_DOWNOAD_BESCHREIBUNG_ANZEIGEN)));
}
private synchronized void reloadTable() {
// nur Downloads die schon in der Liste sind werden geladen
stopBeob = true;
tabelle.getSpalten();
daten.getListeDownloads().getModel(model, onlyAbos, onlyDownloads, onlyNotStarted, onlyStarted, onlyWaiting, onlyRun, onlyFinished);
tabelle.setSpalten();
stopBeob = false;
updateFilmData();
setInfo();
}
private void mediensammlung() {
DatenDownload datenDownload = getSelDownload();
MVConfig.add(MVConfig.Configs.SYSTEM_MEDIA_DB_DIALOG_ANZEIGEN, Boolean.TRUE.toString());
daten.getDialogMediaDB().setVis();
if (datenDownload != null) {
daten.getDialogMediaDB().setFilter(datenDownload.arr[DatenDownload.DOWNLOAD_TITEL]);
}
}
private synchronized void downloadsAktualisieren() {
if (loadFilmlist) {
// wird danach automatisch gemacht
return;
}
// erledigte entfernen, nicht gestartete Abos entfernen und neu nach Abos suchen
daten.getListeDownloads().abosAuffrischen();
daten.getListeDownloads().abosSuchen(parentComponent);
reloadTable();
if (Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_DOWNLOAD_SOFORT_STARTEN))) {
// und wenn gewollt auch gleich starten
filmStartenWiederholenStoppen(true /*alle*/, true /*starten*/, false /*fertige wieder starten*/);
}
}
private synchronized void downloadsAufraeumen() {
// abgeschlossene Downloads werden aus der Tabelle/Liste entfernt
// die Starts dafür werden auch gelöscht
daten.getListeDownloads().listePutzen();
}
private synchronized void downloadsAufraeumen(DatenDownload datenDownload) {
// abgeschlossene Downloads werden aus der Tabelle/Liste entfernt
// die Starts dafür werden auch gelöscht
daten.getListeDownloads().listePutzen(datenDownload);
}
private ArrayList<DatenDownload> getSelDownloads() {
ArrayList<DatenDownload> arrayDownloads = new ArrayList<>();
int rows[] = tabelle.getSelectedRows();
if (rows.length > 0) {
for (int row : rows) {
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
arrayDownloads.add(datenDownload);
}
} else {
new HinweisKeineAuswahl().zeigen(parentComponent);
}
return arrayDownloads;
}
private DatenDownload getSelDownload() {
DatenDownload datenDownload = null;
int row = tabelle.getSelectedRow();
if (row >= 0) {
datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
} else {
new HinweisKeineAuswahl().zeigen(parentComponent);
}
return datenDownload;
}
private synchronized void downloadAendern() {
DatenDownload datenDownload = getSelDownload();
if (datenDownload == null) {
return;
}
boolean gestartet = false;
if (datenDownload.start != null) {
if (datenDownload.start.status >= Start.STATUS_RUN) {
gestartet = true;
}
}
DatenDownload datenDownloadKopy = datenDownload.getCopy();
DialogEditDownload dialog = new DialogEditDownload(parentComponent, true, datenDownloadKopy, gestartet);
dialog.setVisible(true);
if (dialog.ok) {
datenDownload.aufMichKopieren(datenDownloadKopy);
reloadTable();
}
}
private void downloadsVorziehen() {
ArrayList<DatenDownload> arrayDownloads = getSelDownloads();
if (arrayDownloads.isEmpty()) {
return;
}
daten.getListeDownloads().downloadsVorziehen(arrayDownloads);
}
private void zielordnerOeffnen() {
DatenDownload datenDownload = getSelDownload();
if (datenDownload == null) {
return;
}
String s = datenDownload.arr[DatenDownload.DOWNLOAD_ZIEL_PFAD];
DirOpenAction.zielordnerOeffnen(parentComponent, s);
}
private void filmAbspielen_() {
DatenDownload datenDownload = getSelDownload();
if (datenDownload == null) {
return;
}
String s = datenDownload.arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME];
OpenPlayerAction.filmAbspielen(parentComponent, s);
}
private void filmLoeschen_() {
DatenDownload datenDownload = getSelDownload();
if (datenDownload == null) {
return;
}
// Download nur löschen wenn er nicht läuft
if (datenDownload.start != null) {
if (datenDownload.start.status < Start.STATUS_FERTIG) {
MVMessageDialog.showMessageDialog(parentComponent, "Download erst stoppen!", "Film löschen", JOptionPane.ERROR_MESSAGE);
return;
}
}
try {
File file = new File(datenDownload.arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME]);
if (!file.exists()) {
MVMessageDialog.showMessageDialog(parentComponent, "Die Datei existiert nicht!", "Film löschen", JOptionPane.ERROR_MESSAGE);
return;
}
int ret = JOptionPane.showConfirmDialog(parentComponent,
datenDownload.arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME], "Film Löschen?", JOptionPane.YES_NO_OPTION);
if (ret == JOptionPane.OK_OPTION) {
// und jetzt die Datei löschen
SysMsg.sysMsg(new String[]{"Datei löschen: ", file.getAbsolutePath()});
if (!file.delete()) {
throw new Exception();
}
}
} catch (Exception ex) {
MVMessageDialog.showMessageDialog(parentComponent, "Konnte die Datei nicht löschen!", "Film löschen", JOptionPane.ERROR_MESSAGE);
Log.errorLog(915236547, "Fehler beim löschen: " + datenDownload.arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME]);
}
}
private void downloadLoeschen(boolean dauerhaft) {
try {
ArrayList<DatenDownload> arrayDownloads = getSelDownloads();
if (arrayDownloads.isEmpty()) {
return;
}
String zeit = new SimpleDateFormat("dd.MM.yyyy").format(new Date());
ArrayList<DatenDownload> arrayDownloadsLoeschen = new ArrayList<>();
LinkedList<MVUsedUrl> urlAboList = new LinkedList<>();
for (DatenDownload datenDownload : arrayDownloads) {
if (dauerhaft) {
arrayDownloadsLoeschen.add(datenDownload);
if (datenDownload.istAbo()) {
// ein Abo wird zusätzlich ins Logfile geschrieben
urlAboList.add(new MVUsedUrl(zeit,
datenDownload.arr[DatenDownload.DOWNLOAD_THEMA],
datenDownload.arr[DatenDownload.DOWNLOAD_TITEL],
datenDownload.arr[DatenDownload.DOWNLOAD_HISTORY_URL]));
}
} else {
// wenn nicht dauerhaft
datenDownload.zurueckstellen();
}
}
if (!urlAboList.isEmpty()) {
daten.erledigteAbos.zeilenSchreiben(urlAboList);
}
daten.getListeDownloads().downloadLoeschen(arrayDownloadsLoeschen);
reloadTable();
// // ausrichten
// tabelle.setSelRow(rows[0]);
} catch (Exception ex) {
Log.errorLog(451203625, ex);
}
}
private void filmStartAtTime() {
// bezieht sich immer auf "alle"
// Film der noch keinen Starts hat wird gestartet
// Film dessen Start schon auf fertig/fehler steht wird wieder gestartet
// wird immer vom Benutzer aufgerufen
ArrayList<DatenDownload> listeAllDownloads = new ArrayList<>();
ArrayList<DatenDownload> listeUrlsDownloadsAbbrechen = new ArrayList<>();
ArrayList<DatenDownload> listeDownloadsStarten = new ArrayList<>();
// ==========================
// erst mal die Liste nach der Tabelle sortieren
if (tabelle.getRowCount() == 0) {
return;
}
for (int i = 0; i < tabelle.getRowCount(); ++i) {
// um in der Reihenfolge zu starten
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(i), DatenDownload.DOWNLOAD_REF);
listeAllDownloads.add(datenDownload);
daten.getListeDownloads().remove(datenDownload);
daten.getListeDownloads().add(datenDownload);
}
// ========================
// und jetzt abarbeiten
for (DatenDownload download : listeAllDownloads) {
// ==========================================
// starten
if (download.start != null) {
if (download.start.status == Start.STATUS_RUN) {
// dann läuft er schon
continue;
}
if (download.start.status > Start.STATUS_RUN) {
// wenn er noch läuft gibts nix
// wenn er schon fertig ist, erst mal fragen vor dem erneuten Starten
//TODO in auto dialog umwandeln!
int a = JOptionPane.showConfirmDialog(parentComponent, "Film nochmal starten? ==> " + download.arr[DatenDownload.DOWNLOAD_TITEL],
"Fertiger Download", JOptionPane.YES_NO_OPTION);
if (a != JOptionPane.YES_OPTION) {
// weiter mit der nächsten URL
continue;
}
listeUrlsDownloadsAbbrechen.add(download);
if (download.istAbo()) {
// wenn er schon feritg ist und ein Abos ist, Url auch aus dem Logfile löschen, der Film ist damit wieder auf "Anfang"
daten.erledigteAbos.urlAusLogfileLoeschen(download.arr[DatenDownload.DOWNLOAD_HISTORY_URL]);
}
}
}
listeDownloadsStarten.add(download);
}
// ========================
// jetzt noch die Starts stoppen
daten.getListeDownloads().downloadAbbrechen(listeUrlsDownloadsAbbrechen);
// und die Downloads starten oder stoppen
//alle Downloads starten/wiederstarten
DialogBeendenZeit dialogBeenden = new DialogBeendenZeit(daten.getMediathekGui(), daten, listeDownloadsStarten);
dialogBeenden.setVisible(true);
if (dialogBeenden.applicationCanTerminate()) {
// fertig und beenden
daten.getMediathekGui().beenden(false /*Dialog auf "sofort beenden" einstellen*/, dialogBeenden.isShutdownRequested());
}
reloadTable();
}
private void filmStartenWiederholenStoppen(boolean alle, boolean starten /* starten/wiederstarten oder stoppen */) {
filmStartenWiederholenStoppen(alle, starten, true /*auch fertige wieder starten*/);
}
private void filmStartenWiederholenStoppen(boolean alle, boolean starten /* starten/wiederstarten oder stoppen */, boolean fertige /*auch fertige wieder starten*/) {
// bezieht sich immer auf "alle" oder nur die markierten
// Film der noch keinen Starts hat wird gestartet
// Film dessen Start schon auf fertig/fehler steht wird wieder gestartet
// bei !starten wird der Film gestoppt
// wird immer vom Benutzer aufgerufen
ArrayList<DatenDownload> listeDownloadsLoeschen = new ArrayList<>();
ArrayList<DatenDownload> listeDownloadsStarten = new ArrayList<>();
ArrayList<DatenDownload> listeDownloadsMarkiert = new ArrayList<>();
if (tabelle.getRowCount() == 0) {
return;
}
// ==========================
// erst mal die Liste nach der Tabelle sortieren
if (starten && alle) {
//Liste in der Reihenfolge wie in der Tabelle sortieren
for (int i = 0; i < tabelle.getRowCount(); ++i) {
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(i), DatenDownload.DOWNLOAD_REF);
daten.getListeDownloads().remove(datenDownload);
daten.getListeDownloads().add(datenDownload);
}
}
// ==========================
// die URLs sammeln
if (alle) {
for (int i = 0; i < tabelle.getRowCount(); ++i) {
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(i), DatenDownload.DOWNLOAD_REF);
listeDownloadsMarkiert.add(datenDownload);
}
} else {
listeDownloadsMarkiert = getSelDownloads();
}
if (!starten) {
// dann das Starten von neuen Downloads etwas Pausieren
daten.starterClass.pause();
}
// ========================
// und jetzt abarbeiten
int antwort = -1;
for (DatenDownload download : listeDownloadsMarkiert) {
if (starten) {
// ==========================================
// starten
if (download.start != null) {
if (download.start.status == Start.STATUS_RUN
|| !fertige && download.start.status > Start.STATUS_RUN) {
// wenn er noch läuft gibts nix
// fertige bleiben auch unverändert
continue;
}
if (download.start.status > Start.STATUS_RUN) {
// wenn er schon fertig ist, erst mal fragen vor dem erneuten Starten
//TODO in auto dialog umwandeln!
if (antwort == -1) {
// nur einmal fragen
String text;
if (listeDownloadsMarkiert.size() > 1) {
text = "Es sind bereits fertige Filme dabei,\n"
+ "diese nochmal starten?";
} else {
text = "Film nochmal starten? ==> " + download.arr[DatenDownload.DOWNLOAD_TITEL];
}
antwort = JOptionPane.showConfirmDialog(parentComponent, text,
"Fertiger Download", JOptionPane.YES_NO_CANCEL_OPTION);
}
if (antwort == JOptionPane.CANCEL_OPTION) {
//=============================
//dann wars das
return;
}
if (antwort == JOptionPane.NO_OPTION) {
// weiter mit der nächsten URL
continue;
}
listeDownloadsLoeschen.add(download);
if (download.istAbo()) {
// wenn er schon feritg ist und ein Abos ist, Url auch aus dem Logfile löschen, der Film ist damit wieder auf "Anfang"
daten.erledigteAbos.urlAusLogfileLoeschen(download.arr[DatenDownload.DOWNLOAD_HISTORY_URL]);
}
}
}
listeDownloadsStarten.add(download);
} else if (download.start != null) {
// ==========================================
// stoppen
// wenn kein s -> dann gibts auch nichts zum stoppen oder wieder-starten
if (download.start.status <= Start.STATUS_RUN) {
// löschen -> nur wenn noch läuft, sonst gibts nichts mehr zum löschen
listeDownloadsLoeschen.add(download);
}
}
}
// ========================
// jetzt noch die Starts stoppen
daten.getListeDownloads().downloadAbbrechen(listeDownloadsLoeschen);
// und die Downloads starten oder stoppen
if (starten) {
//alle Downloads starten/wiederstarten
DatenDownload.startenDownloads(daten, listeDownloadsStarten);
}
reloadTable();
}
private void wartendeDownloadsStoppen() {
// es werden alle noch nicht gestarteten Downloads gelöscht
ArrayList<DatenDownload> listeStopDownload = new ArrayList<>();
for (int i = 0; i < tabelle.getRowCount(); ++i) {
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(i), DatenDownload.DOWNLOAD_REF);
if (datenDownload.start != null) {
if (datenDownload.start.status < Start.STATUS_RUN) {
listeStopDownload.add(datenDownload);
}
}
}
daten.getListeDownloads().downloadAbbrechen(listeStopDownload);
}
private void setInfo() {
// Infopanel setzen
daten.getMediathekGui().getStatusBar().setTextForLeftDisplay();
}
/**
* Return the model used for the display categories {@link javax.swing.JComboBox}.
*
* @return The selection model.
*/
private DefaultComboBoxModel<String> getDisplaySelectionModel() {
return new DefaultComboBoxModel<>(new String[]{COMBO_DISPLAY_ALL, COMBO_DISPLAY_DOWNLOADS_ONLY, COMBO_DISPLAY_ABOS_ONLY});
}
private DefaultComboBoxModel<String> getViewModel() {
return new DefaultComboBoxModel<>(new String[]{COMBO_VIEW_ALL, COMBO_VIEW_NOT_STARTED, COMBO_VIEW_STARTED, COMBO_VIEW_WAITING, COMBO_VIEW_RUN_ONLY, COMBO_VIEW_FINISHED_ONLY});
}
private void updateFilmData() {
if (isShowing()) {
DatenFilm aktFilm = null;
final int selectedTableRow = tabelle.getSelectedRow();
if (selectedTableRow >= 0) {
final DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(selectedTableRow), DatenDownload.DOWNLOAD_REF);
if (datenDownload != null) {
aktFilm = datenDownload.film;
}
}
Daten.filmInfo.updateCurrentFilm(aktFilm);
}
}
private ArrayList<DatenFilm> getSelFilme() {
ArrayList<DatenFilm> arrayFilme = new ArrayList<>();
int rows[] = tabelle.getSelectedRows();
if (rows.length > 0) {
for (int row : rows) {
DatenDownload datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
if (datenDownload.film != null) {
arrayFilme.add(datenDownload.film);
}
}
} else {
new HinweisKeineAuswahl().zeigen(parentComponent);
}
return arrayFilme;
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
javax.swing.JScrollPane jScrollPane2 = new javax.swing.JScrollPane();
javax.swing.JEditorPane jEditorPane1 = new javax.swing.JEditorPane();
jPanelToolBar = new javax.swing.JPanel();
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPaneFilter = new javax.swing.JScrollPane();
javax.swing.JPanel jPanelFilterExtern = new javax.swing.JPanel();
javax.swing.JLabel lblAnzeigen = new javax.swing.JLabel();
cbDisplayCategories = new javax.swing.JComboBox<>();
javax.swing.JLabel jLabel3 = new javax.swing.JLabel();
jSpinnerAnzahlDownloads = new javax.swing.JSpinner();
javax.swing.JLabel lblBandwidth = new javax.swing.JLabel();
jSliderBandwidth = new javax.swing.JSlider();
txtBandwidth = new javax.swing.JTextField();
cbView = new javax.swing.JComboBox<>();
btnClear = new javax.swing.JButton();
javax.swing.JSeparator jSeparator1 = new javax.swing.JSeparator();
javax.swing.JSeparator jSeparator2 = new javax.swing.JSeparator();
javax.swing.JScrollPane spDownload = new javax.swing.JScrollPane();
txtDownload = new javax.swing.JEditorPane();
javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
javax.swing.JTable jTable1 = new javax.swing.JTable();
jPanelBeschreibung = new javax.swing.JPanel();
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
jScrollPane2.setViewportView(jEditorPane1);
setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153, 255)));
javax.swing.GroupLayout jPanelToolBarLayout = new javax.swing.GroupLayout(jPanelToolBar);
jPanelToolBar.setLayout(jPanelToolBarLayout);
jPanelToolBarLayout.setHorizontalGroup(
jPanelToolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 485, Short.MAX_VALUE)
);
jPanelToolBarLayout.setVerticalGroup(
jPanelToolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 25, Short.MAX_VALUE)
);
jSplitPane1.setDividerLocation(200);
lblAnzeigen.setText("Anzeigen:");
jLabel3.setText("<html>gleichzeitige<br>Downloads:</html>");
lblBandwidth.setText("<html>max. Bandbreite<br>je Download:</html>");
txtBandwidth.setEditable(false);
cbView.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
btnClear.setIcon(new javax.swing.ImageIcon(getClass().getResource("/mediathek/res/muster/button-clear.png"))); // NOI18N
btnClear.setToolTipText("Alles löschen");
txtDownload.setEditable(false);
txtDownload.setOpaque(false);
txtDownload.setPreferredSize(new java.awt.Dimension(10, 21));
spDownload.setViewportView(txtDownload);
javax.swing.GroupLayout jPanelFilterExternLayout = new javax.swing.GroupLayout(jPanelFilterExtern);
jPanelFilterExtern.setLayout(jPanelFilterExternLayout);
jPanelFilterExternLayout.setHorizontalGroup(
jPanelFilterExternLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelFilterExternLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelFilterExternLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSeparator2, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(cbDisplayCategories, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(txtBandwidth, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(cbView, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanelFilterExternLayout.createSequentialGroup()
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 57, Short.MAX_VALUE)
.addComponent(jSpinnerAnzahlDownloads, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelFilterExternLayout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btnClear))
.addComponent(jSeparator1)
.addGroup(jPanelFilterExternLayout.createSequentialGroup()
.addGroup(jPanelFilterExternLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblAnzeigen)
.addComponent(lblBandwidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(jSliderBandwidth, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(spDownload))
.addContainerGap())
);
jPanelFilterExternLayout.setVerticalGroup(
jPanelFilterExternLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelFilterExternLayout.createSequentialGroup()
.addContainerGap()
.addComponent(lblAnzeigen)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbDisplayCategories, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(cbView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(btnClear)
.addGap(18, 18, 18)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanelFilterExternLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jSpinnerAnzahlDownloads, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(30, 30, 30)
.addComponent(lblBandwidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSliderBandwidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtBandwidth, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(spDownload, javax.swing.GroupLayout.DEFAULT_SIZE, 202, Short.MAX_VALUE)
.addContainerGap())
);
jScrollPaneFilter.setViewportView(jPanelFilterExtern);
jSplitPane1.setLeftComponent(jScrollPaneFilter);
jTable1.setAutoCreateRowSorter(true);
jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
jScrollPane1.setViewportView(jTable1);
jPanelBeschreibung.setLayout(new java.awt.BorderLayout());
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanelBeschreibung, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 569, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanelBeschreibung, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
jSplitPane1.setRightComponent(jPanel1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanelToolBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jSplitPane1)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanelToolBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jSplitPane1))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnClear;
private javax.swing.JComboBox<String> cbDisplayCategories;
private javax.swing.JComboBox<String> cbView;
private javax.swing.JPanel jPanelBeschreibung;
private javax.swing.JPanel jPanelToolBar;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPaneFilter;
private javax.swing.JSlider jSliderBandwidth;
private javax.swing.JSpinner jSpinnerAnzahlDownloads;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JTextField txtBandwidth;
private javax.swing.JEditorPane txtDownload;
// End of variables declaration//GEN-END:variables
public class BeobMausTabelle extends MouseAdapter {
private Point p;
DatenDownload datenDownload = null;
@Override
public void mouseClicked(MouseEvent arg0) {
if (arg0.getButton() == MouseEvent.BUTTON1) {
if (arg0.getClickCount() == 1) {
p = arg0.getPoint();
int row = tabelle.rowAtPoint(p);
int column = tabelle.columnAtPoint(p);
if (row >= 0) {
buttonTable(row, column);
}
} else if (arg0.getClickCount() > 1) {
downloadAendern();
}
}
}
@Override
public void mousePressed(MouseEvent arg0) {
p = arg0.getPoint();
int row = tabelle.rowAtPoint(p);
if (row >= 0) {
datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
}
if (arg0.isPopupTrigger()) {
showMenu(arg0);
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
p = arg0.getPoint();
int row = tabelle.rowAtPoint(p);
if (row >= 0) {
datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
}
if (arg0.isPopupTrigger()) {
showMenu(arg0);
}
}
private void buttonTable(int row, int column) {
if (row != -1) {
datenDownload = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
if (tabelle.convertColumnIndexToModel(column) == DatenDownload.DOWNLOAD_BUTTON_START) {
// filmStartenWiederholenStoppen(boolean alle, boolean starten /* starten/wiederstarten oder stoppen */)
if (datenDownload.start != null && !datenDownload.isDownloadManager()) {
if (datenDownload.start.status == Start.STATUS_FERTIG) {
filmAbspielen_();
} else if (datenDownload.start.status == Start.STATUS_ERR) {
// Download starten
filmStartenWiederholenStoppen(false, true /*starten*/);
} else {
// Download stoppen
filmStartenWiederholenStoppen(false, false /*starten*/);
}
} else {
// Download starten
filmStartenWiederholenStoppen(false, true /*starten*/);
}
} else if (tabelle.convertColumnIndexToModel(column) == DatenDownload.DOWNLOAD_BUTTON_DEL) {
if (datenDownload.start != null) {
if (datenDownload.start.status >= Start.STATUS_FERTIG) {
downloadsAufraeumen(datenDownload);
} else {
// Download dauerhaft löschen
downloadLoeschen(true);
}
} else {
// Download dauerhaft löschen
downloadLoeschen(true);
}
}
}
}
private void showMenu(MouseEvent evt) {
p = evt.getPoint();
int nr = tabelle.rowAtPoint(p);
if (nr >= 0) {
tabelle.setRowSelectionInterval(nr, nr);
}
JPopupMenu jPopupMenu = new JPopupMenu();
//Film vorziehen
int row = tabelle.getSelectedRow();
boolean wartenOderLaufen = false;
if (row >= 0) {
DatenDownload download = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF);
if (download.start != null) {
if (download.start.status <= Start.STATUS_RUN) {
wartenOderLaufen = true;
}
}
}
// Download starten
JMenuItem itemStarten = new JMenuItem("Download starten");
itemStarten.setIcon(Icons.ICON_MENUE_DOWNOAD_STARTEN);
itemStarten.setEnabled(!wartenOderLaufen);
jPopupMenu.add(itemStarten);
itemStarten.addActionListener(arg0 -> filmStartenWiederholenStoppen(false /* alle */, true /* starten */));
// Download stoppen
JMenuItem itemStoppen = new JMenuItem("Download stoppen");
itemStoppen.setIcon(Icons.ICON_MENUE_DOWNOAD_STOP);
itemStoppen.setEnabled(wartenOderLaufen);
jPopupMenu.add(itemStoppen);
itemStoppen.addActionListener(arg0 -> filmStartenWiederholenStoppen(false /* alle */, false /* starten */));
//#######################################
jPopupMenu.addSeparator();
//#######################################
JMenuItem itemVorziehen = new JMenuItem("Download vorziehen");
itemVorziehen.setIcon(Icons.ICON_MENUE_VORZIEHEN);
jPopupMenu.add(itemVorziehen);
itemVorziehen.addActionListener(arg0 -> downloadsVorziehen());
JMenuItem itemLoeschen = new JMenuItem("Download zurückstellen");
itemLoeschen.setIcon(Icons.ICON_MENUE_DOWNLOAD_ZURUECKSTELLEN);
jPopupMenu.add(itemLoeschen);
itemLoeschen.addActionListener(arg0 -> downloadLoeschen(false /* dauerhaft */));
//dauerhaft löschen
JMenuItem itemDauerhaftLoeschen = new JMenuItem("Download aus Liste entfernen");
itemDauerhaftLoeschen.setIcon(Icons.ICON_MENUE_DOWNOAD_LOESCHEN);
jPopupMenu.add(itemDauerhaftLoeschen);
itemDauerhaftLoeschen.addActionListener(arg0 -> downloadLoeschen(true /* dauerhaft */));
//Download ändern
JMenuItem itemAendern = new JMenuItem("Download ändern");
itemAendern.setIcon(Icons.ICON_MENUE_DOWNLOAD_AENDERN);
jPopupMenu.add(itemAendern);
itemAendern.addActionListener(arg0 -> downloadAendern());
//#######################################
jPopupMenu.addSeparator();
//#######################################
JMenuItem itemAlleStarten = new JMenuItem("alle Downloads starten");
itemAlleStarten.setIcon(Icons.ICON_MENUE_DOWNLOAD_ALLE_STARTEN);
jPopupMenu.add(itemAlleStarten);
itemAlleStarten.addActionListener(arg0 -> filmStartenWiederholenStoppen(true /* alle */, true /* starten */));
JMenuItem itemAlleStoppen = new JMenuItem("alle Downloads stoppen");
itemAlleStoppen.setIcon(Icons.ICON_MENUE_DOWNOAD_STOP);
jPopupMenu.add(itemAlleStoppen);
itemAlleStoppen.addActionListener(arg0 -> filmStartenWiederholenStoppen(true /* alle */, false /* starten */));
JMenuItem itemWartendeStoppen = new JMenuItem("wartende Downloads stoppen");
itemWartendeStoppen.setIcon(Icons.ICON_MENUE_DOWNOAD_STOP);
jPopupMenu.add(itemWartendeStoppen);
itemWartendeStoppen.addActionListener(arg0 -> wartendeDownloadsStoppen());
JMenuItem itemAktualisieren = new JMenuItem("Liste der Downloads aktualisieren");
itemAktualisieren.setIcon(Icons.ICON_MENUE_AKTUALISIEREN);
jPopupMenu.add(itemAktualisieren);
itemAktualisieren.addActionListener(arg0 -> downloadsAktualisieren());
JMenuItem itemAufraeumen = new JMenuItem("Liste der Downloads aufräumen");
itemAufraeumen.setIcon(Icons.ICON_MENUE_CLEAR);
jPopupMenu.add(itemAufraeumen);
itemAufraeumen.addActionListener(arg0 -> downloadsAufraeumen());
//#######################################
jPopupMenu.addSeparator();
//#######################################
// Film abspielen
JMenuItem itemPlayerDownload = new JMenuItem("gespeicherten Film (Datei) abspielen");
itemPlayerDownload.setIcon(Icons.ICON_MENUE_FILM_START);
itemPlayerDownload.addActionListener(e -> filmAbspielen_());
jPopupMenu.add(itemPlayerDownload);
// Film löschen
JMenuItem itemDeleteDownload = new JMenuItem("gespeicherten Film (Datei) löschen");
itemDeleteDownload.setIcon(Icons.ICON_MENUE_DOWNOAD_LOESCHEN);
itemDeleteDownload.addActionListener(e -> filmLoeschen_());
jPopupMenu.add(itemDeleteDownload);
// Zielordner öffnen
JMenuItem itemOeffnen = new JMenuItem("Zielordner öffnen");
itemOeffnen.setIcon(Icons.ICON_MENUE_FILE_OPEN);
jPopupMenu.add(itemOeffnen);
itemOeffnen.addActionListener(e -> zielordnerOeffnen());
//#######################################
jPopupMenu.addSeparator();
//#######################################
//Abo ändern
JMenu submenueAbo = new JMenu("Abo");
JMenuItem itemChangeAbo = new JMenuItem("Abo ändern");
JMenuItem itemDelAbo = new JMenuItem("Abo löschen");
if (datenDownload == null) {
submenueAbo.setEnabled(false);
itemChangeAbo.setEnabled(false);
itemDelAbo.setEnabled(false);
} else if (datenDownload.film == null) {
submenueAbo.setEnabled(false);
itemChangeAbo.setEnabled(false);
itemDelAbo.setEnabled(false);
} else {
final DatenAbo datenAbo = daten.getListeAbo().getAboFuerFilm_schnell(datenDownload.film, false /*die Länge nicht prüfen*/);
if (datenAbo == null) {
submenueAbo.setEnabled(false);
itemChangeAbo.setEnabled(false);
itemDelAbo.setEnabled(false);
} else {
// dann können wir auch ändern
itemDelAbo.addActionListener(e -> daten.getListeAbo().aboLoeschen(datenAbo));
itemChangeAbo.addActionListener(e -> {
stopBeob = true;
DialogEditAbo dialog = new DialogEditAbo(daten.getMediathekGui(), true, daten, datenAbo, false/*onlyOne*/);
dialog.setVisible(true);
if (dialog.ok) {
daten.getListeAbo().aenderungMelden();
}
stopBeob = false;
});
}
}
submenueAbo.add(itemDelAbo);
submenueAbo.add(itemChangeAbo);
jPopupMenu.add(submenueAbo);
//#######################################
jPopupMenu.addSeparator();
//#######################################
// Film in der MediaDB suchen
JMenuItem itemDb = new JMenuItem("Titel in der Mediensammlung suchen");
itemDb.addActionListener(e -> mediensammlung());
jPopupMenu.add(itemDb);
// URL abspielen
JMenuItem itemPlayer = new JMenuItem("Film (URL) abspielen");
itemPlayer.addActionListener(e -> {
int nr1 = tabelle.rowAtPoint(p);
if (nr1 >= 0) {
DatenPset gruppe = Daten.listePset.getPsetAbspielen();
if (gruppe != null) {
DatenDownload datenDownload1 = (DatenDownload) tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(nr1), DatenDownload.DOWNLOAD_REF);
if (datenDownload1 != null) {
if (datenDownload1.film != null) {
DatenFilm filmDownload = datenDownload1.film.getCopy();
// und jetzt die tatsächlichen URLs des Downloads eintragen
filmDownload.arr[DatenFilm.FILM_URL] = datenDownload1.arr[DatenDownload.DOWNLOAD_URL];
filmDownload.arr[DatenFilm.FILM_URL_RTMP] = datenDownload1.arr[DatenDownload.DOWNLOAD_URL_RTMP];
filmDownload.arr[DatenFilm.FILM_URL_KLEIN] = "";
filmDownload.arr[DatenFilm.FILM_URL_RTMP_KLEIN] = "";
// und starten
daten.starterClass.urlMitProgrammStarten(gruppe, filmDownload, "" /*Auflösung*/);
}
}
} else {
String menuPath;
if (SystemInfo.isMacOSX()) {
menuPath = "MediathekView->Einstellungen…->Aufzeichnen und Abspielen->Set bearbeiten";
} else {
menuPath = "Datei->Einstellungen->Set bearbeiten";
}
MVMessageDialog.showMessageDialog(parentComponent, "Bitte legen Sie im Menü \"" + menuPath + "\" ein Programm zum Abspielen fest.",
"Kein Videoplayer!", JOptionPane.INFORMATION_MESSAGE);
}
}
});
jPopupMenu.add(itemPlayer);
// URL kopieren
JMenuItem itemUrl = new JMenuItem("URL kopieren");
KeyStroke ctrlU = KeyStroke.getKeyStroke(KeyEvent.VK_U, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
itemUrl.setAccelerator(ctrlU);
itemUrl.addActionListener(e -> {
int nr1 = tabelle.rowAtPoint(p);
if (nr1 >= 0) {
GuiFunktionen.copyToClipboard(
tabelle.getModel().getValueAt(tabelle.convertRowIndexToModel(nr1),
DatenDownload.DOWNLOAD_URL).toString());
}
});
jPopupMenu.add(itemUrl);
// Infos
JMenuItem itemInfo = new JMenuItem("Filminformation anzeigen");
itemInfo.addActionListener(e -> {
if (!Daten.filmInfo.isVisible()) {
Daten.filmInfo.showInfo();
}
});
jPopupMenu.add(itemInfo);
// ######################
// Menü anzeigen
jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
/**
* This class filters the shown table items based on the made selection.
*/
private class DisplayCategoryListener implements ActionListener {
@Override
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent e) {
JComboBox<String> box = (JComboBox<String>) e.getSource();
final String action = (String) box.getSelectedItem();
switch (action) {
case COMBO_DISPLAY_ALL:
onlyAbos = false;
onlyDownloads = false;
break;
case COMBO_DISPLAY_DOWNLOADS_ONLY:
onlyAbos = false;
onlyDownloads = true;
break;
case COMBO_DISPLAY_ABOS_ONLY:
onlyAbos = true;
onlyDownloads = false;
break;
case COMBO_VIEW_ALL:
onlyNotStarted = false;
onlyStarted = false;
onlyWaiting = false;
onlyFinished = false;
onlyRun = false;
break;
case COMBO_VIEW_NOT_STARTED:
onlyNotStarted = true;
onlyStarted = false;
onlyWaiting = false;
onlyFinished = false;
onlyRun = false;
break;
case COMBO_VIEW_STARTED:
onlyNotStarted = false;
onlyStarted = true;
onlyWaiting = false;
onlyFinished = false;
onlyRun = false;
break;
case COMBO_VIEW_WAITING:
onlyNotStarted = false;
onlyStarted = false;
onlyWaiting = true;
onlyFinished = false;
onlyRun = false;
break;
case COMBO_VIEW_FINISHED_ONLY:
onlyNotStarted = false;
onlyStarted = false;
onlyWaiting = false;
onlyFinished = true;
onlyRun = false;
break;
case COMBO_VIEW_RUN_ONLY:
onlyNotStarted = false;
onlyStarted = false;
onlyWaiting = false;
onlyFinished = false;
onlyRun = true;
break;
}
reloadTable();
}
}
}