/* * 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.tool; import com.jidesoft.utils.SystemInfo; import mSearch.tool.Listener; import mSearch.tool.Log; import mediathek.config.Icons; import mediathek.config.MVColor; import mediathek.config.MVConfig; import mediathek.controller.starter.Start; import mediathek.daten.DatenDownload; import javax.swing.*; import javax.swing.border.Border; import javax.swing.plaf.basic.BasicProgressBarUI; import javax.swing.table.DefaultTableCellRenderer; import java.awt.*; @SuppressWarnings("serial") public class CellRendererDownloads extends DefaultTableCellRenderer { private final static String DOWNLOAD_STARTEN = "Download starten"; private final static String DOWNLOAD_LOESCHEN = "Download aus Liste entfernen"; private final static String DOWNLOAD_STOPPEN = "Download stoppen"; private final static String DOWNLOAD_ENTFERNEN = "Download entfernen"; private final static String PLAY_DOWNLOADED_FILM = "gespeicherten Film abspielen"; private static ImageIcon ja_16 = null; private static ImageIcon nein_12 = null; private static ImageIcon film_start_tab = null; private static ImageIcon download_stop_tab = null; private static ImageIcon download_start_tab = null; private static ImageIcon film_start_sw_tab = null; private static ImageIcon download_stop_sw_tab = null; private static ImageIcon download_start_sw_tab = null; private static ImageIcon download_clear_tab = null; private static ImageIcon download_clear_sw_tab = null; private static ImageIcon download_del_tab = null; private static ImageIcon download_del_sw_tab = null; private boolean geoMelden = false; private final JProgressBar progressBar; private final Border emptyBorder = BorderFactory.createEmptyBorder(); private final Border largeBorder = BorderFactory.createEmptyBorder(9, 2, 9, 2); private final JPanel panel; private final MVSenderIconCache senderIconCache; public CellRendererDownloads() { ja_16 = Icons.ICON_TABELLE_EIN; nein_12 = Icons.ICON_TABELLE_AUS; film_start_tab = Icons.ICON_TABELLE_FILM_START; film_start_sw_tab = Icons.ICON_TABELLE_FILM_START_SW; download_stop_tab = Icons.ICON_TABELLE_DOWNOAD_STOP; download_stop_sw_tab = Icons.ICON_TABELLE_DOWNOAD_STOP_SW; download_start_tab = Icons.ICON_TABELLE_DOWNOAD_START; download_start_sw_tab = Icons.ICON_TABELLE_DOWNOAD_START_SW; download_clear_tab = Icons.ICON_TABELLE_DOWNOAD_CLEAR; download_clear_sw_tab = Icons.ICON_TABELLE_DOWNOAD_CLEAR_SW; download_del_tab = Icons.ICON_TABELLE_DOWNOAD_DEL; download_del_sw_tab = Icons.ICON_TABELLE_DOWNOAD_DEL_SW; geoMelden = Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_GEO_MELDEN)); Listener.addListener(new Listener(Listener.EREIGNIS_GEO, CellRendererDownloads.class.getSimpleName()) { @Override public void ping() { geoMelden = Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_GEO_MELDEN)); } }); progressBar = new JProgressBar(0, 1000); progressBar.setStringPainted(true); //on OSX the OS provided progress bar looks much better... if (!SystemInfo.isMacOSX()) { progressBar.setUI(new BasicProgressBarUI() { @Override protected Color getSelectionBackground() { return UIManager.getDefaults().getColor("Table.foreground"); } @Override protected Color getSelectionForeground() { return Color.white; } }); } panel = new JPanel(new BorderLayout()); panel.add(progressBar); senderIconCache = new MVSenderIconCache(); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { try { setBackground(null); setForeground(null); setIcon(null); setToolTipText(null); setHorizontalAlignment(SwingConstants.LEADING); super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); final int rowModelIndex = table.convertRowIndexToModel(row); final int columnModelIndex = table.convertColumnIndexToModel(column); DatenDownload datenDownload = (DatenDownload) table.getModel().getValueAt(rowModelIndex, DatenDownload.DOWNLOAD_REF); if (((MVTable) table).lineBreak) { JTextArea textArea; switch (columnModelIndex) { case DatenDownload.DOWNLOAD_TITEL: case DatenDownload.DOWNLOAD_THEMA: case DatenDownload.DOWNLOAD_URL: case DatenDownload.DOWNLOAD_PROGRAMM_AUFRUF: case DatenDownload.DOWNLOAD_PROGRAMM_AUFRUF_ARRAY: case DatenDownload.DOWNLOAD_FILM_URL: case DatenDownload.DOWNLOAD_URL_SUBTITLE: case DatenDownload.DOWNLOAD_ZIEL_DATEINAME: case DatenDownload.DOWNLOAD_ZIEL_PFAD: case DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME: case DatenDownload.DOWNLOAD_ABO: textArea = new JTextArea(); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setText(value.toString()); textArea.setForeground(getForeground()); textArea.setBackground(getBackground()); if (columnModelIndex == DatenDownload.DOWNLOAD_ABO) { handleAboColumn(textArea, datenDownload); } setColor(textArea, datenDownload.start, isSelected); handleGeoBlocking(textArea, datenDownload, isSelected); if (!SystemInfo.isMacOSX()) { // On OS X do not change fonts as it violates HIG... if (isSelected) { textArea.setFont(new java.awt.Font("Dialog", Font.BOLD, MVFont.fontSize)); } else { textArea.setFont(new java.awt.Font("Dialog", Font.PLAIN, MVFont.fontSize)); } } return textArea; } } if (!SystemInfo.isMacOSX()) { // On OS X do not change fonts as it violates HIG... if (isSelected) { setFont(new java.awt.Font("Dialog", Font.BOLD, MVFont.fontSize)); } else { setFont(new java.awt.Font("Dialog", Font.PLAIN, MVFont.fontSize)); } } switch (columnModelIndex) { case DatenDownload.DOWNLOAD_PROGRESS: setHorizontalAlignment(SwingConstants.CENTER); if (((MVTable) table).iconAnzeigen && !((MVTable) table).iconKlein) { progressBar.setBorder(largeBorder); } else { progressBar.setBorder(emptyBorder); } if (datenDownload.start != null) { if (1 < datenDownload.start.percent && datenDownload.start.percent < Start.PROGRESS_FERTIG) { setColor(panel, datenDownload.start, isSelected); setColor(progressBar, datenDownload.start, isSelected); progressBar.setValue(datenDownload.start.percent); final double progressValue = datenDownload.start.percent / 10.0; progressBar.setString(Double.toString(progressValue) + '%'); return panel; } else { setText(Start.getTextProgress(datenDownload.isDownloadManager(), datenDownload.start)); } } else { setText(""); } break; case DatenDownload.DOWNLOAD_RESTZEIT: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.start != null && datenDownload.start.beginnAnschauen) { setForeground(MVColor.DOWNLOAD_ANSEHEN.color); } break; case DatenDownload.DOWNLOAD_FILM_NR: if ((int) table.getModel().getValueAt(rowModelIndex, DatenDownload.DOWNLOAD_FILM_NR) == 0) { setText(""); } setHorizontalAlignment(SwingConstants.CENTER); break; case DatenDownload.DOWNLOAD_PROGRAMM_RESTART: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.isRestart()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_PROGRAMM_DOWNLOADMANAGER: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.isDownloadManager()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_ART: switch (datenDownload.art) { case DatenDownload.ART_DOWNLOAD: setText(DatenDownload.ART_DOWNLOAD_TXT); break; case DatenDownload.ART_PROGRAMM: setText(DatenDownload.ART_PROGRAMM_TXT); break; } break; case DatenDownload.DOWNLOAD_QUELLE: switch (datenDownload.quelle) { case DatenDownload.QUELLE_ALLE: setText(DatenDownload.QUELLE_ALLE_TXT); break; case DatenDownload.QUELLE_ABO: setText(DatenDownload.QUELLE_ABO_TXT); break; case DatenDownload.QUELLE_BUTTON: setText(DatenDownload.QUELLE_BUTTON_TXT); break; case DatenDownload.QUELLE_DOWNLOAD: setText(DatenDownload.QUELLE_DOWNLOAD_TXT); break; } break; case DatenDownload.DOWNLOAD_UNTERBROCHEN: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.isInterrupted()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_ZURUECKGESTELLT: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.istZurueckgestellt()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_INFODATEI: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.isInfoFile()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_SUBTITLE: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.isSubtitle()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_SPOTLIGHT: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.isSpotlight()) { setIcon(ja_16); } else { setIcon(nein_12); } break; case DatenDownload.DOWNLOAD_BUTTON_START: handleButtonStartColumn(datenDownload, isSelected); break; case DatenDownload.DOWNLOAD_BUTTON_DEL: handleButtonDeleteColumn(datenDownload, isSelected); break; case DatenDownload.DOWNLOAD_GROESSE: setHorizontalAlignment(SwingConstants.RIGHT); break; case DatenDownload.DOWNLOAD_ABO: handleAboColumn(datenDownload); break; case DatenDownload.DOWNLOAD_NR: case DatenDownload.DOWNLOAD_DATUM: case DatenDownload.DOWNLOAD_ZEIT: case DatenDownload.DOWNLOAD_DAUER: case DatenDownload.DOWNLOAD_BANDBREITE: setHorizontalAlignment(SwingConstants.CENTER); break; case DatenDownload.DOWNLOAD_SENDER: if (((MVTable) table).iconAnzeigen) { handleSenderColumn((String) value, ((MVTable) table).iconKlein); } break; case DatenDownload.DOWNLOAD_HD: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.film != null && datenDownload.film.isHD()) { setIcon(ja_16); } else { setIcon(nein_12); } setText("");//im Modle brauchen wir den Text zum Sortieren break; case DatenDownload.DOWNLOAD_UT: setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.film != null && datenDownload.film.hasUT()) { setIcon(ja_16); } else { setIcon(nein_12); } setText("");//im Modle brauchen wir den Text zum Sortieren break; } setColor(this, datenDownload.start, isSelected); handleGeoBlocking(this, datenDownload, isSelected); } catch (Exception ex) { Log.errorLog(758200166, ex); } return this; } /** * Draws the sender icon in the sender model column. * * @param sender Name of the sender. */ private void handleSenderColumn(String sender, boolean small) { setHorizontalAlignment(SwingConstants.CENTER); ImageIcon icon = senderIconCache.get(sender, small); if (icon != null) { setText(""); setIcon(icon); } } private void handleButtonStartColumn(final DatenDownload datenDownload, final boolean isSelected) { setHorizontalAlignment(SwingConstants.CENTER); if (isSelected) { if (datenDownload.start != null && !datenDownload.isDownloadManager()) { if (datenDownload.start.status == Start.STATUS_FERTIG) { setIcon(film_start_tab); setToolTipText(PLAY_DOWNLOADED_FILM); } else if (datenDownload.start.status == Start.STATUS_ERR) { setIcon(download_start_tab); setToolTipText(DOWNLOAD_STARTEN); } else { setIcon(download_stop_tab); setToolTipText(DOWNLOAD_STOPPEN); } } else { setIcon(download_start_tab); setToolTipText(DOWNLOAD_STARTEN); } } else if (datenDownload.start != null && !datenDownload.isDownloadManager()) { if (datenDownload.start.status == Start.STATUS_FERTIG) { setIcon(film_start_sw_tab); setToolTipText(PLAY_DOWNLOADED_FILM); } else if (datenDownload.start.status == Start.STATUS_ERR) { setIcon(download_start_sw_tab); setToolTipText(DOWNLOAD_STARTEN); } else { setIcon(download_stop_sw_tab); setToolTipText(DOWNLOAD_STOPPEN); } } else { setIcon(download_start_sw_tab); setToolTipText(DOWNLOAD_STARTEN); } } private void handleButtonDeleteColumn(final DatenDownload datenDownload, final boolean isSelected) { setHorizontalAlignment(SwingConstants.CENTER); if (datenDownload.start != null) { if (datenDownload.start.status >= Start.STATUS_FERTIG) { if (isSelected) { setIcon(download_clear_tab); setToolTipText(DOWNLOAD_ENTFERNEN); } else { setIcon(download_clear_sw_tab); setToolTipText(DOWNLOAD_ENTFERNEN); } } else { setupDownloadLoeschen(isSelected); } } else { setupDownloadLoeschen(isSelected); } } private void handleAboColumn(JTextArea a, final DatenDownload datenDownload) { if (!datenDownload.arr[DatenDownload.DOWNLOAD_ABO].isEmpty()) { a.setForeground(MVColor.DOWNLOAD_IST_ABO.color); } else { a.setForeground(MVColor.DOWNLOAD_IST_DIREKTER_DOWNLOAD.color); a.setText("Download"); } } private void handleAboColumn(final DatenDownload datenDownload) { setHorizontalAlignment(SwingConstants.CENTER); if (!datenDownload.arr[DatenDownload.DOWNLOAD_ABO].isEmpty()) { setForeground(MVColor.DOWNLOAD_IST_ABO.color); } else { setForeground(MVColor.DOWNLOAD_IST_DIREKTER_DOWNLOAD.color); setText("Download"); } } private void handleGeoBlocking(Component c, final DatenDownload datenDownload, final boolean isSelected) { if (datenDownload.start == null && geoMelden && !datenDownload.arr[DatenDownload.DOWNLOAD_GEO].isEmpty() && !datenDownload.arr[DatenDownload.DOWNLOAD_GEO].contains(MVConfig.get(MVConfig.Configs.SYSTEM_GEO_STANDORT))) { if (isSelected) { c.setBackground(MVColor.FILM_GEOBLOCK_BACKGROUND_SEL.color); } else { c.setBackground(MVColor.FILM_GEOBLOCK_BACKGROUND.color); } } } private void setupDownloadLoeschen(final boolean isSelected) { if (isSelected) { setIcon(download_del_tab); setToolTipText(DOWNLOAD_LOESCHEN); } else { setIcon(download_del_sw_tab); setToolTipText(DOWNLOAD_LOESCHEN); } } private void setColor(Component c, Start s, boolean isSelected) { if (s != null) { switch (s.status) { case Start.STATUS_INIT: if (isSelected) { c.setBackground(MVColor.DOWNLOAD_WAIT_SEL.color); } else { c.setBackground(MVColor.DOWNLOAD_WAIT.color); } break; case Start.STATUS_RUN: if (isSelected) { c.setBackground(MVColor.DOWNLOAD_RUN_SEL.color); } else { c.setBackground(MVColor.DOWNLOAD_RUN.color); } break; case Start.STATUS_FERTIG: if (isSelected) { c.setBackground(MVColor.DOWNLOAD_FERTIG_SEL.color); } else { c.setBackground(MVColor.DOWNLOAD_FERTIG.color); } break; case Start.STATUS_ERR: if (isSelected) { c.setBackground(MVColor.DOWNLOAD_FEHLER_SEL.color); } else { c.setBackground(MVColor.DOWNLOAD_FEHLER.color); } break; } } } }