package mediathek.gui; import com.explodingpixels.macwidgets.BottomBar; import com.explodingpixels.macwidgets.BottomBarSize; import mSearch.filmeSuchen.ListenerFilmeLaden; import mSearch.filmeSuchen.ListenerFilmeLadenEvent; import mSearch.tool.Functions; import mSearch.tool.Listener; import mSearch.tool.Log; import mediathek.config.Daten; import mediathek.config.Icons; import mediathek.daten.DatenAbo; import mediathek.daten.DatenDownload; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.border.SoftBevelBorder; import java.awt.*; import java.util.EnumMap; @SuppressWarnings("serial") public final class MVStatusBar extends JPanel { private final Daten daten; private boolean stopTimer = false; private final EnumMap<MVStatusBar.StatusbarIndex, String> displayListForLeftLabel = new EnumMap<>(MVStatusBar.StatusbarIndex.class); private MVStatusBar.StatusbarIndex currentIndex = MVStatusBar.StatusbarIndex.NONE; private final JLabel lblLeft; private final JLabel lblRight; private final JLabel lblSel; private final JProgressBar progress; private final JButton stopButton; private final BottomBar bottomBar; private static final String TRENNER = " || "; public MVStatusBar() { daten = Daten.getInstance(); EmptyBorder eBorder = new EmptyBorder(0, 5, 0, 5); // oben, rechts, unten, links bottomBar = new BottomBar(BottomBarSize.LARGE); SoftBevelBorder sbb = new SoftBevelBorder(javax.swing.border.BevelBorder.LOWERED); lblSel = new JLabel("0"); lblSel.setBorder(BorderFactory.createCompoundBorder(sbb, eBorder)); bottomBar.addComponentToLeft(lblSel, 20); lblLeft = new JLabel(); bottomBar.addComponentToLeft(lblLeft); if (Daten.isDebug()) { bottomBar.addComponentToCenter(new MVMemoryUsageButton()); } //Progress controls and Filminfo must be packed in a panel JPanel progressPanel = new JPanel(); progressPanel.setBackground(bottomBar.getComponent().getBackground()); progressPanel.setLayout(new FlowLayout()); progressPanel.setOpaque(false); lblRight = new JLabel(); progressPanel.add(lblRight); progress = new JProgressBar(); progressPanel.add(progress); stopButton = new JButton(); stopButton.setIcon(Icons.ICON_STATUSBAR_STOP); stopButton.setToolTipText("Abbrechen"); stopButton.addActionListener(e -> daten.getFilmeLaden().setStop(true)); progressPanel.add(stopButton); bottomBar.addComponentToRight(progressPanel); hideProgressIndicators(); Listener.addListener(new Listener(Listener.EREIGNIS_TIMER, MVStatusBar.class.getSimpleName()) { @Override public void ping() { setTextForLeftDisplay(); try { if (!stopTimer) { setTextForRightDisplay(); } } catch (Exception ex) { Log.errorLog(936251087, ex); } } }); daten.getFilmeLaden().addAdListener(new ListenerFilmeLaden() { @Override public void start(ListenerFilmeLadenEvent event) { } @Override public void progress(ListenerFilmeLadenEvent event) { updateProgressBar(event); } @Override public void fertig(ListenerFilmeLadenEvent event) { hideProgressIndicators(); } }); } public enum StatusbarIndex { NONE, FILME, DOWNLOAD, ABO } public JComponent getComponent() { return bottomBar.getComponent(); } /** * Hide the progress bar indicator and stop button */ private void hideProgressIndicators() { stopTimer = false; progress.setVisible(false); stopButton.setVisible(false); lblRight.setVisible(true); setTextForRightDisplay(); } private void updateProgressBar(ListenerFilmeLadenEvent event) { stopTimer = true; if (!progress.isVisible()) { progress.setVisible(true); stopButton.setVisible(true); } if (event.max == 0 || event.progress == event.max) { progress.setIndeterminate(true); progress.setMaximum(0); progress.setMinimum(0); progress.setValue(0); progress.setStringPainted(true); progress.setString(event.text); } else { progress.setIndeterminate(false); progress.setMaximum(event.max); progress.setMinimum(0); progress.setValue(event.progress); progress.setStringPainted(true); progress.setString(event.text); } if (Daten.isDebug()) { lblRight.setText(Functions.textLaenge(60, event.senderUrl, true /* mitte */, true /*addVorne*/)); } else { lblRight.setVisible(false); } } /** * Wähle den Textstring aus dem Index {@code i}, der im zentralen Textfeld dargestellt werden soll. * * @param i Index, für den ein Text dargestellt werden soll. */ public void setIndexForLeftDisplay(StatusbarIndex i) { currentIndex = i; String displayString = displayListForLeftLabel.get(i); lblLeft.setText(displayString); } public void setTextForLeftDisplay() { switch (currentIndex) { case FILME: setInfoFilme(); // muss laufen, wegen der Anzeige der Bandbreite break; case DOWNLOAD: setInfoDownload(); // muss laufen, wegen der Anzeige der Bandbreite break; case ABO: setInfoAbo(); break; default: setInfoDefault(); } String displayString = displayListForLeftLabel.get(currentIndex); lblLeft.setText(displayString); } private void setInfoDefault() { String textLinks; int gesamt = daten.getListeFilme().size(); lblSel.setText(""); // Anzahl der Filme if (gesamt == 1) { textLinks = "1 Film"; } else { textLinks = gesamt + " Filme"; } displayListForLeftLabel.put(MVStatusBar.StatusbarIndex.NONE, textLinks); } private void setInfoFilme() { String textLinks; int gesamt = daten.getListeFilme().size(); int anzListe = Daten.guiFilme.getTableRowCount(); int runs = daten.getListeDownloadsButton().getListOfStartsNotFinished(DatenDownload.QUELLE_BUTTON).size(); lblSel.setText(Daten.guiFilme.tabelle.getSelectedRowCount() + ""); // Anzahl der Filme if (gesamt == anzListe) { if (anzListe == 1) { textLinks = "1 Film"; } else { textLinks = anzListe + " Filme"; } } else { if (anzListe == 1) { textLinks = "1 Film"; } else { textLinks = anzListe + " Filme"; } textLinks += " (Insgesamt: " + gesamt + " )"; } // laufende Programme if (runs == 1) { textLinks += TRENNER; textLinks += (runs + " laufender Film"); } else if (runs > 1) { textLinks += TRENNER; textLinks += (runs + " laufende Filme"); } // auch die Downloads anzeigen textLinks += TRENNER; textLinks += getInfoTextDownloads(false); displayListForLeftLabel.put(MVStatusBar.StatusbarIndex.FILME, textLinks); } private void setInfoDownload() { lblSel.setText(Daten.guiDownloads.tabelle.getSelectedRowCount() + ""); String textLinks = getInfoTextDownloads(true /*mitAbo*/); displayListForLeftLabel.put(MVStatusBar.StatusbarIndex.DOWNLOAD, textLinks); } private void setInfoAbo() { lblSel.setText(Daten.guiAbo.tabelle.getSelectedRowCount() + ""); String textLinks; int ein = 0; int aus = 0; int gesamt = daten.getListeAbo().size(); for (DatenAbo abo : daten.getListeAbo()) { if (abo.aboIstEingeschaltet()) { ++ein; } else { ++aus; } } if (gesamt == 1) { textLinks = "1 Abo"; } else { textLinks = gesamt + " Abos"; } textLinks += TRENNER + ein + " eingeschaltet, " + aus + " ausgeschaltet"; displayListForLeftLabel.put(MVStatusBar.StatusbarIndex.ABO, textLinks); } private String getInfoTextDownloads(boolean download) { String textLinks; // Text links: Zeilen Tabelle // nicht gestarted, laufen, fertig OK, fertig fehler int[] starts = daten.getDownloadInfos().downloadStarts; int anz = daten.getListeDownloads().size(); int diff = anz - starts[0]; boolean print = false; for (int ii = 1; ii < starts.length; ++ii) { if (starts[ii] > 0) { print = true; break; } } if (anz == 1) { textLinks = "1 Download"; } else { textLinks = anz + " Downloads"; } if (download) { if (diff == 1) { textLinks += " (1 zurückgestellt)"; } else if (diff > 1) { textLinks += " (" + diff + " zurückgestellt)"; } textLinks += TRENNER; if (starts[1] == 1) { textLinks += "1 Abo, "; } else { textLinks += "" + starts[1] + " Abos, "; } if (starts[2] == 1) { textLinks += "1 Download"; } else { textLinks += starts[2] + " Downloads"; } textLinks += TRENNER; } else if (print) { textLinks += ": "; } if (print) { if (starts[4] == 1) { textLinks += "1 läuft"; } else { textLinks += starts[4] + " laufen"; } if (starts[4] > 0) { textLinks += " (" + daten.getDownloadInfos().bandwidthStr + ')'; } 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"; } } } return textLinks; } private void setTextForRightDisplay() { // Text rechts: alter/neuladenIn anzeigen String strText = "Filmliste erstellt: "; strText += daten.getListeFilme().genDate(); strText += " Uhr "; final int sekunden = daten.getListeFilme().getAge(); if (sekunden != 0) { strText += "|| Alter: "; final int minuten = sekunden / 60; String strSekunde = String.valueOf(sekunden % 60); String strMinute = String.valueOf(minuten % 60); String strStunde = String.valueOf(minuten / 60); if (strSekunde.length() < 2) { strSekunde = '0' + strSekunde; } if (strMinute.length() < 2) { strMinute = '0' + strMinute; } if (strStunde.length() < 2) { strStunde = '0' + strStunde; } strText += strStunde + ':' + strMinute + ':' + strSekunde + ' '; } // Infopanel setzen lblRight.setText(strText); } }