/* * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * (C)opyright 2002-2010 Dr. Lars H. Hahn */ package haushalt.auswertung; import haushalt.auswertung.bloecke.AbstractBlock; import haushalt.auswertung.bloecke.AbstractTabelleBlock; import haushalt.auswertung.bloecke.DoppelteTabelleBlock; import haushalt.auswertung.bloecke.LeererBlock; import haushalt.auswertung.bloecke.TextBlock; import haushalt.auswertung.bloecke.TortenBlock; import haushalt.daten.Datenbasis; import haushalt.daten.EinzelKategorie; import haushalt.daten.Euro; import haushalt.daten.zeitraum.AbstractZeitraum; import haushalt.daten.zeitraum.Jahr; import haushalt.gui.Haushalt; import haushalt.gui.TextResource; import haushalt.gui.generischerdialog.AbstractGDPane; import haushalt.gui.generischerdialog.BooleanGDP; import haushalt.gui.generischerdialog.EinOderAlleRegisterGDP; import haushalt.gui.generischerdialog.MehrereKategorienGDP; import haushalt.gui.generischerdialog.TextArrayGDP; import haushalt.gui.generischerdialog.ZahlGDP; import haushalt.gui.generischerdialog.ZeitraumGDP; import java.awt.Font; /** * @author Dr. Lars H. Hahn * @version 2.5/2007.07.02 * @since 2.0 */ /* * 2007.07.02 Internationalisierung * 2004.08.22 Erste Version */ public class BATortenDiagramm extends AbstractBlockAuswertung { public static final String UEBERSCHRIFT = TextResource.get().getString("headline_pie_chart"); private static final long serialVersionUID = 1L; private static final TextResource RES = TextResource.get(); public BATortenDiagramm(final Haushalt haushalt, final Datenbasis db, final String name) { super(haushalt, db, name); final AbstractGDPane[] panes = new AbstractGDPane[6]; panes[0] = new ZeitraumGDP(RES.getString("first_period") + ":", new Jahr(2007)); panes[1] = new ZahlGDP(RES.getString("number_of_categories") + ":", 10); panes[2] = new EinOderAlleRegisterGDP(RES.getString("register") + ":", db, null); panes[3] = new MehrereKategorienGDP(RES.getString("categories") + ":", db); panes[4] = new TextArrayGDP(RES.getString("color_scheme") + ":", FarbPaletten.getPalettenNamen(), "Standard"); panes[5] = new BooleanGDP(RES.getString("display_values"), Boolean.FALSE, RES.getString("in_percent")); erzeugeEigenschaften(haushalt.getFrame(), UEBERSCHRIFT, panes); } @Override protected String berechneAuswertung(final Object[] werte) { final AbstractZeitraum zeitraum = (AbstractZeitraum) werte[0]; final int maxAnzahlWerte = ((Integer) werte[1]).intValue(); final String register = (String) werte[2]; final EinzelKategorie[] kategorien = (EinzelKategorie[]) werte[3]; final int anzahlKategorien = kategorien.length; final String farbschema = (String) werte[4]; final Boolean prozent = (Boolean) werte[5]; // --------------------------------------------------------------------------- final Euro[] einnahmen = new Euro[maxAnzahlWerte]; final EinzelKategorie[] kategorienEinnahmen = new EinzelKategorie[maxAnzahlWerte]; final Euro[] ausgaben = new Euro[maxAnzahlWerte]; final EinzelKategorie[] kategorienAusgaben = new EinzelKategorie[maxAnzahlWerte]; final Euro gesamtEinnahmen = new Euro(); final Euro gesamtAusgaben = new Euro(); Euro kategorieSumme; final boolean unterkategorienVerwenden = ((MehrereKategorienGDP) this.getPanes()[3]).getUnterkategorienVerwenden(); int anzahlEinnahmen = 0; int anzahlAusgaben = 0; for (int i = 0; i < anzahlKategorien; i++) { kategorieSumme = getDb().getKategorieSaldo(kategorien[i], zeitraum, register, unterkategorienVerwenden); if (kategorieSumme.compareTo(Euro.NULL_EURO) > 0) { // Einnahmen: gesamtEinnahmen.sum(kategorieSumme); for (int j = 0; j < maxAnzahlWerte; j++) { if (einnahmen[j] == null) { einnahmen[j] = kategorieSumme; // Prima! Noch ein Platz // frei! kategorienEinnahmen[j] = kategorien[i]; j = maxAnzahlWerte; anzahlEinnahmen++; } else if (kategorieSumme.compareTo(einnahmen[j]) > 0) { for (int k = maxAnzahlWerte - 1; k > j; k--) { einnahmen[k] = einnahmen[k - 1]; kategorienEinnahmen[k] = kategorienEinnahmen[k - 1]; } einnahmen[j] = kategorieSumme; kategorienEinnahmen[j] = kategorien[i]; j = maxAnzahlWerte; anzahlEinnahmen++; } } } else if (kategorieSumme.compareTo(Euro.NULL_EURO) < 0) { // Ausgaben: kategorieSumme = Euro.NULL_EURO.sub(kategorieSumme); gesamtAusgaben.sum(kategorieSumme); for (int j = 0; j < maxAnzahlWerte; j++) { if (ausgaben[j] == null) { ausgaben[j] = kategorieSumme; // Prima! Noch ein Platz // frei! kategorienAusgaben[j] = kategorien[i]; j = maxAnzahlWerte; anzahlAusgaben++; } else if (kategorieSumme.compareTo(ausgaben[j]) > 0) { for (int k = maxAnzahlWerte - 1; k > j; k--) { ausgaben[k] = ausgaben[k - 1]; kategorienAusgaben[k] = kategorienAusgaben[k - 1]; } ausgaben[j] = kategorieSumme; kategorienAusgaben[j] = kategorien[i]; j = maxAnzahlWerte; anzahlAusgaben++; } } } } // Vorhandene Blöcke löschen und neu berechnete einfügen String titel = RES.getString("distribution_income_expenditure") + " (" + zeitraum; loescheBloecke(); if (register == null) { titel += ")"; } else { titel += ", " + register + ")"; } final AbstractBlock block1 = new TextBlock(titel); block1.setFont(new Font(this.getHaushalt().getFontname(), Font.BOLD, this.getHaushalt().getFontgroesse() + 6)); addDokumentenBlock(block1); addDokumentenBlock(new LeererBlock(1)); final AbstractBlock block2 = new TortenBlock(farbschema, einnahmen, gesamtEinnahmen, ausgaben, gesamtAusgaben); block2.setFont(new Font(this.getHaushalt().getFontname(), Font.PLAIN, this.getHaushalt().getFontgroesse())); addDokumentenBlock(block2); addDokumentenBlock(new LeererBlock(1)); anzahlEinnahmen = (maxAnzahlWerte < anzahlEinnahmen) ? maxAnzahlWerte : anzahlEinnahmen; anzahlAusgaben = (maxAnzahlWerte < anzahlAusgaben) ? maxAnzahlWerte : anzahlAusgaben; final String[][] tabelleEinnahmen = new String[anzahlEinnahmen][2]; final String[][] tabelleAusgaben = new String[anzahlAusgaben][2]; for (int j = 0; j < anzahlEinnahmen; j++) { tabelleEinnahmen[j][0] = "" + kategorienEinnahmen[j]; if (prozent) { tabelleEinnahmen[j][1] = String.format("%1$.1f%%", einnahmen[j].toDouble() * 100.0 / gesamtEinnahmen.toDouble()); } else { tabelleEinnahmen[j][1] = "" + einnahmen[j]; } } for (int j = 0; j < anzahlAusgaben; j++) { tabelleAusgaben[j][0] = "" + kategorienAusgaben[j]; if (prozent) { tabelleAusgaben[j][1] = "" + String.format("%1$.1f%%", ausgaben[j].toDouble() * 100.0 / gesamtAusgaben.toDouble()); } else { tabelleAusgaben[j][1] = "" + ausgaben[j]; } } final double[] relTabs = {0.0D, 70.0D}; final AbstractTabelleBlock.Ausrichtung[] attribute2 = { AbstractTabelleBlock.Ausrichtung.LINKS, AbstractTabelleBlock.Ausrichtung.RECHTS}; final DoppelteTabelleBlock block3 = new DoppelteTabelleBlock(tabelleEinnahmen, tabelleAusgaben); block3.setFont(new Font(this.getHaushalt().getFontname(), Font.PLAIN, this.getHaushalt().getFontgroesse())); block3.setRelTabs(relTabs, true); block3.setRelTabs(relTabs, false); block3.setAusrichtung(attribute2, true); block3.setAusrichtung(attribute2, false); block3.setHgFarbe(farbschema); block3.setLinienFarbe("Weiß"); block3.setRelRand(0.05D); addDokumentenBlock(block3); return titel; } }