/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.gui.model;
import net.codjo.model.Period;
import net.codjo.model.PeriodHome;
import net.codjo.persistent.Reference;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
/**
* Composant graphique synchronis� avec la p�riode courante de l'application.
*
* @author $Author: blazart $
* @version $Revision: 1.3 $
*
*
*/
public class PeriodComboBox extends javax.swing.JComboBox {
private InternalListener listener = new InternalListener();
private DefaultComboBoxModel model;
private PeriodHome periodHome;
/**
* Constructor.
*/
public PeriodComboBox() {}
/**
* Constructor.
*
* @param periodHome Le PeriodHome
*/
public PeriodComboBox(PeriodHome periodHome) {
setPeriodHome(periodHome);
}
/**
* Positionne le periodHome.
*
* @param periodHome Description of Parameter
*/
public void setPeriodHome(PeriodHome periodHome) {
this.periodHome = periodHome;
updateVisiblePeriodList();
setSelectedItem(this.periodHome.getCurrentPeriod());
this.addActionListener(listener);
this.periodHome.addPropertyChangeListener(listener);
}
/**
* Reconstruit le contenu de la comboBox avec les periodes.
*/
private void updateVisiblePeriodList() {
try {
List list = periodHome.getAllObjects();
List periods = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Reference ref = (Reference)list.get(i);
periods.add(ref.getObject());
}
model = new DefaultComboBoxModel(periods.toArray());
setModel(model);
}
catch (net.codjo.persistent.PersistenceException ex) {
ex.printStackTrace();
removeActionListener(listener);
periodHome.removePropertyChangeListener(listener);
setEnabled(false);
}
}
/**
* Indique si la period appartient au comboBox.
*
* @param period la periode
*
* @return 'true' si la periode est contenu dans la comboBox.
*/
private boolean contains(Object period) {
return model.getIndexOf(period) >= 0;
}
/**
* Internal Listener au ComboBox.
*
* <p>
* Ce listener ecoute les changements sur le ComboBox, et de la periode courante.
* </p>
*
* @author $Author: blazart $
* @version $Revision: 1.3 $
*/
class InternalListener implements ActionListener, PropertyChangeListener {
/**
* Ecoutes le changement de la p�riode courante.
*
* @param evt
*/
public void propertyChange(PropertyChangeEvent evt) {
if (isVisible() == false) {
return;
}
removeActionListener(this);
if (contains(evt.getNewValue()) == false) {
updateVisiblePeriodList();
}
setSelectedItem(evt.getNewValue());
addActionListener(this);
}
/**
* Ecoutes les changements sur le comboBox.
*
* @param parm1
*/
public void actionPerformed(ActionEvent parm1) {
if (isVisible() == false) {
return;
}
Period period = (Period)getSelectedItem();
if (period != null) {
periodHome.setCurrentPeriod(period);
}
}
}
}