/*
* 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.gui.dialoge;
import haushalt.daten.Datenbasis;
import haushalt.daten.Datum;
import haushalt.gui.DeleteableTextField;
import haushalt.gui.EuroField;
import haushalt.gui.Haushalt;
import haushalt.gui.TextResource;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
/**
* Erstellt einen Dialog, um Kategorien zu erzeugen und
* umzubenennen
*
* @author Dr. Lars H. Hahn
* @version 2.5.3/2008.03.31
* @since 2.5
*/
/*
* 2008.03.31 Icons für Buttons verwenden
* 2007.02.07 Erste Version
*/
public class DlgRegisterBearbeiten extends JDialog {
private static final TextResource RES = TextResource.get();
private static final long serialVersionUID = 1L;
private final Haushalt haushalt;
private final Datenbasis db;
private JScrollPane scrollPane;
private JList list;
private final JPanel eastPane = new JPanel();
private final JPanel erzeugenPane = new JPanel();
private final DeleteableTextField textErzeugen;
private final JButton buttonErzeugen;
private final EuroField openingBalance = new EuroField();
private final JPanel umbenennenPane = new JPanel();
private final JTextField alterName = new JTextField();
private final DeleteableTextField textUmbenennen;
private final JButton buttonUmbenennen;
private final JPanel buttonPane = new JPanel();
private final JButton buttonAbbruch;
private final JPanel sortierenPane = new JPanel();
private final JButton buttonHoch;
private final JButton buttonRunter;
public DlgRegisterBearbeiten(final Haushalt haushalt, final Datenbasis datenbasis) {
super(haushalt.getFrame(), RES.getString("edit_registers"), true); // =
// modal
this.haushalt = haushalt;
this.db = datenbasis;
this.list = new JList(this.db.getRegisterNamen());
this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(final ListSelectionEvent arg0) {
if (DlgRegisterBearbeiten.this.list.isSelectionEmpty()) {
DlgRegisterBearbeiten.this.alterName.setText("");
} else {
DlgRegisterBearbeiten.this.alterName.setText("" + DlgRegisterBearbeiten.this.list.getSelectedValue());
}
}
});
this.scrollPane = new JScrollPane(this.list);
this.buttonErzeugen = new JButton(RES.getString("button_create"), haushalt.bildLaden("New16.png"));
this.buttonUmbenennen = new JButton(RES.getString("button_rename"));
this.buttonAbbruch = new JButton(RES.getString("button_close"));
this.buttonHoch = new JButton(haushalt.bildLaden("Up16.png"));
this.buttonRunter = new JButton(haushalt.bildLaden("Down16.png"));
final Dimension dimensionButton = this.buttonUmbenennen.getPreferredSize();
this.erzeugenPane.setLayout(new GridLayout(0, 2, 5, 5));
this.erzeugenPane.setBorder(BorderFactory.createTitledBorder(RES.getString("create_register")));
this.textErzeugen = new DeleteableTextField(15) {
private static final long serialVersionUID = 1L;
@Override
protected Document createDefaultModel() {
return new RegisterDocument();
}
};
final ActionListener erzeugenActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
erzeugen();
}
};
this.textErzeugen.addActionListener(erzeugenActionListener);
this.erzeugenPane.add(new JLabel(RES.getString("new_register_name") + ":"));
this.erzeugenPane.add(this.textErzeugen);
this.erzeugenPane.add(new JLabel(RES.getString("opening_balance") + ":"));
this.erzeugenPane.add(this.openingBalance);
this.erzeugenPane.add(Box.createHorizontalBox());
this.erzeugenPane.add(this.buttonErzeugen);
this.buttonErzeugen.addActionListener(erzeugenActionListener);
this.buttonErzeugen.setPreferredSize(dimensionButton);
this.umbenennenPane.setLayout(new GridLayout(0, 2, 5, 5));
this.umbenennenPane.setBorder(BorderFactory.createTitledBorder(RES.getString("rename_register")));
this.textUmbenennen = new DeleteableTextField(15) {
private static final long serialVersionUID = 1L;
@Override
protected Document createDefaultModel() {
return new RegisterDocument();
}
};
final ActionListener umbenennenActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
umbenennen();
}
};
this.textUmbenennen.addActionListener(umbenennenActionListener);
this.umbenennenPane.add(new JLabel(RES.getString("old_register_name") + ":"));
this.alterName.setEnabled(false);
this.umbenennenPane.add(this.alterName);
this.umbenennenPane.add(new JLabel(RES.getString("new_register_name") + ":"));
this.umbenennenPane.add(this.textUmbenennen);
this.umbenennenPane.add(Box.createHorizontalBox());
this.umbenennenPane.add(this.buttonUmbenennen);
this.buttonUmbenennen.addActionListener(umbenennenActionListener);
this.sortierenPane.setBorder(BorderFactory.createTitledBorder(RES.getString("sort_register")));
this.sortierenPane.setLayout(new GridLayout(0, 2, 5, 5));
this.buttonHoch.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
nachOben();
}
});
this.sortierenPane.add(this.buttonHoch);
this.buttonRunter.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
nachUnten();
}
});
this.sortierenPane.add(this.buttonRunter);
this.eastPane.setLayout(new BoxLayout(this.eastPane, BoxLayout.Y_AXIS));
this.eastPane.add(this.erzeugenPane);
this.eastPane.add(this.umbenennenPane);
this.eastPane.add(this.sortierenPane);
this.buttonAbbruch.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
setVisible(false);
}
});
this.buttonAbbruch.setPreferredSize(dimensionButton);
this.buttonPane.add(this.buttonAbbruch);
final Container contentPane = getContentPane();
contentPane.add(this.scrollPane, BorderLayout.WEST);
contentPane.add(this.eastPane, BorderLayout.EAST);
contentPane.add(this.buttonPane, BorderLayout.SOUTH);
}
/**
* Zeigt den Dialog auf dem Bildschirm an, wenn er noch nicht sichtbar ist.
*/
public void showDialog() {
setLocationRelativeTo(getOwner());
pack();
setVisible(true);
}
protected void erzeugen() {
if (this.textErzeugen.getText().equals("")) {
JOptionPane.showMessageDialog(this.haushalt.getFrame(), RES.getString("message_no_register_name"));
return;
}
final String name = this.db.erzeugeRegister("[" + this.textErzeugen.getText() + "]");
this.haushalt.zeigeRegisterTab(name);
// falls der Name doppelt ist, hat er eine folgende Ziffer erhalten
this.db.addUmbuchung(new Datum(), RES.getString("opening_balance"), name, name, this.openingBalance.getValue());
this.list.setListData(this.db.getRegisterNamen());
this.textErzeugen.setText("");
this.openingBalance.setText("");
}
protected void umbenennen() {
if (this.textUmbenennen.getText().equals("")) {
JOptionPane.showMessageDialog(this.haushalt.getFrame(), RES.getString("message_no_new_register"));
return;
}
if (this.list.isSelectionEmpty()) {
JOptionPane.showMessageDialog(this.haushalt.getFrame(), RES.getString("message_no_register_selected"));
return;
}
final String regname = this.db.renameRegister("" + this.list.getSelectedValue(), "["
+ this.textUmbenennen.getText()
+ "]");
this.haushalt.renameRegisterTab("" + this.list.getSelectedValue(), regname);
this.list.setListData(this.db.getRegisterNamen());
this.textUmbenennen.setText("");
}
protected void nachUnten() {
if (this.list.isSelectionEmpty()) {
JOptionPane.showMessageDialog(this.haushalt.getFrame(), RES.getString("message_no_register_selected"));
return;
}
final int idx = this.list.getSelectedIndex();
if (idx < this.db.getRegisterNamen().length - 1) {
final String regname = "" + this.list.getSelectedValue();
this.db.aendereRegisterIndex(regname, idx + 1);
this.haushalt.bewegeRegisterNachOben(regname);
this.list.setListData(this.db.getRegisterNamen());
this.list.setSelectedIndex(idx + 1);
}
}
protected void nachOben() {
if (this.list.isSelectionEmpty()) {
JOptionPane.showMessageDialog(this.haushalt.getFrame(), RES.getString("message_no_register_selected"));
return;
}
final int idx = this.list.getSelectedIndex();
if (idx > 0) {
final String regname = "" + this.list.getSelectedValue();
this.db.aendereRegisterIndex(regname, idx - 1);
this.haushalt.bewegeRegisterNachUnten(regname);
this.list.setListData(this.db.getRegisterNamen());
this.list.setSelectedIndex(idx - 1);
}
}
private static class RegisterDocument extends PlainDocument {
private static final long serialVersionUID = 1L;
@Override
public void insertString(final int offs, final String str, final AttributeSet a) throws BadLocationException {
final char[] source = str.toCharArray();
final int anzChar = source.length;
final char[] result = new char[anzChar];
int j = 0;
for (int i = 0; i < anzChar; i++) {
if (Character.isLetterOrDigit(source[i]) || (source[i] == '-')) {
result[j++] = source[i];
}
}
super.insertString(offs, new String(result, 0, j), a);
}
}
}