org.eclipse.ui.internal.editors.text.SelectResourcesDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.internal.editors.text.SelectResourcesDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2012 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.ui.internal.editors.text;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeContentProvider;

import org.eclipse.ui.dialogs.TypeFilteringDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

/**
 * Dialog for selecting resources.
 *
 * @since 3.1
 */
class SelectResourcesDialog extends Dialog {

    interface IFilter {
        boolean accept(IResource resource);
    }

    private SelectResourcesBlock fResourceGroup;
    private List fAcceptedFileTypes = new ArrayList();
    private IResource[] fInput;
    private String fTitle;
    private String fInstruction;
    private Label fCountIndication;
    private IFilter fAcceptableLocationsFilter;

    public SelectResourcesDialog(Shell parentShell, String title, String instruction,
            IFilter acceptableLocationsFilter) {
        super(parentShell);
        fTitle = title;
        fInstruction = instruction;
        fAcceptableLocationsFilter = acceptableLocationsFilter;
    }

    /*
     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
     * @since 3.4
     */
    protected boolean isResizable() {
        return true;
    }

    public void setInput(IResource[] input) {
        fInput = input;
    }

    public IResource[] getSelectedResources() {
        List items = fResourceGroup.getAllCheckedListItems();
        return (IResource[]) items.toArray(new IResource[items.size()]);
    }

