package org.openslx.dozmod.gui.control; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.UIManager; import org.openslx.bwlp.thrift.iface.UserInfo; import org.openslx.dozmod.gui.helper.ColorUtil; import org.openslx.dozmod.util.FormatHelper; import org.openslx.dozmod.util.DesktopEnvironment; /** * A label for displaying a {@link UserInfo} object. Supports a callback event * for when the users clicks the label. */ @SuppressWarnings("serial") public class PersonLabel extends QLabel { private UserInfo user = null; private PersonLabelClickEvent callback = defaultCallback; private static final Color linkColor = ColorUtil.add(UIManager.getColor("Label.foreground"), new Color(0, 0, .9f)); public PersonLabel() { this(defaultCallback); } public PersonLabel(PersonLabelClickEvent cb) { this.callback = cb; addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (user != null && callback != null && e.getButton() == MouseEvent.BUTTON1 && getX() >= 0 && getY() >= 0) { Dimension size = getSize(); if (size.width > e.getX() && size.height > e.getY()) callback.clicked(user); } } }); } /** * Set the callback to call when the user clicks this label using the left * mouse button. Only called if a user is set. * * @param cb The {@link PersonLabelClickEvent} to call */ public void setCallback(PersonLabelClickEvent cb) { this.callback = cb; } /** * Set the user to display. */ public void setUser(UserInfo user) { this.user = user; // Text if (user == null) { setText(null); } else { setText(FormatHelper.userName(user)); } // Tooltip, color, cursor if (user == null || user.eMail == null || user.eMail.isEmpty()) { setToolTipText(null); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); setForeground(UIManager.getColor("Label.foreground")); } else { setToolTipText("Klicken, um eine Mail an diese Person zu senden"); setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); setForeground(linkColor); } } /** * The callback for when this label contains a user and gets clicked. */ public static interface PersonLabelClickEvent { public void clicked(UserInfo user); } private static final PersonLabelClickEvent defaultCallback = new PersonLabelClickEvent() { @Override public void clicked(UserInfo user) { if (user == null || user.eMail == null) return; DesktopEnvironment.sendMail(user.eMail, null); } }; }