/*
* This file is part of jHaushalt.
* jHaushalt 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
* (at your option) any later version.
* jHaushalt 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 jHaushalt; if not, see <http://www.gnu.org/licenses/>.
* (C)opyright 2002-2010 Dr. Lars H. Hahn
*/
package haushalt.auswertung;
import haushalt.daten.Datenbasis;
import haushalt.gui.Haushalt;
import haushalt.gui.TextResource;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Logger;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.ResolutionSyntax;
import javax.print.attribute.standard.PrinterResolution;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* @author Dr. Lars H. Hahn
* @version 2.6/2011.01.25
*/
/*
* 2011.01.25 BuxFix: Nutzung "WrapLayout" für die ButtonPane
* 2011.01.21 BugFix: Auflösung (Resolution) des Druckers gesetzt, um
* fehlerhafte
* Ausdrucke auf einigen Druckern zu verhindern
* 2009.08.15 BugFix: Fehler beim Laden von Auswertungen ignoriert; ermöglicht
* das Laden von neuen Auswertungen in alten Versionen
* 2009.08.04 BugFix: Anzeigen der Button bei schmalem Fenster
* 2008.05.15 BugFix: Falscher Fokus beim Sortieren der Auswertungen korrigiert
* 2008.03.31 Erweiterung: Auswertungen sortieren
* 2008.02.12 Überprüfung, ob Auswertungen geaendert, hinzugefügt
* 2007.07.02 Internationalisierung
* 2007.02.14 Versionsnummer und Versionskontrolle angepasst
* 2006.06.19 Größe des Dialogs wird nicht mehr lokal festgelegt
* 2006.06.11 Löschen der Anzeige nach dem Entfernen der letzten Auswertung
* 2006.02.09 Verlagerung der Drucker-Einstellungen in den Dialog
* 2006.02.07 Erweiterung um Versionskontrolle
*/
public class DlgContainerAuswertung extends JDialog implements ListSelectionListener {
public static final String VERSION_AUSWERTUNG = "2.6";
private static final long serialVersionUID = 1L;
private static final boolean DEBUG = false;
private static final Logger LOGGER = Logger.getLogger(DlgContainerAuswertung.class.getName());
private static final TextResource RES = TextResource.get();
private boolean geaendert = false;
private final Haushalt haushalt;
private final Datenbasis db;
private PageFormat seitenFormat = PrinterJob.getPrinterJob().defaultPage();
private final ArrayList<AbstractAuswertung> auswertungen = new ArrayList<AbstractAuswertung>();
// Liste und Ausgabefenster:
private final DefaultListModel listModel = new DefaultListModel();
private final JList list = new JList(this.listModel);
private final JScrollPane listScrollPane = new JScrollPane(this.list);
private final JScrollPane graphikScrollPane = new JScrollPane();
private final JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, this.listScrollPane, this.graphikScrollPane);
private final Dimension minimumSize = new Dimension(100, 50);
// ButtonPane und Buttons:
private final JPanel paneButton = new JPanel();
private final JButton buttonHoch;
private final JButton buttonRunter;
private final JButton buttonHinzu;
private final JButton buttonEntf;
private final JButton buttonEigensch;
private final JButton buttonExport;
private final JButton buttonEinstDr;
private final JButton buttonDrucken;
private final JButton buttonAbbruch;
private final DlgAuswertungAuswaehlen dlg;
public DlgContainerAuswertung(final Haushalt haushalt, final Datenbasis db) {
super(haushalt.getFrame(), RES.getString("reports"), true);
this.haushalt = haushalt;
this.db = db;
this.buttonHoch = new JButton(haushalt.bildLaden("Up16.png"));
this.buttonRunter = new JButton(haushalt.bildLaden("Down16.png"));
this.buttonHinzu = new JButton(RES.getString("button_add"), haushalt.bildLaden("Add16.png"));
this.buttonEntf = new JButton(RES.getString("button_delete"), haushalt.bildLaden("Delete16.png"));
this.buttonEigensch = new JButton(RES.getString("button_properties"), haushalt.bildLaden("Properties16.png"));
this.buttonExport = new JButton(RES.getString("button_csv_export"), haushalt.bildLaden("Export16.png"));
this.buttonEinstDr = new JButton(RES.getString("button_page_setup"), haushalt.bildLaden("PageSetup16.png"));
this.buttonDrucken = new JButton(RES.getString("button_print"), haushalt.bildLaden("Print16.png"));
this.buttonAbbruch = new JButton(RES.getString("button_close"));
// Liste zur Auswahl der Auswertung
this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.list.addListSelectionListener(this);
// SplitPane enthält links die Liste der Auswertungen und
// rechts das Fenster der gewählten Auswertung
this.split.setOneTouchExpandable(true);
this.split.setDividerLocation(150);
this.listScrollPane.setMinimumSize(this.minimumSize);
this.graphikScrollPane.setMinimumSize(this.minimumSize);
this.graphikScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
// Buttons zur ButtonPane hinzufügen:
this.paneButton.add(this.buttonHoch, null);
this.paneButton.add(this.buttonRunter, null);
this.paneButton.add(this.buttonHinzu, null);
this.paneButton.add(this.buttonEntf, null);
this.paneButton.add(this.buttonEigensch, null);
this.paneButton.add(this.buttonExport, null);
this.paneButton.add(this.buttonEinstDr, null);
this.paneButton.add(this.buttonDrucken, null);
this.paneButton.add(this.buttonAbbruch, null);
this.buttonEntf.setEnabled(false);
this.buttonEigensch.setEnabled(false);
this.buttonExport.setEnabled(false);
this.buttonDrucken.setEnabled(false);
this.buttonHoch.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
sortieren(true);
}
});
this.buttonRunter.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
sortieren(false);
}
});
this.buttonHinzu.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
hinzufuegen();
}
});
this.buttonEntf.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
entfernen();
}
});
this.buttonEigensch.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
eigenschaften();
}
});
this.buttonExport.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
export();
}
});
this.buttonEinstDr.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
einstellungenDrucker();
}
});
this.buttonDrucken.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
drucken();
}
});
this.buttonAbbruch.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
setVisible(false);
}
});
final Container contentPane = getContentPane();
contentPane.add(this.split, BorderLayout.CENTER);
this.paneButton.setLayout(new WrapLayout());
contentPane.add(this.paneButton, BorderLayout.SOUTH);
getRootPane().setDefaultButton(this.buttonEigensch);
// Auswahl-Dialog erzeugen
this.dlg = new DlgAuswertungAuswaehlen(haushalt, db);
}
/**
* Ist <code>true</code>, wenn die Auswertungen geändert wurden.
*
* @return geändert oder nicht geändert
*/
public boolean isGeaendert() {
return this.geaendert;
}
public void zeigeDialog() {
final int anzahl = this.auswertungen.size();
if (anzahl > 0) {
this.haushalt.getFrame().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
for (int i = 0; i < anzahl; i++) {
final AbstractAuswertung auswertung = this.auswertungen.get(i);
auswertung.berechneAuswertung();
}
this.list.setSelectedIndex(0);
this.haushalt.getFrame().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
pack();
setVisible(true);
}
private void sortieren(final boolean raufRunter) {
final int idx = this.list.getSelectedIndex();
final int anzahl = this.auswertungen.size();
if ((idx == -1) || (idx >= anzahl)) {
JOptionPane.showMessageDialog(
null,
RES.getString("no_report_selected"),
RES.getString("reports"),
JOptionPane.WARNING_MESSAGE);
} else {
if ((idx < anzahl - 1) && (raufRunter == false)) { // RUNTER
this.listModel.insertElementAt(this.listModel.remove(idx), idx + 1);
this.auswertungen.add(idx + 1, this.auswertungen.remove(idx));
this.list.setSelectedIndex(idx + 1);
} else if ((idx > 0) && (raufRunter == true)) { // RAUF
this.listModel.insertElementAt(this.listModel.remove(idx), idx - 1);
this.auswertungen.add(idx - 1, this.auswertungen.remove(idx));
this.list.setSelectedIndex(idx - 1);
}
this.graphikScrollPane.getViewport().getView().repaint();
}
}
protected void hinzufuegen() {
final AbstractAuswertung auswertung = this.dlg.showDialog();
if ((auswertung != null) && auswertung.zeigeEigenschaften()) {
this.auswertungen.add(auswertung);
this.listModel.addElement(auswertung);
this.list.setSelectedIndex(this.listModel.getSize() - 1);
this.graphikScrollPane.getViewport().getView().repaint();
this.geaendert = true;
}
}
private void entfernen() {
final int nr = this.list.getSelectedIndex();
final int anzahl = this.auswertungen.size();
if ((nr == -1) || (nr >= anzahl)) {
JOptionPane.showMessageDialog(
null,
RES.getString("no_report_selected"),
RES.getString("reports"),
JOptionPane.WARNING_MESSAGE);
} else {
this.auswertungen.remove(nr);
this.listModel.remove(nr);
if (anzahl > 1) {
this.list.setSelectedIndex(0);
} else {
this.graphikScrollPane.getViewport().removeAll();
this.graphikScrollPane.getViewport().repaint();
}
this.geaendert = true;
}
}
private void eigenschaften() {
final int nr = this.list.getSelectedIndex();
if ((nr == -1) || (nr >= this.auswertungen.size())) {
JOptionPane.showMessageDialog(
null,
RES.getString("no_report_selected"),
RES.getString("reports"),
JOptionPane.WARNING_MESSAGE);
} else {
final AbstractAuswertung auswertung = this.auswertungen.get(nr);
if (auswertung.zeigeEigenschaften()) {
this.geaendert = true;
}
this.list.repaint();
this.graphikScrollPane.getViewport().getView().repaint();
}
}
protected void export() {
final int nr = this.list.getSelectedIndex();
if ((nr == -1) || (nr >= this.auswertungen.size())) {
JOptionPane.showMessageDialog(
null,
RES.getString("no_report_selected"),
RES.getString("reports"),
JOptionPane.WARNING_MESSAGE);
} else {
final AbstractAuswertung auswertung = this.auswertungen.get(nr);
final String[][] tabelle = auswertung.getTabelle();
final CsvHandler handler = new CsvHandler(tabelle);
handler.exportDlg(this.haushalt.getFrame(), this.haushalt.getOrdner());
}
}
private void einstellungenDrucker() {
this.seitenFormat = PrinterJob.getPrinterJob().pageDialog(this.seitenFormat);
}
private void drucken() {
final int nr = this.list.getSelectedIndex();
if ((nr == -1) || (nr >= this.auswertungen.size())) {
JOptionPane.showMessageDialog(
null,
RES.getString("no_report_selected"),
RES.getString("reports"),
JOptionPane.WARNING_MESSAGE);
} else {
final AbstractAuswertung auswertung = this.auswertungen.get(nr);
final PrinterJob job = PrinterJob.getPrinterJob();
job.setJobName("jHaushalt - Report");
job.setPrintable(auswertung, this.seitenFormat);
final HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
final PrinterResolution pr = new PrinterResolution(300, 300, ResolutionSyntax.DPI);
set.add(pr);
if (job.printDialog(set)) {
LOGGER.info("Auswertung drucken: Format "
+ this.seitenFormat.getImageableWidth()
+ " x "
+ this.seitenFormat.getImageableHeight());
}
try {
job.print();
} catch (final PrinterException e) {
LOGGER.warning(e.getMessage());
}
}
}
public void valueChanged(final ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {
final int nr = this.list.getSelectedIndex();
if (nr == -1) {
// Nichts selektiert, disable Eigenschaften + Entfernen
this.buttonEntf.setEnabled(false);
this.buttonEigensch.setEnabled(false);
this.buttonExport.setEnabled(false);
this.buttonDrucken.setEnabled(false);
} else {
this.buttonEntf.setEnabled(true);
this.buttonEigensch.setEnabled(true);
this.buttonDrucken.setEnabled(true);
this.buttonExport.setEnabled(false);
if (nr < this.auswertungen.size()) {
final AbstractAuswertung auswertung = this.auswertungen.get(nr);
if (auswertung.getTabelle() != null) {
this.buttonExport.setEnabled(true);
}
this.graphikScrollPane.getViewport().setView(auswertung);
}
}
}
}
public void laden(final String dateiname) {
final File datei = new File(dateiname);
if (datei.exists()) {
try {
final FileInputStream fis = new FileInputStream(datei);
final DataInputStream in = new DataInputStream(fis);
int size = 0;
final String version = in.readUTF();
if (version.equals(VERSION_AUSWERTUNG) || version.equals("2.5")) {
size = in.readInt();
} else {
JOptionPane.showMessageDialog(
null,
RES.getString("message_reports1")
+ "\n"
+ RES.getString("message_reports2")
+ " "
+ VERSION_AUSWERTUNG
+ " "
+ RES.getString("message_reports3")
+ "\n"
+ RES.getString("message_reports4")
+ "\n"
+ RES.getString("message_reports5")
+ "\n"
+ RES.getString("message_reports6"),
RES.getString("hint"),
JOptionPane.INFORMATION_MESSAGE);
}
for (int i = 0; i < size; i++) {
final String name = in.readUTF();
final String klasse = in.readUTF();
final AbstractAuswertung auswertung = AbstractAuswertung.erzeugeAuswertung(
klasse,
this.haushalt,
this.db,
name);
if (auswertung != null) {
auswertung.laden(in);
this.auswertungen.add(auswertung);
this.listModel.addElement(auswertung);
}
}
fis.close();
if (DEBUG) {
LOGGER.info("" + size + " " + RES.getString("reports_loaded"));
}
} catch (final IOException e) {
LOGGER.warning(e.getMessage());
}
}
this.geaendert = false;
}
public void speichern(final String dateiname) {
final File datei = new File(dateiname);
try {
final FileOutputStream fos = new FileOutputStream(datei);
final DataOutputStream out = new DataOutputStream(fos);
out.writeUTF(VERSION_AUSWERTUNG);
out.writeInt(this.auswertungen.size());
for (int i = 0; i < this.auswertungen.size(); i++) {
final AbstractAuswertung auswertung = this.auswertungen.get(i);
out.writeUTF("" + auswertung);
out.writeUTF(auswertung.getClass().getName());
auswertung.speichern(out);
}
out.flush();
fos.close();
if (DEBUG) {
LOGGER.info("" + this.auswertungen.size() + " " + RES.getString("reports_stored"));
}
} catch (final IOException e) {
LOGGER.warning(e.getMessage());
}
this.geaendert = false;
}
}