/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.ui.widget; /******************************************************************************* Copyright (c) : EIG (Environmental Informatics Group) http://www.htw-saarland.de/eig Prof. Dr. Reiner Guettler Prof. Dr. Ralf Denzer HTWdS Hochschule fuer Technik und Wirtschaft des Saarlandes Goebenstr. 40 66117 Saarbruecken Germany Programmers : Pascal Project : WuNDA 2 Version : 1.0 Purpose : Created : 01.11.1999 History : *******************************************************************************/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /* IMPORT STRINGLOADER */ /** * Eine JComboBox mit JCheckBoxes als Listeneintr\u00E4ge. Ueber die CheckBox "Alle" koennen alle Eintraege an- bzw. * abgewaehlt werden. * * @author Pascal Dihé * @version 1.0 * @see javax.swing.JCheckBox; * @see javax.swing.JComboBox; */ public class CheckBoxComboBox extends JComboBox implements ActionListener { //~ Instance fields -------------------------------------------------------- // protected boolean allSelected = false; protected boolean modelChanged = false; protected CheckBoxModel model; //~ Constructors ----------------------------------------------------------- /** * Creates a new CheckBoxComboBox object. */ public CheckBoxComboBox() { super(); model = new CheckBoxModel(); this.setModel(model); this.initCheckBoxComboBox(); } /** * Konstruiert eine neue CheckBoxComboBox "Alle" koennen alle Eintraege an- bzw. abgewaehlt werden. * * @param themes Ein String mit den Namen fuer die Checkboxes. * @param selectAll Wenn true werden alle Eintrage zu Beginn selektiert. */ public CheckBoxComboBox(final String[] themes, final boolean selectAll) { super(); model = new CheckBoxModel(themes, selectAll); model.allSelected = selectAll; this.setModel(model); this.initCheckBoxComboBox(); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! */ protected void initCheckBoxComboBox() { modelChanged = false; this.setRenderer(new CheckBoxListCellRenderer()); this.addActionListener(this); // Damit das PopupWindow richtig angezeigt wird, wenn die // CheckBoxComboBox direkt zu einer HeavyWight Komponente, einen // Swing Toplevel Komponente oder einem LayPanel hinzugefuegt wird. this.setLightWeightPopupEnabled(false); } /** * Liefert ein String-Array mit den Namen aller ausgewaehlten CheckBoxes. * * @return DOCUMENT ME! */ public synchronized String[] getSelectedItems() { int selected = 0; final String[] tmp = new String[(this.getItemCount() - 1)]; // Die Ausgewaehlten Elemente (ausser "Alle") in ein // String Array kopieren for (int i = 1; i < this.getItemCount(); i++) { final JCheckBox checkBox = (JCheckBox)getItemAt(i); if (checkBox.isSelected()) { tmp[selected] = checkBox.getText(); selected++; } } if (selected == 0) { return new String[0]; } final String[] result = new String[selected]; System.arraycopy(tmp, 0, result, 0, selected); return result; } /** * Liefert ein int-Array mit den positionen aller ausgewaehlten CheckBoxes. * * @return DOCUMENT ME! */ public synchronized int[] getSelectedIndices() { int selected = 0; final int[] tmp = new int[(this.getItemCount() - 1)]; // Die Ausgewaehlten Elemente (ausser "Alle") in ein // int Array kopieren for (int i = 1; i < this.getItemCount(); i++) { final JCheckBox checkBox = (JCheckBox)getItemAt(i); if (checkBox.isSelected()) { tmp[selected] = i - 1; selected++; // NavigatorLogger.printMessage(tmp[selected]); } } if (selected == 0) { return new int[0]; } final int[] result = new int[selected]; System.arraycopy(tmp, 0, result, 0, selected); return result; } /** * Musste uerbschrieben werden, da sonst bei jeder Aenderung des Models auch ein ActionEvent ausgeloest wird. * * @param model DOCUMENT ME! */ public void setModel(final CheckBoxModel model) { this.model = model; modelChanged = true; super.setModel(model); this.validate(); } /** * Das erste selektierte Objekt (CheckBox) wird angezeigt. */ public void showSelectedIndex() { final JCheckBox checkBox = (JCheckBox)model.getElementAt(model.firstSelectedIndex); if ((checkBox != null) && checkBox.isSelected()) { setSelectedIndex(model.firstSelectedIndex); setSelectedIndex(model.firstSelectedIndex); } } // ACTION LISTENER ========================================================= @Override public void actionPerformed(final ActionEvent e) { JCheckBox selectedCheckBox = (JCheckBox)getSelectedItem(); JCheckBox checkBox; if (selectedCheckBox == null) { return; } if (modelChanged == true) { modelChanged = false; return; } // Wenn CheckBox "Alle" markiert wird, alle anderen Eintraege // anwaehlen, bzw. abwaehlen if (selectedCheckBox.getText().equals("Alle")) { for (int i = 0; i < getItemCount(); i++) { checkBox = (JCheckBox)getItemAt(i); checkBox.setSelected(!model.allSelected); } model.allSelected = !model.allSelected; } else { selectedCheckBox.doClick(); int j = 1; for (int i = 1; i < this.getItemCount(); i++) { checkBox = (JCheckBox)getItemAt(i); if (checkBox.isSelected()) { j++; } } // NavigatorLogger.printMessage(j); // NavigatorLogger.printMessage("getItemCount()" + this.getItemCount()); if (j == this.getItemCount()) { checkBox = (JCheckBox)getItemAt(0); checkBox.setSelected(true); model.allSelected = true; } else { // Die CheckBox "Alle" zuruecksetzen selectedCheckBox = (JCheckBox)getItemAt(0); selectedCheckBox.setSelected(false); model.allSelected = false; } } // String[] st = getSelectedItems(); // for(int i = 0; i < st.length; i++) // NavigatorLogger.printMessage(st[i]); // L\u00F6st einen neuen ItemEvent aus fireItemStateChanged(new ItemEvent(this, 0, selectedCheckBox, ItemEvent.SELECTED)); } } /** * Ein neuer ListCellRenderer und die JCheckBoxes in der JList anzuzeigen.<br> * Wird benoetigt, da standardmaessig nur eine String-Representation des Objekts in der JList angezeigt wird. * * @version $Revision$, $Date$ */ class CheckBoxListCellRenderer extends JCheckBox implements ListCellRenderer { //~ Constructors ----------------------------------------------------------- /** * Creates a new CheckBoxListCellRenderer object. */ public CheckBoxListCellRenderer() { super(); this.setOpaque(true); } //~ Methods ---------------------------------------------------------------- /* * getListCellRendererComponent(...) gibt nun eine Referenz auf die JCheckBox in der JList zurueck. */ @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { if ((value == null) || !(value instanceof JCheckBox)) { // _TA_return new JLabel("nicht verfuegbar"); // return new JLabel(StringLoader.getString("STL@notAvailable")); return new JLabel(); } final JCheckBox checkBox = (JCheckBox)value; list.setToolTipText(checkBox.getToolTipText()); // NavigatorLogger.printMessage("CheckBoxToolTip: " + checkBox.getToolTipText()); if (isSelected) { checkBox.setBackground(list.getSelectionBackground()); checkBox.setForeground(list.getSelectionForeground()); } else { checkBox.setBackground(list.getBackground()); checkBox.setForeground(list.getForeground()); } return checkBox; } }