/*******************************************************************************
 * Copyright (c) 2004 - 2006 University Of British Columbia 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:
 *     University Of British Columbia - initial API and implementation
 *******************************************************************************/
package org.eclipse.mylyn.internal.bugzilla.ui;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;

/**
 * @author Mik Kersten
 */
public class BugzillaHyperLink implements IHyperlink {

	private static final String SHOW_BUG_CGI = "/show_bug.cgi?taskId=";

	private IRegion region;

	private String id;

	private String repositoryUrl;

	public BugzillaHyperLink(IRegion nlsKeyRegion, String id, String repositoryUrl) {
		this.region = nlsKeyRegion;
		this.id = id;
		this.repositoryUrl = repositoryUrl;
	}

	public IRegion getHyperlinkRegion() {
		return region;
	}

	public String getTypeLabel() {
		return null;
	}

	public String getHyperlinkText() {
		return SHOW_BUG_CGI + id;
	}

	public void open() {
		// TaskRepository repository =
		// MylarTaskListPlugin.getRepositoryManager().getRepositoryForActiveTask(BugzillaPlugin.REPOSITORY_KIND);
		// TaskRepository repository =
		// MylarTaskListPlugin.getRepositoryManager().getDefaultRepository(
		// BugzillaPlugin.REPOSITORY_KIND);
		if (repositoryUrl != null) {
			TasksUiUtil.openRepositoryTask(repositoryUrl, id, repositoryUrl + IBugzillaConstants.URL_GET_SHOW_BUG
					+ id);
			// OpenBugzillaReportJob job = new
			// OpenBugzillaReportJob(repository.getUrl(), taskId);
			// IProgressService service =
			// PlatformUI.getWorkbench().getProgressService();
			// try {
			// service.run(true, false, job);
			// } catch (Exception e) {
			// MylarStatusHandler.fail(e, "Could not open report", true);
			// }
		} else {
			MessageDialog.openError(null, IBugzillaConstants.TITLE_MESSAGE_DIALOG,
					"Could not determine repository for report");
		}
	}

}
