/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.tools.metaobjectrenderer;
import Sirius.navigator.ui.RequestsFullSizeComponent;
import java.beans.PropertyChangeListener;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JComponent;
import javax.swing.JPanel;
import de.cismet.cids.dynamics.Disposable;
import de.cismet.cids.dynamics.DisposableCidsBeanStore;
/**
* DOCUMENT ME!
*
* @author srichter
* @version $Revision$, $Date$
*/
public class SelfDisposingPanel extends JPanel {
//~ Static fields/initializers ---------------------------------------------
private static final int CHECK_INTERVAL = 7500;
//~ Instance fields --------------------------------------------------------
private final transient Disposable disposableBeanStore;
private final transient Timer checkTimer;
private transient PropertyChangeListener strongListenerReference;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new SelfDisposingPanel object.
*/
public SelfDisposingPanel() {
this((DisposableCidsBeanStore)null);
}
/**
* Creates a new SelfDisposingPanel object.
*
* @param disposableBeanStore DOCUMENT ME!
*/
public SelfDisposingPanel(final JComponent disposableBeanStore) {
this((disposableBeanStore instanceof Disposable) ? (Disposable)disposableBeanStore : (Disposable)null);
}
/**
* Creates a new SelfDisposingPanel object.
*
* @param disposableBeanStore DOCUMENT ME!
*/
public SelfDisposingPanel(final Disposable disposableBeanStore) {
this.disposableBeanStore = disposableBeanStore;
if (disposableBeanStore == null) {
checkTimer = null;
} else {
checkTimer = new Timer();
}
setOpaque(false);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
public void startChecking() {
if (checkTimer != null) {
checkTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO: this should not only check for the parent but rather if the component is in the
// windows hierarchy!
if (getParent() == null) {
SelfDisposingPanel.this.disposableBeanStore.dispose();
SelfDisposingPanel.this.checkTimer.cancel();
}
}
}, CHECK_INTERVAL, CHECK_INTERVAL);
}
}
/**
* DOCUMENT ME!
*
* @param strongListenerReference DOCUMENT ME!
*/
public void setStrongListenerReference(final PropertyChangeListener strongListenerReference) {
this.strongListenerReference = strongListenerReference;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PropertyChangeListener getStrongListenerReference() {
return strongListenerReference;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean requestsFullSize() {
return disposableBeanStore instanceof RequestsFullSizeComponent;
}
}