/**
* Copyright (c) 2009 Juwi MacMillan Group GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.juwimm.cms.content.panel;
import java.awt.event.ActionListener;
import java.util.Hashtable;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.event.*;
/**
* An abstract implementation of the {@link TreePanel} interface.<br>
* Two remaining methods must be implented by all extending classes:
* {@link #setCheckHash(Hashtable)} and {@link #setFieldsEditable(boolean)}.
*
* <p>Title: juwimm cms</p>
* <p><b>Copyright: JuwiMacMillan Group GmbH (c) 2002</b></p>
* @author <a href="mailto:s.kulawik@juwimm.com">Sascha-Matthias Kulawik</a>
* @version $Id$
*/
public abstract class AbstractTreePanel extends JPanel implements TreePanel {
private EventListenerList changelistener = new EventListenerList();
private ChangedDocumentListener docListener = new ChangedDocumentListener();
private CheckActionListener checkListener = new CheckActionListener();
private Hashtable checkhash = new Hashtable();
/** @see de.juwimm.cms.content.panel.TreePanel#setFieldsEditable(boolean) */
public abstract void setFieldsEditable(boolean editable);
/** @see de.juwimm.cms.content.panel.TreePanel#updateCheckHash() */
public abstract void updateCheckHash();
/** @see de.juwimm.cms.content.panel.TreePanel#getCheckHash() */
public Hashtable getCheckHash() {
return this.checkhash;
}
/** @see de.juwimm.cms.content.panel.TreePanel#setCheckHash(java.util.Hashtable) */
public void setCheckHash(Hashtable ch) {
this.checkhash = ch;
// TODO [CH] check if fireChangeListener() is still needed... a new Hashtable only means the visibilities have changed, not the content!
//fireChangeListener();
}
/** @see de.juwimm.cms.content.panel.TreePanel#setAllChecksEnabled(boolean) */
public void setAllChecksEnabled(boolean enabled) {
setAllElementsEnabled(getComponents(), enabled);
}
/** @see de.juwimm.cms.content.panel.TreePanel#addChangeListener(javax.swing.event.ChangeListener) */
public void addChangeListener(ChangeListener cl) {
changelistener.add(ChangeListener.class, cl);
}
/** @see de.juwimm.cms.content.panel.TreePanel#removeAllChangeListener() */
public void removeAllChangeListener() {
changelistener = new EventListenerList();
}
/**
* Returns the ChangedDocumentListener Object for using inside the Panel.
*
* @return
*/
public ChangedDocumentListener getChangedDocumentListener() {
return this.docListener;
}
/**
* Returns the {@link CheckActionListener} object that should be registered for all action events
* on check boxes inside this panel.
*
* @return the {@code CheckActionListener} object
*/
public CheckActionListener getCheckActionListener() {
return this.checkListener;
}
/**
* Returns true if this Panel contains any Clicked Fields.
* @return
*/
public boolean hasClicks() {
boolean ret = false;
if (this.checkhash != null) {
java.util.Iterator it = this.checkhash.values().iterator();
while (it.hasNext()) {
if (((Integer) it.next()).equals(new Integer(1))) {
ret = true;
break;
}
}
}
return ret;
}
/**
* Internal Helper-Procedure for setAllChecks
* @param comparr
* @param enabled
*/
private void setAllElementsEnabled(java.awt.Component[] comparr, boolean enabled) {
if (comparr != null) {
for (int i = 0; i < comparr.length; i++) {
try {
if (comparr[i] != null) {
if ((comparr[i] instanceof javax.swing.JCheckBox)) {
JComponent comp = (JComponent) comparr[i];
comp.setEnabled(enabled);
if (!enabled) {
((javax.swing.JCheckBox) comp).setSelected(false);
}
} else {
JComponent comp = (JComponent) comparr[i];
setAllElementsEnabled(comp.getComponents(), enabled);
}
}
} catch (Exception e) {
}
}
}
}
/**
* Returns a boolean value reflecting whether the Checkbox for the specified name
* should be checked or not.
* @param name the String used as key inside the {@code Hashtable}
* @return a boolean indicating whether the checkbox should be checked
*/
public boolean getCheckValueForName(String name) {
if (this.checkhash.get(name) != null) {
if (this.checkhash.get(name).equals(new Integer(1))) {
return true;
}
}
return false;
}
/**
* Fires the Event for calling all ChangeListener.
* FIXME [CH] die Listener für die Entscheidung: Datenbank-Speicherung notwendig?
*/
public void fireChangeListener() {
ChangeEvent ce = new ChangeEvent(this);
Object[] listeners = changelistener.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
((ChangeListener) listeners[i + 1]).stateChanged(ce);
}
}
/**
* Observer for content changes.
* Notifies the listener that a database update is needed.
*
* @author <a href="mailto:christiane.hausleiter@juwimm.com">Christiane Hausleiter</a>
*
*/
public class ChangedDocumentListener implements DocumentListener {
public void changedUpdate(DocumentEvent de) {
fireChangeListener();
}
public void insertUpdate(DocumentEvent de) {
fireChangeListener();
}
public void removeUpdate(DocumentEvent de) {
fireChangeListener();
}
}
/**
* An {@link ActionListener} implementation that listens for registering
* checking and unchecking events on check boxes within this panel.
*
* @author <a href="mailto:christiane.hausleiter@juwimm.com">Christiane Hausleiter</a>
*
*/
public class CheckActionListener implements ActionListener {
public void actionPerformed(java.awt.event.ActionEvent ae) {
updateCheckHash();
}
}
}