org.eclipse.team.internal.ui.wizards.ExportProjectSetLocationPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.team.internal.ui.wizards.ExportProjectSetLocationPage.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 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 Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.team.internal.ui.wizards;

import java.io.File;
import java.util.ArrayList;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

public class ExportProjectSetLocationPage extends TeamWizardPage {

    Combo fileCombo;
    protected IFile workspaceFile;
    protected String file = ""; //$NON-NLS-1$
    Button browseButton;

    private boolean saveToFileSystem;
    private Button fileRadio;
    private Button workspaceRadio;

    protected Text workspaceText;

    public ExportProjectSetLocationPage(String pageName, String title, ImageDescriptor titleImage) {
        super(pageName, title, titleImage);
        setDescription(TeamUIMessages.ExportProjectSetMainPage_description);
    }

    public void createControl(Composite parent) {
        Composite composite = createComposite(parent, 1);
        initializeDialogUnits(composite);

        Group locationGroup = new Group(composite, SWT.None);
        GridLayout layout = new GridLayout();
        locationGroup.setLayout(layout);
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
        locationGroup.setLayoutData(data);
        locationGroup.setText(TeamUIMessages.ExportProjectSetMainPage_Project_Set_File_Name__3);

        createExportToFile(locationGroup);

        createExportToWorkspace(locationGroup);

        saveToFileSystem = true;

        setControl(composite);
        updateEnablement();
        Dialog.applyDialogFont(parent);
    }

