package org.limewire.ui.swing.friends; import java.awt.Color; import java.awt.event.ActionEvent; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import org.limewire.friend.api.FriendConnectionEvent; import org.limewire.friend.api.FriendRequest; import org.limewire.listener.EventListener; import org.limewire.listener.ListenerSupport; import org.limewire.listener.SwingEDTEvent; import org.limewire.ui.swing.action.AbstractAction; import org.limewire.ui.swing.components.Disposable; import org.limewire.ui.swing.components.HyperlinkButton; import org.limewire.ui.swing.util.BackgroundExecutorService; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; public class FriendRequestPanel extends JPanel implements Disposable { private final List<FriendRequest> pendingRequests; private EventListener<FriendConnectionEvent> connectionListener; private ListenerSupport<FriendConnectionEvent> connectionSupport; private JLabel requestLabel; @Inject public FriendRequestPanel() { GuiUtils.assignResources(this); setLayout(new MigLayout("nogrid, gap 0, insets 2 8" + " 8 8, fill")); setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); pendingRequests = new ArrayList<FriendRequest>(); JComponent yes = new HyperlinkButton(new AbstractAction(I18n.tr("Yes")) { @Override public void actionPerformed(ActionEvent e) { completeRequest(true); } }); JComponent no = new HyperlinkButton(new AbstractAction(I18n.tr("No")) { @Override public void actionPerformed(ActionEvent e) { completeRequest(false); } }); requestLabel = new JLabel(); add(requestLabel, "growx, wrap"); add(new JLabel(I18n.tr("Accept?")), "gapbefore push"); add(yes); add(new JLabel("/")); add(no); } @Inject void registerListener(ListenerSupport<FriendConnectionEvent> connectionSupport) { this.connectionSupport = connectionSupport; connectionListener = new EventListener<FriendConnectionEvent>() { @Override @SwingEDTEvent public void handleEvent(FriendConnectionEvent event) { switch(event.getType()) { case CONNECT_FAILED: case DISCONNECTED: close(); } } }; connectionSupport.addListener(connectionListener); } public void addRequest(FriendRequest request) { pendingRequests.add(request); ensureRequestVisible(); } private void ensureRequestVisible() { if(pendingRequests.size() > 0) { String start = "<html><img src='" + getURL("/org/limewire/ui/swing/mainframe/resources/icons/friends/friends_icon.png") + "' /> "; String end = "</html>"; requestLabel.setText(start + I18n.tr("{0} wants to be your friend.", pendingRequests.get(0).getFriendUsername()) + end); } else { close(); } } private static String getURL(String path) { URL resource = FriendRequestPanel.class.getResource(path); return resource != null ? resource.toExternalForm() : ""; } private void completeRequest(final boolean accept) { final FriendRequest request = pendingRequests.remove(0); BackgroundExecutorService.execute(new Runnable() { @Override public void run() { request.getDecisionHandler().handleDecision(request.getFriendUsername(), accept); } }); ensureRequestVisible(); } private void close() { setVisible(false); } @Override public void dispose() { connectionSupport.removeListener(connectionListener); } }