| /******************************************************************************* |
| * 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); |
| } |
| |
| } |