com.android.ide.eclipse.adt.internal.wizards.exportgradle.ConfirmationPage.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.adt.internal.wizards.exportgradle.ConfirmationPage.java

Source

/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.adt.internal.wizards.exportgradle;

import com.google.common.collect.Lists;

import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import java.io.File;
import java.util.Collection;
import java.util.List;

/**
 * Confirmation page to review the actual project export
 * list and see warning about existing files.
 *
 */
public class ConfirmationPage extends WizardPage {

    private final ProjectSetupBuilder mBuilder;
    private TableViewer mTableViewer;
    private Label mModuleDescription1;
    private Label mModuleDescription2;
    private Label mModuleDescription3;
    private Label mProjectRootLabel;
    private Label mProjectRootWarning;
    private List<IJavaProject> mOverrideProjects;
    private boolean mOverrideWarning;
    private Button mForceOverride;

    public ConfirmationPage(ProjectSetupBuilder builder) {
        super("ConfirmationPage"); //$NON-NLS-1$
        mBuilder = builder;
        setPageComplete(false);
        setTitle(ExportMessages.PageTitle);
        setDescription(ExportMessages.PageDescription);
    }

    @Override
    public void createControl(Composite parent) {
        initializeDialogUnits(parent);
        GridData data;

        Composite workArea = new Composite(parent, SWT.NONE);
        setControl(workArea);

        workArea.setLayout(new GridLayout());
        workArea.setLayoutData(
                new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));

        Label title = new Label(workArea, SWT.NONE);
        title.setText("Please review the export options.");

        Group group = new Group(workArea, SWT.NONE);
        group.setText("Project root");
        group.setLayout(new GridLayout());
        group.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        mProjectRootLabel = new Label(group, SWT.NONE);
        mProjectRootLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        mProjectRootWarning = new Label(group, SWT.NONE);
        mProjectRootWarning.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        Group group2 = new Group(workArea, SWT.NONE);
        group2.setText("Exported Modules");
        group2.setLayout(new GridLayout());
        group2.setLayoutData(data = new GridData(SWT.FILL, SWT.FILL, true, true));
        data.heightHint = 300;

        Table table = new Table(group2, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        mTableViewer = new TableViewer(table);
        table.setLayout(new TableLayout());
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        mTableViewer.setContentProvider(new IStructuredContentProvider() {
            @Override
            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof ProjectSetupBuilder) {
                    ProjectSetupBuilder builder = (ProjectSetupBuilder) inputElement;
                    Collection<GradleModule> modules = builder.getModules();
                    Object[] array = new Object[modules.size()];
                    int i = 0;
                    for (GradleModule module : modules) {
                        array[i++] = module.getJavaProject();
                    }

                    return array;
                }

                return null;
            }

            @Override
            public void dispose() {
            }

            @Override
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

        });
        mTableViewer.setLabelProvider(new WorkbenchLabelProvider() {
            @Override
            protected String decorateText(String input, Object element) {
                if (element instanceof IJavaProject) {
                    IJavaProject javaProject = (IJavaProject) element;
                    StringBuilder sb = new StringBuilder(input);
                    if (!mBuilder.isOriginalProject(javaProject)) {
                        sb.append('*');
                    }
                    // TODO: decorate icon instead?
                    if (mOverrideProjects.contains(javaProject)) {
                        sb.append(" (1 warning)");
                    }

                    return sb.toString();
                }

                return input;
            }
        });
        mTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object firstElement = selection.getFirstElement();
                if (firstElement instanceof IJavaProject) {
                    GradleModule module = mBuilder.getModule((IJavaProject) firstElement);
                    if (mBuilder.getOriginalModules().contains(module)) {
                        mModuleDescription1.setText("Exported because selected in previous page.");
                    } else {
                        List<GradleModule> list = mBuilder.getShortestDependencyTo(module);
                        StringBuilder sb = new StringBuilder();
                        for (GradleModule m : list) {
                            if (sb.length() > 0) {
                                sb.append(" > ");
                            }
                            sb.append(m.getJavaProject().getProject().getName());
                        }
                        mModuleDescription1.setText("Dependency chain: " + sb);
                    }
                    mModuleDescription2.setText("Path: " + module.getPath());

                    if (mOverrideProjects.contains(module.getJavaProject())) {
                        mModuleDescription3.setText("WARNING: build.gradle already exists for this project");
                    } else {
                        mModuleDescription3.setText("");
                    }
                } else {
                    mModuleDescription1.setText("");
                    mModuleDescription2.setText("");
                    mModuleDescription3.setText("");
                }
            }
        });

        mModuleDescription1 = new Label(group2, SWT.NONE);
        mModuleDescription1.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        mModuleDescription2 = new Label(group2, SWT.NONE);
        mModuleDescription2.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        mModuleDescription3 = new Label(group2, SWT.NONE);
        mModuleDescription3.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        mForceOverride = new Button(workArea, SWT.CHECK);
        mForceOverride.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        mForceOverride.setText("Force overriding of existing files");
        mForceOverride.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updateEnablement();
            }
        });

        setControl(workArea);
        Dialog.applyDialogFont(parent);
    }

    /**
     * Get list of projects which have already a buildfile.
     *
     * @param javaProjects list of IJavaProject objects
     * @return set of project names
     */
    private void computeOverride(String commonRoot) {
        mOverrideProjects = Lists.newArrayList();
        for (GradleModule module : mBuilder.getModules()) {
            if (new File(module.getProject().getLocation().toFile(), BuildFileCreator.BUILD_FILE).exists()) {
                mOverrideProjects.add(module.getJavaProject());
            }
        }

        // also check on the root settings.gradle/build.gradle
        boolean settingsFile = new File(commonRoot, BuildFileCreator.SETTINGS_FILE).exists();
        boolean buildFile = new File(commonRoot, BuildFileCreator.BUILD_FILE).exists();
        if (settingsFile && buildFile) {
            mProjectRootWarning.setText("WARNING: build.gradle/settings.gradle already exists at this location.");
        } else if (settingsFile) {
            mProjectRootWarning.setText("WARNING: settings.gradle already exists at this location.");
        } else if (buildFile) {
            mProjectRootWarning.setText("WARNING: build.gradle already exists at this location.");
        }

        mOverrideWarning = mOverrideProjects.size() > 0 || settingsFile || buildFile;
    }

    /**
     * Enables/disables the finish button on the wizard and displays error messages as needed.
     */
    private void updateEnablement() {
        if (mOverrideWarning && !mForceOverride.getSelection()) {
            setErrorMessage("Enable overriding of existing files before clicking Finish");
            mBuilder.setCanGenerate(false);
        } else {
            setErrorMessage(null);
            mBuilder.setCanGenerate(true);
        }
        setPageComplete(false);
        getContainer().updateButtons();
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            mProjectRootWarning.setText("");

            String commonRoot = mBuilder.getCommonRoot().toOSString();
            computeOverride(commonRoot);
            mProjectRootLabel.setText(commonRoot);
            mTableViewer.setInput(mBuilder);
            mTableViewer.getTable().setFocus();
            mBuilder.setCanFinish(false);
            mBuilder.setCanGenerate(true);
            updateEnablement();
        }
    }
}