org.eclipse.mylyn.java.ui.editor.MylarClassFileEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.java.ui.editor.MylarClassFileEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2004 - 2005 University Of British Columbia 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:
 *     University Of British Columbia - initial API and implementation
 *******************************************************************************/
/*
 * Created on Aug 6, 2004
  */
package org.eclipse.mylyn.java.ui.editor;

import org.eclipse.jdt.core.IImportContainer;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.ISourceReference;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor;
import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput;
import org.eclipse.jface.text.ITextViewerExtension5;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.views.contentoutline.ContentOutline;

import org.eclipse.mylyn.core.MylarPlugin;

/**
 * @author Mik Kersten
 */
public class MylarClassFileEditor extends ClassFileEditor {

    //    private final ActiveFoldingListener FOLDING_LISTENER = new ActiveFoldingListener(this);

    @Override
    public void createPartControl(Composite parent) {
        super.createPartControl(parent);

        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
            public void run() {
                ContextCorePlugin.getTaskscapeManager().addListener(FOLDING_LISTENER);
            }
        });
    }

    // EXPOSED METHODS FROM SUPER CLASS, DO NOT MODIFY
    // -----------------------------------------------

    /**
     * Computes and returns the source reference that includes the caret and
     * serves as provider for the outline page selection and the editor range
     * indication.
     * 
     * @return the computed source reference
     * @since 3.0
     */
    @Override
    protected ISourceReference computeHighlightRangeSourceReference() {
        ISourceViewer sourceViewer = getSourceViewer();
        if (sourceViewer == null)
            return null;

        StyledText styledText = sourceViewer.getTextWidget();
        if (styledText == null)
            return null;

        int caret = 0;
        if (sourceViewer instanceof ITextViewerExtension5) {
            ITextViewerExtension5 extension = (ITextViewerExtension5) sourceViewer;
            caret = extension.widgetOffset2ModelOffset(styledText.getCaretOffset());
        } else {
            int offset = sourceViewer.getVisibleRegion().getOffset();
            caret = offset + styledText.getCaretOffset();
        }

        IJavaElement element = getElementAt(caret, false);

        if (!(element instanceof ISourceReference))
            return null;

        if (element.getElementType() == IJavaElement.IMPORT_DECLARATION) {

            IImportDeclaration declaration = (IImportDeclaration) element;
            IImportContainer container = (IImportContainer) declaration.getParent();
            ISourceRange srcRange = null;

            try {
                srcRange = container.getSourceRange();
            } catch (JavaModelException e) {
                ContextCorePlugin.log(this.getClass().toString(), e);
            }

            if (srcRange != null && srcRange.getOffset() == caret)
                return container;
        }

        return (ISourceReference) element;
    }

    /**
     * Synchronizes the outliner selection with the given element
     * position in the editor.
     * 
     * @param element the java element to select
     * @param checkIfOutlinePageActive <code>true</code> if check for active outline page needs to be done
     */
    @Override
    protected void synchronizeOutlinePage(ISourceReference element, boolean checkIfOutlinePageActive) {
        if (fOutlinePage != null && element != null && !(checkIfOutlinePageActive && isJavaOutlinePageActive())) {
            fOutlineSelectionChangedListener.uninstall(fOutlinePage);
            fOutlinePage.select(element);
            fOutlineSelectionChangedListener.install(fOutlinePage);
        }
    }

    @Override
    protected IJavaElement getElementAt(int offset) {
        if (getEditorInput() instanceof IClassFileEditorInput) {
            try {
                IClassFileEditorInput input = (IClassFileEditorInput) getEditorInput();
                return input.getClassFile().getElementAt(offset);
            } catch (JavaModelException e) {
                ContextCorePlugin.log(this.getClass().toString(), e);
            }
        }
        return null;
    }

    private boolean isJavaOutlinePageActive() {
        IWorkbenchPart part = getActivePart();
        return part instanceof ContentOutline && ((ContentOutline) part).getCurrentPage() == fOutlinePage;
    }

    private IWorkbenchPart getActivePart() {
        IWorkbenchWindow window = getSite().getWorkbenchWindow();
        IPartService service = window.getPartService();
        IWorkbenchPart part = service.getActivePart();
        return part;
    }
}