/******************************************************************************* * Copyright (c) 2006-2007 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 * IBM Research *******************************************************************************/ package com.ibm.research.tours.content.url.delegates; import java.util.HashMap; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.progress.WorkbenchJob; import org.eclipse.ui.texteditor.ITextEditor; import com.ibm.research.tours.ITourElement; import com.ibm.research.tours.content.ToursContentPlugin; import com.ibm.research.tours.content.elements.ResourceURLTourElement; import com.ibm.research.tours.content.url.IURL; import com.ibm.research.tours.content.url.ResourceURL; import com.ibm.research.tours.fx.AlphaFx; import com.ibm.research.tours.fx.DefaultHighlightEffect; import com.ibm.research.tours.fx.EclipseFx; import com.ibm.research.tours.fx.GlobalHighlightEffect; import com.ibm.research.tours.fx.LetterboxEffect; import com.ibm.research.tours.fx.UnhighlightEffect; public class ResourceURLTourElementDelegate implements IURLTourElementDelegate { private IResource fResource; protected AlphaFx fAlphaFX; private WorkbenchJob fJob; private ResourceURLTourElement fTourElement; private HashMap<PartEditorKey, IResourceTourEditorExtension> extensions; private HashMap<PartEditorKey, IResourceTourUIExtension> uiExtensions; private static final String RESOURCE_EXTENSION_MEMENTO = "resource.extension"; private class PartEditorKey { private String key; public PartEditorKey(String editorID, String extension) { if (extension == null) extension = ""; extension = extension.toLowerCase(); this.key = editorID + ":" + extension; } public int hashCode() { return key.hashCode(); } @Override public boolean equals(Object obj) { if (obj == null || !getClass().equals(obj.getClass())) return false; return key.equals(((PartEditorKey)obj).key); } } public ResourceURLTourElementDelegate(ResourceURLTourElement tourElement,IResource resource) { fResource = resource; fTourElement = tourElement; } public ITourElement createClone() { return new ResourceURLTourElement(fResource); } public Image getImage() { return ToursContentPlugin.getImage(fResource); } public String getShortText() { return fResource.getName(); } public String getText() { return fResource.getFullPath().toString(); } public void start() { } public void stop() { if(fJob!=null) fJob.cancel(); if (fResource instanceof IFile) { IFile file = (IFile) fResource; FileEditorInput input = new FileEditorInput(file); IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findEditor(input); if (part != null) { IResourceTourEditorExtension extension = getEditorExtension(part.getSite().getId(), file.getFileExtension()); if (extension != null) { extension.finish(part, file); } } } if(fAlphaFX !=null && !fAlphaFX.getAlphaShell().getShell().isDisposed()) fAlphaFX.dispose(); } public void transition() { // always show the resource - whether it is a file or whatever, in the package explorer for context PackageExplorerPart view = PackageExplorerPart.openInActivePerspective(); view.tryToReveal(fResource); if(fResource instanceof IFile) { IFile file = (IFile)fResource; try { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); final IEditorPart part = IDE.openEditor(page, file); processExtension(part, file); if(fTourElement.getMaximixedHint()) EclipseFx.maximizeActiveEditor(); if(part instanceof ITextEditor) { ITextEditor editor = (ITextEditor)part; editor.setHighlightRange(0,0,true); } if(fTourElement.getHighlightEffect()!=null) { fJob = new WorkbenchJob("") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { if(fTourElement.getHighlightEffect() instanceof DefaultHighlightEffect) { GlobalHighlightEffect.reset(); fAlphaFX = new AlphaFx(PlatformUI.getWorkbench().getDisplay()); Rectangle bounds = EclipseFx.getBounds(part); fAlphaFX.focus(bounds, true); fAlphaFX.fadeTo(128); } else if(fTourElement.getHighlightEffect() instanceof LetterboxEffect) { GlobalHighlightEffect.reset(); fAlphaFX = new AlphaFx(PlatformUI.getWorkbench().getDisplay()); Rectangle bounds = EclipseFx.getBounds(part); fAlphaFX.letterbox(bounds.y, bounds.height, true); fAlphaFX.fadeTo(128); } else if(fTourElement.getHighlightEffect() instanceof UnhighlightEffect) { if (fAlphaFX!=null) { Rectangle bounds = EclipseFx.getBounds(part); fAlphaFX.unfocus(bounds, true); } else { AlphaFx alphaFX = GlobalHighlightEffect.getAlphaFx(); if ( alphaFX!=null ) { Rectangle bounds = EclipseFx.getBounds(part); alphaFX.unfocus(bounds, true); } } } else if(fTourElement.getHighlightEffect() instanceof GlobalHighlightEffect) { AlphaFx alphaFX = GlobalHighlightEffect.getAlphaFx(); Rectangle bounds = EclipseFx.getBounds(part); alphaFX.focus(bounds, true); alphaFX.fadeTo(128); } return Status.OK_STATUS; } }; fJob.schedule(); } } catch (PartInitException e) { e.printStackTrace(); } } } private void processExtension(IEditorPart part, IFile file) { String fileExtension = file.getFileExtension(); String editorID = part.getSite().getId(); IResourceTourEditorExtension extension = getEditorExtension(editorID, fileExtension); if (extension != null) { try { extension.editorOpened(part, file); } catch (Exception e) { ToursContentPlugin.log("Error executing extension", e); } } } private synchronized void loadExtensions() { if (extensions != null) return; extensions = new HashMap<PartEditorKey, IResourceTourEditorExtension>(); uiExtensions = new HashMap<PartEditorKey, IResourceTourUIExtension>(); IConfigurationElement[] extensionPointElements = Platform.getExtensionRegistry().getConfigurationElementsFor("com.ibm.research.tours.content.tourEditorExtension"); for (IConfigurationElement editorExtension : extensionPointElements) { String editorID = editorExtension.getAttribute("editorID"); String fileExtension = editorExtension.getAttribute("fileExtension"); PartEditorKey key = new PartEditorKey(editorID, fileExtension); if (!extensions.containsKey(key)) { try { IResourceTourEditorExtension extension = (IResourceTourEditorExtension) editorExtension.createExecutableExtension("class"); extensions.put(key, extension); if (editorExtension.getAttribute("ui") != null) { IResourceTourUIExtension uiExtension = (IResourceTourUIExtension)editorExtension.createExecutableExtension("ui"); uiExtensions.put(key, uiExtension); } } catch (CoreException e) { ToursContentPlugin.getDefault().getLog().log(e.getStatus()); } } } } public IURL getUrl() { return new ResourceURL(fResource); } public void load(IMemento memento) { ResourceURL url = (ResourceURL) getUrl(); IResource resource = url.getResource(); if (resource instanceof IFile) { IFile file = (IFile) resource; IEditorDescriptor editor = IDE.getDefaultEditor(file); IResourceTourEditorExtension extension = getEditorExtension(editor.getId(), file.getFileExtension()); if (extension != null) { IMemento extensionMemento = memento.getChild(RESOURCE_EXTENSION_MEMENTO); if (extensionMemento != null) { extension.load(memento); } } } } public void save(IMemento memento) { ResourceURL url = (ResourceURL) getUrl(); IResource resource = url.getResource(); if (resource instanceof IFile) { IFile file = (IFile) resource; IEditorDescriptor editor = IDE.getDefaultEditor(file); if (editor != null) { IResourceTourEditorExtension extension = getEditorExtension(editor.getId(), file.getFileExtension()); if (extension != null) { IMemento extensionMemento = memento.getChild(RESOURCE_EXTENSION_MEMENTO); if (extensionMemento == null) { extensionMemento = memento.createChild(RESOURCE_EXTENSION_MEMENTO); } extension.save(extensionMemento); } } } } public IResourceTourEditorExtension getEditorExtension(String id, String fileExtension) { loadExtensions(); return extensions.get(new PartEditorKey(id, fileExtension)); } public IResourceTourUIExtension getUIExtension(String id, String fileExtension) { loadExtensions(); return uiExtensions.get(new PartEditorKey(id, fileExtension)); } }