blob: a31e9ec7872b921d9dc48fcc7b70e880fc416dbe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM - Initial API and implementation
******************************************************************************/
package org.eclipse.team.internal.ccvs.ui;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.core.CVSTeamProvider;
import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.core.IUserInfo;
import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
import org.eclipse.ui.dialogs.PropertyPage;
public class CVSRepositoryPropertiesPage extends PropertyPage {
ICVSRepositoryLocation location;
// Widgets
Text userText;
Text passwordText;
Combo methodType;
Label hostLabel;
Label pathLabel;
Label portLabel;
boolean passwordChanged;
boolean connectionInfoChanged;
IUserInfo info;
/*
* @see PreferencesPage#createContents
*/
protected Control createContents(Composite parent) {
initialize();
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout();
layout.numColumns = 3;
composite.setLayout(layout);
Label label = createLabel(composite, Policy.bind("CVSPropertiesPage.connectionType"), 1); //$NON-NLS-1$
methodType = createCombo(composite);
label = createLabel(composite, Policy.bind("CVSPropertiesPage.user"), 1); //$NON-NLS-1$
userText = createTextField(composite);
label = createLabel(composite, Policy.bind("CVSPropertiesPage.password"), 1); //$NON-NLS-1$
passwordText = createTextField(composite);
passwordText.setEchoChar('*');
label = createLabel(composite, Policy.bind("CVSPropertiesPage.host"), 1); //$NON-NLS-1$
hostLabel = createLabel(composite, "", 2); //$NON-NLS-1$
label = createLabel(composite, Policy.bind("CVSPropertiesPage.port"), 1); //$NON-NLS-1$
portLabel = createLabel(composite, "", 2); //$NON-NLS-1$
label = createLabel(composite, Policy.bind("CVSPropertiesPage.path"), 1); //$NON-NLS-1$
pathLabel = createLabel(composite, "", 2); //$NON-NLS-1$
initializeValues();
passwordText.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
passwordChanged = true;
}
});
userText.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
connectionInfoChanged = true;
}
});
methodType.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
connectionInfoChanged = true;
}
});
return composite;
}
/**
* Utility method that creates a combo box
*
* @param parent the parent for the new label
* @return the new widget
*/
protected Combo createCombo(Composite parent) {
Combo combo = new Combo(parent, SWT.READ_ONLY);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
data.horizontalSpan = 2;
combo.setLayoutData(data);
return combo;
}
/**
* Utility method that creates a label instance
* and sets the default layout data.
*
* @param parent the parent for the new label
* @param text the text for the new label
* @return the new label
*/
protected Label createLabel(Composite parent, String text, int span) {
Label label = new Label(parent, SWT.LEFT);
label.setText(text);
GridData data = new GridData();
data.horizontalSpan = span;
data.horizontalAlignment = GridData.FILL;
label.setLayoutData(data);
return label;
}
/**
* Create a text field specific for this application
*
* @param parent the parent of the new text field
* @return the new text field
*/
protected Text createTextField(Composite parent) {
Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.verticalAlignment = GridData.CENTER;
data.grabExcessVerticalSpace = false;
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
data.horizontalSpan = 2;
text.setLayoutData(data);
return text;
}
/**
* Initializes the page
*/
private void initialize() {
location = null;
IAdaptable element = getElement();
if (element instanceof ICVSRepositoryLocation) {
location = (ICVSRepositoryLocation)element;
} else {
Object adapter = element.getAdapter(ICVSRepositoryLocation.class);
if (adapter instanceof ICVSRepositoryLocation) {
location = (ICVSRepositoryLocation)adapter;
}
}
}
/**
* Set the initial values of the widgets
*/
private void initializeValues() {
passwordChanged = false;
String[] methods = CVSProviderPlugin.getProvider().getSupportedConnectionMethods();
for (int i = 0; i < methods.length; i++) {
methodType.add(methods[i]);
}
String method = location.getMethod().getName();
methodType.select(methodType.indexOf(method));
info = location.getUserInfo(true);
userText.setText(info.getUsername());
passwordText.setText("*********"); //$NON-NLS-1$
hostLabel.setText(location.getHost());
int port = location.getPort();
if (port == ICVSRepositoryLocation.USE_DEFAULT_PORT) {
portLabel.setText(Policy.bind("CVSPropertiesPage.defaultPort")); //$NON-NLS-1$
} else {
portLabel.setText("" + port); //$NON-NLS-1$
}
pathLabel.setText(location.getRootDirectory());
}
/*
* @see PreferencesPage#performOk
*/
public boolean performOk() {
if (!connectionInfoChanged && !passwordChanged) {
return true;
}
info.setUsername(userText.getText());
if (passwordChanged) {
info.setPassword(passwordText.getText());
}
final String type = methodType.getText();
final String password = passwordText.getText();
final boolean[] result = new boolean[] { false };
try {
new ProgressMonitorDialog(getShell()).run(true, false, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
// Check if the password was the only thing to change.
if (passwordChanged && !connectionInfoChanged) {
CVSRepositoryLocation oldLocation = (CVSRepositoryLocation)location;
oldLocation.setPassword(password);
oldLocation.updateCache();
result[0] = true;
return;
}
// Create a new repository location with the new information
CVSRepositoryLocation newLocation = CVSRepositoryLocation.fromString(location.getLocation());
newLocation.setMethod(type);
newLocation.setUserInfo(info);
// For each project shared with the old location, set connection info to the new one
List projects = new ArrayList();
IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for (int i = 0; i < allProjects.length; i++) {
RepositoryProvider teamProvider = RepositoryProvider.getProvider(allProjects[i], CVSProviderPlugin.getTypeId());
if (teamProvider != null) {
CVSTeamProvider cvsProvider = (CVSTeamProvider)teamProvider;
if (cvsProvider.getCVSWorkspaceRoot().getRemoteLocation().equals(location)) {
projects.add(allProjects[i]);
break;
}
}
}
if (projects.size() > 0) {
// To do: warn the user
boolean r = MessageDialog.openConfirm(getShell(), Policy.bind("CVSRepositoryPropertiesPage.Confirm_Project_Sharing_Changes_1"), Policy.bind("CVSRepositoryPropertiesPage.There_are_projects_in_the_workspace_shared_with_this_repository._The_projects_will_be_updated_with_the_new_information_that_you_have_entered_2")); //$NON-NLS-1$ //$NON-NLS-2$
if (!r) {
result[0] = false;
return;
}
monitor.beginTask(null, 1000 * projects.size());
try {
Iterator it = projects.iterator();
while (it.hasNext()) {
IProject project = (IProject)it.next();
RepositoryProvider teamProvider = RepositoryProvider.getProvider(project, CVSProviderPlugin.getTypeId());
CVSTeamProvider cvsProvider = (CVSTeamProvider)teamProvider;
cvsProvider.setRemoteRoot(newLocation, Policy.subMonitorFor(monitor, 1000));
}
} finally {
monitor.done();
}
}
// Dispose the old repository location
CVSProviderPlugin.getProvider().disposeRepository(location);
} catch (TeamException e) {
throw new InvocationTargetException(e);
}
result[0] = true;
}
});
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t instanceof TeamException) {
handle((TeamException)t);
} else if (t instanceof CoreException) {
handle(((CoreException)t).getStatus());
} else {
IStatus status = new Status(IStatus.ERROR, CVSUIPlugin.ID, 1, Policy.bind("internal"), t); //$NON-NLS-1$
handle(status);
CVSUIPlugin.log(status);
}
} catch (InterruptedException e) {
}
return result[0];
}
/**
* Shows the given errors to the user.
*/
protected void handle(TeamException e) {
handle(e.getStatus());
}
protected void handle(IStatus status) {
if (!status.isOK()) {
IStatus toShow = status;
if (status.isMultiStatus()) {
IStatus[] children = status.getChildren();
if (children.length == 1) {
toShow = children[0];
}
}
ErrorDialog.openError(getShell(), status.getMessage(), null, toShow);
}
}
}