org.eclipse.ajdt.internal.ui.dialogs.TypeSelectionDialog2.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.internal.ui.dialogs.TypeSelectionDialog2.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2006 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ajdt.internal.ui.dialogs;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.ajdt.internal.corext.util.OpenTypeHistory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobManager;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.TypeNameMatch;
import org.eclipse.jdt.core.search.TypeNameRequestor;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaUIMessages;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.dialogs.SelectionStatusDialog;

public class TypeSelectionDialog2 extends SelectionStatusDialog {

    private String fTitle;

    private boolean fMultipleSelection;
    private IRunnableContext fRunnableContext;
    private IJavaSearchScope fScope;
    private int fElementKind;

    private String fInitialFilter;
    private int fSelectionMode;
    private ISelectionStatusValidator fValidator;
    private TypeSelectionComponent fContent;
    private TypeSelectionExtension fExtension;

    public static final int NONE = TypeSelectionComponent.NONE;
    public static final int CARET_BEGINNING = TypeSelectionComponent.CARET_BEGINNING;
    public static final int FULL_SELECTION = TypeSelectionComponent.FULL_SELECTION;

    private static boolean fgFirstTime = true;

    private class TitleLabel implements TypeSelectionComponent.ITitleLabel {
        public void setText(String text) {
            if (text == null || text.length() == 0) {
                getShell().setText(fTitle);
            } else {
                getShell().setText(Messages.format(JavaUIMessages.TypeSelectionDialog2_title_format,
                        new String[] { fTitle, text }));
            }
        }
    }

    public TypeSelectionDialog2(Shell parent, boolean multi, IRunnableContext context, IJavaSearchScope scope,
            int elementKinds) {
        this(parent, multi, context, scope, elementKinds, null);
    }

    public TypeSelectionDialog2(Shell parent, boolean multi, IRunnableContext context, IJavaSearchScope scope,
            int elementKinds, TypeSelectionExtension extension) {
        super(parent);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        fMultipleSelection = multi;
        fRunnableContext = context;
        fScope = scope;
        fElementKind = elementKinds;
        fSelectionMode = NONE;
        fExtension = extension;
        if (fExtension != null) {
            fValidator = fExtension.getSelectionValidator();
        }
    }

    public void setFilter(String filter) {
        setFilter(filter, FULL_SELECTION);
    }

    public void setFilter(String filter, int selectionMode) {
        fInitialFilter = filter;
        fSelectionMode = selectionMode;
    }

    public void setValidator(ISelectionStatusValidator validator) {
        fValidator = validator;
    }

    protected TypeNameMatch[] getSelectedTypes() {
        if (fContent == null || fContent.isDisposed())
            return null;
        return fContent.getSelection();
    }

