net.enilink.komma.common.ui.rcp.dialogs.WorkspaceResourceDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.enilink.komma.common.ui.rcp.dialogs.WorkspaceResourceDialog.java

Source

/**
 * <copyright>
 *
 * Copyright (c) 2005, 2010 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 - Initial API and implementation
 *
 * </copyright>
 *
 * $Id: WorkspaceResourceDialog.java,v 1.5 2008/05/01 19:52:01 marcelop Exp $
 */

package net.enilink.komma.common.ui.rcp.dialogs;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.dialogs.NewFolderDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;

import net.enilink.komma.common.ui.CommonUIPlugin;

/**
 * @since 2.2.0
 */
public class WorkspaceResourceDialog extends ElementTreeSelectionDialog implements ISelectionStatusValidator {
    public static IContainer[] openFolderSelection(Shell parent, String title, String message,
            boolean allowMultipleSelection, Object[] initialSelection, List<ViewerFilter> viewerFilters) {
        WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(parent, new WorkbenchLabelProvider(),
                new WorkbenchContentProvider());
        dialog.setAllowMultiple(allowMultipleSelection);
        dialog.setTitle(title != null ? title : CommonUIPlugin.INSTANCE.getString("_UI_FolderSelection_title"));
        dialog.setMessage(message);
        dialog.setShowNewFolderControl(true);

        dialog.addFilter(dialog.createDefaultViewerFilter(false));
        if (viewerFilters != null) {
            for (ViewerFilter viewerFilter : viewerFilters) {
                dialog.addFilter(viewerFilter);
            }
        }

        if (initialSelection != null) {
            dialog.setInitialSelections(initialSelection);
        }

        dialog.loadContents();
        return dialog.open() == Window.OK ? dialog.getSelectedContainers() : new IContainer[0];
    }

    public static IFile[] openFileSelection(Shell parent, String title, String message,
            boolean allowMultipleSelection, Object[] initialSelection, List<ViewerFilter> viewerFilters) {
        WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(parent, new WorkbenchLabelProvider(),
                new WorkbenchContentProvider());
        dialog.setAllowMultiple(allowMultipleSelection);
        dialog.setTitle(title != null ? title : CommonUIPlugin.INSTANCE.getString("_UI_FileSelection_title"));
        dialog.setMessage(message);

        dialog.addFilter(dialog.createDefaultViewerFilter(true));
        if (viewerFilters != null) {
            for (ViewerFilter viewerFilter : viewerFilters) {
                dialog.addFilter(viewerFilter);
            }
        }

        if (initialSelection != null) {
            dialog.setInitialSelections(initialSelection);
        }

        dialog.loadContents();
        return dialog.open() == Window.OK ? dialog.getSelectedFiles() : new IFile[0];
    }

    public static IFile openNewFile(Shell parent, String title, String message, IPath suggestedPath,
            List<ViewerFilter> viewerFilters) {
        WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(parent, new WorkbenchLabelProvider(),
                new WorkbenchContentProvider());
        dialog.setAllowMultiple(false);
        dialog.setTitle(title != null ? title : CommonUIPlugin.INSTANCE.getString("_UI_NewFile_title"));
        dialog.setMessage(message);
        dialog.setShowNewFolderControl(true);
        dialog.setShowFileControl(true);

        dialog.addFilter(dialog.createDefaultViewerFilter(false));
        if (viewerFilters != null) {
            for (ViewerFilter viewerFilter : viewerFilters) {
                dialog.addFilter(viewerFilter);
            }
        }

        if (suggestedPath != null) {
            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
            IResource resource = root.findMember(suggestedPath);
            if (resource != null && resource.isAccessible()) {
                if (resource instanceof IContainer) {
                    dialog.setInitialSelection(resource);
                } else {
                    dialog.setInitialSelection(resource.getParent());
                    dialog.setFileText(resource.getName());
                }
            } else {
                if (suggestedPath.segmentCount() > 1) {
                    if (resource == null) {
                        resource = root.getFile(suggestedPath);
                    }

                    if (resource.getProject().isAccessible()) {
                        IContainer container = resource.getParent();
                        for (; !container.isAccessible()
                                && container != resource.getProject(); container = container.getParent()) {
                            // Do nothing
                        }
                        dialog.setInitialSelection(container);
                        suggestedPath = suggestedPath.removeFirstSegments(container.getFullPath().segmentCount());
                        dialog.setFileText(suggestedPath.toString());
                        suggestedPath = null;
                    }
                }

                if (suggestedPath != null) {
                    String fileText = suggestedPath.isAbsolute() ? suggestedPath.removeFirstSegments(1).toString()
                            : suggestedPath.toString();
                    dialog.setFileText(fileText);
                }
            }
        }

        dialog.loadContents();
        return dialog.open() == Window.OK ? dialog.getFile() : null;
    }

    protected boolean showNewFolderControl = false;
    protected boolean showFileControl = false;
    protected boolean showFiles = true;

    protected Button newFolderButton;
    protected Text fileText;
    protected String fileTextContent = "";

    protected IContainer selectedContainer;

    public WorkspaceResourceDialog(Shell parent, ILabelProvider labelProvider,
            ITreeContentProvider contentProvider) {
        super(parent, labelProvider, contentProvider);
        setComparator(new ResourceComparator(ResourceComparator.NAME));
        setValidator(this);
    }

