/******************************************************************************* * 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.internal.presence.ui.dialogs; import java.util.Iterator; import org.eclipse.core.runtime.*; 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.*; import org.eclipse.ecf.presence.ui.MultiRosterAccount; import org.eclipse.ecf.presence.ui.UserSearchView; import org.eclipse.jface.dialogs.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.UIJob; /** * * @since 3.0 * */ public class SearchContactDialog extends Dialog { Button closeButton; Button searchButton; MultiRosterAccount account; Button addContactButton; Button runInBackgroundButton; Table tableResult; Table tableFields; public SearchContactDialog(Shell parentShell, MultiRosterAccount account) { super(parentShell); this.account = account; } protected void addListeners() { searchButton.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { IUserSearchManager userManager = account.getPresenceContainerAdapter().getUserSearchManager(); try { //selection to build the criteria IRestriction selection = userManager.createRestriction(); //create a specific criteria final ICriteria criteria = userManager.createCriteria(); //fields to consider on XMPP server side search TableItem items[] = tableFields.getItems(); for (int i = 0; i < items.length; i++) { TableItem item = items[i]; if (item.getChecked()) { //build criterion field=value ICriterion criterion = selection.eq(item.getText(0), item.getText(1)); criteria.add(criterion); } } //Run in a block or non-block way using the criteria built previously if (runInBackgroundButton.getSelection()) { callAsynchronous(userManager, criteria); //close the UI close(); } else { //call the block search ISearch search = userManager.search(criteria); //the collection of IResult IResultList resultList = search.getResultList(); //clean the table for a new result list tableResult.removeAll(); for (Iterator iterator = resultList.getResults().iterator(); iterator.hasNext();) { IResult result = (IResult) iterator.next(); TableItem item = new TableItem(tableResult, SWT.NONE); item.setText(0, result.getUser().getName()); item.setText(1, result.getUser().getID().getName()); } } } catch (UserSearchException e1) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, e1.getLocalizedMessage(), e1)); } } }); addContactButton.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { TableItem contact = tableResult.getSelection()[0]; if (MessageDialog.openConfirm(null, Messages.AddContactDialog_DialogTitle, NLS.bind(Messages.SearchContactDialog_AddContactMessage, contact.getText(0)))) { IPresenceContainerAdapter ipca = account.getPresenceContainerAdapter(); IRosterSubscriptionSender sender = ipca.getRosterManager().getRosterSubscriptionSender(); try { sender.sendRosterAdd(contact.getText(1), contact.getText(0), null); } catch (ECFException e1) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, e1.getLocalizedMessage(), e1)); } close(); } } }); } protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(Messages.SearchContactDialog_DialogTitle); } /* * Create just a close button for the Dialog * (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); closeButton = getButton(IDialogConstants.OK_ID); closeButton.setEnabled(true); } protected Control createDialogArea(Composite parent) { final int editableColumn = 1; try { parent = (Composite) super.createDialogArea(parent); parent.setLayout(new GridLayout(2, false)); String fields[] = null; IUserSearchManager userManager = account.getPresenceContainerAdapter().getUserSearchManager(); fields = userManager.getUserPropertiesFields(); GridData searchButtonData = new GridData(SWT.RIGHT, GridData.FILL_HORIZONTAL, false, false, 1, 1); GridData addContactData = new GridData(SWT.RIGHT, GridData.FILL_HORIZONTAL, true, false, 1, 1); Group group = new Group(parent, SWT.SHADOW_ETCHED_IN); group.setLayout(new GridLayout(2, false)); group.setText(Messages.SearchContactDialog_InfoSearchFields); Group groupContact = new Group(parent, SWT.SHADOW_ETCHED_IN); groupContact.setLayout(new GridLayout(2, false)); groupContact.setText(Messages.SearchContactDialog_InfoContactFields); tableResult = new Table(groupContact, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION); tableResult.setLinesVisible(true); tableResult.setHeaderVisible(true); GridData dataTable = new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true, 2, 1); dataTable.heightHint = 200; tableResult.setLayoutData(dataTable); new TableColumn(tableResult, SWT.NONE).setText(Messages.SearchContactDialog_TableResultColumnName); new TableColumn(tableResult, SWT.NONE).setText(Messages.SearchContactDialog_TableResultColumnUsername); new TableItem(tableResult, SWT.NONE); for (int i = 0; i < 2; i++) { tableResult.getColumn(i).setWidth(130); } addContactButton = new Button(groupContact, SWT.PUSH | SWT.RIGHT); addContactButton.setText(Messages.SearchContactDialog_ButtonAddContact); addContactButton.setLayoutData(addContactData); tableFields = new Table(group, SWT.BORDER | SWT.MULTI | SWT.CHECK); tableFields.setLinesVisible(true); tableFields.setHeaderVisible(true); dataTable = new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true, 2, 1); dataTable.heightHint = 200; tableFields.setLayoutData(dataTable); TableColumn colField = new TableColumn(tableFields, SWT.NONE); colField.setText(Messages.SearchContactDialog_TableSearchColumnField); TableColumn colValue = new TableColumn(tableFields, SWT.NONE); colValue.setText(Messages.SearchContactDialog_TableSearchColumnValue); colValue.setWidth(130); for (int i = 0; i < fields.length; i++) { TableItem item = new TableItem(tableFields, SWT.NONE); item.setText(new String[] {fields[i], ""}); //$NON-NLS-1$ item.setChecked(true); } TableItem[] items = tableFields.getItems(); for (int i = 0; i < items.length; i++) { final TableEditor editor = new TableEditor(tableFields); Text text = new Text(tableFields, SWT.NONE); text.setText(items[i].getText(editableColumn)); text.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { editor.getItem().setText(editableColumn, ((Text) editor.getEditor()).getText()); } }); text.selectAll(); text.setFocus(); editor.grabHorizontal = true; editor.setEditor(text, items[i], editableColumn); } colField.pack(); runInBackgroundButton = new Button(group, SWT.CHECK); runInBackgroundButton.setText(Messages.SearchContactDialog_RunInBackground); runInBackgroundButton.setToolTipText(Messages.SearchContactDialog_RunInBackGroundToolTip); searchButton = new Button(group, SWT.PUSH | SWT.RIGHT); searchButton.setText(Messages.SearchContactDialog_ButtonSearch); searchButton.setLayoutData(searchButtonData); } catch (ECFException e) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, e.getLocalizedMessage(), e)); new Label(parent, SWT.LEFT).setText(e.getLocalizedMessage()); } addListeners(); applyDialogFont(parent); return parent; } /** * Call the user search and open the view * asynchronous * @param userManager * @param criteria */ protected void callAsynchronous(final IUserSearchManager userManager, final ICriteria criteria) { IUserSearchListener listener = new IUserSearchListener() { public void handleUserSearchEvent(IUserSearchEvent event) { if (event instanceof IUserSearchCompleteEvent) { fireEventComplete((IUserSearchCompleteEvent) event); } } }; userManager.search(criteria, listener); } /** * * @param event */ protected void fireEventComplete(final IUserSearchCompleteEvent event) { new UIJob(Messages.SearchContactDialog_UserSearchJobName) { public IStatus runInUIThread(IProgressMonitor monitor) { try { final UserSearchView view = (UserSearchView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(UserSearchView.VIEW_ID); view.showMessage(Messages.SearchContactDialog_SearchingMessage); view.addMultiRosterAccount(account); view.addResult(event.getSearch().getResultList()); } catch (PartInitException e) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, e.getLocalizedMessage(), e)); return new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, "Exception showing search results view", e); //$NON-NLS-1$ } return Status.OK_STATUS; } }.schedule(); } }