package org.signalml.app.view.common.components.panels; import java.awt.Component; import java.awt.Container; import java.awt.Window; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.swing.JPanel; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import org.apache.log4j.Logger; import org.signalml.app.model.components.validation.ValidationErrors; /** * All panels in Svarog should extend this panel. Contains an instance of * SvarogI18n and methods for enabling/disabling all components * within the panel. * * @author Piotr Szachewicz */ public class AbstractPanel extends JPanel implements PropertyChangeListener { protected transient final Logger logger = Logger.getLogger(getClass()); /** * PropertyChangeSupport to fire property changes when needed. */ private PropertyChangeSupport propertyChangeSupport; /** * Constructor. * @param messageSource message Source capable of returning localized * messages */ public AbstractPanel() { super(); propertyChangeSupport = new PropertyChangeSupport(this); } public AbstractPanel(String panelTitle) { super(); propertyChangeSupport = new PropertyChangeSupport(this); setTitledBorder(panelTitle); } public Window getParentWindow() { Container container = this; while (!(container instanceof Window)) { if (container == null) return null; container = container.getParent(); } return (Window) container; } /** * Sets enabled to this panel and all it's children. * Clears all fields if enabled == false. * * @param enabled true or false */ public void setEnabledAll(boolean enabled) { setEnabledToChildren(this, enabled); } /** * Sets enabled to a component and all of it's children. * * @param component target component * @param enabled true or false * @param omit wheter to omit component */ private void setEnabledToChildren(Component component, boolean enabled) { component.setEnabled(enabled); if (component instanceof Container) { Component[] children = ((Container) component).getComponents(); for (Component child : children) { setEnabledToChildren(child, enabled); } } } /** * Puts a border around this panel with a given title. * @param label the title to be shown on the border */ protected void setTitledBorder(String label) { setTitledBorder(this, label); } protected static void setTitledBorder(JPanel panel, String label) { CompoundBorder cb = new CompoundBorder( new TitledBorder(label), new EmptyBorder(3,3,3,3) ); panel.setBorder(cb); } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } @Override public void propertyChange(PropertyChangeEvent evt) { } @Override protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { if (propertyChangeSupport != null) propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } public void validatePanel(ValidationErrors errors) { //do nothing } }