blob: 717dd5e02e83810ba134ec19e7b9f7ddcd7c1a22 [file] [log] [blame]
/*******************************************************************************
* 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.ui.CrucibleUiUtil;
import com.atlassian.connector.eclipse.internal.crucible.ui.commons.CrucibleRepositoriesLabelProvider;
import com.atlassian.theplugin.commons.crucible.api.model.Repository;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import java.util.Set;
/**
* Page for adding a patch (from the clipboard) to a review
*
* @author Thomas Ehrnhoefer
*/
public class CrucibleAddPatchPage extends WizardPage {
private Text patchText;
private final TaskRepository taskRepository;
private String selectedRepository;
private Set<Repository> cachedRepositories;
private ComboViewer comboViewer;
private boolean includePatch = false;
protected boolean patchPasted = false;
public CrucibleAddPatchPage(TaskRepository repository) {
super("cruciblePatch"); //$NON-NLS-1$
setTitle("Add Patch to Review");
setDescription("Attach a patch from the clipboard to the review.");
this.taskRepository = repository;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).margins(5, 5).create());
final Button includePatchButton = new Button(composite, SWT.CHECK);
includePatchButton.setText("Include this Patch from the clipboard in the review:");
GridDataFactory.fillDefaults().span(2, 1).applyTo(includePatchButton);
includePatchButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
includePatch = includePatchButton.getSelection();
if (includePatch) {
//copy content from clipboard, only if not already done
Clipboard clipboard = new Clipboard(Display.getDefault());
Object patch = clipboard.getContents(TextTransfer.getInstance());
if (patch != null && patch instanceof String && !patchPasted) {
patchText.setText((String) patch);
patchPasted = true;
}
if (cachedRepositories == null) {
cachedRepositories = CrucibleUiUtil.getCachedRepositories(taskRepository);
}
comboViewer.setInput(cachedRepositories);
}
validatePage();
}
});
patchText = new Text(composite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
GridDataFactory.fillDefaults().span(2, 1).hint(SWT.DEFAULT, 220).grab(true, true).applyTo(patchText);
patchText.setEditable(false);
Label label = new Label(composite, SWT.NONE);
label.setText("Select the repository on Crucible:");
GridDataFactory.fillDefaults().grab(false, false).applyTo(label);
comboViewer = new ComboViewer(composite);
comboViewer.getCombo().setText("Select Repository");
comboViewer.setContentProvider(new ArrayContentProvider());
comboViewer.setLabelProvider(new CrucibleRepositoriesLabelProvider());
comboViewer.setSorter(new ViewerSorter());
comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if (comboViewer.getSelection() instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection) comboViewer.getSelection()).getFirstElement();
if (cachedRepositories.contains(selected)) {
selectedRepository = ((Repository) selected).getName();
}
}
validatePage();
}
});
GridDataFactory.fillDefaults()
.align(SWT.BEGINNING, SWT.BEGINNING)
.grab(true, false)
.hint(100, SWT.DEFAULT)
.applyTo(comboViewer.getCombo());
Button updateData = new Button(composite, SWT.PUSH);
updateData.setText("Update Repository Data");
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(updateData);
updateData.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
}
});
Dialog.applyDialogFont(composite);
setControl(composite);
}
public boolean hasPatch() {
return includePatch && patchText.getText().length() > 0 && selectedRepository != null;
}
public String getPatch() {
return patchText.getText();
}
/*
* checks if page is complete updates the buttons
*/
private void validatePage() {
setErrorMessage(null);
boolean allFine = true;
String errorMessage = null;
if (patchText.getText().length() < 1) {
errorMessage = "In order to create a review from a patch,"
+ " copy the patch to the clipboard before opening this Wizard.";
allFine = false;
} else if (selectedRepository == null) {
errorMessage = "Choose a repository on Crucible this patch relates to.";
allFine = false;
}
if (includePatch) {
setPageComplete(allFine);
if (errorMessage != null) {
setErrorMessage(errorMessage);
}
} else {
setPageComplete(true);
}
getContainer().updateButtons();
}
public String getPatchRepository() {
return selectedRepository;
}
}