/****************************************************************************
* Copyright (c) 2004 Composent, Inc. 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:
* Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.ui.hyperlink;
import java.net.URI;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.internal.ui.Activator;
import org.eclipse.ecf.internal.ui.Messages;
import org.eclipse.ecf.ui.IConnectWizard;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Abstract class for representing ECF URL hyperlinks. This class can be subclassed to
* create an URL hyperlink specifically for accessing ECF protocols. For example,
* and XMPPURLHyperlink subclass can be created to open URLs of the form:
* <p>
* xmpp://foo@bar.com
* </p>
*/
public abstract class AbstractURLHyperlink implements IHyperlink {
private URI uri;
private IRegion region;
private String typeLabel;
private String hyperlinkText;
protected URI getURI() {
return uri;
}
protected void setURI(URI uri) {
this.uri = uri;
}
protected IRegion getRegion() {
return region;
}
protected void setRegion(IRegion region) {
this.region = region;
}
protected void setTypeLabel(String typeLabel) {
this.typeLabel = typeLabel;
}
/**
* Creates a new URL hyperlink.
*
* @param region
* @param uri
*/
public AbstractURLHyperlink(IRegion region, URI uri) {
Assert.isNotNull(uri);
Assert.isNotNull(region);
this.region = region;
this.uri = uri;
}
protected abstract IContainer createContainer()
throws ContainerCreateException;
/**
* Create a connect wizard for this hyperlink. Subclasses must implement this
* method to return a non-null instance of IConnectWizard when this method
* is called (during {@link #open()}.
* @return non-<code>null</code> instance implementing {@link IConnectWizard}.
*/
protected abstract IConnectWizard createConnectWizard();
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getHyperlinkRegion()
*/
public IRegion getHyperlinkRegion() {
return region;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getTypeLabel()
*/
public String getTypeLabel() {
return typeLabel;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getHyperlinkText()
*/
public String getHyperlinkText() {
return hyperlinkText;
}
/**
* Returns the URL string of this hyperlink.
*
* @return the URL string
* @since 3.2
*/
public String getURLString() {
return uri.toString();
}
/**
* @param hyperlinkText
* the hyperlinkText to set
*/
protected void setHyperlinkText(String hyperlinkText) {
this.hyperlinkText = hyperlinkText;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#open()
*/
public void open() {
try {
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IContainer container = createContainer();
Assert.isNotNull(container);
IConnectWizard icw = createConnectWizard();
Assert.isNotNull(icw);
icw.init(workbench, container);
WizardDialog dialog = new WizardDialog(window.getShell(), icw);
dialog.open();
} catch (Exception ex) {
IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
IStatus.ERROR,
Messages.AbstractURIHyperlink_EXCEPTION_HYPERLINK, ex);
ErrorDialog.openError(null, null, null, status);
Activator.getDefault().getLog().log(status);
}
}
}