blob: 2fb2a2e7e81483447ffd91905d8edb3ded131edd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Marcelo Mayworm. 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: Marcelo Mayworm - initial API and implementation
*
******************************************************************************/
package org.eclipse.ecf.presence.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.IContainerListener;
import org.eclipse.ecf.core.events.IContainerDisconnectedEvent;
import org.eclipse.ecf.core.events.IContainerEvent;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.internal.presence.ui.Activator;
import org.eclipse.ecf.internal.presence.ui.Messages;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import org.eclipse.ecf.presence.roster.IRosterSubscriptionSender;
import org.eclipse.ecf.presence.search.IResult;
import org.eclipse.ecf.presence.search.IResultList;
import org.eclipse.ecf.ui.SharedImages;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ViewPart;
/**
* View class for displaying multiple users that match a search in a tree viewer. This view part
* provides the ability to display multiple users in a single tree viewer. This class may be subclassed as
* desired to add or customize behavior.
* @since 2.0
*/
public class UserSearchView extends ViewPart {
public static final String VIEW_ID = "org.eclipse.ecf.presence.ui.UserSearchView"; //$NON-NLS-1$
protected static final int DEFAULT_EXPAND_LEVEL = 3;
protected TreeViewer treeViewer;
protected List users = new ArrayList();
private IAction addContactAction;
private MultiRosterAccount account;
private PageBook pageBook;
private Label helpMessageLabel;
private IContainerListener listener;
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl(Composite parent) {
pageBook = new PageBook(parent, SWT.NONE);
createHelpMessage(pageBook);
setupTreeViewer(pageBook);
if (users.size() == 0)
pageBook.showPage(helpMessageLabel);
}
private void createHelpMessage(Composite parent) {
if (!parent.isDisposed()) {
helpMessageLabel = new Label(parent, SWT.TOP + SWT.LEFT + SWT.WRAP);
}
}
protected void setupTreeViewer(Composite parent) {
treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
getSite().setSelectionProvider(treeViewer);
treeViewer.setContentProvider(new UserSearchContentProvider());
treeViewer.setLabelProvider(new UserSearchLabelProvider());
makeActions();
hookContextMenu();
}
private void makeActions() {
addContactAction = new Action(Messages.MultiRosterView_AddContact, SharedImages.getImageDescriptor(SharedImages.IMG_ADD_BUDDY)) {
public void run() {
ITreeSelection selection = (ITreeSelection) treeViewer.getSelection();
IResult contact = (IResult) selection.getFirstElement();
if (MessageDialog.openConfirm(null, Messages.AddContactDialog_DialogTitle, NLS.bind(Messages.SearchContactDialog_AddContactMessage, contact.getUser().getName()))) {
IPresenceContainerAdapter ipca = account.getPresenceContainerAdapter();
IRosterSubscriptionSender sender = ipca.getRosterManager().getRosterSubscriptionSender();
try {
sender.sendRosterAdd(contact.getUser().getID().getName(), contact.getUser().getName(), null);
} catch (ECFException e) {
Activator.getDefault().getLog().log(e.getStatus());
}
}
}
};
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(treeViewer.getControl());
treeViewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, treeViewer);
}
private void fillContextMenu(IMenuManager manager) {
IStructuredSelection iss = (IStructuredSelection) treeViewer.getSelection();
Object element = iss.getFirstElement();
if (element instanceof IResult) {
manager.add(addContactAction);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
public void dispose() {
treeViewer = null;
users.clear();
if (account != null)
account.container.removeListener(listener);
super.dispose();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
public void setFocus() {
if (treeViewer != null)
treeViewer.getControl().setFocus();
}
/**
* Add the list of {@link IResult} that will be display on a tree
* @param list
* @return boolean
*/
public boolean addResult(IResultList list) {
users.clear();
users.add(list);
treeViewer.setInput(users);
pageBook.showPage(treeViewer.getControl());
treeViewer.expandToLevel(DEFAULT_EXPAND_LEVEL);
helpMessageLabel.setText(""); //$NON-NLS-1$
return true;
}
/**
* Add the MultiRosterAccount for add user contact
* @param multiRosterAccount
* @return boolean
*/
public boolean addMultiRosterAccount(MultiRosterAccount multiRosterAccount) {
Assert.isNotNull(multiRosterAccount);
this.account = multiRosterAccount;
listener = new IContainerListener() {
public void handleEvent(IContainerEvent event) {
if (event instanceof IContainerDisconnectedEvent) {
users.clear();
showMessage(Messages.MultiRosterView_HELP_MESSAGE);
}
}
};
account.container.addListener(listener);
return true;
}
/**
* Show a message into the view before show the result in a tree view
* @param message
*/
public void showMessage(String message) {
helpMessageLabel.setText(message);
pageBook.showPage(helpMessageLabel);
}
}