package org.waarp.xample; /* * Copyright (c) 2002 Felix Golubov */ import java.util.*; import java.util.List; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import com.fg.util.FLoader; import com.fg.util.FadingFilter; /** * A simple button with drop-down menu for the XAmple application. * * @author Felix Golubov * @version 1.0 */ public class FHistoryButton extends JComponent implements ItemSelectable, ActionListener { class Btn extends JToggleButton implements MouseListener, PopupMenuListener { boolean b = false; public Btn() { super(); setFocusPainted(false); this.addMouseListener(this); } public Dimension getMinimumSize() { Dimension d = super.getMinimumSize(); return new Dimension(14, 27); } public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); return new Dimension(14, 27); } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { if (!isEnabled()) return; if (popupMenu.isShowing()) b = true; else popupMenu.show(FHistoryButton.this, 0, FHistoryButton.this.getSize().height); } public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void popupMenuCanceled(PopupMenuEvent e) {} public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { if (b) b = false; else setSelected(false); } public void popupMenuWillBecomeVisible(PopupMenuEvent e) { } } JToggleButton leftButton = new JToggleButton(); Btn rightButton = new Btn(); JPopupMenu popupMenu = new JPopupMenu(); ArrayList items = new ArrayList(); ArrayList itemListeners = new ArrayList(1); ArrayList actionListeners = new ArrayList(1); public FHistoryButton(ImageIcon icon, String leftTipText, String rightTipText) { super(); leftButton.setFocusPainted(false); setIcon(icon); ImageIcon icoArrow = FLoader.getIcon(this, "DropDown.gif"); rightButton.setIcon(icoArrow); rightButton.setDisabledIcon(FadingFilter.fade(icoArrow)); leftButton.setToolTipText(leftTipText); rightButton.setToolTipText(rightTipText); popupMenu.addPopupMenuListener(rightButton); leftButton.addActionListener(this); setBorder(BorderFactory.createLineBorder(Color.gray)); setLayout(new BorderLayout()); add(leftButton, BorderLayout.CENTER); add(rightButton, BorderLayout.EAST); setPreferredSize(new Dimension(44 + 14, 27)); setMinimumSize(new Dimension(44 + 14, 27)); setMaximumSize(new Dimension(44 + 14, 27)); setItems(null); } public Insets getInsets() { return new Insets(2, 2, 1, 1); } public void setIcon(ImageIcon icon) { leftButton.setIcon(icon); if (icon != null) leftButton.setDisabledIcon(FadingFilter.fade(icon)); } public void setItems(List items) { popupMenu.removeAll(); this.items.clear(); if (items != null) { for (int i = 0; i < items.size(); i++) { Object item = items.get(i); if (item == null) continue; this.items.add(item); JMenuItem mi = new JMenuItem(item.toString()); mi.addActionListener(this); popupMenu.add(mi); } } if (this.items.size() == 0) { JMenuItem mi = new JMenuItem("< Empty >"); mi.setEnabled(false); popupMenu.add(mi); return; } } public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof JMenuItem) { int index = popupMenu.getComponentIndex((Component)e.getSource()); if (index >= 0 && index < items.size()) { ItemEvent ie = new ItemEvent(this, index, items.get(index), ItemEvent.SELECTED); for (int i = 0; i < itemListeners.size(); i++) { ItemListener l = (ItemListener)itemListeners.get(i); l.itemStateChanged(ie); } } } else if (e.getSource() == leftButton) { leftButton.setSelected(false); for (int i = 0; i < actionListeners.size(); i++) { ActionListener l = (ActionListener)actionListeners.get(i); ActionEvent ae = new ActionEvent(this, e.getID(), e.getActionCommand()); l.actionPerformed(ae); } } } public void addItemListener(ItemListener l) { if (!itemListeners.contains(l)) itemListeners.add(l); } public Object[] getSelectedObjects() { return null; } public void removeItemListener(ItemListener l) { itemListeners.remove(l); } public void addActionListener(ActionListener l) { if (!actionListeners.contains(l)) actionListeners.add(l); } public void removeActionListener(ActionListener l) { actionListeners.remove(l); } public void setEnabled(boolean enabled) { super.setEnabled(enabled); leftButton.setEnabled(enabled); rightButton.setEnabled(enabled); } public void updateUI() { super.updateUI(); SwingUtilities.updateComponentTreeUI(popupMenu); } }