package org.limewire.ui.swing.menu; import javax.swing.JSeparator; import org.limewire.friend.api.FriendConnection; import org.limewire.friend.api.FriendConnectionEvent; import org.limewire.listener.EventBean; import org.limewire.listener.EventListener; import org.limewire.listener.EventUtils; import org.limewire.listener.ListenerSupport; import org.limewire.listener.SwingEDTEvent; import org.limewire.ui.swing.action.MnemonicMenu; import org.limewire.ui.swing.friends.actions.AddFriendAction; import org.limewire.ui.swing.friends.actions.BrowseFriendsAction; import org.limewire.ui.swing.friends.actions.LoginAction; import org.limewire.ui.swing.friends.actions.LogoutAction; import org.limewire.ui.swing.friends.actions.StatusActions; import org.limewire.ui.swing.friends.login.AutoLoginService; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; import com.google.inject.Provider; class FriendsMenu extends MnemonicMenu { private final EventBean<FriendConnectionEvent> friendConnectionEventBean; private final Provider<AutoLoginService> autoLoginServiceProvider; private final Provider<ShareListMenu> shareMenuProvider; private final Provider<BrowseFriendsAction> browseFriendsActionProvider; private final Provider<StatusActions> statusActionsProvider; private final Provider<AddFriendAction> addFriendActionProvider; private final Provider<LoginAction> loginActionProvider; private final Provider<LogoutAction> logoutActionProvider; @Inject public FriendsMenu(EventBean<FriendConnectionEvent> friendConnectionEventBean, Provider<AutoLoginService> autoLoginServiceProvider, Provider<ShareListMenu> shareMenuProvider, Provider<BrowseFriendsAction> browseFriendsActionProvider, Provider<StatusActions> statusActionsProvider, Provider<AddFriendAction> addFriendActionProvider, Provider<LoginAction> loginActionProvider, Provider<LogoutAction> logoutActionProvider) { super(I18n.tr("&Friends")); this.friendConnectionEventBean = friendConnectionEventBean; this.autoLoginServiceProvider = autoLoginServiceProvider; this.shareMenuProvider = shareMenuProvider; this.browseFriendsActionProvider = browseFriendsActionProvider; this.statusActionsProvider = statusActionsProvider; this.addFriendActionProvider = addFriendActionProvider; this.loginActionProvider = loginActionProvider; this.logoutActionProvider = logoutActionProvider; } @Inject void register(ListenerSupport<FriendConnectionEvent> event) { event.addListener(new EventListener<FriendConnectionEvent>() { @Override @SwingEDTEvent public void handleEvent(FriendConnectionEvent event) { switch (event.getType()) { case CONNECTED: case CONNECTING: case CONNECT_FAILED: case DISCONNECTED: if (isPopupMenuVisible()) { removeAll(); createMenuItems(); // needed so that the menu does not stay squished after we add in all // the new items. setPopupMenuVisible(false); setPopupMenuVisible(true); } break; } } }); } @Override public void createMenuItems() { FriendConnection friendConnection = EventUtils.getSource(friendConnectionEventBean); boolean signedIn = friendConnection != null && friendConnection.isLoggedIn(); boolean supportsAddRemoveFriend = signedIn && friendConnection != null && friendConnection.supportsAddRemoveFriend(); boolean supportModeChanges = signedIn && friendConnection != null && friendConnection.supportsMode(); boolean loggingIn = autoLoginServiceProvider.get().isAttemptingLogin() || (friendConnection != null && friendConnection.isLoggingIn()); add(browseFriendsActionProvider.get()).setEnabled(signedIn); add(shareMenuProvider.get()); if (supportsAddRemoveFriend) { add(new JSeparator()); add(addFriendActionProvider.get()); } if (supportModeChanges) { add(new JSeparator()); StatusActions statusActions = statusActionsProvider.get(); add(statusActions.getAvailableMenuItem()); add(statusActions.getDnDMenuItem()); } add(new JSeparator()); if (!signedIn) { add(loginActionProvider.get()).setEnabled(!loggingIn); } else { add(logoutActionProvider.get()); } } }