org.eclipse.remote.ui.dialogs.RemoteResourceBrowser.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.remote.ui.dialogs.RemoteResourceBrowser.java

Source

/*******************************************************************************
 * Copyright (c) 2008,2013 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
 *******************************************************************************/
package org.eclipse.remote.ui.dialogs;

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

import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.wizard.ProgressMonitorPart;
import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteFileService;
import org.eclipse.remote.internal.ui.messages.Messages;
import org.eclipse.remote.ui.widgets.RemoteResourceBrowserWidget;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.Shell;

/**
 * Generic file/directory browser for remote resources.
 * 
 * A directory browser (DIRECTORY_BROWSER) only allows selection of directories.
 * A file browser (FILE_BROWSER) allows selection of files and directories, but the ok button is only enabled when a file is
 * selected.
 * A resource browser (FILE_BROWSER|DIRECTORY_BROWSER) allows selection of files and directories. This is the default.
 * 
 * To select multiple resources, set the style to SWT.MULTI.
 * 
 * @author greg
 * 
 */
public class RemoteResourceBrowser extends Dialog implements IRunnableContext {
    public static final String EMPTY_STRING = ""; //$NON-NLS-1$
    public static final int FILE_BROWSER = 0x01;
    public static final int DIRECTORY_BROWSER = 0x02;

    private final static int widthHint = 400;

    private Button fOkButton;
    private RemoteResourceBrowserWidget fResourceBrowserWidget;
    private ProgressMonitorPart fProgressMonitor;

    private int fBrowserType;
    private String fDialogTitle;

    private boolean fShowHiddenCheckbox = true;
    private boolean fShowNewFolderButton = true;
    private boolean fShowConnections = false;
    private boolean fShowLocalSelection = false;
    private String fInitialPath;
    private IRemoteConnection fConnection;
    private int fBrowserStyle = SWT.SINGLE;

    public RemoteResourceBrowser(Shell parent, int style) {
        super(parent);
        setShellStyle(SWT.RESIZE | getShellStyle());
        if (style != SWT.NONE) {
            fBrowserStyle = style;
        }
        setTitle(Messages.RemoteResourceBrowser_resourceTitle);
        setType(FILE_BROWSER | DIRECTORY_BROWSER);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets
     * .Composite, int, java.lang.String, boolean)
     */
    @Override
    protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
        Button button = super.createButton(parent, id, label, defaultButton);
        if (id == IDialogConstants.OK_ID) {
            fOkButton = button;
        }
        return button;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets
     * .Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        Control contents = super.createContents(parent);
        if (fDialogTitle == null) {
            if (fBrowserType == DIRECTORY_BROWSER) {
                setTitle(Messages.RemoteResourceBrowser_directoryTitle);
            } else if (fBrowserType == FILE_BROWSER) {
                setTitle(Messages.RemoteResourceBrowser_fileTitle);
            }
        } else {
            setTitle(fDialogTitle);
        }
        if (fInitialPath != null) {
            fResourceBrowserWidget.setInitialPath(fInitialPath);
        }
        if (fConnection != null) {
            fResourceBrowserWidget.setConnection(fConnection);
        }
        updateDialog();
        return contents;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets
     * .Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite main = (Composite) super.createDialogArea(parent);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.widthHint = widthHint;
        main.setLayoutData(gd);
        main.setLayout(new GridLayout(1, true));

