blob: e7cd85ca60502f54a325f7f7d2030d60c026a4a6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
/**
* @author Steffen Pingel
*/
public class TaskEditorDescriptionPart extends TaskEditorRichTextPart {
public TaskEditorDescriptionPart() {
setPartName(Messages.TaskEditorDescriptionPart_Description);
}
private void addDuplicateDetection(Composite composite, FormToolkit toolkit) {
List<AbstractDuplicateDetector> allCollectors = new ArrayList<AbstractDuplicateDetector>();
if (getDuplicateSearchCollectorsList() != null) {
allCollectors.addAll(getDuplicateSearchCollectorsList());
}
if (!allCollectors.isEmpty()) {
int style = ExpandableComposite.TWISTIE | ExpandableComposite.SHORT_TITLE_BAR;
if (getTaskData().isNew()) {
style |= ExpandableComposite.EXPANDED;
}
Section duplicatesSection = toolkit.createSection(composite, style);
duplicatesSection.setText(Messages.TaskEditorDescriptionPart_Duplicate_Detection);
duplicatesSection.setLayout(new GridLayout());
GridDataFactory.fillDefaults().indent(SWT.DEFAULT, 15).applyTo(duplicatesSection);
Composite relatedBugsComposite = toolkit.createComposite(duplicatesSection);
relatedBugsComposite.setLayout(new GridLayout(4, false));
relatedBugsComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
duplicatesSection.setClient(relatedBugsComposite);
Label duplicateDetectorLabel = new Label(relatedBugsComposite, SWT.LEFT);
duplicateDetectorLabel.setText(Messages.TaskEditorDescriptionPart_Detector);
final CCombo duplicateDetectorChooser = new CCombo(relatedBugsComposite, SWT.FLAT | SWT.READ_ONLY);
toolkit.adapt(duplicateDetectorChooser, false, false);
duplicateDetectorChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
duplicateDetectorChooser.setFont(TEXT_FONT);
duplicateDetectorChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create());
Collections.sort(allCollectors, new Comparator<AbstractDuplicateDetector>() {
public int compare(AbstractDuplicateDetector c1, AbstractDuplicateDetector c2) {
return c1.getName().compareToIgnoreCase(c2.getName());
}
});
for (AbstractDuplicateDetector detector : allCollectors) {
duplicateDetectorChooser.add(detector.getName());
}
duplicateDetectorChooser.select(0);
duplicateDetectorChooser.setEnabled(true);
duplicateDetectorChooser.setData(allCollectors);
if (allCollectors.size() > 0) {
Button searchForDuplicates = toolkit.createButton(relatedBugsComposite,
Messages.TaskEditorDescriptionPart_Search, SWT.NONE);
GridData searchDuplicatesButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
searchForDuplicates.setLayoutData(searchDuplicatesButtonData);
searchForDuplicates.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
String selectedDetector = duplicateDetectorChooser.getItem(duplicateDetectorChooser.getSelectionIndex());
searchForDuplicates(selectedDetector);
}
});
}
toolkit.paintBordersFor(relatedBugsComposite);
}
}
@Override
public void createControl(Composite parent, FormToolkit toolkit) {
if (getAttribute() == null) {
return;
}
super.createControl(parent, toolkit);
addDuplicateDetection(getComposite(), toolkit);
}
@Override
protected void fillToolBar(ToolBarManager toolBar) {
if (!getTaskData().isNew()) {
AbstractReplyToCommentAction replyAction = new AbstractReplyToCommentAction(getTaskEditorPage(), null) {
@Override
protected String getReplyText() {
return getEditor().getValue();
}
};
replyAction.setImageDescriptor(TasksUiImages.COMMENT_REPLY_SMALL);
toolBar.add(replyAction);
}
super.fillToolBar(toolBar);
}
protected IRepositoryQuery getDuplicateQuery(String name) throws CoreException {
String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name; //$NON-NLS-1$ //$NON-NLS-2$
for (AbstractDuplicateDetector detector : getDuplicateSearchCollectorsList()) {
if (detector.getName().equals(duplicateDetectorName)) {
return detector.getDuplicatesQuery(getTaskEditorPage().getTaskRepository(), getTaskData());
}
}
return null;
}
protected Set<AbstractDuplicateDetector> getDuplicateSearchCollectorsList() {
Set<AbstractDuplicateDetector> duplicateDetectors = new HashSet<AbstractDuplicateDetector>();
for (AbstractDuplicateDetector detector : TasksUiPlugin.getDefault().getDuplicateSearchCollectorsList()) {
if (isValidDuplicateDetector(detector)) {
duplicateDetectors.add(detector);
}
}
return duplicateDetectors;
}
@Override
public void initialize(AbstractTaskEditorPage taskEditorPage) {
super.initialize(taskEditorPage);
setAttribute(getModel().getTaskData().getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION));
}
private boolean isValidDuplicateDetector(AbstractDuplicateDetector detector) {
return (detector.getConnectorKind() == null || detector.getConnectorKind().equals(
getTaskEditorPage().getConnectorKind())) //
&& detector.canQuery(getTaskData());
}
public void searchForDuplicates(String duplicateDetectorName) {
try {
IRepositoryQuery duplicatesQuery = getDuplicateQuery(duplicateDetectorName);
if (duplicatesQuery != null) {
SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(),
getTaskEditorPage().getTaskRepository(), duplicatesQuery);
NewSearchUI.runQueryInBackground(collector);
} else {
TasksUiInternal.displayStatus(Messages.TaskEditorDescriptionPart_Duplicate_Detection_Failed,
new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
Messages.TaskEditorDescriptionPart_The_duplicate_detector_did_not_return_a_valid_query));
}
} catch (CoreException e) {
TasksUiInternal.displayStatus(Messages.TaskEditorDescriptionPart_Duplicate_Detection_Failed, e.getStatus());
}
}
}