/*
* 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 mSearch.tool.Datum;
import mSearch.tool.Listener;
import mediathek.MediathekGui;
import mediathek.config.Daten;
import mediathek.config.Icons;
import mediathek.config.MVConfig;
import mediathek.daten.DatenAbo;
import mediathek.gui.dialog.DialogEditAbo;
import mediathek.tool.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
@SuppressWarnings("serial")
public class GuiAbo extends PanelVorlage {
private final ToolBar toolBar;
public GuiAbo(Daten d, JFrame parentComponent) {
super(d, parentComponent);
initComponents();
tabelle = new MVTable(MVTable.TableType.ABOS);
jScrollPane1.setViewportView(tabelle);
initBeobachter();
tabelleLaden();
tabelle.initTabelle();
if (tabelle.getRowCount() > 0) {
tabelle.setRowSelectionInterval(0, 0);
}
toolBar = new ToolBar(daten, MediathekGui.TABS.TAB_ABOS);
jPanelToolBar.setLayout(new BorderLayout());
jPanelToolBar.add(toolBar, BorderLayout.CENTER);
setToolbarVisible();
}
//===================================
//public
//===================================
@Override
public void isShown() {
super.isShown();
if (!solo) {
daten.getMediathekGui().getStatusBar().setIndexForLeftDisplay(MVStatusBar.StatusbarIndex.ABO);
}
}
public void aendern() {
aboAendern();
}
public void einAus(boolean ein) {
aboEinAus(ein);
}
public void loeschen() {
aboLoeschen();
}
public void neu() {
aboNeu();
}
public void invertSelection() {
tabelle.invertSelection();
}
//===================================
//private
//===================================
private void setToolbarVisible() {
toolBar.setVisible(Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_TOOLBAR_ALLES_ANZEIGEN)));
}
private void initBeobachter() {
Listener.addListener(new Listener(Listener.EREIGNIS_TOOLBAR_VIS, GuiAbo.class.getSimpleName()) {
@Override
public void ping() {
setToolbarVisible();
}
});
Listener.addListener(new Listener(Listener.EREIGNIS_LISTE_ABOS, GuiAbo.class.getSimpleName()) {
@Override
public void ping() {
tabelleLaden();
}
});
tabelle.addMouseListener(new BeobMausTabelle1());
tabelle.setDefaultRenderer(Object.class, new CellRendererAbo());
tabelle.setDefaultRenderer(Datum.class, new CellRendererAbo());
tabelle.setDefaultRenderer(Integer.class, new CellRendererAbo());
tabelle.setModel(new TModelAbo(new Object[][]{}, DatenAbo.COLUMN_NAMES));
tabelle.lineBreak = MVConfig.getBool(MVConfig.Configs.SYSTEM_TAB_ABO_LINEBREAK);
tabelle.getTableHeader().addMouseListener(new BeobTableHeader(tabelle, DatenAbo.COLUMN_NAMES, DatenAbo.spaltenAnzeigen,
new int[]{DatenAbo.ABO_EINGESCHALTET},
new int[]{},
true /*Icon*/, MVConfig.Configs.SYSTEM_TAB_ABO_LINEBREAK));
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);
}
});
//aendern
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) {
aendern();
}
});
//löschen
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "loeschen");
am.put("loeschen", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
aboLoeschen();
}
});
//Filter
final String[] sender = GuiFunktionen.addLeerListe(daten.getFilmeLaden().getSenderNamen());
jcbSender.setModel(new javax.swing.DefaultComboBoxModel<>(sender));
jcbSender.addActionListener(l -> tabelleLaden());
jSplitPane1.setDividerLocation(MVConfig.getInt(MVConfig.Configs.SYSTEM_PANEL_ABO_DIVIDER));
jSplitPane1.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, pce -> {
if (jScrollPaneFilter.isVisible()) {
MVConfig.add(MVConfig.Configs.SYSTEM_PANEL_ABO_DIVIDER, String.valueOf(jSplitPane1.getDividerLocation()));
}
});
jScrollPaneFilter.setVisible(MVConfig.getBool(MVConfig.Configs.SYSTEM_TAB_ABO_FILTER_VIS));
Listener.addListener(new Listener(Listener.EREIGNIS_PANEL_ABO_FILTER_ANZEIGEN, GuiAbo.class.getSimpleName()) {
@Override
public void ping() {
setFilter();
}
});
}
private void setFilter() {
// Panel anzeigen und die Filmliste anpassen
jScrollPaneFilter.setVisible(MVConfig.getBool(MVConfig.Configs.SYSTEM_TAB_ABO_FILTER_VIS));
if (jScrollPaneFilter.isVisible()) {
jSplitPane1.setDividerLocation(MVConfig.getInt(MVConfig.Configs.SYSTEM_PANEL_ABO_DIVIDER));
}
updateUI();
}
private void tabelleLaden() {
tabelle.getSpalten();
daten.getListeAbo().addObjectData((TModelAbo) tabelle.getModel(), jcbSender.getSelectedItem().toString());
tabelle.setSpalten();
setInfo();
}
private void aboLoeschen() {
int rows[] = tabelle.getSelectedRows();
if (rows.length > 0) {
String text;
if (rows.length == 1) {
int delRow = tabelle.convertRowIndexToModel(rows[0]);
text = '"' + tabelle.getModel().getValueAt(delRow, DatenAbo.ABO_NAME).toString() + "\" löschen?";
} else {
text = rows.length + " Abos löschen?";
}
int ret = JOptionPane.showConfirmDialog(parentComponent, text, "Löschen?", JOptionPane.YES_NO_OPTION);
if (ret == JOptionPane.OK_OPTION) {
for (int i = rows.length - 1; i >= 0; --i) {
int delRow = tabelle.convertRowIndexToModel(rows[i]);
((TModelAbo) tabelle.getModel()).removeRow(delRow);
daten.getListeAbo().remove(delRow);
}
}
tabelleLaden();
zeileMarkieren(0);
daten.getListeAbo().aenderungMelden();
} else {
new HinweisKeineAuswahl().zeigen(parentComponent);
}
}
private void zeileMarkieren(int row) {
if (tabelle.getRowCount() > 0) {
// sonst ist schon eine Zeile markiert
if (tabelle.getSelectedRow() == -1) {
tabelle.requestFocus();
tabelle.setRowSelectionInterval(row, row);
}
}
}
// private void aboAendern() {
// if (tabelle.getSelectedRowCount() == 1) {
// int modelRow = tabelle.convertRowIndexToModel(row);
// DatenAbo akt = daten.getListeAbo().getAboNr(modelRow);
// DialogEditAbo dialog = new DialogEditAbo(daten.getMediathekGui(), true, daten, akt, false /*onlyOne*/);
// dialog.setVisible(true);
// if (dialog.ok) {
// tabelleLaden();
// daten.getListeAbo().aenderungMelden();
// }
// setInfo();
// } else {
// new HinweisKeineAuswahl().zeigen(parentComponent);
// }
// }
private void aboAendern() {
// nichts selektiert
if (tabelle.getSelectedRowCount() == 0) {
new HinweisKeineAuswahl().zeigen(parentComponent);
return;
}
int[] rows = tabelle.getSelectedRows();
int modelRow = tabelle.convertRowIndexToModel(tabelle.getSelectedRow());
DatenAbo akt = daten.getListeAbo().getAboNr(modelRow);
DialogEditAbo dialog = new DialogEditAbo(daten.getMediathekGui(), true, daten, akt, tabelle.getSelectedRowCount() > 1 /*onlyOne*/);
dialog.setVisible(true);
if (!dialog.ok) {
return;
}
if (tabelle.getSelectedRowCount() > 1) {
// bei mehreren selektierten Zeilen
for (int row : rows) {
for (int b = 0; b < dialog.ch.length; ++b) {
if (!dialog.ch[b]) {
continue;
}
modelRow = tabelle.convertRowIndexToModel(row);
DatenAbo sel = daten.getListeAbo().getAboNr(modelRow);
sel.arr[b] = akt.arr[b];
if (b == DatenAbo.ABO_MINDESTDAUER) {
sel.setMindestDauerMinuten();
}
if (b == DatenAbo.ABO_MIN) {
sel.min = Boolean.parseBoolean(sel.arr[DatenAbo.ABO_MIN]);
}
}
}
}
tabelleLaden();
daten.getListeAbo().aenderungMelden();
setInfo();
}
private void aboNeu() {
daten.getListeAbo().addAbo("Neu" /*Abonamer*/);
}
private void aboEinAus(boolean ein) {
final int[] rows = tabelle.getSelectedRows();
if (rows.length > 0) {
for (int row : rows) {
int modelRow = tabelle.convertRowIndexToModel(row);
DatenAbo akt = daten.getListeAbo().getAboNr(modelRow);
akt.arr[DatenAbo.ABO_EINGESCHALTET] = String.valueOf(ein);
}
tabelleLaden();
tabelle.clearSelection();
tabelle.requestFocus();
for (int row : rows) {
tabelle.addRowSelectionInterval(row, row);
}
setInfo();
daten.getListeAbo().aenderungMelden();
} else {
new HinweisKeineAuswahl().zeigen(parentComponent);
}
}
private void setInfo() {
// Infopanel setzen
daten.getMediathekGui().getStatusBar().setTextForLeftDisplay();
}
/**
* 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() {
jPanelToolBar = new javax.swing.JPanel();
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
javax.swing.JTable jTable1 = new javax.swing.JTable();
jScrollPaneFilter = new javax.swing.JScrollPane();
javax.swing.JPanel jPanelFilter = new javax.swing.JPanel();
javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
jcbSender = new javax.swing.JComboBox<>();
javax.swing.GroupLayout jPanelToolBarLayout = new javax.swing.GroupLayout(jPanelToolBar);
jPanelToolBar.setLayout(jPanelToolBarLayout);
jPanelToolBarLayout.setHorizontalGroup(
jPanelToolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 758, Short.MAX_VALUE)
);
jPanelToolBarLayout.setVerticalGroup(
jPanelToolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 13, Short.MAX_VALUE)
);
jSplitPane1.setDividerLocation(200);
jTable1.setAutoCreateRowSorter(true);
jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
jScrollPane1.setViewportView(jTable1);
jSplitPane1.setRightComponent(jScrollPane1);
jLabel1.setText("Abos für Sender:");
jcbSender.setMaximumRowCount(25);
jcbSender.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
javax.swing.GroupLayout jPanelFilterLayout = new javax.swing.GroupLayout(jPanelFilter);
jPanelFilter.setLayout(jPanelFilterLayout);
jPanelFilterLayout.setHorizontalGroup(
jPanelFilterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelFilterLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelFilterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jcbSender, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanelFilterLayout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(0, 57, Short.MAX_VALUE)))
.addContainerGap())
);
jPanelFilterLayout.setVerticalGroup(
jPanelFilterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelFilterLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jcbSender, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(363, Short.MAX_VALUE))
);
jScrollPaneFilter.setViewportView(jPanelFilter);
jSplitPane1.setLeftComponent(jScrollPaneFilter);
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)
.addGroup(layout.createSequentialGroup()
.addComponent(jSplitPane1)
.addContainerGap())
);
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)
.addGap(18, 18, 18)
.addComponent(jSplitPane1)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel jPanelToolBar;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPaneFilter;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JComboBox<String> jcbSender;
// End of variables declaration//GEN-END:variables
private class BeobMausTabelle1 extends MouseAdapter {
private Point p;
@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) {
aboAendern();
}
}
}
@Override
public void mousePressed(MouseEvent arg0) {
if (arg0.isPopupTrigger()) {
showMenu(arg0);
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
if (arg0.isPopupTrigger()) {
showMenu(arg0);
}
}
private void buttonTable(int row, int column) {
if (row != -1) {
if (tabelle.convertColumnIndexToModel(column) == DatenAbo.ABO_EINGESCHALTET) {
DatenAbo akt = daten.getListeAbo().getAboNr(tabelle.convertRowIndexToModel(row));
akt.arr[DatenAbo.ABO_EINGESCHALTET] = Boolean.toString(!Boolean.parseBoolean(akt.arr[DatenAbo.ABO_EINGESCHALTET]));
tabelle.getSpalten();
tabelleLaden();
tabelle.setSpalten();
setInfo();
daten.getListeAbo().aenderungMelden();
}
}
}
private void showMenu(MouseEvent evt) {
boolean ein = true;
p = evt.getPoint();
int nr = tabelle.rowAtPoint(p);
if (nr >= 0) {
tabelle.setRowSelectionInterval(nr, nr);
int modelRow = tabelle.convertRowIndexToModel(nr);
DatenAbo akt = daten.getListeAbo().getAboNr(modelRow);
ein = Boolean.parseBoolean(akt.arr[DatenAbo.ABO_EINGESCHALTET]);
}
JPopupMenu jPopupMenu = new JPopupMenu();
// Abo einschalten
JMenuItem itemEinschalten = new JMenuItem("Abo einschalten");
itemEinschalten.setIcon(Icons.ICON_MENUE_EIN);
itemEinschalten.setEnabled(!ein);
itemEinschalten.addActionListener(e -> aboEinAus(true));
jPopupMenu.add(itemEinschalten);
// Abo deaktivieren
JMenuItem itemDeaktivieren = new JMenuItem("Abo ausschalten");
itemDeaktivieren.setIcon(Icons.ICON_MENUE_AUS);
itemDeaktivieren.setEnabled(ein);
itemDeaktivieren.addActionListener(e -> aboEinAus(false));
jPopupMenu.add(itemDeaktivieren);
//Abo lösschen
JMenuItem itemLoeschen = new JMenuItem("Abo löschen");
itemLoeschen.setIcon(Icons.ICON_MENUE_ABO_LOESCHEN);
itemLoeschen.addActionListener(e -> aboLoeschen());
jPopupMenu.add(itemLoeschen);
//Abo ändern
JMenuItem itemAendern = new JMenuItem("Abo ändern");
itemAendern.setIcon(Icons.ICON_MENUE_ABO_AENDERN);
itemAendern.addActionListener(e -> aboAendern());
jPopupMenu.add(itemAendern);
//##Trenner##
jPopupMenu.addSeparator();
//Abo ändern
JMenuItem itemNeu = new JMenuItem("Abo anlegen");
itemNeu.setIcon(Icons.ICON_MENUE_ABO_NEU);
itemNeu.addActionListener(e -> aboNeu());
jPopupMenu.add(itemNeu);
//Menü anzeigen
jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}