package org.limewire.ui.swing.friends.actions;
import java.awt.event.ActionEvent;
import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import org.jdesktop.application.Resource;
import org.limewire.concurrent.FutureEvent;
import org.limewire.core.settings.FriendSettings;
import org.limewire.friend.api.FriendConnection;
import org.limewire.friend.api.FriendConnectionEvent;
import org.limewire.friend.api.FriendPresence;
import org.limewire.listener.EventBean;
import org.limewire.listener.EventListener;
import org.limewire.listener.EventUtils;
import org.limewire.setting.evt.SettingEvent;
import org.limewire.setting.evt.SettingListener;
import org.limewire.ui.swing.action.AbstractAction;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.SwingUtils;
import com.google.inject.Inject;
/**
* Provides JMenuItems to be used for setting available or disabled status for
* the users. These items are backed by a button group and JCheckBoxMenuItems
*/
public class StatusActions {
@Resource private Icon available;
@Resource private Icon doNotDisturb;
private final Action availableAction;
private final Action doNotDisturbAction;
private final JCheckBoxMenuItem availableItem;
private final JCheckBoxMenuItem doNotDisturbItem;
private final EventBean<FriendConnectionEvent> friendConnectionEventBean;
private final ButtonGroup statusButtonGroup = new ButtonGroup();
@Inject
public StatusActions(final EventBean<FriendConnectionEvent> friendConnectionEventBean) {
this.friendConnectionEventBean = friendConnectionEventBean;
GuiUtils.assignResources(this);
availableAction = new AbstractAction(I18n.tr("&Available")) {
{
putValue(Action.SMALL_ICON, available);
setEnabled(false);
}
@Override
public void actionPerformed(ActionEvent e) {
FriendConnection friendConnection = EventUtils
.getSource(StatusActions.this.friendConnectionEventBean);
if (friendConnection != null && friendConnection.supportsMode()) {
friendConnection.setMode(FriendPresence.Mode.available).addFutureListener(
new EventListener<FutureEvent<Void>>() {
@Override
public void handleEvent(FutureEvent<Void> event) {
if (event.getType() == FutureEvent.Type.SUCCESS) {
FriendSettings.DO_NOT_DISTURB.setValue(false);
}
}
});
}
}
};
doNotDisturbAction = new AbstractAction(I18n.tr("&Do Not Disturb")) {
{
putValue(Action.SMALL_ICON, doNotDisturb);
setEnabled(false);
}
@Override
public void actionPerformed(ActionEvent e) {
FriendConnection friendConnection = EventUtils
.getSource(StatusActions.this.friendConnectionEventBean);
if (friendConnection != null && friendConnection.supportsMode()) {
friendConnection.setMode(FriendPresence.Mode.dnd).addFutureListener(
new EventListener<FutureEvent<Void>>() {
@Override
public void handleEvent(FutureEvent<Void> event) {
if (event.getType() == FutureEvent.Type.SUCCESS) {
FriendSettings.DO_NOT_DISTURB.setValue(true);
}
}
});
}
}
};
this.availableItem = new JCheckBoxMenuItem(availableAction);
this.doNotDisturbItem = new JCheckBoxMenuItem(doNotDisturbAction);
updateSignedInStatus();
FriendSettings.DO_NOT_DISTURB.addSettingListener(new SettingListener() {
@Override
public void settingChanged(SettingEvent evt) {
SwingUtils.invokeNowOrLater(new Runnable() {
@Override
public void run() {
updateSignedInStatus();
}
});
}
});
}
public void updateSignedInStatus() {
FriendConnection friendConnection = EventUtils
.getSource(StatusActions.this.friendConnectionEventBean);
boolean signedIn = friendConnection != null && friendConnection.isLoggedIn()
&& friendConnection.supportsMode();
if (signedIn) {
statusButtonGroup.remove(availableItem);
statusButtonGroup.remove(doNotDisturbItem);
statusButtonGroup.add(availableItem);
statusButtonGroup.add(doNotDisturbItem);
boolean dndBool = FriendSettings.DO_NOT_DISTURB.getValue();
availableItem.setSelected(!dndBool);
doNotDisturbItem.setSelected(dndBool);
} else {
// removing from button group so that no items are selected while
// they are disabled.
statusButtonGroup.remove(availableItem);
statusButtonGroup.remove(doNotDisturbItem);
// do not show selections when logged out
availableItem.setSelected(false);
doNotDisturbItem.setSelected(false);
}
availableAction.setEnabled(signedIn);
doNotDisturbAction.setEnabled(signedIn);
}
public JMenuItem getAvailableMenuItem() {
return availableItem;
}
public JMenuItem getDnDMenuItem() {
return doNotDisturbItem;
}
}