package jas.util; import java.util.Enumeration; import java.util.Observable; import java.util.Observer; import java.util.Vector; import javax.swing.JPanel; public abstract class PropertyPage extends JPanel implements Observer { public PropertyPage() { } public void addNotify() { super.addNotify(); if (getParent() instanceof PropertyPage) ((PropertyPage) getParent()).addInnerPropertyPage(this); // If the parent is a property page then notify the parent. } void addInnerPropertyPage(PropertyPage p) { if (getParent() instanceof PropertyPage) // pass the notification to the topmost page ((PropertyPage) getParent()).addInnerPropertyPage(p); else { // this is the top page, so deal with the notification... if (m_innerPropPages == null) m_innerPropPages = new Vector(); m_innerPropPages.addElement(p); // keep a list of inner pages } } public void setPropertySite(PropertySite dlg) { m_dlg = dlg; } public void doDataExchange(boolean set,Object hist) { Enumeration e = m_propertyBindings.elements(); while (e.hasMoreElements()) { PropertyBinding p = (PropertyBinding) e.nextElement(); p.doDataExchange(set,hist); } m_changed = false; } protected void addBinding(PropertyBinding bind) { m_propertyBindings.addElement(bind); bind.addObserver(this); } public void update(Observable o, Object arg) { setChanged(true); } protected void setChanged(boolean set) { m_changed = set; if (m_dlg != null) m_dlg.callEnable(); } boolean hasChanged() { return m_changed; } /** * called when the page is deactivated, either due to another page * being selected, or due to the dialog being disposed of. */ protected void deactivate() { } /** * called when the page is activated, either because it is the default * page, or because its tab was selected. This is called before doDataExchanged */ protected void activate() { } boolean hasValidInput() { Enumeration e = m_propertyBindings.elements(); PropertyBinding b; while (e.hasMoreElements()) { b = (PropertyBinding) e.nextElement(); if (! b.hasValidInput()) return false; } if (m_innerPropPages != null) // check also all inner pages { e = m_innerPropPages.elements(); while (e.hasMoreElements()) if (!((PropertyPage) e.nextElement()).hasValidInput()) return false; } return true; } // default return indicates no help topic; override to specify otherwise public String getHelpTopic() { return null; } private PropertySite m_dlg; private boolean m_changed = false; private Vector m_propertyBindings = new Vector(); private Vector m_innerPropPages = null; }