    private void createExportToFile(Composite composite) {
        fileRadio = new Button(composite, SWT.RADIO);
        fileRadio.setText(TeamUIMessages.ExportProjectSetMainPage_FileButton);
        fileRadio.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                saveToFileSystem = true;
                file = fileCombo.getText();
                updateEnablement();
            }
        });

        Composite inner = new Composite(composite, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginWidth = 0;
        inner.setLayout(layout);
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
        inner.setLayoutData(data);

        fileCombo = createDropDownCombo(inner);
        file = PsfFilenameStore.getInstance().getSuggestedDefault();
        fileCombo.setItems(PsfFilenameStore.getInstance().getHistory());
        fileCombo.setText(file);
        fileCombo.addListener(SWT.Modify, new Listener() {
            public void handleEvent(Event event) {
                file = fileCombo.getText();
                updateEnablement();
            }
        });

        browseButton = new Button(inner, SWT.PUSH);
        browseButton.setText(TeamUIMessages.ExportProjectSetMainPage_Browse_4);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        data.widthHint = Math.max(widthHint, browseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        browseButton.setLayoutData(data);
        browseButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (!isSaveToFileSystem())
                    saveToFileSystem = true;

                FileDialog d = new FileDialog(getShell(), SWT.SAVE);
                d.setFilterExtensions(new String[] { "*.psf" }); //$NON-NLS-1$
                d.setFilterNames(new String[] { TeamUIMessages.ExportProjectSetMainPage_Project_Set_Files_3 });
                d.setFileName(TeamUIMessages.ExportProjectSetMainPage_default);
                String fileName = getFileName();
                if (fileName != null) {
                    int separator = fileName.lastIndexOf(System.getProperty("file.separator").charAt(0)); //$NON-NLS-1$
                    if (separator != -1) {
                        fileName = fileName.substring(0, separator);
                    }
                }
                d.setFilterPath(fileName);
                String f = d.open();
                if (f != null) {
                    fileCombo.setText(f);
                    file = f;
                }
            }
        });
    }

    private void createExportToWorkspace(Composite composite) {
        workspaceRadio = new Button(composite, SWT.RADIO);
        workspaceRadio.setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceButton);
        workspaceRadio.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                saveToFileSystem = false;
                updateEnablement();
            }
        });

        final Composite nameGroup = new Composite(composite, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginWidth = 0;
        nameGroup.setLayout(layout);
        final GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
        nameGroup.setLayoutData(data);

        workspaceText = createTextField(nameGroup);
        workspaceText.setEditable(false);
        workspaceText.addListener(SWT.Modify, new Listener() {
            public void handleEvent(Event event) {
                file = workspaceFile.getLocation().toString();
                updateEnablement();
            }
        });
        Button wsBrowseButton = new Button(nameGroup, SWT.PUSH);
        GridData gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        gd.widthHint = Math.max(widthHint, wsBrowseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        wsBrowseButton.setLayoutData(gd);
        wsBrowseButton.setText(TeamUIMessages.ExportProjectSetMainPage_Browse);
        wsBrowseButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (isSaveToFileSystem())
                    saveToFileSystem = false;

                WorkspaceDialog d = new WorkspaceDialog(getShell());
                d.open();
            }
        });
    }

    private void updateEnablement() {
        boolean complete;
        //update radio buttons
        fileRadio.setSelection(saveToFileSystem);
        workspaceRadio.setSelection(!saveToFileSystem);

        if (file.length() == 0) {
            setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_specifyFile);
            complete = false;
        } else {
            File f = new File(file);
            if (f.isDirectory()) {
                setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_You_have_specified_a_folder_5);
                complete = false;
            } else {
                if (!isSaveToFileSystem() && workspaceFile == null) {
                    setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_specifyFile);
                    complete = false;
                } else {
                    complete = true;
                }
            }
        }

        if (!isSaveToFileSystem() && workspaceFile != null) {
            complete = true;
        }

        if (complete) {
            setErrorMessage(null);
            setDescription(TeamUIMessages.ExportProjectSetMainPage_description);
        }
        setPageComplete(complete);
    }

    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            fileCombo.setFocus();
        }
    }

    public boolean isSaveToFileSystem() {
        return saveToFileSystem;
    }

    public void refreshWorkspaceFile(IProgressMonitor monitor) throws CoreException {
        if (workspaceFile != null)
            workspaceFile.refreshLocal(IResource.DEPTH_ONE, monitor);
    }

    public String getFileName() {
        return file;
    }

    public void setFileName(String file) {
        if (file != null) {
            this.file = file;
        }
    }

    class WorkspaceDialog extends TitleAreaDialog {

        protected TreeViewer wsTreeViewer;
        protected Text wsFilenameText;
        protected IContainer wsContainer;
        protected Image dlgTitleImage;

        private Button okButton;

        public WorkspaceDialog(Shell shell) {
            super(shell);
        }

        protected Control createContents(Composite parent) {
            Control control = super.createContents(parent);
            setTitle(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitle);
            setMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitleMessage);

            return control;
        }

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

            GridLayout layout = new GridLayout();
            layout.numColumns = 1;
            composite.setLayout(layout);
            final GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
            composite.setLayoutData(data);

            getShell().setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogMessage);

            wsTreeViewer = new TreeViewer(composite, SWT.BORDER);
            final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
            gd.widthHint = 550;
            gd.heightHint = 250;
            wsTreeViewer.getTree().setLayoutData(gd);

            wsTreeViewer.setContentProvider(new LocationPageContentProvider());
            wsTreeViewer.setLabelProvider(new WorkbenchLabelProvider());
            wsTreeViewer.setInput(ResourcesPlugin.getWorkspace());

            final Composite group = new Composite(composite, SWT.NONE);
            layout = new GridLayout(2, false);
            layout.marginWidth = 0;
            group.setLayout(layout);
            group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

            final Label label = new Label(group, SWT.NONE);
            label.setLayoutData(new GridData());
            label.setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogFilename);

            wsFilenameText = new Text(group, SWT.BORDER);
            wsFilenameText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
            wsFilenameText.setText("projectSet.psf"); //$NON-NLS-1$

            setupListeners();

            return parent;
        }

        protected void createButtonsForButtonBar(Composite parent) {
            super.createButtonsForButtonBar(parent);
            okButton = getButton(IDialogConstants.OK_ID);
        }

        protected void okPressed() {
            //Make sure that a container has been selected
            if (wsContainer == null) {
                getSelectedContainer();
            }
            //Assert.isNotNull(wsContainer);

            workspaceFile = wsContainer.getFile(new Path(wsFilenameText.getText()));
            if (workspaceFile != null) {
                workspaceText.setText(workspaceFile.getFullPath().toString());
            }
            //this.page.validatePage();
            //workspaceText.setText(wsFilenameText.getText());
            super.okPressed();
        }

        private void getSelectedContainer() {
            Object obj = ((IStructuredSelection) wsTreeViewer.getSelection()).getFirstElement();

            if (obj instanceof IContainer)
                wsContainer = (IContainer) obj;
            else if (obj instanceof IFile) {
                wsContainer = ((IFile) obj).getParent();
            }
        }

        protected void cancelPressed() {
            //this.page.validatePage();
            getSelectedContainer();
            super.cancelPressed();
        }

        public boolean close() {
            /*     if (dlgTitleImage != null)
             dlgTitleImage.dispose();*/
            return super.close();
        }

        void setupListeners() {
            wsTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
                public void selectionChanged(SelectionChangedEvent event) {
                    IStructuredSelection s = (IStructuredSelection) event.getSelection();
                    Object obj = s.getFirstElement();
                    if (obj != null) {

                    }
                    if (obj instanceof IContainer)
                        wsContainer = (IContainer) obj;
                    else if (obj instanceof IFile) {
                        IFile tempFile = (IFile) obj;
                        wsContainer = tempFile.getParent();
                        wsFilenameText.setText(tempFile.getName());
                    }
                }
            });

            wsTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
                public void doubleClick(DoubleClickEvent event) {
                    ISelection s = event.getSelection();
                    if (s instanceof IStructuredSelection) {
                        Object item = ((IStructuredSelection) s).getFirstElement();
                        if (wsTreeViewer.getExpandedState(item))
                            wsTreeViewer.collapseToLevel(item, 1);
                        else
                            wsTreeViewer.expandToLevel(item, 1);
                    }
                }
            });

            wsFilenameText.addModifyListener(new ModifyListener() {
                public void modifyText(ModifyEvent e) {
                    String patchName = wsFilenameText.getText();
                    if (patchName.trim().equals("")) { //$NON-NLS-1$
                        okButton.setEnabled(false);
                        setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorNoFilename);
                    } else if (!(ResourcesPlugin.getWorkspace().validateName(patchName, IResource.FILE)).isOK()) {
                        //make sure that the filename does not contain more than one segment
                        okButton.setEnabled(false);
                        setErrorMessage(
                                TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorFilenameSegments);
                    } else {
                        okButton.setEnabled(true);
                        setErrorMessage(null);
                    }
                }
            });
        }
    }

    class LocationPageContentProvider extends BaseWorkbenchContentProvider {
        //Never show closed projects
        boolean showClosedProjects = false;

        public Object[] getChildren(Object element) {
            if (element instanceof IWorkspace) {
                // check if closed projects should be shown
                IProject[] allProjects = ((IWorkspace) element).getRoot().getProjects();
                if (showClosedProjects)
                    return allProjects;

                ArrayList accessibleProjects = new ArrayList();
                for (int i = 0; i < allProjects.length; i++) {
                    if (allProjects[i].isOpen()) {
                        accessibleProjects.add(allProjects[i]);
                    }
                }
                return accessibleProjects.toArray();
            }

            return super.getChildren(element);
        }
    }

    public void validateEditWorkspaceFile(Shell shell) throws TeamException {
        if (workspaceFile == null || !workspaceFile.exists() || !workspaceFile.isReadOnly())
            return;
        IStatus status = ResourcesPlugin.getWorkspace().validateEdit(new IFile[] { workspaceFile }, shell);
        if (!status.isOK()) {
            throw new TeamException(status);
        }
    }
}