blob: 9b57d19581b372a65afeda6a878b353f9f25e09d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.wizards;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
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.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.core.ICVSFolder;
import org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
import org.eclipse.team.internal.ccvs.ui.AdaptableResourceList;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.ccvs.ui.Policy;
/**
* This page allows the user to select the target parent container for
* the folders being checked out.
*/
public class CheckoutAsProjectSelectionPage extends CVSWizardPage {
public static final String NAME = "CheckoutAsProjectSelectionPage"; //$NON-NLS-1$
private TreeViewer tree;
private Text nameField;
private Combo filterList;
private Button recurseCheck;
private IResource[] resources;
private IResource selection;
private ICVSRemoteFolder[] remoteFolders;
private String folderName;
private boolean recurse;
private int filter;
/**
* Constructor for CheckoutIntoProjectSelectionPage.
* @param pageName
* @param title
* @param titleImage
*/
public CheckoutAsProjectSelectionPage(ImageDescriptor titleImage, ICVSRemoteFolder[] remoteFolders) {
super(NAME, Policy.bind("CheckoutAsProjectSelectionPage.title"), titleImage, Policy.bind("CheckoutAsProjectSelectionPage.description")); //$NON-NLS-1$ //$NON-NLS-2$
this.remoteFolders = remoteFolders;
}
/**
* @return
*/
private boolean isSingleFolder() {
return remoteFolders.length == 1;
}
/*
* For the single folder case, return the name of the folder
*/
private String getInputFolderName() {
return remoteFolders[0].getName();
}
private String getRepository() throws CVSException {
return remoteFolders[0].getFolderSyncInfo().getRoot();
}
/**
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
Composite composite= createComposite(parent, 2);
setControl(composite);
// WorkbenchHelp.setHelp(composite, IHelpContextIds.CHECKOUT_INTO_RESOURCE_SELECTION_PAGE);
if (isSingleFolder()) {
createLabel(composite, Policy.bind("CheckoutAsProjectSelectionPage.name")); //$NON-NLS-1$
nameField = createTextField(composite);
nameField.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
folderName = nameField.getText();
updateWidgetEnablements();
}
});
}
createWrappingLabel(composite, Policy.bind("CheckoutAsProjectSelectionPage.treeLabel"), 0, 2); //$NON-NLS-1$
tree = createResourceSelectionTree(composite, IResource.PROJECT | IResource.FOLDER, 2 /* horizontal span */);
tree.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleResourceSelection(event);
}
});
Composite filterComposite = createComposite(composite, 2);
GridData data = new GridData();
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
data.horizontalSpan = 2;
filterComposite.setLayoutData(data);
createLabel(filterComposite, Policy.bind("CheckoutAsProjectSelectionPage.showLabel")); //$NON-NLS-1$
filterList = createCombo(filterComposite);
filterList.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleFilterSelection();
}
});
createWrappingLabel(composite, "", 0, 2); //$NON-NLS-1$
// Should subfolders of the folder be checked out?
recurseCheck = createCheckBox(composite, Policy.bind("CheckoutAsProjectSelectionPage.recurse")); //$NON-NLS-1$
recurseCheck.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
recurse = recurseCheck.getSelection();
updateWidgetEnablements();
}
});
initializeValues();
updateWidgetEnablements();
tree.getControl().setFocus();
}
/**
* Method initializeValues.
*/
private void initializeValues() {
if (isSingleFolder()) {
nameField.setText(getInputFolderName());
}
tree.setInput(ResourcesPlugin.getWorkspace().getRoot());
recurse = true;
recurseCheck.setSelection(recurse);
filter = 0;
updateTreeContents(filter);
filterList.add(Policy.bind("CheckoutAsProjectSelectionPage.showAll")); //$NON-NLS-1$
filterList.add(Policy.bind("CheckoutAsProjectSelectionPage.showUnshared")); //$NON-NLS-1$
filterList.add(Policy.bind("CheckoutAsProjectSelectionPage.showSameRepo")); //$NON-NLS-1$
filterList.select(filter);
}
private void handleResourceSelection(SelectionChangedEvent event) {
ISelection sel = event.getSelection();
if (sel.isEmpty()) {
this.selection = null;
} else if (sel instanceof IStructuredSelection) {
this.selection = (IResource)((IStructuredSelection)sel).getFirstElement();
}
updateWidgetEnablements();
}
/**
* Method updateWidgetEnablement.
*/
private void updateWidgetEnablements() {
if (isSingleFolder() && !Path.EMPTY.isValidSegment(folderName)) {
setPageComplete(false);
setErrorMessage(Policy.bind("CheckoutAsProjectSelectionPage.invalidFolderName", folderName)); //$NON-NLS-1$
return;
}
boolean complete = selection != null && selection.getType() != IResource.FILE;
setErrorMessage(null);
setPageComplete(complete);
}
/**
* Returns the selection.
* @return IResource
*/
public IResource getSelection() {
return selection;
}
/**
* Returns the folderName.
* @return String
*/
public String getFolderName() {
return folderName;
}
private void updateTreeContents(int selected) {
try {
if (selected == 0) {
tree.setInput(new AdaptableResourceList(getProjects(getRepository(), true)));
} else if (selected == 1) {
tree.setInput(new AdaptableResourceList(getProjects(null, true)));
} else if (selected == 2) {
tree.setInput(new AdaptableResourceList(getProjects(getRepository(), false)));
}
} catch (CVSException e) {
CVSUIPlugin.log(e);
}
}
/**
* Method getValidTargetProjects returns the set of projects that match the provided criteria.
* @return IResource
*/
private IProject[] getProjects(String root, boolean unshared) throws CVSException {
List validTargets = new ArrayList();
try {
IResource[] projects = ResourcesPlugin.getWorkspace().getRoot().members();
for (int i = 0; i < projects.length; i++) {
IResource resource = projects[i];
if (resource instanceof IProject) {
IProject project = (IProject) resource;
if (project.isAccessible()) {
RepositoryProvider provider = RepositoryProvider.getProvider(project);
if (provider == null && unshared) {
validTargets.add(project);
} else if (provider != null && provider.getID().equals(CVSProviderPlugin.getTypeId())) {
ICVSFolder cvsFolder = CVSWorkspaceRoot.getCVSFolderFor(project);
FolderSyncInfo info = cvsFolder.getFolderSyncInfo();
if (root != null && info != null && root.equals(info.getRoot())) {
validTargets.add(project);
}
}
}
}
}
} catch (CoreException e) {
throw CVSException.wrapException(e);
}
return (IProject[]) validTargets.toArray(new IProject[validTargets.size()]);
}
public IContainer getLocalFolder() {
if (Path.EMPTY.isValidSegment(folderName)) {
return ((IContainer)getSelection()).getFolder(new Path(folderName));
} else {
return null;
}
}
public IContainer getParentFolder() {
return ((IContainer)getSelection());
}
/**
* Returns the recurse.
* @return boolean
*/
public boolean isRecurse() {
return recurse;
}
private void handleFilterSelection() {
filter = filterList.getSelectionIndex();
updateTreeContents(filter);
}
}