package eu.jucy.gui.itemhandler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.menus.IWorkbenchContribution;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.services.IServiceLocator;
import eu.jucy.gui.Application;
import eu.jucy.gui.IImageKeys;
import eu.jucy.gui.itemhandler.UserHandlers.AddToFavouritesHandler;
import eu.jucy.gui.itemhandler.UserHandlers.BrowseFilelistHandler;
import eu.jucy.gui.itemhandler.UserHandlers.CopyNickToClipboardHandler;
import eu.jucy.gui.itemhandler.UserHandlers.GetFilelistHandler;
import eu.jucy.gui.itemhandler.UserHandlers.GrantExtraSlotHandler;
import eu.jucy.gui.itemhandler.UserHandlers.MatchQueueHandler;
import eu.jucy.gui.itemhandler.UserHandlers.RemoveFromFavouritesHandler;
import eu.jucy.gui.itemhandler.UserHandlers.RemoveUserFromQueueHandler;
import eu.jucy.gui.itemhandler.UserHandlers.RevokeSlotHandler;
import eu.jucy.gui.itemhandler.UserHandlers.SendPMHandler;
import uc.IHasUser;
import uc.IUser;
import uc.IHasUser.IMultiUser;
public class UserContributionItem extends CompoundContributionItem implements
IWorkbenchContribution {
private final IUser usr;
private IServiceLocator serviceLocator;
private static final ImageDescriptor filelist,sendPM,fav;
static {
filelist = AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, IImageKeys.FILELIST);
sendPM = AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, IImageKeys.SENDPM);
fav = AbstractUIPlugin.imageDescriptorFromPlugin(
Application.PLUGIN_ID, IImageKeys.FAVUSER);
}
public UserContributionItem() {
this(null);
}
public UserContributionItem(IUser usr) {
this.usr = usr;
}
@Override
protected IContributionItem[] getContributionItems() {
ArrayList<IContributionItem> contribs = new ArrayList<IContributionItem>();
List<IUser> selectedUsers = new ArrayList<IUser>();
if (usr == null) {
ISelectionService selserv = (ISelectionService)serviceLocator.getService(ISelectionService.class);
ISelection sel = selserv.getSelection();
if (sel instanceof IStructuredSelection) {
for (Object o : ((IStructuredSelection)sel).toArray()) {
if (o instanceof IMultiUser) {
selectedUsers.addAll(((IMultiUser)o).getIterable());
} else if (o instanceof IHasUser) {
selectedUsers.add(((IHasUser)o).getUser());
} else if (o instanceof IUser) {
selectedUsers.add((IUser)o);
}
}
}
} else {
selectedUsers.add(usr);
}
if (!selectedUsers.isEmpty()) {
contribs.add(create(GetFilelistHandler.COMMAND_ID, filelist));
boolean allHaveFilelist = true;
for (IUser usr:selectedUsers) {
allHaveFilelist = allHaveFilelist && usr.hasDownloadedFilelist();
}
if (allHaveFilelist) {
contribs.add(create(BrowseFilelistHandler.COMMAND_ID, null ));
}
contribs.add(create(MatchQueueHandler.COMMAND_ID, null ));
if (selectedUsers.size() == 1) {
IUser sel = selectedUsers.get(0);
if (sel.getHub() != null) {
contribs.add(create(SendPMHandler.COMMAND_ID, sendPM ));
}
if (!sel.isFavUser()) {
contribs.add(create(AddToFavouritesHandler.COMMAND_ID, fav ));
} else {
contribs.add(create(RemoveFromFavouritesHandler.COMMAND_ID, fav ));
}
if (!sel.hasCurrentlyAutogrant()) {
contribs.add(create(GrantExtraSlotHandler.COMMAND_ID,null));
} else {
contribs.add(create(RevokeSlotHandler.COMMAND_ID,null));
}
contribs.add(new Separator());
if (sel.nrOfFilesInQueue() > 0) {
contribs.add(create(RemoveUserFromQueueHandler.COMMAND_ID,null));
}
contribs.add(create(CopyNickToClipboardHandler.COMMAND_ID,null));
CopyContributionItem cci = new CopyContributionItem(usr);
cci.initialize(serviceLocator);
contribs.add(cci);
}
}
return contribs.toArray(new IContributionItem[]{});
}
public void initialize(IServiceLocator serviceLocator) {
this.serviceLocator = serviceLocator;
}
private IContributionItem create(String commandId,ImageDescriptor icon) {
boolean byID = usr != null;
if (byID) {
commandId += UserHandlers.BY_ID_POSTFIX;
}
CommandContributionItemParameter ccip =
new CommandContributionItemParameter(serviceLocator, null,
commandId,SWT.PUSH);
ccip.icon = icon;
if (byID) {
ccip.parameters = Collections.singletonMap(
UserHandlers.USER_BY_ID,usr.getUserid().toString());
}
return new CommandContributionItem(ccip);
}
}