/******************************************************************************* * Copyright (c) 2001, 2004 IBM Corporation 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: * IBM Corporation - initial API and implementation * Jens Lukowski/Innoopract - initial renaming/restructuring * Exadel, Inc. * Red Hat, Inc. *******************************************************************************/ package org.jboss.tools.common.text.ext.hyperlink.xpl; import java.io.File; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.editors.text.EditorsUI; import org.eclipse.ui.ide.IDE; import org.eclipse.wst.sse.core.internal.provisional.IModelManager; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.StructuredModelManager; import org.eclipse.wst.sse.core.internal.util.PathHelper; import org.eclipse.wst.sse.core.internal.util.URIResolver; import org.eclipse.wst.sse.ui.internal.openon.ExternalFileEditorInput; import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil; import org.jboss.tools.common.text.ext.hyperlink.IHyperlinkRegion; public abstract class AbstractBaseHyperlink { protected final String FILE_PROTOCOL = "file:/";//$NON-NLS-1$ public final String HTTP_PROTOCOL = "http://";//$NON-NLS-1$ protected IRegion hyperlinkRegion; public void setRegion(IRegion region) { this.hyperlinkRegion = region; } public AbstractBaseHyperlink() { super(); } private IDocument fDocument; private int fOffset; public void setDocument(IDocument document) { fDocument = document; } public void setOffset(int offset) { fOffset = offset; } public int getOffset() { return fOffset; } /** * Opens the appropriate editor for fileString * * @param fileString */ protected void openFileInEditor(String fileString) { IEditorPart editor = null; if (fileString != null) { // open web browser if this is a web address String temp = fileString.toLowerCase(); if (temp.startsWith(HTTP_PROTOCOL)) { return; } else { // chop off the file protocol if (temp.startsWith(FILE_PROTOCOL)) { fileString = fileString.substring(FILE_PROTOCOL.length()); } IFile file = getFile(fileString); if (file != null) { editor = openFileInEditor(file); } else { editor = openExternalFile(fileString); } } } if (editor == null) { openFileFailed(); } } /** * Returns an IFile from the given uri if possible, null if cannot find file * from uri. * * @param fileString * file system path * @return returns IFile if fileString exists in the workspace */ protected IFile getFile(String fileString) { if (fileString != null) { IFile[] files = ResourcesPlugin.getWorkspace().getRoot() .findFilesForLocation(new Path(fileString)); for (int i = 0; i < files.length; i++) if (files[i].exists()) return files[i]; } return null; } /** * Opens the IFile, input in its default editor, if possible, and returns * the editor opened. Possible reasons for failure: input cannot be found, * input does not exist in workbench, editor cannot be opened. * * @return IEditorPart editor opened or null if input == null or does not * exist, external editor was opened, editor could not be opened */ public static IEditorPart openFileInEditor(IFile input) { if (input != null && input.exists()) { try { IWorkbenchPage page = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage(); return IDE.openEditor(page, input, true); } catch (PartInitException pie) { ResourcesPlugin.getPlugin().getLog().log( createStatus(pie)); } } return null; } private static IStatus createStatus(Exception ex) { return new Status( IStatus.ERROR,"org.jboss.tools.common.text.ext",0, //$NON-NLS-1$ ex.getMessage()+"",ex); //$NON-NLS-1$ } /** * Opens the IFile, input in its default editor, if possible, and returns * the editor opened. Possible reasons for failure: input cannot be found, * input does not exist in workbench, editor cannot be opened. * * @return IEditorPart editor opened or null if input == null or does not * exist, external editor was opened, editor could not be opened */ protected IEditorPart openFileInEditor(IEditorInput input, String fileString) { if (input != null && input.exists()) { try { String editorId = getEditorId(fileString); IWorkbenchPage page = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage(); return IDE.openEditor(page, input, editorId, true); } catch (PartInitException pie) { ResourcesPlugin.getPlugin().getLog().log( createStatus(pie)); } } return null; } /** * Try to open the external file, fileString in its default editor * * @param fileString * @return IEditorPart editor opened or null if editor could not be opened */ protected IEditorPart openExternalFile(String fileString) { // file does not exist in workspace so try to open using system editor File file = new File(fileString); if (!file.exists()) return null; IEditorInput input = new ExternalFileEditorInput(file); String editorId = getEditorId(fileString); try { IWorkbenchPage page = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage(); return page.openEditor(input, editorId, true); } catch (PartInitException pie) { ResourcesPlugin.getPlugin().getLog().log( createStatus(pie)); } return null; } /** * Determines the editor associated with the given file name * * @param filename * @return editor id of the editor associated with the given file name */ protected String getEditorId(String filename) { IWorkbench workbench = PlatformUI.getWorkbench(); IEditorRegistry editorRegistry = workbench.getEditorRegistry(); IEditorDescriptor descriptor = editorRegistry .getDefaultEditor(filename); if (descriptor != null) return descriptor.getId(); return EditorsUI.DEFAULT_TEXT_EDITOR_ID; } /** * Notifies user that open on selection action could not successfully open * the selection (writes message on status bar and beeps) */ protected void openFileFailed() { PlatformStatusLineUtil.displayErrorMessage(Messages.cannotOpenLink); PlatformStatusLineUtil.addOneTimeClearListener(); } /** * @deprecated this method has moved up to DefaultHyperlinkHTML - TODO * remove in C5 */ protected String resolveURI(String uriString) { String resolvedURI = uriString; if (uriString != null) { IStructuredModel sModel = null; try { sModel = getModelManager() .getExistingModelForRead(getDocument()); if (sModel != null) { URIResolver resolver = sModel.getResolver(); resolvedURI = resolver != null ? resolver.getLocationByURI( uriString, true) : uriString; } } finally { if (sModel != null) sModel.releaseFromRead(); } // special adjustment for file protocol if (uriString.startsWith(FILE_PROTOCOL)) { PathHelper.removeLeadingSeparator(resolvedURI); } } return resolvedURI; } protected IModelManager getModelManager() { return StructuredModelManager.getModelManager(); } /* * (non-Javadoc) * * @see IHyperlink#getHyperlinkRegion() */ public IRegion getHyperlinkRegion() { if (hyperlinkRegion != null) { return hyperlinkRegion; } hyperlinkRegion = (IHyperlinkRegion)doGetHyperlinkRegion(getOffset()); return (hyperlinkRegion != null) ? hyperlinkRegion: new Region(getOffset(), 0); } abstract protected IRegion doGetHyperlinkRegion(int offset); /* * (non-Javadoc) * * @see IHyperlink#open() */ public void open() { IRegion region = getHyperlinkRegion(); // if no region was given this action fails if (getDocument() == null || region == null) openFileFailed(); else doHyperlink(region); } abstract protected void doHyperlink(IRegion region); /** * Returns the current document associated with hyperlink * * @return IDocument */ public IDocument getDocument() { return fDocument; } abstract public String getHyperlinkText(); /* * (non-Javadoc) * * @see IHyperlink#getTypeLabel() */ public String getTypeLabel() { return null; } }