/*
* Copyright (c) 2007-2012 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.buddies.internal.ui.actions;
import org.eclipse.net4j.buddies.IBuddySession;
import org.eclipse.net4j.buddies.ISessionManager;
import org.eclipse.net4j.buddies.common.IBuddy.State;
import org.eclipse.net4j.buddies.internal.ui.messages.Messages;
import org.eclipse.net4j.internal.buddies.Self;
import org.eclipse.net4j.ui.shared.SharedIcons;
import org.eclipse.net4j.util.ui.actions.SafeAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import java.text.MessageFormat;
/**
* @author Eike Stepper
*/
public class StateAction extends SafeAction
{
private State state;
public StateAction(String text, State state, String key)
{
super(text, Action.AS_RADIO_BUTTON);
setToolTipText(MessageFormat.format(Messages.getString("StateAction_0"), text.toLowerCase())); //$NON-NLS-1$
setImageDescriptor(SharedIcons.getDescriptor(key));
this.state = state;
}
public void updateState()
{
IBuddySession session = ISessionManager.INSTANCE.getSession();
setEnabled(session != null);
setChecked(session != null && session.getSelf().getState() == state);
}
@Override
protected void safeRun() throws Exception
{
IBuddySession session = ISessionManager.INSTANCE.getSession();
if (session != null && isChecked())
{
Self self = (Self)session.getSelf();
self.setState(state);
}
}
public static class DropDownAction extends Action implements IMenuCreator
{
private Menu fMenu;
private StateAction availableAction = new AvailableAction();
private StateAction lonesomeAction = new LonesomeAction();
private StateAction awayAction = new AwayAction();
private StateAction doNotDisturbAction = new DoNotDisturbAction();
public DropDownAction()
{
setText(Messages.getString("StateAction_2")); //$NON-NLS-1$
setMenuCreator(this);
}
public void dispose()
{
if (fMenu != null)
{
fMenu.dispose();
fMenu = null;
}
}
public void updateState()
{
availableAction.updateState();
lonesomeAction.updateState();
awayAction.updateState();
doNotDisturbAction.updateState();
IBuddySession session = ISessionManager.INSTANCE.getSession();
if (session != null)
{
setEnabled(true);
State state = session.getSelf().getState();
switch (state)
{
case AVAILABLE:
setImageDescriptor(availableAction.getImageDescriptor());
break;
case LONESOME:
setImageDescriptor(lonesomeAction.getImageDescriptor());
break;
case AWAY:
setImageDescriptor(awayAction.getImageDescriptor());
break;
case DO_NOT_DISTURB:
setImageDescriptor(doNotDisturbAction.getImageDescriptor());
break;
}
}
else
{
setImageDescriptor(awayAction.getImageDescriptor());
setEnabled(false);
}
}
public Menu getMenu(Control parent)
{
if (fMenu != null)
{
fMenu.dispose();
}
fMenu = new Menu(parent);
addActionToMenu(fMenu, availableAction);
addActionToMenu(fMenu, lonesomeAction);
addActionToMenu(fMenu, awayAction);
addActionToMenu(fMenu, doNotDisturbAction);
return fMenu;
}
public Menu getMenu(Menu parent)
{
return null;
}
@Override
public void run()
{
}
protected void addActionToMenu(Menu parent, Action action)
{
ActionContributionItem item = new ActionContributionItem(action);
item.fill(parent, -1);
}
}
public static final class AvailableAction extends StateAction
{
public AvailableAction()
{
super(Messages.getString("StateAction_3"), State.AVAILABLE, SharedIcons.OBJ_BUDDY); //$NON-NLS-1$
}
}
public static final class LonesomeAction extends StateAction
{
public LonesomeAction()
{
super(Messages.getString("StateAction_4"), State.LONESOME, SharedIcons.OBJ_BUDDY_LONESOME); //$NON-NLS-1$
}
}
public static final class AwayAction extends StateAction
{
public AwayAction()
{
super(Messages.getString("StateAction_5"), State.AWAY, SharedIcons.OBJ_BUDDY_AWAY); //$NON-NLS-1$
}
}
public static final class DoNotDisturbAction extends StateAction
{
public DoNotDisturbAction()
{
super(Messages.getString("StateAction_6"), State.DO_NOT_DISTURB, SharedIcons.OBJ_BUDDY_DO_NOT_DISTURB); //$NON-NLS-1$
}
}
}