    public void loadContents() {
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        setInput(root);
    }

    public ViewerFilter createDefaultViewerFilter(boolean showFiles) {
        this.showFiles = showFiles;
        return new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof IResource) {
                    IResource workspaceResource = (IResource) element;
                    return workspaceResource.isAccessible() && (WorkspaceResourceDialog.this.showFiles
                            || workspaceResource.getType() != IResource.FILE);
                }
                return false;
            }
        };
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);

        if (isShowNewFolderControl()) {
            createNewFolderControl(composite);
        }
        if (isShowFileControl()) {
            createFileControl(composite);
        }

        applyDialogFont(composite);
        return composite;
    }

    protected void createNewFolderControl(Composite parent) {
        newFolderButton = new Button(parent, SWT.PUSH);
        newFolderButton.setText(CommonUIPlugin.INSTANCE.getString("_UI_NewFolder_label"));
        newFolderButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                newFolderButtonPressed();
            }
        });
        newFolderButton.setFont(parent.getFont());
        updateNewFolderButtonState();
    }

    protected void updateNewFolderButtonState() {
        IStructuredSelection selection = (IStructuredSelection) getTreeViewer().getSelection();
        selectedContainer = null;
        if (selection.size() == 1) {
            Object first = selection.getFirstElement();
            if (first instanceof IContainer) {
                selectedContainer = (IContainer) first;
            }
        }
        newFolderButton.setEnabled(selectedContainer != null);
    }

    protected void newFolderButtonPressed() {
        NewFolderDialog dialog = new NewFolderDialog(getShell(), selectedContainer);
        if (dialog.open() == Window.OK) {
            TreeViewer treeViewer = getTreeViewer();
            treeViewer.refresh(selectedContainer);
            Object createdFolder = dialog.getResult()[0];
            treeViewer.reveal(createdFolder);
            treeViewer.setSelection(new StructuredSelection(createdFolder));
        }
    }

    protected void createFileControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        {
            GridLayout layout = new GridLayout(2, false);
            layout.marginLeft = -5;
            layout.marginRight = -5;
            layout.marginTop = -5;
            layout.marginBottom = -5;
            composite.setLayout(layout);
        }

        Label fileLabel = new Label(composite, SWT.NONE);
        fileLabel.setText(CommonUIPlugin.INSTANCE.getString("_UI_FileName_label"));

        fileText = new Text(composite, SWT.BORDER);
        fileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fileText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                fileTextModified(fileText.getText());
            }
        });

        if (fileTextContent != null) {
            fileText.setText(fileTextContent);
        }
    }

    protected void fileTextModified(String text) {
        fileTextContent = text;
    }

    public IStatus validate(Object[] selectedElements) {
        if (isShowNewFolderControl()) {
            updateNewFolderButtonState();
        }

        boolean enableOK = false;
        for (int i = 0; i < selectedElements.length; i++) {
            if (selectedElements[i] instanceof IContainer) {
                enableOK = !showFiles || (isShowFileControl() && fileText.getText().trim().length() > 0);
            } else if (selectedElements[i] instanceof IFile) {
                if (isShowFileControl()) {
                    fileText.setText(((IFile) selectedElements[i]).getName());
                }
                enableOK = true;
            }
            if (enableOK)
                break;
        }

        return enableOK ? new Status(IStatus.OK, "org.eclipse.emf.common.ui", 0, "", null)
                : new Status(IStatus.ERROR, "org.eclipse.emf.common.ui", 0, "", null);
    }

    public IContainer[] getSelectedContainers() {
        List<IContainer> containers = new ArrayList<IContainer>();
        Object[] result = getResult();
        for (int i = 0; i < result.length; i++) {
            if (result[i] instanceof IContainer) {
                containers.add((IContainer) result[i]);
            }
        }
        return containers.toArray(new IContainer[containers.size()]);
    }

    public IFile[] getSelectedFiles() {
        List<IFile> files = new ArrayList<IFile>();
        Object[] result = getResult();
        for (int i = 0; i < result.length; i++) {
            if (result[i] instanceof IFile) {
                files.add((IFile) result[i]);
            }
        }
        return files.toArray(new IFile[files.size()]);
    }

    public IFile getFile() {
        String file = getFileText();
        if (file.length() != 0) {
            Object[] result = getResult();
            if (result.length == 1) {
                if (result[0] instanceof IFile) {
                    return (IFile) result[0];
                } else if (result[0] instanceof IContainer) {
                    IContainer container = (IContainer) result[0];
                    return container.getFile(new Path(file));
                }
            }
        }
        return null;
    }

    public void setFileText(String text) {
        if (text == null) {
            text = "";
        }

        if (fileText != null && !fileText.isDisposed()) {
            fileText.setText(text);
        } else {
            fileTextContent = text;
        }
    }

    public String getFileText() {
        return fileText != null && !fileText.isDisposed() ? fileText.getText() : fileTextContent;
    }

    public boolean isShowNewFolderControl() {
        return showNewFolderControl;
    }

    public void setShowNewFolderControl(boolean showNewFolderControl) {
        this.showNewFolderControl = showNewFolderControl;
    }

    public boolean isShowFileControl() {
        return showFileControl;
    }

    public void setShowFileControl(boolean showFileControl) {
        this.showFileControl = showFileControl;
    }
}