org.eclipse.ecf.internal.presence.ui.dialogs.SearchContactDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.internal.presence.ui.dialogs.SearchContactDialog.java

Source

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

    }

}