package datechooser.autorun;
import datechooser.beans.DateChooserBean;
import datechooser.beans.customizer.DateChooserCustomizer;
import datechooser.beans.customizer.PropertyDescriptorsHolder;
import java.beans.*;
import java.io.*;
import javax.swing.*;
/**
* Displays customizer/component pair.
* Provides save/load properties functions and links component and customizer.
*
* @author Androsov Vadim
* @since 1.0
*/
public abstract class ConfigBean extends JPanel implements PropertyChangeListener {
/**
* Successfull operation result.
* @since 1.0
*/
public static final String OK = PropertyDescriptorsHolder.OK;
/**
* Customized bean .
*/
private DateChooserBean bean;
/**
* Bean customizer.
*/
private DateChooserCustomizer customizer;
/**
* File containing bean config.
*/
private File file;
/**
* All changes saved flag.
*/
private boolean saved;
protected ConfigBean(DateChooserBean bean, DateChooserCustomizer customizer) {
setFile(null);
setBean(bean);
setCustomizer(customizer);
getCustomizer().setObject(getBean());
getCustomizer().addPropertyChangeListener(this);
setSaved(true);
setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5));
}
/**
* Describes component. <br>
* @return Component's description.
* @since 1.0
*/
public String toString() {
return getBeanInfo().getBeanDescriptor().getDisplayName();
}
/**
* Handles "property changed" event in customizer.
* Set "saved" flag = false and repaint component (if it is visual).
* @param evt Event description.
* @since 1.0
*/
public void propertyChange(PropertyChangeEvent evt) {
setSaved(false);
if (getBean() instanceof JComponent) {
((JComponent)getBean()).repaint();
}
}
protected DateChooserBean getBean() {
return bean;
}
private void setBean(DateChooserBean bean) {
this.bean = bean;
}
protected DateChooserCustomizer getCustomizer() {
return customizer;
}
private void setCustomizer(DateChooserCustomizer customizer) {
this.customizer = customizer;
}
protected BeanInfo getBeanInfo() {
return getCustomizer().getBeanInfo();
}
/**
* Short component's description.
* @return Component's description.
* @since 1.0
*/
public String getBeanDisplayName() {
try {
return getBeanInfo().getBeanDescriptor().getDisplayName();
} catch (NullPointerException ex) {
return "?";
}
}
/**
* Save customized properties to file.
* @param file File to write in.
* @return OK is operation successfull, error description otherwise.
* @since 1.0
*/
public String writeToFile(File file) {
setFile(file);
setSaved(true);
return getCustomizer().getHolder().writeToFile(file);
}
/**
* Reads properies form file.
* @param file Properies file.
* @return OK if operation successfull.
* @since 1.0
*/
public String readFromFile(File file) {
setFile(file);
setSaved(true);
return getCustomizer().getHolder().readFromFile(file);
}
/**
* File extension for corresponding component properties.
* @return Extension.
* @since 1.0
*/
public abstract String getFileExt();
/**
* Saved properties file.
* @return Properties file, null if there component was never saved.
* @since 1.0
*/
public File getFile() {
return file;
}
/**
* Set save file.
* @param file Properties file.
* @since 1.0
*/
public void setFile(File file) {
this.file = file;
}
/**
* Get "all properties saved" flag.
* @return true if there is no unsaved properties.
* @since 1.0
*/
public boolean isSaved() {
return saved;
}
/**
* Sets "saved" flag. <br>
* @param saved "saved" flag.
* @since 1.0
*/
public void setSaved(boolean saved) {
this.saved = saved;
}
}