blob: 06d684f717669d6fed9531393c643d3e7db6fa86 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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.ptp.rdt.sync.ui.wizards;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.ui.wizards.conversion.ConvertProjectWizardPage;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.internal.filesystem.local.LocalFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ptp.internal.rdt.sync.ui.RDTHelpContextIds;
import org.eclipse.ptp.rdt.sync.core.make.RemoteMakeBuilder;
import org.eclipse.ptp.rdt.sync.core.resources.RemoteMakeNature;
import org.eclipse.ptp.rdt.sync.core.resources.RemoteSyncNature;
import org.eclipse.ptp.rdt.sync.ui.RDTSyncUIPlugin;
import org.eclipse.ptp.rdt.sync.ui.messages.Messages;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.ProjectNotConfiguredException;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.ptp.services.ui.widgets.ServiceProviderConfigurationWidget;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
/**
* Converts existing CDT projects to RDT projects.
*
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as part
* of a work in progress. There is no guarantee that this API will work or that
* it will remain the same. Please do not use this API without consulting with
* the RDT team.
*
* @author vkong
*/
public class ConvertToRemoteWizardPage extends ConvertProjectWizardPage {
/**
* @since 2.0
*/
protected static final String WZ_TITLE = "WizardProjectConversion.title"; //$NON-NLS-1$
/**
* @since 2.0
*/
protected static final String WZ_DESC = "WizardProjectConversion.description"; //$NON-NLS-1$
/**
* @since 2.0
*/
protected ServiceProviderConfigurationWidget fServiceModelWidget;
/**
* @since 2.0
*/
protected Group remoteServices;
/**
* @since 2.0
*/
protected Map<IProject, IServiceConfiguration> projectConfigs = new HashMap<IProject, IServiceConfiguration>();
/**
* Constructor for ConvertToRemoteWizardPage.
*
* @param pageName
*/
public ConvertToRemoteWizardPage(String pageName) {
super(pageName);
}
/**
* Method getWzTitleResource returns the correct Title Label for this class
* overriding the default in the superclass.
*/
@Override
protected String getWzTitleResource() {
return Messages.WizardProjectConversion_title;
}
/**
* Method getWzDescriptionResource returns the correct description Label for
* this class overriding the default in the superclass.
*/
@Override
protected String getWzDescriptionResource() {
return Messages.WizardProjectConversion_description;
}
/**
* Returns true for: - non-hidden projects - non-RDT projects - projects
* that does not have remote systems temporary nature - projects that are
* located remotely
*/
@Override
public boolean isCandidate(IProject project) {
boolean a = false;
boolean b = false;
boolean c = false;
boolean d = false;
a = !project.isHidden();
try {
// b = !project.hasNature(RemoteNature.REMOTE_NATURE_ID);
try {
ServiceModelManager.getInstance().getConfigurations(project);
} catch (ProjectNotConfiguredException e) {
b = true;
}
c = !project.hasNature("org.eclipse.rse.ui.remoteSystemsTempNature"); //$NON-NLS-1$
IFileStore fileStore = EFS.getStore(project.getLocationURI());
if (fileStore != null) {
if (!(fileStore instanceof LocalFile)) {
d = true;
}
}
} catch (CoreException e) {
RDTSyncUIPlugin.log(e);
}
return a && b && c && d;
}
/**
* Add remote nature and configure remote services for the project
*/
@Override
public void convertProject(IProject project, String bsId, IProgressMonitor monitor) throws CoreException {
convertProject(project, monitor);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.cdt.ui.wizards.conversion.ConvertProjectWizardPage#convertProject
* (org.eclipse.core.resources.IProject,
* org.eclipse.core.runtime.IProgressMonitor, java.lang.String)
*/
@Override
public void convertProject(IProject project, IProgressMonitor monitor, String projectID) throws CoreException {
convertProject(project, monitor);
}
/**
* @since 2.0
*/
protected void convertProject(IProject project, IProgressMonitor monitor) throws CoreException {
monitor.beginTask(Messages.WizardProjectConversion_monitor_convertingToRemoteProject, 3);
try {
RemoteSyncNature.addRemoteNature(project, new SubProgressMonitor(monitor, 1));
RemoteMakeNature.updateProjectDescription(project, RemoteMakeBuilder.BUILDER_ID, monitor);
configureServicesForRemoteProject(project);
} finally {
monitor.done();
}
}
@Override
protected void addToMainPage(Composite container) {
remoteServices = new Group(container, SWT.SHADOW_IN);
remoteServices.setText(Messages.WizardProjectConversion_servicesTableLabel);
remoteServices.setLayout(new FillLayout());
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.heightHint = 350;
remoteServices.setLayoutData(data);
fServiceModelWidget = new ServiceProviderConfigurationWidget(remoteServices, SWT.NONE);
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent e) {
IProject project = (IProject) ((IStructuredSelection) e.getSelection()).getFirstElement();
if (project != null) {
changeProject(project);
}
}
});
tableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent e) {
IProject project = (IProject) e.getElement();
if (e.getChecked() && project != null) {
changeProject(project);
}
}
});
Shell shell = getContainer().getShell();
PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, RDTHelpContextIds.CONVERTING_TO_REMOTE_PROJECT);
}
@Override
public void doRun(IProgressMonitor monitor, String projectID, String bsId) throws CoreException {
monitor.beginTask(Messages.ConvertToRemoteWizardPage_0, 2);
fServiceModelWidget.applyChangesToConfiguration();
super.doRun(new SubProgressMonitor(monitor, 1), projectID, bsId);
try {
ServiceModelManager.getInstance().saveModelConfiguration();
} catch (IOException e) {
RDTSyncUIPlugin.log(e);
} finally {
monitor.done();
}
}
/**
* @since 2.0
*/
protected IServiceConfiguration getConfig(IProject project) {
IServiceConfiguration config = projectConfigs.get(project);
if (config == null) {
config = ServiceModelManager.getInstance().newServiceConfiguration(project.getName());
projectConfigs.put(project, config);
}
return config;
}
/**
* @since 2.0
*/
protected void changeProject(IProject project) {
IServiceConfiguration config = getConfig(project);
fServiceModelWidget.applyChangesToConfiguration();
fServiceModelWidget.setServiceConfiguration(config);
remoteServices.setText(MessageFormat.format(Messages.WizardProjectConversion_servicesTableForProjectLabel,
new Object[] { project.getName() }));
}
/**
* @since 2.0
*/
protected void configureServicesForRemoteProject(IProject project) {
ServiceModelManager.getInstance().addConfiguration(project, getConfig(project));
}
}