package de.onyxbits.dummydroid;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JLabel;
import javax.swing.JTextField;
/**
* A key/value editor form.
*
* @author patrick
*
*/
public abstract class PropertyForm extends AbstractForm {
/**
*
*/
private static final long serialVersionUID = 1L;
public PropertyForm(NavigateAction forwardAction, NavigateAction backwardAction) {
super(forwardAction, backwardAction);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST,
GridBagConstraints.NONE, new Insets(4, 4, 4, 4), 4, 4);
for (String name : listProperties()) {
gbc.gridx = 0;
gbc.fill = GridBagConstraints.NONE;
add(new JLabel(getDisplayName(name)), gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
JTextField entry = new JTextField(20);
entry.setName(name);
add(entry, gbc);
gbc.gridy++;
}
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridwidth = 2;
gbc.gridy++;
gbc.gridx = 0;
add(new JLabel(""), gbc);
}
private JTextField editorFor(String name) {
Component[] all = getComponents();
for (Component c : all) {
if (name.equals(c.getName())) {
return (JTextField) c;
}
}
return null;
}
@Override
public void edit(FormData formData) {
super.edit(formData);
for (String name : listProperties()) {
editorFor(name).setText(getInitialValue(name));
}
}
/**
* List all the properties that are supposed to be edited with the form
*
* @return list of property names
*/
protected abstract String[] listProperties();
/**
* Query the default value of a property
*
* @param pn
* name of the property
* @return what to put into the editor
*/
protected abstract String getInitialValue(String p);
/**
* Override the name that is shown for a property
*
* @param pn
* the name of the property
* @return the string to show to the user. by default, the propertyName is
* returned.
*/
protected String getDisplayName(String pn) {
return pn;
}
/**
* Query the value of a property
*
* @param name
* property name
* @return editor contents
*/
protected String getProperty(String name) {
return editorFor(name).getText();
}
/**
* Validate that a set of properties is either empty or can be parsed as
* integers.
*
* @param propertyName
* the properties to check
* @throws RuntimeException
* if a property contains something thats not a number.
*/
protected void validateIntOrEmpty(String... propertyName) throws RuntimeException {
for (String pn : propertyName) {
String val = getProperty(pn);
if (val.length() > 0) {
Integer.parseInt(val);
}
}
}
/**
* Check if a field does not contain a value
*
* @param propertyName
* name of the property
* @return true if nothing is set.
*/
protected boolean isEmpty(String propertyName) {
return getProperty(propertyName).length() == 0;
}
}