package org.maziarz.yiiclipse.hyperlinks;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
public class ExternalResourceHyperlink implements IHyperlink {
private IRegion fRegion;
private IPath fLocalPath;
private TextEditor fEditor;
public ExternalResourceHyperlink(Region region, IPath lp, TextEditor editor) {
Assert.isNotNull(region);
Assert.isNotNull(lp);
Assert.isNotNull(editor);
this.fRegion = region;
this.fLocalPath = lp;
this.fEditor = editor;
}
private String getEditorId(){
return fEditor.getSite().getId();
}
private IWorkbenchPage getActivePage(){
return fEditor.getSite().getWorkbenchWindow().getActivePage();
}
@Override
public IRegion getHyperlinkRegion() {
return fRegion;
}
@Override
public String getTypeLabel() {
return "Open Declaration";
}
@Override
public String getHyperlinkText() {
return "Open declaration (hyperlink text)";
}
@Override
public void open() {
IEditorInput editorInput;
IFileStore fileStore;
try {
fileStore = EFS.getStore(fLocalPath.toFile().toURI());
editorInput = new FileStoreEditorInput(fileStore);
} catch (CoreException e) {
e.printStackTrace();
return;
}
IEditorPart editorPart;
try {
editorPart = getActivePage().openEditor(editorInput, getEditorId(), true);
} catch (PartInitException e1) {
e1.printStackTrace();
return;
}
IDocumentProvider provider = fEditor.getDocumentProvider();
try {
provider.connect(editorInput);
IDocument document = provider.getDocument(editorInput);
IRegion lineRegion = document.getLineInformation(1);
((TextEditor)editorPart).selectAndReveal(lineRegion.getOffset(), lineRegion.getLength());
} catch (Exception e) {
e.printStackTrace();
}
provider.disconnect(editorInput);
}
}