net.sf.eclipsensis.dialogs.FileSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.eclipsensis.dialogs.FileSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2004-2010 Sunil Kamath (IcemanK).
 * All rights reserved.
 * This program is made available under the terms of the Common Public License
 * v1.0 which is available at http://www.eclipse.org/legal/cpl-v10.html
 *
 * Contributors:
 *     Sunil Kamath (IcemanK) - initial API and implementation
 *******************************************************************************/
package net.sf.eclipsensis.dialogs;

import java.util.*;
import java.util.List;

import net.sf.eclipsensis.EclipseNSISPlugin;
import net.sf.eclipsensis.viewer.EmptyContentProvider;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.model.WorkbenchLabelProvider;

public class FileSelectionDialog extends TitleAreaDialog {
    private static final Object[] EMPTY_ARRAY = new Object[0];
    private static final int VIEWER_WIDTH = 200;
    private static final int VIEWER_HEIGHT = 300;

    private IFilter mFilter = null;
    private IContainer mContainer = null;
    private IFile mFile = null;
    private String mDialogTitle;
    private String mDialogHeader;
    private String mDialogMessage;

    public FileSelectionDialog(Shell parentShell, IResource resource, IFilter filter) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        if (resource instanceof IFile) {
            mFile = (IFile) resource;
            mContainer = mFile.getParent();
        } else {
            mFile = null;
            mContainer = (IContainer) resource;
        }
        mFilter = filter;
    }

    public FileSelectionDialog(Shell parentShell, IResource resource) {
        this(parentShell, resource, null);
    }

    public FileSelectionDialog(Shell parentShell, IFilter filter) {
        this(parentShell, null, filter);
    }

    public FileSelectionDialog(Shell parentShell) {
        this(parentShell, null, null);
    }

    public IFile getFile() {
        return mFile;
    }

    public String getDialogHeader() {
        return mDialogHeader;
    }

    public void setDialogHeader(String dialogHeader) {
        mDialogHeader = dialogHeader;
    }

    public String getDialogMessage() {
        return mDialogMessage;
    }

    public void setDialogMessage(String dialogMessage) {
        mDialogMessage = dialogMessage;
    }

    public String getDialogTitle() {
        return mDialogTitle;
    }

    public void setDialogTitle(String dialogTitle) {
        mDialogTitle = dialogTitle;
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(mDialogTitle == null ? EclipseNSISPlugin.getResourceString("fileselection.dialog.title") //$NON-NLS-1$
                : mDialogTitle);
        shell.setImage(EclipseNSISPlugin.getShellImage());
    }

    @Override
    protected Control createContents(Composite parent) {

        Control contents = super.createContents(parent);
        setTitle(mDialogHeader == null ? EclipseNSISPlugin.getResourceString("fileselection.dialog.header") //$NON-NLS-1$
                : mDialogHeader);
        setTitleImage(EclipseNSISPlugin.getImageManager()
                .getImage(EclipseNSISPlugin.getResourceString("file.selection.dialog.icon"))); //$NON-NLS-1$
        setMessage(mDialogMessage == null ? EclipseNSISPlugin.getResourceString("fileselection.dialog.message") //$NON-NLS-1$
                : mDialogMessage);

        Button button = getButton(IDialogConstants.OK_ID);
        if (button != null) {
            button.setEnabled(mFile != null);
        }
        return contents;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite parent2 = (Composite) super.createDialogArea(parent);
        Composite composite = new Composite(parent2, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        GridLayout layout = new GridLayout(1, true);
        composite.setLayout(layout);

        SashForm form = new SashForm(composite, SWT.HORIZONTAL);
        form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        layout = new GridLayout(1, true);
        form.setLayout(layout);

        composite = new Composite(form, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        layout = new GridLayout(1, true);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);

        Label l = new Label(composite, SWT.NONE);
        l.setText(EclipseNSISPlugin.getResourceString("fileselection.parent.folder.label")); //$NON-NLS-1$
        l.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        Tree tree = new Tree(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.widthHint = VIEWER_WIDTH;
        gridData.heightHint = VIEWER_HEIGHT;
        tree.setLayoutData(gridData);
        final TreeViewer tv = new TreeViewer(tree);
        tv.setContentProvider(new ContainerContentProvider());
        tv.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider());
        tv.setSorter(new ViewerSorter());

        composite = new Composite(form, SWT.None);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        layout = new GridLayout(1, true);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);

        l = new Label(composite, SWT.NONE);
        l.setText(EclipseNSISPlugin.getResourceString("fileselection.file.label")); //$NON-NLS-1$
        l.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        Table table = new Table(composite,
                SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
        gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.widthHint = VIEWER_WIDTH;
        gridData.heightHint = VIEWER_HEIGHT;
        table.setLayoutData(gridData);
        table.setLinesVisible(false);
        final TableViewer tv2 = new TableViewer(table);
        tv2.setContentProvider(new FilesContentProvider());
        tv2.setLabelProvider(new FilesLabelProvider());
        tv2.setSorter(new ViewerSorter());
        if (mFilter != null) {
            tv2.addFilter(new ViewerFilter() {
                @Override
                public boolean select(Viewer viewer, Object parentElement, Object element) {
                    return mFilter.select(element);
                }
            });
        }

        tv.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                tv2.setInput(selection.getFirstElement()); // allow null
            }
        });
        tv.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    Object item = ((IStructuredSelection) selection).getFirstElement();
                    if (tv.getExpandedState(item)) {
                        tv.collapseToLevel(item, 1);
                    } else {
                        tv.expandToLevel(item, 1);
                    }
                }
            }
        });

        tv2.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (selection != null && !selection.isEmpty()) {
                    mFile = (IFile) selection.getFirstElement();
                } else {
                    mFile = null;
                }
                Button button = getButton(IDialogConstants.OK_ID);
                if (button != null) {
                    button.setEnabled(selection != null && !selection.isEmpty());
                }
            }
        });
        tv2.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                if (mFile != null) {
                    setReturnCode(Window.OK);
                    close();
                }
            }
        });

        tv.setInput(ResourcesPlugin.getWorkspace());
        if (mContainer != null) {
            tv.setSelection(new StructuredSelection(mContainer));
            if (mFile != null) {
                tv2.setSelection(new StructuredSelection(mFile));
            } else {
                tv2.setSelection(new StructuredSelection());
            }
        }
        return parent2;
    }

    private class ContainerContentProvider extends EmptyContentProvider {
        @Override
        public Object[] getChildren(Object element) {
            if (element instanceof IWorkspace) {
                return ((IWorkspace) element).getRoot().getProjects();
            } else if (element instanceof IContainer) {
                IContainer container = (IContainer) element;
                if (container.isAccessible()) {
                    try {
                        List<IResource> children = new ArrayList<IResource>();
                        IResource[] members = container.members();
                        for (int i = 0; i < members.length; i++) {
                            if (members[i].getType() != IResource.FILE) {
                                children.add(members[i]);
                            }
                        }
                        return children.toArray();
                    } catch (CoreException e) {
                        EclipseNSISPlugin.getDefault().log(e);
                    }
                }
            }
            return EMPTY_ARRAY;
        }

        @Override
        public Object[] getElements(Object element) {
            return getChildren(element);
        }

        @Override
        public Object getParent(Object element) {
            if (element instanceof IResource) {
                return ((IResource) element).getParent();
            }
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }
    }

    private class FilesLabelProvider extends LabelProvider implements ITableLabelProvider {
        private ILabelProvider mLabelProvider = WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider();

        public Image getColumnImage(Object element, int columnIndex) {
            return mLabelProvider.getImage(element);
        }

        public String getColumnText(Object element, int columnIndex) {
            return mLabelProvider.getText(element);
        }
    }

    private class FilesContentProvider extends EmptyContentProvider {
        @Override
        public Object[] getElements(Object element) {
            if (element instanceof IContainer) {
                IContainer container = (IContainer) element;
                if (container.isAccessible()) {
                    try {
                        List<IResource> children = new ArrayList<IResource>();
                        IResource[] members = container.members();
                        for (int i = 0; i < members.length; i++) {
                            if (members[i].getType() == IResource.FILE) {
                                children.add(members[i]);
                            }
                        }
                        return children.toArray();
                    } catch (CoreException e) {
                        EclipseNSISPlugin.getDefault().log(e);
                    }
                }
            }
            return EMPTY_ARRAY;
        }
    }
}