package org.limewire.ui.swing.components; import java.awt.event.ActionListener; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.SwingConstants; import org.limewire.ui.swing.action.ActionKeys; import org.limewire.ui.swing.listener.ActionHandListener; import org.limewire.ui.swing.listener.MouseActionListener; /** * A label that has a clickable text. */ public class ActionLabel extends JLabel { private MouseListener urlListener; private PropertyChangeListener listener = null; private Action currentAction; private final List<ActionListener> actionListeners = new CopyOnWriteArrayList<ActionListener>(); public ActionLabel(Action action) { this(action, false); } /** * Constructs a new clickable label. */ public ActionLabel(Action action, boolean showHand) { setAction(action, showHand); setHorizontalTextPosition(SwingConstants.RIGHT); setHorizontalAlignment(SwingConstants.LEFT); } public void addActionListener(ActionListener listener) { actionListeners.add(listener); } public void removeActionListener(ActionListener listener) { actionListeners.remove(listener); } public void setAction(Action action, boolean showHand) { // remove old listener Action oldAction = getAction(); if (oldAction != null) { oldAction.removePropertyChangeListener(getListener()); } // add listener currentAction = action; currentAction.addPropertyChangeListener(getListener()); if(showHand) { installListener(new ActionHandListener(new ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { currentAction.actionPerformed(e); for(ActionListener listener : actionListeners) { listener.actionPerformed(e); } } })); } else { installListener(new MouseActionListener(new ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { currentAction.actionPerformed(e); for(ActionListener listener : actionListeners) { listener.actionPerformed(e); } } })); } updateLabel(currentAction, null); } public Action getAction(){ return currentAction; } private PropertyChangeListener getListener() { if (listener == null) { listener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { updateLabel(null, evt); } }; } return listener; } /* * Update label text based on action event */ public void updateLabel(Action action, PropertyChangeEvent evt) { if(evt == null) { assert action != null; String display = (String) currentAction.getValue(Action.NAME); setIcon((Icon) currentAction.getValue(Action.SMALL_ICON)); setToolTipText((String) currentAction.getValue(Action.SHORT_DESCRIPTION)); setVisible(!Boolean.FALSE.equals(currentAction.getValue(ActionKeys.VISIBLE))); if(display != null) { setText(display); } } else { assert action == null; String id = evt.getPropertyName(); if(id.equals(Action.NAME)) { setText((String)evt.getNewValue()); } else if(id.equals(Action.SMALL_ICON)) { setIcon((Icon)evt.getNewValue()); } else if(id.equals(Action.SHORT_DESCRIPTION)) { setToolTipText((String)evt.getNewValue()); } else if(id.equals(ActionKeys.VISIBLE)) { setVisible(!Boolean.FALSE.equals(evt.getNewValue())); } } } private void installListener(MouseListener listener) { if (urlListener != null) { removeMouseListener(urlListener); } urlListener = listener; addMouseListener(urlListener); } }