/*******************************************************************************
* Copyright (c) 2011 Red Hat 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:
* David Green <david.green@tasktop.com> - initial contribution
* Christian Trutz <christian.trutz@gmail.com> - initial contribution
* Chris Aniszczyk <caniszczyk@gmail.com> - initial contribution
*******************************************************************************/
package org.eclipse.mylyn.internal.github.ui.issue;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.egit.github.core.RepositoryId;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.jface.text.hyperlink.URLHyperlink;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.mylyn.internal.github.core.GitHub;
import org.eclipse.mylyn.internal.github.core.issue.IssueConnector;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskMapping;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
import org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage;
import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard;
import org.eclipse.mylyn.tasks.ui.wizards.RepositoryQueryWizard;
/**
* GitHub connector specific UI extensions.
*/
public class IssueConnectorUi extends AbstractRepositoryConnectorUi {
private final Pattern issuePattern = Pattern
.compile("(?:([a-zA-Z0-9_\\.-]+)(?:/([a-zA-Z0-9_\\.-]+))?)?\\#(\\d+)"); //$NON-NLS-1$
/**
* Get core repository connector
*
* @return connector
*/
public static IssueConnector getCoreConnector() {
return (IssueConnector) TasksUi
.getRepositoryConnector(GitHub.CONNECTOR_KIND);
}
/**
*
*
* @return the unique type of the repository: "github"
*/
@Override
public String getConnectorKind() {
return GitHub.CONNECTOR_KIND;
}
/**
*
*
* @return {@link AbstractRepositorySettingsPage} with GitHub specific
* parameter like user name, password, ...
*/
@Override
public ITaskRepositoryPage getSettingsPage(
final TaskRepository taskRepository) {
return new IssueRepositorySettingsPage(taskRepository);
}
/**
*
*
* @return {@link NewTaskWizard} with GitHub specific tab
*/
@Override
public IWizard getNewTaskWizard(final TaskRepository taskRepository,
final ITaskMapping taskSelection) {
return new NewTaskWizard(taskRepository, taskSelection);
}
/**
* This {@link AbstractRepositoryConnectorUi} has search page.
*
* @return {@code true}
*/
@Override
public boolean hasSearchPage() {
return true;
}
/**
* Returns {@link IWizard} used in Mylyn for creating new queries. This
* {@link IWizard} has a wizard page for creating GitHub specific task
* queries.
*
* @return {@link RepositoryQueryWizard} with GitHub specific query page
*/
@Override
public IWizard getQueryWizard(final TaskRepository taskRepository,
final IRepositoryQuery queryToEdit) {
RepositoryQueryWizard wizard = new RepositoryQueryWizard(taskRepository);
IssueRepositoryQueryPage queryPage = new IssueRepositoryQueryPage(
taskRepository, queryToEdit);
wizard.addPage(queryPage);
return wizard;
}
public IHyperlink[] findHyperlinks(TaskRepository repository, String text,
int index, int textOffset) {
List<IHyperlink> hyperlinks = new ArrayList<IHyperlink>();
Matcher matcher = issuePattern.matcher(text);
while (matcher.find()) {
if (index == -1
|| (index >= matcher.start() && index <= matcher.end())) {
String user = matcher.group(1);
String project = matcher.group(2);
String taskId = matcher.group(3);
if (project == null && user != null) {
// same project name, different user
String url = repository.getUrl();
RepositoryId repo = GitHub.getRepository(url);
if (repo != null)
project = repo.getName();
}
TaskRepository taskRepository = null;
if (user == null && project == null) {
taskRepository = repository;
} else if (user != null && project != null) {
String repositoryUrl = GitHub
.createGitHubUrl(user, project);
taskRepository = TasksUi
.getRepositoryManager()
.getRepository(GitHub.CONNECTOR_KIND, repositoryUrl);
if (taskRepository == null) {
repositoryUrl = GitHub.createGitHubUrlAlternate(user,
project);
taskRepository = TasksUi.getRepositoryManager()
.getRepository(GitHub.CONNECTOR_KIND,
repositoryUrl);
}
}
if (taskRepository != null) {
Region region = createRegion(textOffset, matcher);
hyperlinks
.add(new TaskHyperlink(region, repository, taskId));
} else if (user != null && project != null) {
Region region = createRegion(textOffset, matcher);
String url = GitHub.createGitHubUrl(user, project)
+ "/issues/" + taskId;
hyperlinks.add(new URLHyperlink(region, url));
}
}
}
return hyperlinks.toArray(new IHyperlink[hyperlinks.size()]);
}
private Region createRegion(int textOffset, Matcher matcher) {
return new Region(matcher.start() + textOffset, matcher.end()
- matcher.start());
}
/**
* @see org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi#getSearchPage(org.eclipse.mylyn.tasks.core.TaskRepository,
* org.eclipse.jface.viewers.IStructuredSelection)
*/
public ITaskSearchPage getSearchPage(TaskRepository repository,
IStructuredSelection selection) {
return new IssueRepositoryQueryPage(repository, null);
}
@Override
public String getTaskKindLabel(ITask task) {
return Messages.IssueConnectorUi_LabelIssueKind;
}
}