blob: 1f236fb2bfc8097b7de5e4d8123ce5efbb838eb6 [file] [log] [blame]
/*
* 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();
}
}
}