org.eclipse.ptp.rdt.ui.wizards.IndexFileLocationWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ptp.rdt.ui.wizards.IndexFileLocationWidget.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 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:
 *     Mike Kucera (IBM) - Initial API and implementation
 *******************************************************************************/
package org.eclipse.ptp.rdt.ui.wizards;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.ptp.internal.rdt.ui.RSEUtils;
import org.eclipse.ptp.rdt.ui.messages.Messages;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.files.ui.dialogs.SystemRemoteFolderDialog;
import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
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.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class IndexFileLocationWidget extends Composite {

    ///private final Label label;
    private final Text text;
    private final Button browseButton;
    //private final Button validateButton;
    private final Button defaultButton;

    private IHost host;
    private ListenerList pathListeners = new ListenerList();

    private Map<String, String> previousSelections = new HashMap<String, String>();

    public IndexFileLocationWidget(Composite parent, int style, IHost initialHost, String defaultPath) {
        super(parent, style);

        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        this.setLayout(layout);
        this.setLayoutData(new GridData(GridData.FILL_BOTH));

        Group group = new Group(this, SWT.NONE);
        group.setText(Messages.getString("IndexFileLocationWidget.0")); //$NON-NLS-1$
        group.setLayout(new GridLayout(2, false));
        group.setLayoutData(new GridData(GridData.FILL_BOTH));

        text = new Text(group, SWT.BORDER);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        //data.widthHint = 300;
        data.horizontalSpan = 2;
        text.setLayoutData(data);
        text.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                String path = text.getText();

                previousSelections.put(key(host), path);

                for (Object listener : pathListeners.getListeners()) {
                    ((IIndexFilePathChangeListener) listener).pathChanged(path);
                }
            }
        });

        text.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent fe) {
                validateIndexLoc();
            }
        });

        browseButton = new Button(group, SWT.NONE);
        browseButton.setText(Messages.getString("IndexFileLocationWidget.1")); //$NON-NLS-1$
        browseButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        browseButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                browse();
            }
        });

        defaultButton = new Button(group, SWT.NONE);
        defaultButton.setText(Messages.getString("IndexFileLocationWidget.2")); //$NON-NLS-1$
        defaultButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        defaultButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                restoreDefault();
            }
        });

        setHost(initialHost);
        if (defaultPath != null)
            text.setText(defaultPath);
    }

    public IHost getHost() {
        return host;
    }

    public void setHost(IHost host) {
        if (host == null)
            throw new NullPointerException();
        this.host = host;

        String path = previousSelections.get(key(host));
        if (path == null)
            path = RSEUtils.getDefaultConfigDirectory(host);
        if (path == null)
            path = ""; //$NON-NLS-1$

        text.setText(path); // modify event listener updates map
    }

    private static String key(IHost host) {
        return host.getSystemProfileName() + "." + host.getAliasName(); //$NON-NLS-1$
    }

    public String getConfigLocationPath() {
        return text.getText();
    }

    public void addPathListener(IIndexFilePathChangeListener listener) {
        pathListeners.add(listener);
    }

    public void removePathListener(IIndexFilePathChangeListener listener) {
        pathListeners.remove(listener);
    }

    private void browse() {
        SystemRemoteFolderDialog folderDialog = new SystemRemoteFolderDialog(getShell(), host.getAliasName());
        folderDialog.setDefaultSystemConnection(host, true);
        folderDialog.open();

        Object remoteObject = folderDialog.getSelectedObject();
        if (remoteObject instanceof IRemoteFile) {
            IRemoteFile folder = (IRemoteFile) remoteObject;
            text.setText(folder.getCanonicalPath());
        }
        validateIndexLoc();
    }

    private void restoreDefault() {
        text.setText(RSEUtils.getDefaultConfigDirectory(host));
        validateIndexLoc();
    }

    private void validateIndexLoc() {
        String path = text.getText();
        IRemoteFileSubSystem remoteFileSubSystem = RemoteFileUtility.getFileSubSystem(host);

        // display the message in the property dialog if possible
        Composite parent = text.getParent();
        PreferenceDialog dialog = null;
        while (parent != null && !(parent instanceof Shell))
            parent = parent.getParent();
        if (parent instanceof Shell) {
            if (parent.getData() instanceof PreferenceDialog) {
                dialog = (PreferenceDialog) parent.getData();
                dialog.setMessage(null, IMessageProvider.NONE);
            }
        }

        try {
            IRemoteFile currentRemoteFolder = remoteFileSubSystem.getRemoteFileObject(path,
                    new NullProgressMonitor());

            if (currentRemoteFolder == null || !currentRemoteFolder.canWrite()) {
                if (dialog != null)
                    dialog.setMessage(Messages.getString("InvalidIndexLocationLabel"), IMessageProvider.ERROR); //$NON-NLS-1$
                else
                    // just display a dialog
                    MessageDialog.openWarning(getShell(), Messages.getString("InvalidIndexLocationTitle"), //$NON-NLS-1$
                            Messages.getString("InvalidIndexLocationLabel")); //$NON-NLS-1$
            }

        } catch (SystemMessageException e1) {
            e1.printStackTrace();
        }
    }

}