        int options = 0;
        if (fConnection == null || fShowConnections) {
            options |= RemoteResourceBrowserWidget.SHOW_CONNECTIONS;
        }
        if (fBrowserType == DIRECTORY_BROWSER) {
            options |= RemoteResourceBrowserWidget.DIRECTORY_BROWSER;
        } else if (fBrowserType == FILE_BROWSER) {
            options |= RemoteResourceBrowserWidget.FILE_BROWSER;
        } else {
            options |= RemoteResourceBrowserWidget.FILE_BROWSER | RemoteResourceBrowserWidget.DIRECTORY_BROWSER;
        }
        if (fShowHiddenCheckbox) {
            options |= RemoteResourceBrowserWidget.SHOW_HIDDEN_CHECKBOX;
        }
        if (fShowNewFolderButton) {
            options |= RemoteResourceBrowserWidget.SHOW_NEW_FOLDER_BUTTON;
        }
        if (fShowLocalSelection) {
            options |= RemoteResourceBrowserWidget.SHOW_LOCAL_SELECTION;
        }
        fResourceBrowserWidget = new RemoteResourceBrowserWidget(main, fBrowserStyle, options);
        fResourceBrowserWidget.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                updateDialog();
            }
        });
        fResourceBrowserWidget.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                getShell().setDefaultButton(null); // allow text widget to receive SWT.DefaultSelection event
            }

            @Override
            public void focusLost(FocusEvent e) {
                getShell().setDefaultButton(fOkButton);
            }
        });
        fResourceBrowserWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        if (fConnection != null) {
            fResourceBrowserWidget.setConnection(fConnection);
        }

        Composite monitorComposite = new Composite(main, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 2;
        monitorComposite.setLayout(layout);
        monitorComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fProgressMonitor = new ProgressMonitorPart(monitorComposite, new GridLayout(), true);
        GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, true);
        fProgressMonitor.setLayoutData(gridData);
        monitorComposite.setVisible(false);

        fResourceBrowserWidget.setRunnableContext(this);

        return main;
    }

    /**
     * Get the connection that was selected
     * 
     * @return selected connection
     */
    public IRemoteConnection getConnection() {
        if (fResourceBrowserWidget != null) {
            return fResourceBrowserWidget.getConnection();
        }
        return null;
    }

    /**
     * Get the resources that was selected.
     * 
     * @return selected resource or null if no resource is selected
     */
    public IFileStore getResource() {
        if (fResourceBrowserWidget != null) {
            return fResourceBrowserWidget.getResource();
        }
        return null;
    }

    /**
     * Get the resources that were selected.
     * 
     * @return selected resources
     */
    public List<IFileStore> getResources() {
        if (fResourceBrowserWidget != null) {
            return fResourceBrowserWidget.getResources();
        }
        return new ArrayList<IFileStore>();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
     */
    @Override
    public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
            throws InvocationTargetException, InterruptedException {
        fProgressMonitor.attachToCancelComponent(null);
        fProgressMonitor.getParent().setVisible(true);
        try {
            ModalContext.run(runnable, fork, fProgressMonitor, getShell().getDisplay());
        } finally {
            fProgressMonitor.getParent().setVisible(false);
            fProgressMonitor.removeFromCancelComponent(null);
        }
    }

    /**
     * Set the connection for the browser. The connection must support the IRemoteFileService service or this method will have no
     * effect.
     * 
     * @param connection
     *            connection that supports the IRemoteFileService service
     */
    public void setConnection(IRemoteConnection connection) {
        if (connection != null && connection.hasService(IRemoteFileService.class)) {
            fConnection = connection;
        }
    }

    /**
     * Set the initial path to start browsing. This will be set in the browser
     * text field, and in a future version should expand the browser to this
     * location if it exists.
     * 
     * @param path
     */
    public void setInitialPath(String path) {
        fInitialPath = path;
    }

    /**
     * Set the fDialogTitle of the dialog.
     * 
     * @param title
     */
    public void setTitle(String title) {
        fDialogTitle = title;
        if (fDialogTitle == null) {
            fDialogTitle = ""; //$NON-NLS-1$
        }
        Shell shell = getShell();
        if ((shell != null) && !shell.isDisposed()) {
            shell.setText(fDialogTitle);
        }
    }

    /**
     * Set the type of browser. Can be either a file browser (allows selection
     * of files), a directory browser (allows selection of directories), or
     * a resource browser (allows selection of files and directories).
     */
    public void setType(int type) {
        fBrowserType = type;
    }

    /**
     * Show available connections on browser if possible (default disabled).
     * 
     * @param enable
     */
    public void showConnections(boolean enable) {
        fShowConnections = enable;
    }

    /**
     * Enable a checkbox to show hidden files (default enabled)
     * 
     * @param showHidden
     */
    public void showHiddenCheckbox(boolean showHidden) {
        fShowHiddenCheckbox = showHidden;
    }

    /**
     * Enable selection of local files
     * 
     * @param showNewFolderButton
     */
    public void showLocalSelection(boolean showLocalSelection) {
        fShowLocalSelection = showLocalSelection;
    }

    /**
     * Enable a button to create new folders (default enabled)
     * 
     * @param showNewFolderButton
     */
    public void showNewFolderButton(boolean showNewFolderButton) {
        fShowNewFolderButton = showNewFolderButton;
    }

    private void updateDialog() {
        if (fOkButton != null) {
            IFileStore resource = getResource();
            boolean enabled = getConnection() != null && resource != null;
            if (enabled && fBrowserType == FILE_BROWSER) {
                enabled &= !resource.fetchInfo().isDirectory();
            }
            fOkButton.setEnabled(enabled);
        }
    }
}