diff options
Diffstat (limited to 'framework/org.eclipse.mylyn.reviews.ui/src/com/atlassian/connector/eclipse/internal/crucible/ui/wizards/ReviewWizard.java')
-rw-r--r-- | framework/org.eclipse.mylyn.reviews.ui/src/com/atlassian/connector/eclipse/internal/crucible/ui/wizards/ReviewWizard.java | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/framework/org.eclipse.mylyn.reviews.ui/src/com/atlassian/connector/eclipse/internal/crucible/ui/wizards/ReviewWizard.java b/framework/org.eclipse.mylyn.reviews.ui/src/com/atlassian/connector/eclipse/internal/crucible/ui/wizards/ReviewWizard.java new file mode 100644 index 0000000..9966598 --- /dev/null +++ b/framework/org.eclipse.mylyn.reviews.ui/src/com/atlassian/connector/eclipse/internal/crucible/ui/wizards/ReviewWizard.java @@ -0,0 +1,307 @@ +/******************************************************************************* + * Copyright (c) 2009 Atlassian 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: + * Atlassian - initial API and implementation + ******************************************************************************/ + +package com.atlassian.connector.eclipse.internal.crucible.ui.wizards; + +import com.atlassian.connector.eclipse.internal.crucible.core.TaskRepositoryUtil; +import com.atlassian.connector.eclipse.internal.crucible.ui.CrucibleUiPlugin; +import com.atlassian.connector.eclipse.internal.crucible.ui.CrucibleUiUtil; +import com.atlassian.connector.eclipse.team.ui.AtlassianTeamUiPlugin; +import com.atlassian.connector.eclipse.team.ui.ICustomChangesetLogEntry; +import com.atlassian.connector.eclipse.team.ui.ITeamUiResourceConnector; +import com.atlassian.connector.eclipse.team.ui.LocalStatus; +import com.atlassian.connector.eclipse.team.ui.TeamUiUtils; +import com.atlassian.connector.eclipse.ui.commons.DecoratedResource; +import com.atlassian.connector.eclipse.ui.commons.ResourceEditorBean; +import com.atlassian.theplugin.commons.crucible.api.UploadItem; +import com.atlassian.theplugin.commons.crucible.api.model.BasicProject; +import com.atlassian.theplugin.commons.crucible.api.model.PermId; +import com.atlassian.theplugin.commons.crucible.api.model.Review; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.wizard.IWizardPage; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.mylyn.internal.tasks.core.LocalTask; +import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.TasksUi; +import org.eclipse.mylyn.tasks.ui.TasksUiUtil; +import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard; +import org.eclipse.ui.INewWizard; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; + +/** + * Wizard for creating a new review + * + * @author Thomas Ehrnhoefer + * @author Pawel Niewiadomski + * @author Jacek Jaroczynski + */ +@SuppressWarnings("restriction") +public class ReviewWizard extends NewTaskWizard implements INewWizard { + + public enum Type { + ADD_CHANGESET, ADD_PATCH, ADD_WORKSPACE_PATCH, ADD_SCM_RESOURCES, ADD_UPLOAD_ITEMS, ADD_RESOURCES, ADD_COMMENT_TO_FILE; + } + + private CrucibleReviewDetailsPage detailsPage; + + private Review crucibleReview; + + private SelectScmChangesetsPage addChangeSetsPage; + + private CrucibleAddPatchPage addPatchPage; + +// private WorkspacePatchSelectionPage addWorkspacePatchPage; + + private DefineRepositoryMappingsPage defineMappingPage; + + private ResourceSelectionPage resourceSelectionPage; + + private final Set<Type> types; + + private SortedSet<ICustomChangesetLogEntry> preselectedLogEntries; + + private String previousPatch; + + private String previousPatchRepository; + + private final List<IResource> selectedWorkspaceResources = new ArrayList<IResource>(); + + private IResource[] previousWorkspaceSelection; + + private List<UploadItem> uploadItems; + + private List<ResourceEditorBean> versionedCommentsToAdd = new ArrayList<ResourceEditorBean>(); + + private SelectChangesetsFromCruciblePage addChangeSetsFromCruciblePage; + + private ITeamUiResourceConnector selectedWorkspaceTeamConnector; + + public ReviewWizard(TaskRepository taskRepository, Set<Type> types) { + super(taskRepository, null); + setWindowTitle("New Crucible Review"); + setNeedsProgressMonitor(true); + this.types = types; + this.selectedWorkspaceResources.addAll(Arrays.asList((IResource[]) ResourcesPlugin.getWorkspace() + .getRoot() + .getProjects())); + } + + public ReviewWizard(Review review, Set<Type> types) { + this(CrucibleUiUtil.getCrucibleTaskRepository(review), types); + this.crucibleReview = review; + } + + public ReviewWizard(Review review, Type type) { + this(review, new HashSet<Type>(Arrays.asList(type))); + } + + @Override + public void addPages() { + if (types.contains(Type.ADD_CHANGESET)) { + addChangeSetsFromCruciblePage = new SelectChangesetsFromCruciblePage(getTaskRepository(), + preselectedLogEntries); + addPage(addChangeSetsFromCruciblePage); + } + + if (types.contains(Type.ADD_PATCH)) { + addPatchPage = new CrucibleAddPatchPage(getTaskRepository()); + addPage(addPatchPage); + } + + // pre-commit + if (types.contains(Type.ADD_WORKSPACE_PATCH)) { +// addWorkspacePatchPage = new WorkspacePatchSelectionPage(getTaskRepository(), selectedWorkspaceResources); +// addPage(addWorkspacePatchPage); + } + + // post-commit for editor selection + if (types.contains(Type.ADD_SCM_RESOURCES)) { + + if (selectedWorkspaceResources.size() > 0 && selectedWorkspaceResources.get(0) != null) { + + // single SCM integration selection supported + final ITeamUiResourceConnector teamConnector = AtlassianTeamUiPlugin.getDefault() + .getTeamResourceManager() + .getTeamConnector(selectedWorkspaceResources.get(0)); + if (teamConnector == null) { + MessageDialog.openInformation(getShell(), CrucibleUiPlugin.PRODUCT_NAME, + "Cannot find Atlassian SCM Integration for '" + selectedWorkspaceResources.get(0).getName() + + "'."); + } else { + boolean missingMapping = false; + Collection<String> scmPaths = new ArrayList<String>(); + // TODO use job below if there are plenty of resource (currently it is used for single resource) + for (IResource resource : selectedWorkspaceResources) { + try { + LocalStatus status = teamConnector.getLocalRevision(resource); + if (status.getScmPath() != null && status.getScmPath().length() > 0) { + String scmPath = TeamUiUtils.getScmPath(resource, teamConnector); + + if (TaskRepositoryUtil.getMatchingSourceRepository( + TaskRepositoryUtil.getScmRepositoryMappings(getTaskRepository()), scmPath) == null) { + // we need to see mapping page + missingMapping = true; + scmPaths.add(scmPath); + } + + } + } catch (CoreException e) { + // resource is probably not under version control + // skip + } + } + + if (missingMapping) { + defineMappingPage = new DefineRepositoryMappingsPage(scmPaths, getTaskRepository()); + addPage(defineMappingPage); + } + } + } + } + + // mixed review + if (types.contains(Type.ADD_RESOURCES)) { + resourceSelectionPage = new ResourceSelectionPage(getTaskRepository(), selectedWorkspaceTeamConnector, + selectedWorkspaceResources); + addPage(resourceSelectionPage); + } + + // only add details page if review is not already existing + if (crucibleReview == null) { + detailsPage = new CrucibleReviewDetailsPage(getTaskRepository(), types.contains(Type.ADD_COMMENT_TO_FILE)); + addPage(detailsPage); + } + } + + @Override + public boolean canFinish() { + if (detailsPage != null) { + return detailsPage.isPageComplete(); + } + return super.canFinish(); + } + + @Override + public boolean performFinish() { + + setErrorMessage(null); + + crucibleReview = detailsPage.getReview(); + LocalTask task = TasksUiInternal.createNewLocalTask("Review: " + crucibleReview.getSummary()); + crucibleReview.setPermId(new PermId(task.getTaskId())); + + if (detailsPage != null) { + // save project selection + final BasicProject selectedProject = detailsPage.getSelectedProject(); + CrucibleUiPlugin.getDefault().updateLastSelectedProject(getTaskRepository(), + selectedProject != null ? selectedProject.getKey() : null); + + // save checkbox selections + CrucibleUiPlugin.getDefault().updateAllowAnyoneOption(getTaskRepository(), + detailsPage.isAllowAnyoneToJoin()); + CrucibleUiPlugin.getDefault().updateStartReviewOption(getTaskRepository(), + detailsPage.isStartReviewImmediately()); + } + + if (addPatchPage != null) { + String patchToAdd = addPatchPage.hasPatch() ? addPatchPage.getPatch() : null; + String patchRepositoryToAdd = addPatchPage.hasPatch() ? addPatchPage.getPatchRepository() : null; + + if (patchToAdd != null && patchRepositoryToAdd != null && !patchToAdd.equals(previousPatch) + && !patchRepositoryToAdd.equals(previousPatchRepository)) { + // create patch review + } + } + +// if (addWorkspacePatchPage != null) { +// final IResource[] selection = addWorkspacePatchPage.getSelection(); +// +// if (selection != null && selection.length > 0 && !Arrays.equals(selection, previousWorkspaceSelection) +// && addWorkspacePatchPage.getSelectedTeamResourceConnector() != null) { +// // create pre-commit review +// } +// } + + if (addChangeSetsPage != null || addChangeSetsFromCruciblePage != null) { + final Map<String, Set<String>> changesetsToAdd = addChangeSetsPage != null ? addChangeSetsPage.getSelectedChangesets() + : addChangeSetsFromCruciblePage.getSelectedChangesets(); + if (changesetsToAdd != null && changesetsToAdd.size() > 0) { + // create review from changeset + } + } + + if (types.contains(Type.ADD_SCM_RESOURCES)) { + if (selectedWorkspaceResources != null) { + // create review from editor selection (post-commit) + } + } + + if (types.contains(Type.ADD_UPLOAD_ITEMS)) { + if (uploadItems.size() > 0) { + // create review from editor selection (pre-commit) + } + } + + if (resourceSelectionPage != null && types.contains(Type.ADD_RESOURCES)) { + final List<DecoratedResource> resources = resourceSelectionPage.getSelection(); + if (resources != null && resources.size() > 0) { + // create review from workbench selection (post- and pre-commit) + } + } + + TasksUiUtil.openTask(task); + TasksUi.getTaskActivityManager().activateTask(task); + CrucibleUiPlugin.getDefault() + .getActiveReviewManager() + .reviewAdded(task.getRepositoryUrl(), task.getTaskId(), crucibleReview); + + return true; + } + + private void setErrorMessage(String message) { + IWizardPage page = getContainer().getCurrentPage(); + if (page instanceof WizardPage) { + ((WizardPage) page).setErrorMessage(message != null ? message.replace("\n", " ") : null); + } + } + + public void setLogEntries(SortedSet<ICustomChangesetLogEntry> logEntries) { + this.preselectedLogEntries = logEntries; + } + + public void setRoots(ITeamUiResourceConnector teamConnector, List<IResource> list) { + this.selectedWorkspaceResources.clear(); + this.selectedWorkspaceResources.addAll(list); + this.selectedWorkspaceTeamConnector = teamConnector; + } + + public void setUploadItems(List<UploadItem> uploadItems) { + this.uploadItems = uploadItems; + } + + public void setFilesCommentData(List<ResourceEditorBean> list) { + this.versionedCommentsToAdd = list; + } + +} |