/*
* This file is part of Caliph & Emir.
*
* Caliph & Emir 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.
*
* Caliph & Emir 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 Caliph & Emir; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Copyright statement:
* --------------------
* (c) 2005 by Werner Klieber (werner@klieber.info)
* http://caliph-emir.sourceforge.net
*/
package at.wklieber.gui;
import at.wklieber.tools.Console;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
class InputDataSet {
public int type = -1;
public String name = null;
public String value = null;
public JTextField jTextField = null;
public JComboBox jComboBox = null;
}
public class DataInputDialog
implements DocumentListener
// extends Container
{
private static java.util.logging.Logger cat = java.util.logging.Logger.getLogger(DataInputDialog.class.getName());
private static Console console = Console.getReference();
public static final int SMALL_LENGTH = 6;
public static final int MEDIUM_LENGTH = 15;
private static final int INPUT_TYPE_TEXTFIELD = 0;
private static final int INPUT_TYPE_COMBOBOX = 1;
private String dialogTitle = "Data Input Frame";
private JFrame parentFrame = null;
private JPanel textPanel = null;
private JPanel textPanelIterator = null;
private Container contentPane = null;
private java.util.Map dataMap = null;
private java.util.Map oldDataMap = null;
protected EventListenerList changeListeners = new EventListenerList();
JDialog myDialog = null;
public DataInputDialog(JFrame parentFrame1, Container drawContainer1, String title1) {
init(parentFrame1, drawContainer1, title1);
}
public DataInputDialog(JFrame parentFrame1) {
init(parentFrame1, null, dialogTitle);
}
private void init(JFrame parentFrame1, Container drawContainer1, String title1) {
parentFrame = parentFrame1;
contentPane = drawContainer1;
dialogTitle = title1;
if (contentPane == null) {
contentPane = new Container();
}
contentPane.setLayout(new BorderLayout());
textPanel = new JPanel();
LayoutManager mgr = new BorderLayout();
textPanel.setLayout(mgr);
contentPane.add(textPanel, BorderLayout.CENTER);
contentPane.setVisible(true);
dataMap = new HashMap();
if (dialogTitle != null && dialogTitle.length() > 0) {
JLabel title = new JLabel(dialogTitle);
title.setMinimumSize(new Dimension(200, 20));
title.setBorder(BorderFactory.createLoweredBevelBorder());
contentPane.add(title, BorderLayout.NORTH);
}
contentPane.validate();
}
public Container getContentPane() {
return contentPane;
}
/**
* Set as new entry for a Textfield
*/
public void addInputData(String name1, String description1, String initValue, int textFieldLength1) {
String[] values = new String[1];
values[0] = initValue;
addNewEntry(name1, description1, values, textFieldLength1, INPUT_TYPE_TEXTFIELD, -1);
}
private void addNewEntry(String name1, String description1, String[] initValues1,
int textFieldLength1, int type1, int startPos1) {
Date currentDate = new Date(System.currentTimeMillis());
if (textPanelIterator == null) {
textPanelIterator = textPanel;
}
JLabel label = new JLabel(name1 + ": ");
label.setToolTipText(description1);
//label.setMaximumSize(new Dimension(100, MAX_HIGH));
//label.setMinimumSize(new Dimension(100, MIN_HIGH));
Component inputField = null;
if (type1 == INPUT_TYPE_TEXTFIELD) {
String initValue = initValues1[0];
JTextField textField = new JTextField(initValue);
textField.setToolTipText(description1);
textField.setColumns(textFieldLength1);
textField.getDocument().addDocumentListener(this);
inputField = textField;
} else if (type1 == INPUT_TYPE_COMBOBOX) {
java.util.Vector entry = new Vector();
for (int i = 0; i < initValues1.length; i++) {
entry.add(initValues1[i]);
//cat.fine("Como add: " + dirs[i]);
}
JComboBox comboBox = new JComboBox(entry);
comboBox.setToolTipText(description1);
comboBox.setSelectedIndex(startPos1);
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox) e.getSource();
String selected = (String) cb.getSelectedItem();
int index = (int) cb.getSelectedIndex();
actionComboElementSelected(selected, index);
}
};
comboBox.addActionListener(listener);
inputField = comboBox;
}
JPanel dummyPanel = new JPanel();
dummyPanel.setLayout(new BorderLayout());
textPanelIterator.add(dummyPanel, BorderLayout.CENTER);
JPanel entryPanel = new JPanel();
//entryPanel.setLayout(new FlowLayout(FlowLayout.LEADING));
entryPanel.setLayout(new GridLayout(0, 2));
entryPanel.add(label);
entryPanel.add(inputField);
dummyPanel.add(entryPanel, BorderLayout.NORTH);
//textPanel.add(label);
//textPanel.add(textField);
//textPanel.revalidate();
textPanelIterator = dummyPanel;
//cat.fine("textPanel added: " + name1);
InputDataSet data = new InputDataSet();
data.type = type1;
data.name = name1;
if (type1 == INPUT_TYPE_TEXTFIELD) {
data.jTextField = (JTextField) inputField;
data.value = initValues1[0];
} else if (type1 == INPUT_TYPE_COMBOBOX) {
data.jComboBox = (JComboBox) inputField;
data.value = initValues1[startPos1];
}
dataMap.put(name1, data);
oldDataMap = new HashMap();
for (Iterator it = dataMap.keySet().iterator(); it.hasNext();) {
String key = (String) it.next();
InputDataSet d = (InputDataSet) dataMap.get(key);
InputDataSet copy = new InputDataSet();
copy.type = d.type;
copy.name = d.name;
copy.value = d.value;
oldDataMap.put(key, copy);
}
contentPane.validate();
}
/**
* Set as new entry for a Textfield
*/
public void addInputData(String name1, String description1, String initValue1) {
addInputData(name1, description1, initValue1, MEDIUM_LENGTH);
}
/**
* Set as new entry for Pull Down Box
*/
public void addInputData(String name1, String description1, String[] values1, String startName1) {
int currendIndex = 0;
for (int i = 0; i < values1.length; i++) {
if (values1[i].equalsIgnoreCase(startName1)) {
currendIndex = i;
}
}
addNewEntry(name1, description1, values1, MEDIUM_LENGTH, INPUT_TYPE_COMBOBOX, currendIndex);
}
public void removeAllInputData() {
textPanel.removeAll();
textPanelIterator = null;
dataMap = new HashMap();
}
public String getInputData(String name1, String defaultValue1) {
String returnValue = defaultValue1;
try {
if (dataMap.containsKey(name1)) {
InputDataSet data = (InputDataSet) dataMap.get(name1);
returnValue = data.value;
}
} catch (Exception e) {
cat.severe(e.toString());
}
return returnValue;
}
/**
* Returns true if the input String is "yes" or "true"
* Returns false otherwise
*
* @param name1
* @param defaultValue1
* @return
*/
public boolean getInputData(String name1, boolean defaultValue1) {
boolean returnValue = defaultValue1;
try {
if (dataMap.containsKey(name1)) {
InputDataSet data = (InputDataSet) dataMap.get(name1);
if (data.value.equalsIgnoreCase("true") || data.value.equalsIgnoreCase("yes") ||
data.value.equalsIgnoreCase("1")) {
returnValue = true;
} else {
returnValue = false;
}
}
} catch (Exception e) {
cat.severe(e.toString());
}
return returnValue;
}
/**
* show the content of the container in an own Dialog with ok and cancel button
*/
public void showDialog() {
myDialog = new JDialog(parentFrame, dialogTitle, true);
Container dialogContentPane = myDialog.getContentPane();
dialogContentPane.setLayout(new BorderLayout());
myDialog.setSize(500, 400);
//myDialog.setTitle(dialogTitle);
// contentPane.setLayout(new BorderLayout());
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
myDialog.setLocation((d.width - myDialog.getSize().width) / 2, (d.height - myDialog.getSize().height) / 2);
//contentPane = new Container();
//contentPane.setLayout(new BorderLayout());
//contentPane.add(new JButton("OK"), BorderLayout.SOUTH);
dialogContentPane.add(contentPane, BorderLayout.CENTER);
Container controllButtons = new Container();
controllButtons.setLayout(new FlowLayout(FlowLayout.CENTER));
dialogContentPane.add(controllButtons, BorderLayout.SOUTH);
ActionListener okAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionOk(e);
}
};
ActionListener cancelAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionCancel(e);
}
};
JButton okButton = new JButton("OK");
okButton.addActionListener(okAction);
controllButtons.add(okButton);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(cancelAction);
controllButtons.add(cancelButton);
myDialog.setVisible(true);
}
private void updateData() {
Component[] components = textPanel.getComponents();
for (Iterator it = dataMap.keySet().iterator(); it.hasNext();) {
String name = (String) it.next();
InputDataSet data = (InputDataSet) dataMap.get(name);
if (data.type == INPUT_TYPE_TEXTFIELD) {
data.value = data.jTextField.getText();
} else if (data.type == INPUT_TYPE_COMBOBOX) {
data.value = (String) data.jComboBox.getSelectedItem();
}
//cat.fine("update: " + name + ", " + data.value);
} // end for
}
public void actionOk(ActionEvent e) {
updateData();
myDialog.setVisible(false);
}
public void actionCancel(ActionEvent e) {
dataMap = oldDataMap;
myDialog.setVisible(false);
}
public String toString() {
return "nothing to report";
}
protected void finalize() throws Throwable {
super.finalize();
}
//--------------------- stuff to inform changelistern classes
public void setContentPane(Container contentPane) {
this.contentPane = contentPane;
}
public void insertUpdate(DocumentEvent evt) {
//cat.fine("ACTION, insertUpdate: " + evt.toString());
fireChange();
}
public void removeUpdate(DocumentEvent evt) {
//cat.fine("ACTION, removeUpdate: " + evt.toString());
fireChange();
}
public void changedUpdate(DocumentEvent evt) {
//cat.fine("ACTION, changedUpdate: " + evt.toString());
fireChange();
}
// Listener notification support
public void addChangeListener(ChangeListener x) {
changeListeners.add(ChangeListener.class, x);
// bring it up to date with current state
x.stateChanged(new ChangeEvent(this));
}
public void removeChangeListener(ChangeListener x) {
changeListeners.remove(ChangeListener.class, x);
}
// inform all listeners that something has changed
protected void fireChange() {
ChangeEvent c = new ChangeEvent(this);
updateData();
// Get the listener list
Object[] listeners = changeListeners.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) {
ChangeListener cl = (ChangeListener) listeners[i + 1];
cl.stateChanged(c);
}
}
}
private void actionComboElementSelected(String selected, int index) {
//cat.fine("Selected: " + index);
//drawPanel.removeAll();
if (index < 0) {
return;
}
fireChange();
} // end method
}