com.ibm.research.tours.content.url.delegates.JavaURLTourElementDelegate.java Source code

Java tutorial

Introduction

Here is the source code for com.ibm.research.tours.content.url.delegates.JavaURLTourElementDelegate.java

Source

/*******************************************************************************
 * 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.List;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.internal.editors.text.EditorsPlugin;
import org.eclipse.ui.progress.WorkbenchJob;
import org.eclipse.ui.texteditor.AnnotationPreference;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;

import com.ibm.research.tours.ITourElement;
import com.ibm.research.tours.content.BoxTextEffect;
import com.ibm.research.tours.content.DashedBoxTextEffect;
import com.ibm.research.tours.content.HighlightedTextEffect;
import com.ibm.research.tours.content.ITextEffect;
import com.ibm.research.tours.content.NativeProblemUnderlineTextEffect;
import com.ibm.research.tours.content.SquigglesTextEffect;
import com.ibm.research.tours.content.ToursContentPlugin;
import com.ibm.research.tours.content.UnderlinedTextEffect;
import com.ibm.research.tours.content.VerticalBarTextEffect;
import com.ibm.research.tours.content.elements.ResourceURLTourElement;
import com.ibm.research.tours.content.url.IURL;
import com.ibm.research.tours.content.url.JavaURL;
import com.ibm.research.tours.fx.AlphaFx;
import com.ibm.research.tours.fx.EclipseFx;
import com.ibm.research.tours.fx.IHighlightEffect;

public class JavaURLTourElementDelegate implements IURLTourElementDelegate {
    private MarkerAnnotationPreferences fMarkerAnnotationPreferences;
    private AnnotationPreference fAnnotationPreference;
    private JavaElementLabelProvider fJavaElementLabelProvider;
    private JavaElementLabelProvider fRuntimeJavaElementLabelProvider;
    private IJavaElement fElement;
    private ResourceURLTourElement fTourElement;
    private IMarker fMarker;
    protected AlphaFx fAlphaFX;
    private WorkbenchJob fJob;
    private IPreferenceStore fStore;
    private ISourceRange fRange;

    public JavaURLTourElementDelegate(ResourceURLTourElement tourElement, IJavaElement element) {
        fElement = element;
        fTourElement = tourElement;
    }

    private JavaElementLabelProvider getJavaElementLabelProvider() {
        if (fJavaElementLabelProvider == null)
            fJavaElementLabelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_QUALIFIED
                    | JavaElementLabelProvider.SHOW_SMALL_ICONS | JavaElementLabelProvider.SHOW_PARAMETERS);
        return fJavaElementLabelProvider;
    }

    private JavaElementLabelProvider getRuntimeJavaElementLabelProvider() {
        if (fRuntimeJavaElementLabelProvider == null)
            fRuntimeJavaElementLabelProvider = new JavaElementLabelProvider(
                    JavaElementLabelProvider.SHOW_SMALL_ICONS | JavaElementLabelProvider.SHOW_PARAMETERS);
        return fRuntimeJavaElementLabelProvider;
    }

    public ITourElement createClone() {
        return new ResourceURLTourElement(fElement);
    }

    public Image getImage() {
        return ToursContentPlugin.getImage(fElement);
    }

    public String getShortText() {
        return getRuntimeJavaElementLabelProvider().getText(fElement);
    }

    public String getText() {
        return getJavaElementLabelProvider().getText(fElement);
    }

    public void start() {
        if (fTourElement.getTextHighlighting()) {
            fMarkerAnnotationPreferences = EditorsPlugin.getDefault().getMarkerAnnotationPreferences();
            List annotations = fMarkerAnnotationPreferences.getAnnotationPreferences();

            for (Object o : annotations) {
                AnnotationPreference info = (AnnotationPreference) o;
                String type = (String) info.getAnnotationType();

                if (type.equals("com.ibm.research.tours.content.tourtextannotation"))
                    fAnnotationPreference = info;
            }

            fStore = EditorsPlugin.getDefault().getPreferenceStore();
            fStore.setValue(fAnnotationPreference.getHighlightPreferenceKey(),
                    fTourElement.getTextHighlighting() ? "true" : "false");
            fStore.setValue(fAnnotationPreference.getOverviewRulerPreferenceKey(),
                    fTourElement.getShowInOverview() ? "true" : "false");
            fStore.setValue(fAnnotationPreference.getVerticalRulerPreferenceKey(),
                    fTourElement.getShowInVertical() ? "true" : "false");

            fStore.setValue(fAnnotationPreference.getHighlightPreferenceKey(), "false");
            fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "false");

            // This code is `duplicated!!! 
            ITextEffect effect = fTourElement.getSelectedTextEffect();

            if (effect instanceof HighlightedTextEffect) {
                fStore.setValue(fAnnotationPreference.getHighlightPreferenceKey(), "true");
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "false");
            } else if (effect instanceof SquigglesTextEffect) {
                fStore.setValue(fAnnotationPreference.getTextStylePreferenceKey(),
                        AnnotationPreference.STYLE_SQUIGGLES);
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "true");
            } else if (effect instanceof UnderlinedTextEffect) {
                fStore.setValue(fAnnotationPreference.getTextStylePreferenceKey(),
                        AnnotationPreference.STYLE_UNDERLINE);
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "true");
            } else if (effect instanceof BoxTextEffect) {
                fStore.setValue(fAnnotationPreference.getTextStylePreferenceKey(), AnnotationPreference.STYLE_BOX);
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "true");
            } else if (effect instanceof VerticalBarTextEffect) {
                fStore.setValue(fAnnotationPreference.getTextStylePreferenceKey(),
                        AnnotationPreference.STYLE_IBEAM);
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "true");
            } else if (effect instanceof NativeProblemUnderlineTextEffect) {
                fStore.setValue(fAnnotationPreference.getTextStylePreferenceKey(),
                        AnnotationPreference.STYLE_PROBLEM_UNDERLINE);
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "true");
            } else if (effect instanceof DashedBoxTextEffect) {
                fStore.setValue(fAnnotationPreference.getTextStylePreferenceKey(),
                        AnnotationPreference.STYLE_DASHED_BOX);
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "true");
            } else
                fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "false");

            if (fTourElement.getTextPresentationColor() != null) {
                String color = fTourElement.getTextPresentationColor().red + ","
                        + fTourElement.getTextPresentationColor().green + ","
                        + fTourElement.getTextPresentationColor().blue;
                fStore.setValue(fAnnotationPreference.getColorPreferenceKey(), color);
            }
        }

        try {
            fRange = null;

            if (fElement.getElementType() == IJavaElement.TYPE) {
                IType type = (IType) fElement;
                fRange = type.getSourceRange();
            } else if (fElement.getElementType() == IJavaElement.METHOD) {
                IMethod method = (IMethod) fElement;
                fRange = method.getSourceRange();
            } else if (fElement.getElementType() == IJavaElement.FIELD) {
                IField field = (IField) fElement;
                fRange = field.getSourceRange();
            }

            if (fRange != null) {
                fMarker = fElement.getResource().createMarker("com.ibm.research.tours.content.tourtextmarker");
                fMarker.setAttribute(IMarker.CHAR_START, fRange.getOffset());
                fMarker.setAttribute(IMarker.CHAR_END, fRange.getOffset() + fRange.getLength());
            }
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    public void stop() {
        if (fAnnotationPreference != null && fStore != null) {
            fStore.setValue(fAnnotationPreference.getHighlightPreferenceKey(), "false");
            fStore.setValue(fAnnotationPreference.getTextPreferenceKey(), "false");
        }

        try {
            if (fMarker != null)
                fMarker.delete();
        } catch (CoreException e) {
            e.printStackTrace();
        }

        if (fJob != null)
            fJob.cancel();

        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(fElement);

        try {
            final IEditorPart part = JavaUI.openInEditor(fElement);

            if (fTourElement.getMaximixedHint())
                EclipseFx.maximizeActiveEditor();

            if (part instanceof ITextEditor) {
                if (fRange != null) {
                    ITextEditor editor = (ITextEditor) part;
                    editor.setHighlightRange(fRange.getOffset(), 0, true);
                }
            }

            if (fTourElement.getHighlightEffect() != null) {
                fJob = new WorkbenchJob("") {
                    @Override
                    public IStatus runInUIThread(IProgressMonitor monitor) {
                        IHighlightEffect effect = fTourElement.getHighlightEffect();
                        if (effect != null)
                            fAlphaFX = effect.apply(fAlphaFX, part);

                        //                  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 MismarHighlightEffect) {
                        //                     GlobalHighlightEffect.reset();
                        //                     fAlphaFX = new AlphaFx(PlatformUI.getWorkbench().getDisplay());
                        //                     Rectangle bounds = EclipseFx.getBounds(part);
                        //                     IViewPart mismarView = getMismarView();
                        //                     
                        //                     if (mismarView != null) {
                        //                        Rectangle bounds2 = EclipseFx.getBounds(mismarView);
                        //                        fAlphaFX.focus(bounds,bounds2, true);
                        //                     } else {
                        //                        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();
        } catch (JavaModelException e) {
            e.printStackTrace();
        }
    }

    public IURL getUrl() {
        return new JavaURL(fElement);
    }
}