/*
* Copyright (c) 2015 the original author or authors.
* 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:
* Etienne Studer & Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation
*/
package org.eclipse.buildship.ui.wizard.project;
import java.io.File;
import java.util.List;
import com.google.common.collect.ImmutableList;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.buildship.core.projectimport.ProjectImportConfiguration;
import org.eclipse.buildship.core.util.file.FileUtils;
import org.eclipse.buildship.ui.UiPlugin;
import org.eclipse.buildship.ui.UiPluginConstants;
import org.eclipse.buildship.ui.i18n.UiMessages;
import org.eclipse.buildship.ui.util.file.DirectoryDialogSelectionListener;
import org.eclipse.buildship.ui.util.layout.LayoutUtils;
import org.eclipse.buildship.ui.util.widget.UiBuilder;
import org.eclipse.buildship.ui.util.workbench.WorkingSetUtils;
/**
* Page in the {@link ProjectImportWizard} specifying the Gradle root project folder to import.
*/
public final class GradleProjectWizardPage extends AbstractWizardPage {
private Text projectDirText;
private WorkingSetConfigurationWidget workingSetConfigurationWidget;
public GradleProjectWizardPage(ProjectImportConfiguration configuration) {
super("GradleProject", ProjectWizardMessages.Title_GradleProjectWizardPage, ProjectWizardMessages.InfoMessage_GradleProjectWizardPageDefault, //$NON-NLS-1$
configuration, ImmutableList.of(configuration.getProjectDir(), configuration.getWorkingSets()));
}
@Override
protected void createWidgets(Composite root) {
root.setLayout(LayoutUtils.newGridLayout(3));
createContent(root);
bindToConfiguration();
}
private void createContent(Composite root) {
UiBuilder.UiBuilderFactory uiBuilderFactory = getUiBuilderFactory();
// project directory container
Composite projectDirectoryComposite = new Composite(root, SWT.NONE);
GridLayoutFactory.swtDefaults().numColumns(3).extendedMargins(0, 0, 0, 10).applyTo(projectDirectoryComposite);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(3, SWT.DEFAULT).applyTo(projectDirectoryComposite);
// project directory label
uiBuilderFactory.newLabel(projectDirectoryComposite).alignLeft().text(ProjectWizardMessages.Label_ProjectRootDirectory).control();
// project directory text field
File projectDir = getConfiguration().getProjectDir().getValue();
String projectDirValue = FileUtils.getAbsolutePath(projectDir).orNull();
this.projectDirText = uiBuilderFactory.newText(projectDirectoryComposite).alignFillHorizontal().text(projectDirValue).control();
// browse button for file chooser
Button projectDirBrowseButton = uiBuilderFactory.newButton(projectDirectoryComposite).alignLeft().text(UiMessages.Button_Label_Browse).control();
projectDirBrowseButton.addSelectionListener(new DirectoryDialogSelectionListener(root.getShell(), this.projectDirText, ProjectWizardMessages.Label_ProjectRootDirectory));
// working set container
Group workingSetGroup = uiBuilderFactory.newGroup(root).text(ProjectWizardMessages.Group_Label_WorkingSets).control();
GridLayoutFactory.swtDefaults().applyTo(workingSetGroup);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(3, SWT.DEFAULT).applyTo(workingSetGroup);
this.workingSetConfigurationWidget = new WorkingSetConfigurationWidget(new String[] { UiPluginConstants.RESOURCE, UiPluginConstants.JAVA }, UiPlugin.getInstance().getDialogSettings());
this.workingSetConfigurationWidget.createContent(workingSetGroup);
this.workingSetConfigurationWidget.modifyCurrentWorkingSetItem(WorkingSetUtils.toWorkingSets(getConfiguration().getWorkingSets().getValue()));
this.workingSetConfigurationWidget.getWorkingSetsEnabledButton().setSelection(getConfiguration().getApplyWorkingSets().getValue());
this.workingSetConfigurationWidget.getWorkingSetsCombo().setEnabled(getConfiguration().getApplyWorkingSets().getValue());
this.workingSetConfigurationWidget.getWorkingSetsSelectButton().setEnabled(getConfiguration().getApplyWorkingSets().getValue());
}
private void bindToConfiguration() {
this.projectDirText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
File projectDir = FileUtils.getAbsoluteFile(GradleProjectWizardPage.this.projectDirText.getText()).orNull();
getConfiguration().setProjectDir(projectDir);
}
});
this.workingSetConfigurationWidget.addWorkingSetChangeListener(new WorkingSetChangedListener() {
@Override
public void workingSetsChanged(List<IWorkingSet> workingSets) {
List<String> workingSetNames = WorkingSetUtils.toWorkingSetNames(workingSets);
getConfiguration().setWorkingSets(workingSetNames);
}
});
this.workingSetConfigurationWidget.getWorkingSetsEnabledButton().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean selected = GradleProjectWizardPage.this.workingSetConfigurationWidget.getWorkingSetsEnabledButton().getSelection();
getConfiguration().setApplyWorkingSets(selected);
}
});
}
@Override
protected String getPageContextInformation() {
return ProjectWizardMessages.InfoMessage_GradleProjectWizardPageContext;
}
}