package org.limewire.ui.swing.friends.chat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JPopupMenu;
import org.limewire.core.api.library.SharedFileList;
import org.limewire.core.api.library.SharedFileListManager;
import org.limewire.ui.swing.action.AbstractAction;
import org.limewire.ui.swing.library.LibraryMediator;
import org.limewire.ui.swing.library.ShareListIcons;
import org.limewire.ui.swing.search.FriendPresenceActions;
import org.limewire.ui.swing.util.I18n;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Popup menu for a friend in the chat window.
*/
class ChatPopupMenu extends JPopupMenu {
private final Provider<FriendPresenceActions> remoteHostActions;
private final Provider<SharedFileListManager> sharedFileListManager;
private final Provider<LibraryMediator> library;
private final Provider<ChatFrame> chatFrame;
private final ChatFriend chatFriend;
@Inject
public ChatPopupMenu(Provider<ChatFriendList> chatFriendList,
Provider<FriendPresenceActions> remoteHostActions,
Provider<SharedFileListManager> sharedFileListManager,
Provider<LibraryMediator> library, Provider<ChatFrame> chatFrame) {
this.remoteHostActions = remoteHostActions;
this.sharedFileListManager = sharedFileListManager;
this.library = library;
this.chatFrame = chatFrame;
chatFriend = chatFriendList.get().getSelectedFriend();
init();
}
private void init() {
if (chatFriend.isChatting()) {
add(createShareListSubMenu());
addSeparator();
add(new BrowseFiles());
addSeparator();
add(new CloseChat());
} else {
add(new OpenChat());
addSeparator();
add(createShareListSubMenu());
addSeparator();
add(new BrowseFiles());
}
}
/**
* Performs a browse host on the selected friend. This is
* only enabled if the friend is on LW and is browseable.
*/
class BrowseFiles extends AbstractAction {
public BrowseFiles() {
super(I18n.tr("Browse Files"));
setEnabled(chatFriend.isSignedInToLimewire());
}
@Override
public void actionPerformed(ActionEvent e) {
remoteHostActions.get().viewFriendLibrary(chatFriend.getFriend());
}
}
/**
* Closes the current chat with the selected friend.
*/
private class CloseChat extends AbstractAction {
public CloseChat() {
super(I18n.tr("Close Conversation"));
}
@Override
public void actionPerformed(ActionEvent e) {
chatFrame.get().closeConversation(chatFriend);
}
}
/**
* Starts a new chat with the selected friend.
*/
private class OpenChat extends AbstractAction {
public OpenChat() {
super(I18n.tr("Open Conversation"));
}
@Override
public void actionPerformed(ActionEvent e) {
chatFrame.get().selectOrStartConversation(chatFriend);
}
}
/**
* Creates a new Share List in the Library and adds this friend to that list.
*/
private class ShareNewList extends AbstractAction {
public ShareNewList() {
super(I18n.tr("Share New List"));
}
@Override
public void actionPerformed(ActionEvent e) {
final int id = sharedFileListManager.get().createNewSharedFileList(I18n.tr("Untitled"));
for(SharedFileList list : sharedFileListManager.get().getModel()) {
if(list.getId() == id) {
list.addFriend(chatFriend.getID());
library.get().selectAndRenameSharedList(list);
}
}
}
}
private JMenu createShareListSubMenu() {
JMenu shareListMenu = new JMenu(I18n.tr("Share List"));
for (SharedFileList list : sharedFileListManager.get().getModel()) {
if(list.isPublic()){//skip the public share list
continue;
}
shareListMenu.add(new AddRemoveCheckBoxMenuItem(chatFriend.getID(), list));
}
shareListMenu.addSeparator();
shareListMenu.add(new ShareNewList());
return shareListMenu;
}
/**
* Check box in the Share List menu, if the list is shared with the selected friend,
* this will be checked.
*/
private class AddRemoveCheckBoxMenuItem extends JCheckBoxMenuItem {
public AddRemoveCheckBoxMenuItem(final String friendID, final SharedFileList shareList) {
super(shareList.getCollectionName(), new ShareListIcons().getListIcon(shareList));
setSelected(shareList.getFriendIds().contains(friendID));
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(isSelected()){
shareList.addFriend(friendID);
} else {
shareList.removeFriend(friendID);
}
setIcon(new ShareListIcons().getListIcon(shareList));
}
});
}
}
}