    /*
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);

        if (fTitle != null)
            newShell.setText(fTitle);
    }

    /*
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        Label label = new Label(composite, SWT.LEFT);
        label.setText(fInstruction);
        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        fResourceGroup = new SelectResourcesBlock(composite, ResourcesPlugin.getWorkspace().getRoot(),
                getResourceProvider(IResource.FOLDER | IResource.PROJECT),
                WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(), getResourceProvider(IResource.FILE),
                WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(), SWT.NONE, useHeightHint(parent));
        fResourceGroup.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                updateSelectionCount();
            }
        });

        fCountIndication = new Label(composite, SWT.LEFT);
        fCountIndication.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        createSelectionButtonGroup(composite);

        setInitialSelection();
        return composite;
    }

    private boolean useHeightHint(Composite parent) {
        int fontHeight = (parent.getFont().getFontData())[0].getHeight();
        int displayHeight = parent.getDisplay().getClientArea().height;
        return (displayHeight / fontHeight) > 50;
    }

    private ITreeContentProvider getResourceProvider(final int resourceType) {
        return new WorkbenchContentProvider() {
            public Object[] getChildren(Object o) {
                if (o instanceof IWorkspaceRoot) {
                    HashSet projects = new HashSet();
                    for (int i = 0; i < fInput.length; i++) {
                        IResource project = fInput[i].getProject();
                        if ((project.getType() & resourceType) > 0)
                            projects.add(project);
                    }
                    return projects.toArray();
                }

                if (o instanceof IContainer) {
                    IResource[] members = null;
                    try {
                        members = ((IContainer) o).members();
                    } catch (CoreException e) {
                        //just return an empty set of children
                        return new Object[0];
                    }

                    //filter out the desired resource types
                    ArrayList results = new ArrayList();
                    for (int i = 0; i < members.length; i++) {
                        //And the test bits with the resource types to see if they are what we want
                        if ((members[i].getType() & resourceType) > 0
                                && (resourceType != IResource.FILE || fAcceptableLocationsFilter == null
                                        || fAcceptableLocationsFilter.accept(members[i]))) {
                            results.add(members[i]);
                        }
                    }
                    return results.toArray();
                }

                //input element case
                if (o instanceof ArrayList)
                    return ((ArrayList) o).toArray();

                return new Object[0];
            }
        };
    }

    protected final void createSelectionButtonGroup(Composite parent) {

        Font font = parent.getFont();

        // top level group
        Composite buttonComposite = new Composite(parent, SWT.NONE);
        buttonComposite.setFont(parent.getFont());

        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        layout.makeColumnsEqualWidth = true;
        buttonComposite.setLayout(layout);
        buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));

        Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID,
                TextEditorMessages.SelectResourcesDialog_selectAll, false);

        SelectionListener listener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                fResourceGroup.setAllSelections(true);
                updateSelectionCount();
            }
        };
        selectButton.addSelectionListener(listener);
        selectButton.setFont(font);
        setButtonLayoutData(selectButton);

        Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID,
                TextEditorMessages.SelectResourcesDialog_deselectAll, false);

        listener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                fResourceGroup.setAllSelections(false);
                updateSelectionCount();
            }
        };
        deselectButton.addSelectionListener(listener);
        deselectButton.setFont(font);
        setButtonLayoutData(deselectButton);

        // types edit button
        Button selectTypesButton = createButton(buttonComposite, IDialogConstants.SELECT_TYPES_ID,
                TextEditorMessages.SelectResourcesDialog_filterSelection, false);

        listener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleSelectFileTypes();
            }
        };
        selectTypesButton.addSelectionListener(listener);
        selectTypesButton.setFont(font);
        setButtonLayoutData(selectTypesButton);
    }

    protected void handleSelectFileTypes() {
        Object[] acceptedFileTypes = queryFileTypes();
        if (acceptedFileTypes != null) {
            fAcceptedFileTypes = Arrays.asList(acceptedFileTypes);
            filterSelection();
        }
    }

    protected Object[] queryFileTypes() {
        TypeFilteringDialog dialog = new TypeFilteringDialog(getShell(), fAcceptedFileTypes);
        dialog.open();
        return dialog.getResult();
    }

    private void filterSelection() {

        final IFilter filter = new IFilter() {
            public boolean accept(IResource resource) {
                return hasAcceptedFileType(resource);
            }
        };

        List list = fResourceGroup.getAllWhiteCheckedItems();
        final IResource[] resources = (IResource[]) list.toArray(new IResource[list.size()]);

        Runnable runnable = new Runnable() {
            public void run() {
                setSelection(resources, filter);
            }
        };

        BusyIndicator.showWhile(getShell().getDisplay(), runnable);
    }

    protected boolean hasAcceptedFileType(IResource resource) {
        if (fAcceptedFileTypes == null)
            return true;

        String resourceName = resource.getName();
        int separatorIndex = resourceName.lastIndexOf("."); //$NON-NLS-1$
        if (separatorIndex == -1)
            return false;

        String extension = resourceName.substring(separatorIndex + 1);

        Iterator e = fAcceptedFileTypes.iterator();
        while (e.hasNext()) {
            if (extension.equalsIgnoreCase((String) e.next()))
                return true;
        }

        return false;
    }

    protected void setInitialSelection() {
        setSelection(fInput, fAcceptableLocationsFilter);
        selectAndReveal(fInput[0]);
    }

    protected void setSelection(IResource[] input, IFilter filter) {
        Map selectionMap = new Hashtable();
        for (int i = 0; i < input.length; i++) {
            IResource resource = input[i];
            if ((resource.getType() & IResource.FILE) > 0) {
                if (filter.accept(resource)) {
                    List files = null;
                    IContainer parent = resource.getParent();
                    if (selectionMap.containsKey(parent))
                        files = (List) selectionMap.get(parent);
                    else
                        files = new ArrayList();

                    files.add(resource);
                    selectionMap.put(parent, files);
                }
            } else
                setSelection(selectionMap, (IContainer) resource, filter);
        }
        fResourceGroup.updateSelections(selectionMap);
        updateSelectionCount();
    }

    private void setSelection(Map selectionMap, IContainer parent, IFilter filter) {
        try {

            IResource[] resources = parent.members();
            List selections = new ArrayList();

            for (int i = 0; i < resources.length; i++) {
                IResource resource = resources[i];
                if ((resource.getType() & IResource.FILE) > 0) {
                    if (filter.accept(resource))
                        selections.add(resource);
                } else {
                    setSelection(selectionMap, (IContainer) resource, filter);
                }
            }

            if (!selections.isEmpty())
                selectionMap.put(parent, selections);

        } catch (CoreException x) {
            //Just return if we can't get any info
            return;
        }
    }

    private void selectAndReveal(IResource resource) {
        IContainer container = null;
        if ((IResource.FILE & resource.getType()) > 0)
            container = resource.getParent();
        else
            container = (IContainer) resource;
        fResourceGroup.selectAndReveal(container);
    }

    private void updateSelectionCount() {
        List listItems = fResourceGroup.getAllCheckedListItems();
        int checkedFiles = listItems == null ? 0 : listItems.size();
        StringBuffer buffer = new StringBuffer();
        switch (checkedFiles) {
        case 0:
            buffer.append(TextEditorMessages.SelectResourcesDialog_noFilesSelected);
            break;
        case 1:
            buffer.append(TextEditorMessages.SelectResourcesDialog_oneFileSelected);
            break;
        default:
            buffer.append(NLSUtility.format(TextEditorMessages.SelectResourcesDialog_nFilesSelected,
                    new Integer(checkedFiles)));
        }
        fCountIndication.setText(buffer.toString());

        Button okButton = getButton(IDialogConstants.OK_ID);
        if (okButton != null)
            okButton.setEnabled(checkedFiles > 0);
    }
}