    public void create() {
        super.create();
        fContent.populate(fSelectionMode);
        getOkButton().setEnabled(fContent.getSelection().length > 0);
    }

    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IJavaHelpContextIds.TYPE_SELECTION_DIALOG2);
    }

    protected Control createDialogArea(Composite parent) {
        Composite area = (Composite) super.createDialogArea(parent);
        fContent = new TypeSelectionComponent(area, SWT.NONE, getMessage(), fMultipleSelection, fScope,
                fElementKind, fInitialFilter, new TitleLabel(), fExtension);
        GridData gd = new GridData(GridData.FILL_BOTH);
        fContent.setLayoutData(gd);
        fContent.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
                handleDefaultSelected(fContent.getSelection());
            }

            public void widgetSelected(SelectionEvent e) {
                handleWidgetSelected(fContent.getSelection());
            }
        });
        return area;
    }

    protected void handleDefaultSelected(TypeNameMatch[] selection) {
        if (selection.length == 0)
            return;
        okPressed();
    }

    protected void handleWidgetSelected(TypeNameMatch[] selection) {
        IStatus status = null;
        if (selection.length == 0) {
            status = new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IStatus.ERROR, "", null); //$NON-NLS-1$
        } else {
            if (fValidator != null) {
                List jElements = new ArrayList();
                for (int i = 0; i < selection.length; i++) {
                    IType type = selection[i].getType();
                    if (type != null) {
                        jElements.add(type);
                    } else {
                        status = new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IStatus.ERROR,
                                Messages.format(JavaUIMessages.TypeSelectionDialog_error_type_doesnot_exist,
                                        selection[i].getFullyQualifiedName()),
                                null);
                        break;
                    }
                }
                if (status == null) {
                    status = fValidator.validate(jElements.toArray());
                }
            } else {
                status = new Status(IStatus.OK, JavaPlugin.getPluginId(), IStatus.OK, "", null); //$NON-NLS-1$
            }
        }
        updateStatus(status);
    }

    public int open() {
        try {
            ensureConsistency();
        } catch (InvocationTargetException e) {
            ExceptionHandler.handle(e, JavaUIMessages.TypeSelectionDialog_error3Title,
                    JavaUIMessages.TypeSelectionDialog_error3Message);
            return CANCEL;
        } catch (InterruptedException e) {
            // cancelled by user
            return CANCEL;
        }
        if (fInitialFilter == null) {
            IWorkbenchWindow window = JavaPlugin.getActiveWorkbenchWindow();
            if (window != null) {
                ISelection selection = window.getSelectionService().getSelection();
                if (selection instanceof ITextSelection) {
                    String text = ((ITextSelection) selection).getText();
                    if (text != null) {
                        text = text.trim();
                        if (text.length() > 0 && JavaConventions.validateJavaTypeName(text,
                                CompilerOptions.VERSION_1_3, CompilerOptions.VERSION_1_3).isOK()) {
                            fInitialFilter = text;
                            fSelectionMode = FULL_SELECTION;
                        }
                    }
                }
            }
        }
        return super.open();
    }

    public boolean close() {
        boolean result;
        try {
            if (getReturnCode() == OK) {
                OpenTypeHistory.getInstance().save();
            }
        } finally {
            result = super.close();
        }
        return result;
    }

    public void setTitle(String title) {
        super.setTitle(title);
        fTitle = title;
    }

    protected void computeResult() {
        TypeNameMatch[] selected = fContent.getSelection();
        if (selected == null || selected.length == 0) {
            setResult(null);
            return;
        }

        // If the scope is null then it got computed by the type selection component.
        if (fScope == null) {
            fScope = fContent.getScope();
        }

        OpenTypeHistory history = OpenTypeHistory.getInstance();
        List result = new ArrayList(selected.length);
        for (int i = 0; i < selected.length; i++) {
            TypeNameMatch typeInfo = selected[i];
            IType type = typeInfo.getType();
            if (type == null) {
                String title = JavaUIMessages.TypeSelectionDialog_errorTitle;
                String message = Messages.format(JavaUIMessages.TypeSelectionDialog_dialogMessage,
                        typeInfo.getFullyQualifiedName());
                MessageDialog.openError(getShell(), title, message);
                history.remove(typeInfo);
                setResult(null);
            } else {
                history.accessed(typeInfo);
                result.add(type);
            }
        }
        setResult(result);
    }

    private void ensureConsistency() throws InvocationTargetException, InterruptedException {
        // we only have to ensure history consistency here since the search engine
        // takes care of working copies.
        class ConsistencyRunnable implements IRunnableWithProgress {
            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                if (fgFirstTime) {
                    // Join the initialize after load job.
                    IJobManager manager = Platform.getJobManager();
                    manager.join(JavaUI.ID_PLUGIN, monitor);
                }
                OpenTypeHistory history = OpenTypeHistory.getInstance();
                if (fgFirstTime || history.isEmpty()) {
                    monitor.beginTask(JavaUIMessages.TypeSelectionDialog_progress_consistency, 100);
                    if (history.needConsistencyCheck()) {
                        refreshSearchIndices(new SubProgressMonitor(monitor, 90));
                        history.checkConsistency(new SubProgressMonitor(monitor, 10));
                    } else {
                        refreshSearchIndices(monitor);
                    }
                    monitor.done();
                    fgFirstTime = false;
                } else {
                    history.checkConsistency(monitor);
                }
            }

            public boolean needsExecution() {
                OpenTypeHistory history = OpenTypeHistory.getInstance();
                return fgFirstTime || history.isEmpty() || history.needConsistencyCheck();
            }

            private void refreshSearchIndices(IProgressMonitor monitor) throws InvocationTargetException {
                try {
                    new SearchEngine().searchAllTypeNames(null, 0,
                            // make sure we search a concrete name. This is faster according to Kent  
                            "_______________".toCharArray(), //$NON-NLS-1$
                            SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE, IJavaSearchConstants.ENUM,
                            SearchEngine.createWorkspaceScope(), new TypeNameRequestor() {
                            }, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor);
                } catch (JavaModelException e) {
                    throw new InvocationTargetException(e);
                }
            }
        }
        ConsistencyRunnable runnable = new ConsistencyRunnable();
        if (!runnable.needsExecution())
            return;
        IRunnableContext context = fRunnableContext != null ? fRunnableContext
                : PlatformUI.getWorkbench().getProgressService();
        context.run(true, true, runnable);
    }
}