/* * 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 mSearch.daten.DatenFilm; import mSearch.tool.Listener; import mSearch.tool.Log; import mediathek.config.Daten; import mediathek.config.MVConfig; import mediathek.daten.*; import javax.activation.DataHandler; import javax.swing.*; import javax.swing.RowSorter.SortKey; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DragSource; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.LinkedList; import java.util.List; @SuppressWarnings("serial") public final class MVTable extends JTable { public enum TableType { STANDARD, FILME, DOWNLOADS, ABOS, PSET, PROG, MEDIA_DB } //public static final String TABELLEN = "Tabellen"; public static final String FELDTRENNER = "|"; public static final String SORT_ASCENDING = "ASCENDING"; public static final String SORT_DESCENDING = "DESCENDING"; public boolean iconAnzeigen = false; public boolean iconKlein = false; private final int[] breite; private final int[] reihe; private MVConfig.Configs nrDatenSystem = null; private TableType tabelle; private int maxSpalten; private List<? extends RowSorter.SortKey> listeSortKeys = null; private int indexSpalte = 0; private int[] selRows; private int[] selIndexes = null; private int selRow = -1; private boolean[] spaltenAnzeigen; private MVConfig.Configs iconAnzeigenStr = null; private MVConfig.Configs iconKleinStr = null; public boolean lineBreak = true; private final Daten daten; /** * Return the type of this MVTable. * * @return */ public TableType getTableType() { return tabelle; } public MVTable(TableType tabelle) { this.tabelle = tabelle; daten = Daten.getInstance(); setAutoCreateRowSorter(true); setAutoResizeMode(JTable.AUTO_RESIZE_OFF); String[] spaltenTitel; switch (tabelle) { case FILME: spaltenTitel = DatenFilm.COLUMN_NAMES; maxSpalten = DatenFilm.MAX_ELEM; spaltenAnzeigen = getSpaltenEinAus(DatenFilm.spaltenAnzeigen, DatenFilm.MAX_ELEM); indexSpalte = DatenFilm.FILM_NR; nrDatenSystem = MVConfig.Configs.SYSTEM_EIGENSCHAFTEN_TABELLE_FILME; iconAnzeigenStr = MVConfig.Configs.SYSTEM_TAB_FILME_ICON_ANZEIGEN; iconKleinStr = MVConfig.Configs.SYSTEM_TAB_FILME_ICON_KLEIN; this.setModel(new TModelFilm(new Object[][]{}, spaltenTitel)); this.getTableHeader().addMouseListener(new WidthAdjuster(this)); break; case DOWNLOADS: spaltenTitel = DatenDownload.COLUMN_NAMES; maxSpalten = DatenDownload.MAX_ELEM; spaltenAnzeigen = getSpaltenEinAus(DatenDownload.spaltenAnzeigen, DatenDownload.MAX_ELEM); indexSpalte = DatenDownload.DOWNLOAD_NR; nrDatenSystem = MVConfig.Configs.SYSTEM_EIGENSCHAFTEN_TABELLE_DOWNLOADS; iconAnzeigenStr = MVConfig.Configs.SYSTEM_TAB_DOWNLOAD_ICON_ANZEIGEN; iconKleinStr = MVConfig.Configs.SYSTEM_TAB_DOWNLOAD_ICON_KLEIN; setDragEnabled(true); setDropMode(DropMode.INSERT_ROWS); setTransferHandler(new TableRowTransferHandlerDownload(this)); setModel(new TModelDownload(new Object[][]{}, spaltenTitel)); this.getTableHeader().addMouseListener(new WidthAdjuster(this)); break; case ABOS: spaltenTitel = DatenAbo.COLUMN_NAMES; maxSpalten = DatenAbo.MAX_ELEM; spaltenAnzeigen = getSpaltenEinAus(DatenAbo.spaltenAnzeigen, DatenAbo.MAX_ELEM); indexSpalte = DatenAbo.ABO_NR; nrDatenSystem = MVConfig.Configs.SYSTEM_EIGENSCHAFTEN_TABELLE_ABOS; iconAnzeigenStr = MVConfig.Configs.SYSTEM_TAB_ABO_ICON_ANZEIGEN; iconKleinStr = MVConfig.Configs.SYSTEM_TAB_ABO_ICON_KLEIN; this.setModel(new TModelAbo(new Object[][]{}, spaltenTitel)); this.getTableHeader().addMouseListener(new WidthAdjuster(this)); break; case PSET: spaltenTitel = DatenPset.COLUMN_NAMES; maxSpalten = DatenPset.MAX_ELEM; spaltenAnzeigen = getSpaltenEinAus(DatenPset.spaltenAnzeigen, DatenPset.MAX_ELEM); indexSpalte = 0; nrDatenSystem = null; this.setModel(new TModel(new Object[][]{}, spaltenTitel)); this.setRowSorter(null); this.setAutoCreateRowSorter(false); // Reihenfolge ist die Anzeige der Button! this.getTableHeader().addMouseListener(new WidthAdjuster(this)); break; case PROG: spaltenTitel = DatenProg.COLUMN_NAMES; maxSpalten = DatenProg.MAX_ELEM; spaltenAnzeigen = getSpaltenEinAus(DatenProg.spaltenAnzeigen, DatenProg.MAX_ELEM); indexSpalte = 0; nrDatenSystem = null; this.setModel(new TModel(new Object[][]{}, spaltenTitel)); this.getTableHeader().addMouseListener(new WidthAdjuster(this)); break; case MEDIA_DB: spaltenTitel = DatenMediaDB.COLUMN_NAMES; maxSpalten = DatenMediaDB.MAX_ELEM; spaltenAnzeigen = getSpaltenEinAus(new boolean[DatenMediaDB.MAX_ELEM], DatenMediaDB.MAX_ELEM); indexSpalte = 0; nrDatenSystem = MVConfig.Configs.SYSTEM_EIGENSCHAFTEN_TABELLE_MEDIA_DB; this.setModel(new TModel(new Object[][]{}, spaltenTitel)); this.getTableHeader().addMouseListener(new WidthAdjuster(this)); break; } breite = getArray(maxSpalten); reihe = getArray(maxSpalten); if (iconAnzeigenStr != null) { iconAnzeigen = Boolean.parseBoolean(MVConfig.get(iconAnzeigenStr)); } if (iconKleinStr != null) { iconKlein = Boolean.parseBoolean(MVConfig.get(iconKleinStr)); } setHeight(); Listener.addListener(new Listener(Listener.EREIGNIS_FONT, MVTable.class.getSimpleName()) { @Override public void ping() { setHeight(); } }); } public void setLineBreak(boolean lb) { lineBreak = lb; } public void invertSelection() { ListSelectionModel mdl = getSelectionModel(); int[] selected = getSelectedRows(); mdl.setValueIsAdjusting(true); mdl.setSelectionInterval(0, getRowCount() - 1); for (int i : selected) { mdl.removeSelectionInterval(i, i); } mdl.setValueIsAdjusting(false); } @SuppressWarnings("fallthrough") public void setHeight() { int sizeArea = 0; int size; switch (tabelle) { case FILME: if (spaltenAnzeigen[DatenFilm.FILM_BESCHREIBUNG]) { sizeArea = MVFont.fontSize * 5; } else if (lineBreak) { sizeArea = MVFont.fontSize * 4; } case DOWNLOADS: case ABOS: if (lineBreak) { sizeArea = MVFont.fontSize * 4; } } if (!iconAnzeigen) { if (MVFont.fontSize < 15) { size = 18; } else { size = MVFont.fontSize + MVFont.fontSize / 3; } } else if (iconKlein) { if (MVFont.fontSize < 18) { size = 20; } else { size = MVFont.fontSize + MVFont.fontSize / 3; } } else if (MVFont.fontSize < 30) { size = 36; } else { size = MVFont.fontSize + MVFont.fontSize / 3; } setRowHeight(size > sizeArea ? size : sizeArea); } public void reorder(int index, int[] rowFrom) { getSelected(); TModel tModel = (TModelDownload) getModel(); // listeDownloads neu nach der Reihenfolge in der Tabelle erstellen for (int i = 0; i < this.getRowCount(); ++i) { DatenDownload d = ((DatenDownload) tModel.getValueAt(this.convertRowIndexToModel(i), DatenDownload.DOWNLOAD_REF)); if (d != null) { daten.getListeDownloads().remove(d); daten.getListeDownloads().add(d); } } // Downloads zum Verschieben suchen LinkedList<DatenDownload> liste = new LinkedList<>(); for (int row : rowFrom) { if (index > row) { --index; } DatenDownload d = ((DatenDownload) tModel.getValueAt(this.convertRowIndexToModel(row), DatenDownload.DOWNLOAD_REF)); liste.add(d); daten.getListeDownloads().remove(d); } // an der richtigen Stellei einfügen daten.getListeDownloads().addAll(index, liste); // die Tabellensortierung löschen, die wird jetzt mit der Liste wieder gefüllt this.getRowSorter().setSortKeys(null); this.setRowSorter(null); this.setAutoCreateRowSorter(true); setSelected(); Listener.notify(Listener.EREIGNIS_REIHENFOLGE_DOWNLOAD, MVTable.class.getSimpleName()); } public void initTabelle() { // Tabelle das erste Mal initialisieren, // mit den gespeicherten Daten oder // den Standardwerten // erst die Breite, dann die Reihenfolge try { if (nrDatenSystem == null) { // wird nur für eingerichtete Tabellen gemacht return; } String b = "", r = "", s = "", upDown = ""; boolean ok = false; if (!MVConfig.get(nrDatenSystem).isEmpty()) { ok = true; int f1, f2, f3; //String d = Daten.system[nrDatenSystem]; if ((f1 = MVConfig.get(nrDatenSystem).indexOf(FELDTRENNER)) != -1) { b = MVConfig.get(nrDatenSystem).substring(0, f1); if ((f2 = MVConfig.get(nrDatenSystem).indexOf(FELDTRENNER, f1 + 1)) != -1) { r = MVConfig.get(nrDatenSystem).substring(f1 + 1, f2); } if ((f3 = MVConfig.get(nrDatenSystem).indexOf(FELDTRENNER, f2 + 1)) != -1) { s = MVConfig.get(nrDatenSystem).substring(f2 + 1, f3); upDown = MVConfig.get(nrDatenSystem).substring(f3 + 1); } } if (!arrLesen(b, breite)) { ok = false; } if (!arrLesen(r, reihe)) { ok = false; } SortKey sk = sortKeyLesen(s, upDown); if (sk != null) { LinkedList<SortKey> listSortKeys_ = new LinkedList<>(); listSortKeys_.add(sk); this.getRowSorter().setSortKeys(listSortKeys_); } } if (ok) { setSpaltenEinAus(breite, spaltenAnzeigen); setSpalten(); setHeight(); } else { resetTabelle(); } } catch (Exception ex) { //vorsichtshalber } } private boolean anzeigen(int i, boolean[] spaltenAnzeigen) { return spaltenAnzeigen[i]; } private void setSpaltenEinAus(int[] nr, boolean[] spaltenAnzeigen) { for (int i = 0; i < spaltenAnzeigen.length; ++i) { spaltenAnzeigen[i] = nr[i] > 0; } } private boolean[] getSpaltenEinAus(boolean[] spaltenAnzeigen, int MAX_ELEM) { for (int i = 0; i < MAX_ELEM; ++i) { spaltenAnzeigen[i] = true; } return spaltenAnzeigen; } public void fireTableDataChanged(boolean setSpalten) { if (setSpalten) { getSelected(); } ((TModel) this.getModel()).fireTableDataChanged(); if (setSpalten) { setSelected(); } } public void requestFocusSelelct(JScrollPane jScrollPane) { requestFocus(); if (getRowCount() > 0) { // sonst ist schon eine Zeile markiert if (getSelectedRow() == -1) { setRowSelectionInterval(0, 0); } int firstSelectedRow = getSelectedRow(); Rectangle cellLocation = getCellRect(firstSelectedRow, 0, false); jScrollPane.getVerticalScrollBar().setValue(cellLocation.y); } } public void requestFocusSelelct(JScrollPane jScrollPane, int zeile) { requestFocus(); if (getRowCount() > 0) { // sonst ist schon eine Zeile markiert setRowSelectionInterval(zeile, zeile); int firstSelectedRow = getSelectedRow(); Rectangle cellLocation = getCellRect(firstSelectedRow, 0, false); jScrollPane.getVerticalScrollBar().setValue(cellLocation.y); } } public void setSelRow(int i) { // Sel auf zeile i in der TABELLE! (nicht Modell) setzten oder erste-letzt Zeile if (getRowCount() > 0) { if (i < 0) { i = 0; } if (i >= getRowCount()) { i = getRowCount() - 1; } setRowSelectionInterval(i, i); scrollToSelection(i); } } public void scrollToSelection() { if (getRowCount() > 0) { int i = getSelectedRow(); if (i < 0) { i = 0; setRowSelectionInterval(i, i); } if (i >= getRowCount()) { i = getRowCount() - 1; } scrollToSelection(i); } } private void scrollToSelection(int rowIndex) { if (!(getParent() instanceof JViewport)) { return; } JViewport viewport = (JViewport) getParent(); Rectangle rect = getCellRect(rowIndex, 0, true); Rectangle viewRect = viewport.getViewRect(); rect.setLocation(rect.x - viewRect.x, rect.y - viewRect.y); int centerX = (viewRect.width - rect.width) / 2; int centerY = (viewRect.height - rect.height) / 2; if (rect.x < centerX) { centerX = -centerX; } if (rect.y < centerY) { centerY = -centerY; } rect.translate(centerX, centerY); viewport.scrollRectToVisible(rect); } public void getSelected() { // Einstellungen der Tabelle merken selRow = this.getSelectedRow(); selRows = this.getSelectedRows(); switch (tabelle) { case DOWNLOADS: case FILME: case ABOS: int selIndex = -1; if (selRow >= 0) { selIndex = (Integer) this.getModel().getValueAt(this.convertRowIndexToModel(selRow), indexSpalte); } else { selIndex = -1; } if (selIndex >= 0) { selIndexes = new int[selRows.length]; int k = 0; for (int i : selRows) { selIndexes[k++] = (Integer) this.getModel().getValueAt(this.convertRowIndexToModel(i), indexSpalte); } } else { selIndexes = null; } break; case MEDIA_DB: break; default: if (selRows != null) { if (selRows.length > 0) { String[] indexWertSelection = new String[selRows.length]; for (int i = 0; i < selRows.length; ++i) { indexWertSelection[i] = this.getModel().getValueAt(this.convertRowIndexToModel(selRows[i]), indexSpalte).toString(); } } } break; } } private void setSelected() { // gemerkte Einstellungen der Tabelle wieder setzten boolean found = false; switch (tabelle) { case DOWNLOADS: case FILME: case ABOS: if (selIndexes != null) { int r; this.selectionModel.setValueIsAdjusting(true); TModel tModel = (TModel) this.getModel(); for (int i : selIndexes) { r = tModel.getIdxRow(i); if (r >= 0) { // ansonsten gibts die Zeile nicht mehr r = this.convertRowIndexToView(r); this.addRowSelectionInterval(r, r); found = true; } } if (!found && selRow >= 0 && this.getRowCount() > selRow) { // große Frage was da besser ist??? for (int i = selRow; i >= 0; --i) { this.setRowSelectionInterval(i, i); break; } } else if (!found && selRow >= 0 && this.getRowCount() > 0) { this.setRowSelectionInterval(tModel.getRowCount() - 1, tModel.getRowCount() - 1); } this.selectionModel.setValueIsAdjusting(false); } selIndexes = null; break; case MEDIA_DB: break; default: if (selRows != null) { if (selRows.length > 0) { this.selectionModel.setValueIsAdjusting(true); for (int selectedRow : selRows) { if (selectedRow < this.getRowCount()) { this.addRowSelectionInterval(selectedRow, selectedRow); } } this.selectionModel.setValueIsAdjusting(false); } } break; } } public void spaltenEinAus() { getSpalten(); // die aktuelle Breite holen for (int i = 0; i < breite.length && i < this.getColumnCount(); ++i) { if (!anzeigen(i, spaltenAnzeigen)) { // geänderte Ansicht der Spalten abfragen breite[i] = 0; } else if (breite[i] == 0) { breite[i] = 100; // damit sie auch zu sehen ist :) } } for (int i = 0; i < breite.length && i < this.getColumnCount(); ++i) { if (breite[i] == 0) { this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMinWidth(0); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setPreferredWidth(0); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMaxWidth(0); } else { this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMinWidth(10); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMaxWidth(3000); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setPreferredWidth(breite[i]); } } this.validate(); } public void getSpalten() { // Einstellungen der Tabelle merken getSelected(); for (int i = 0; i < reihe.length && i < this.getModel().getColumnCount(); ++i) { reihe[i] = this.convertColumnIndexToModel(i); } for (int i = 0; i < breite.length && i < this.getModel().getColumnCount(); ++i) { breite[i] = getColumnModel().getColumn( this.convertColumnIndexToView(i)).getWidth(); } if (this.getRowSorter() != null) { listeSortKeys = this.getRowSorter().getSortKeys(); } else { listeSortKeys = null; } } public void setSpalten() { // gemerkte Einstellungen der Tabelle wieder setzten // setSelected(); try { for (int i = 0; i < breite.length && i < this.getColumnCount(); ++i) { if (!anzeigen(i, spaltenAnzeigen)) { // geänderte Ansicht der Spalten abfragen breite[i] = 0; } else if (breite[i] == 0) { breite[i] = 100; // damit sie auch zu sehen ist :) } } for (int i = 0; i < breite.length && i < this.getColumnCount(); ++i) { if (breite[i] == 0) { this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMinWidth(0); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setPreferredWidth(0); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMaxWidth(0); } else { this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMinWidth(10); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setMaxWidth(3000); this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).setPreferredWidth(breite[i]); } } for (int i = 0; i < reihe.length && i < this.getColumnCount(); ++i) { this.getColumnModel().moveColumn(this.convertColumnIndexToView(reihe[i]), i); } if (listeSortKeys != null) { if (!listeSortKeys.isEmpty()) { this.getRowSorter().setSortKeys(listeSortKeys); } } setSelected(); this.validate(); } catch (Exception ex) { Log.errorLog(965001463, ex); } } private void resetFilmeTab(int i) { reihe[i] = i; breite[i] = 200; switch (i) { case DatenFilm.FILM_NR: breite[i] = 75; break; case DatenFilm.FILM_TITEL: breite[i] = 300; break; case DatenFilm.FILM_BESCHREIBUNG: breite[i] = 400; break; case DatenFilm.FILM_DATUM: case DatenFilm.FILM_ZEIT: case DatenFilm.FILM_SENDER: case DatenFilm.FILM_GROESSE: case DatenFilm.FILM_DAUER: case DatenFilm.FILM_GEO: breite[i] = 100; break; case DatenFilm.FILM_URL: breite[i] = 500; break; case DatenFilm.FILM_ABSPIELEN: case DatenFilm.FILM_AUFZEICHNEN: case DatenFilm.FILM_HD: case DatenFilm.FILM_UT: breite[i] = 50; break; default: break; } } private void resetDownloadsTab(int i) { reihe[i] = i; breite[i] = 200; switch (i) { case DatenDownload.DOWNLOAD_NR: case DatenDownload.DOWNLOAD_FILM_NR: breite[i] = 75; break; case DatenDownload.DOWNLOAD_BUTTON_START: case DatenDownload.DOWNLOAD_BUTTON_DEL: case DatenDownload.DOWNLOAD_PROGRAMM_RESTART: case DatenDownload.DOWNLOAD_PROGRAMM_DOWNLOADMANAGER: case DatenDownload.DOWNLOAD_UNTERBROCHEN: case DatenDownload.DOWNLOAD_SPOTLIGHT: case DatenDownload.DOWNLOAD_SUBTITLE: case DatenDownload.DOWNLOAD_INFODATEI: case DatenDownload.DOWNLOAD_HD: case DatenDownload.DOWNLOAD_UT: breite[i] = 50; break; case DatenDownload.DOWNLOAD_TITEL: breite[i] = 250; break; case DatenDownload.DOWNLOAD_ABO: case DatenDownload.DOWNLOAD_THEMA: breite[i] = 150; break; case DatenDownload.DOWNLOAD_DATUM: case DatenDownload.DOWNLOAD_ZEIT: case DatenDownload.DOWNLOAD_GROESSE: case DatenDownload.DOWNLOAD_BANDBREITE: case DatenDownload.DOWNLOAD_SENDER: case DatenDownload.DOWNLOAD_PROGRESS: case DatenDownload.DOWNLOAD_RESTZEIT: case DatenDownload.DOWNLOAD_DAUER: case DatenDownload.DOWNLOAD_GEO: breite[i] = 100; break; default: break; } } private void resetAbosTab(int i) { reihe[i] = i; breite[i] = 200; if (i == DatenAbo.ABO_NR || i == DatenAbo.ABO_EINGESCHALTET || i == DatenAbo.ABO_MIN) { breite[i] = 75; } else if (i == DatenAbo.ABO_DOWN_DATUM || i == DatenAbo.ABO_SENDER) { breite[i] = 100; } } public void resetTabelle() { // Standardwerte wetzen for (int i = 0; i < maxSpalten; ++i) { switch (tabelle) { case FILME: resetFilmeTab(i); break; case DOWNLOADS: resetDownloadsTab(i); break; case ABOS: resetAbosTab(i); break; case MEDIA_DB: reihe[i] = i; breite[i] = 200; break; } } listeSortKeys = null; this.getRowSorter().setSortKeys(null); this.setRowSorter(null); this.setAutoCreateRowSorter(true); spaltenAusschalten(); setSpaltenEinAus(breite, spaltenAnzeigen); setSpalten(); setHeight(); } private void spaltenAusschaltenFilme(int i) { if (i == DatenFilm.FILM_BESCHREIBUNG || i == DatenFilm.FILM_WEBSEITE || i == DatenFilm.FILM_NEU || i == DatenFilm.FILM_URL_RTMP || i == DatenFilm.FILM_URL_AUTH || i == DatenFilm.FILM_URL_HD || i == DatenFilm.FILM_URL_RTMP_HD || i == DatenFilm.FILM_URL_KLEIN || i == DatenFilm.FILM_URL_RTMP_KLEIN || i == DatenFilm.FILM_DATUM_LONG || i == DatenFilm.FILM_URL_HISTORY || i == DatenFilm.FILM_URL_SUBTITLE || i == DatenFilm.FILM_REF) { breite[i] = 0; } } private void spaltenAusschaltenDownloads(int i) { if (i == DatenDownload.DOWNLOAD_FILM_URL || i == DatenDownload.DOWNLOAD_URL_RTMP || i == DatenDownload.DOWNLOAD_URL_SUBTITLE || i == DatenDownload.DOWNLOAD_PROGRAMM || i == DatenDownload.DOWNLOAD_PROGRAMM_AUFRUF || i == DatenDownload.DOWNLOAD_PROGRAMM_AUFRUF_ARRAY || i == DatenDownload.DOWNLOAD_PROGRAMM_RESTART || i == DatenDownload.DOWNLOAD_PROGRAMM_DOWNLOADMANAGER || i == DatenDownload.DOWNLOAD_ZIEL_DATEINAME || i == DatenDownload.DOWNLOAD_ZIEL_PFAD || i == DatenDownload.DOWNLOAD_ART || i == DatenDownload.DOWNLOAD_QUELLE || i == DatenDownload.DOWNLOAD_ZURUECKGESTELLT || i == DatenDownload.DOWNLOAD_HISTORY_URL || i == DatenDownload.DOWNLOAD_REF || i == DatenDownload.DOWNLOAD_SPOTLIGHT || i == DatenDownload.DOWNLOAD_INFODATEI || i == DatenDownload.DOWNLOAD_SUBTITLE || i == DatenDownload.DOWNLOAD_UNTERBROCHEN) { breite[i] = 0; } } private void spaltenAusschaltenAbos(int i) { if (i == DatenAbo.ABO_ZIELPFAD || i == DatenAbo.ABO_PSET || i == DatenAbo.ABO_MINDESTDAUER || i == DatenAbo.ABO_MIN || i == DatenAbo.ABO_DOWN_DATUM) { breite[i] = 0; } } private void spaltenAusschalten() { for (int i = 0; i < maxSpalten; ++i) { switch (tabelle) { case FILME: spaltenAusschaltenFilme(i); break; case DOWNLOADS: spaltenAusschaltenDownloads(i); break; case ABOS: spaltenAusschaltenAbos(i); break; case STANDARD: break; } } } public void tabelleNachDatenSchreiben() { if (tabelle == TableType.STANDARD) { // wird nur für eingerichtet Tabellen gemacht return; } // Tabellendaten ind die Daten.system schreiben // erst die Breite, dann die Reihenfolge String b, r, s = "", upDown = ""; int reihe_[] = new int[maxSpalten]; int breite_[] = new int[maxSpalten]; for (int i = 0; i < reihe_.length && i < this.getModel().getColumnCount(); ++i) { reihe_[i] = this.convertColumnIndexToModel(i); } for (int i = 0; i < breite_.length && i < this.getModel().getColumnCount(); ++i) { breite_[i] = this.getColumnModel().getColumn(this.convertColumnIndexToView(i)).getWidth(); } b = Integer.toString(breite_[0]); r = Integer.toString(reihe_[0]); for (int i = 1; i < breite.length; i++) { b = b + ',' + Integer.toString(breite_[i]); r = r + ',' + Integer.toString(reihe_[i]); } listeSortKeys = this.getRowSorter().getSortKeys(); if (listeSortKeys != null) { if (!listeSortKeys.isEmpty()) { SortKey sk = listeSortKeys.get(0); s = String.valueOf(sk.getColumn()); upDown = sk.getSortOrder().equals(SortOrder.ASCENDING) ? SORT_ASCENDING : SORT_DESCENDING; } } MVConfig.add(nrDatenSystem, b + FELDTRENNER + r + FELDTRENNER + s + FELDTRENNER + upDown); if (iconAnzeigenStr != null) { MVConfig.add(iconAnzeigenStr, String.valueOf(iconAnzeigen)); } if (iconKleinStr != null) { MVConfig.add(iconKleinStr, String.valueOf(iconKlein)); } } private int[] getArray(int anzahl) { int[] arr = new int[anzahl]; for (int i = 0; i < arr.length; ++i) { arr[i] = -1; } return arr; } private boolean arrLesen(String s, int[] arr) { String sub; if (maxSpalten != countString(s)) { // dann hat sich die Anzahl der Spalten der Tabelle geändert: Versionswechsel return false; } else { for (int i = 0; i < maxSpalten; i++) { if (!s.isEmpty()) { if (s.contains(",")) { sub = s.substring(0, s.indexOf(',')); s = s.replaceFirst(sub + ',', ""); } else { sub = s; s = ""; } try { arr[i] = Integer.parseInt(sub); } catch (Exception ex) { return false; } } } } return true; } public static SortKey sortKeyLesen(String s, String upDown) { SortKey sk; int sp; try { sp = Integer.parseInt(s); if (upDown.equals(SORT_DESCENDING)) { sk = new SortKey(sp, SortOrder.DESCENDING); } else { sk = new SortKey(sp, SortOrder.ASCENDING); } } catch (Exception ex) { return null; } return sk; } private int countString(String s) { int ret = 0; for (int i = 0; i < s.length(); ++i) { if (s.charAt(i) == ',') { ++ret; } } return ++ret; } private class TableRowTransferHandlerDownload extends TransferHandler { //private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, DataFlavor.javaJVMLocalObjectMimeType, "Integer Row Index"); private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class, "Integer Row Index"); private JTable table = null; private int[] transferedRows = null; public TableRowTransferHandlerDownload(JTable table) { this.table = table; } @Override protected Transferable createTransferable(JComponent c) { assert (c.equals(table)); transferedRows = table.getSelectedRows(); return new DataHandler(table.getSelectedRow(), localObjectFlavor.getMimeType()); } @Override public boolean canImport(TransferHandler.TransferSupport info) { try { boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor); table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop); return b; // here's the problem // canImport is called during drags AND before drop is accepted } catch (Exception e) { e.printStackTrace(); } return true; } @Override public int getSourceActions(JComponent c) { return TransferHandler.COPY_OR_MOVE; } @Override public boolean importData(TransferHandler.TransferSupport info) { try { JTable target = (JTable) info.getComponent(); JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation(); int index = dl.getRow(); TModel tModel = (TModel) table.getModel(); int max = tModel.getRowCount(); if (index < 0 || index > max) { index = max; } target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); if (transferedRows != null) { reorder(index, transferedRows); transferedRows = null; return true; } } catch (Exception ex) { ex.printStackTrace(); } return false; } @Override protected void exportDone(JComponent c, Transferable t, int act) { if (act == TransferHandler.MOVE) { table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } } public class WidthAdjuster extends MouseAdapter { private List<? extends RowSorter.SortKey> listeSortKeys = null; private final JTable table; private static final int EPSILON = 5; //boundary sensitivity private final Cursor EAST = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); private final Cursor WEST = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR); public WidthAdjuster(final JTable table) { this.table = table; } @Override public void mousePressed(final MouseEvent evt) { //int c = getLeftColumn(evt.getPoint()); if (evt.getClickCount() == 1) { if (table.getRowSorter() != null) { listeSortKeys = table.getRowSorter().getSortKeys(); } else { listeSortKeys = null; } } if (evt.getClickCount() > 1 && usingResizeCursor()) { resize(getLeftColumn(evt.getPoint())); } } private JTableHeader getTableHeader() { return table.getTableHeader(); } private boolean usingResizeCursor() { Cursor cursor = getTableHeader().getCursor(); return cursor.equals(EAST) || cursor.equals(WEST); } //if near the boundary, will choose left column private int getLeftColumn(final Point pt) { pt.x -= EPSILON; return getTableHeader().columnAtPoint(pt); } private void resize(final int col) { TableColumnModel tcm = table.getColumnModel(); TableColumn tc = tcm.getColumn(col); TableCellRenderer tcr = tc.getHeaderRenderer(); if (tcr == null) { tcr = table.getTableHeader().getDefaultRenderer(); } Object obj = tc.getHeaderValue(); Component comp = tcr.getTableCellRendererComponent(table, obj, false, false, 0, 0); int maxWidth = comp.getPreferredSize().width; for (int i = 0, ub = table.getRowCount(); i != ub; ++i) { tcr = table.getCellRenderer(i, col); obj = table.getValueAt(i, col); comp = tcr.getTableCellRendererComponent(table, obj, false, false, i, col); int w = comp.getPreferredSize().width; if (w > maxWidth) { maxWidth = w; } } maxWidth += 10; //and room to grow... tc.setPreferredWidth(maxWidth); //remembers the value tc.setWidth(maxWidth); //forces layout, repaint if (listeSortKeys != null) { if (!listeSortKeys.isEmpty()) { table.getRowSorter().setSortKeys(listeSortKeys); } } } } }