org.scribble.protocol.designer.editor.ScribbleContentOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for org.scribble.protocol.designer.editor.ScribbleContentOutlinePage.java

Source

/*
 * Copyright 2009 Scribble.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package org.scribble.protocol.designer.editor;

import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.scribble.protocol.designer.editor.outliner.DefaultModelOutliner;
import org.scribble.protocol.model.ModelProperties;

/**
 * A content outline page which always represents the content of the
 * connected editor in 10 segments.
 */
public class ScribbleContentOutlinePage extends ContentOutlinePage {

    protected class LabelProvider implements ILabelProvider {

        public Image getImage(Object element) {
            Image ret = null;

            if (m_outliner != null) {
                ret = m_outliner.getImage(m_reference, element);
            }

            return (ret);
        }

        public String getText(Object element) {
            String ret = null;

            if (m_outliner != null) {
                ret = m_outliner.getLabel(m_reference, element);
            }

            return (ret);
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }

    }

    /**
     * Divides the editor's document into ten segments and provides elements for them.
     */
    protected class ContentProvider implements ITreeContentProvider {

        /*
         * @see IContentProvider#inputChanged(Viewer, Object, Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

        }

        /*
         * @see IContentProvider#dispose
         */
        public void dispose() {
        }

        /*
         * @see IContentProvider#isDeleted(Object)
         */
        public boolean isDeleted(Object element) {
            return false;
        }

        /*
         * @see IStructuredContentProvider#getElements(Object)
         */
        public Object[] getElements(Object element) {
            Object[] ret = null;

            if (m_outliner != null) {
                java.util.List<Object> list = m_outliner.getChildren(m_reference, element);

                if (list != null) {
                    ret = list.toArray();
                }
            } else {
                ret = new Object[0];
            }

            return (ret);
        }

        /*
         * @see ITreeContentProvider#hasChildren(Object)
         */
        public boolean hasChildren(Object element) {
            boolean ret = false;

            if (m_outliner != null) {
                ret = m_outliner.hasChildren(m_reference, element);
            }

            return (ret);
        }

        /*
         * @see ITreeContentProvider#getParent(Object)
         */
        public Object getParent(Object element) {
            return (m_model);
        }

        /*
         * @see ITreeContentProvider#getChildren(Object)
         */
        public Object[] getChildren(Object element) {
            return (getElements(element));
        }
    }

    protected Object fInput;
    protected IDocumentProvider fDocumentProvider;
    protected ITextEditor fTextEditor;

    /**
     * Creates a content outline page using the given provider and the given editor.
     * 
     * @param provider the document provider
     * @param editor the editor
     */
    public ScribbleContentOutlinePage(IDocumentProvider provider, ITextEditor editor) {
        super();
        fDocumentProvider = provider;
        fTextEditor = editor;
    }

    /* (non-Javadoc)
     * Method declared on ContentOutlinePage
     */
    public void createControl(Composite parent) {

        super.createControl(parent);

        TreeViewer viewer = getTreeViewer();
        viewer.setContentProvider(new ContentProvider());
        viewer.setLabelProvider(new LabelProvider());
        viewer.addSelectionChangedListener(this);

        if (m_model != null) {
            viewer.setInput(m_model);
        } else if (fInput != null) {
            viewer.setInput(fInput);
        }
    }

    /* (non-Javadoc)
     * Method declared on ContentOutlinePage
     */
    public void selectionChanged(SelectionChangedEvent event) {

        super.selectionChanged(event);

        ISelection selection = event.getSelection();
        if (selection.isEmpty()) {
            fTextEditor.resetHighlightRange();
        } else {

            if (((IStructuredSelection) selection)
                    .getFirstElement() instanceof org.scribble.protocol.model.ModelObject) {
                org.scribble.protocol.model.ModelObject mobj = (org.scribble.protocol.model.ModelObject) ((IStructuredSelection) selection)
                        .getFirstElement();

                if (mobj.getProperties().containsKey(ModelProperties.START_LOCATION)
                        && mobj.getProperties().containsKey(ModelProperties.END_LOCATION)) {
                    int start = (Integer) mobj.getProperties().get(ModelProperties.START_LOCATION);
                    int length = (Integer) mobj.getProperties().get(ModelProperties.END_LOCATION);

                    try {
                        fTextEditor.setHighlightRange(start, length, true);
                    } catch (IllegalArgumentException x) {
                        fTextEditor.resetHighlightRange();
                    }
                } else {
                    fTextEditor.resetHighlightRange();
                }
            } else {
                fTextEditor.resetHighlightRange();
            }
        }
    }

    /**
     * Sets the input of the outline page
     * 
     * @param input the input of this outline page
     */
    public void setInput(Object input) {
        fInput = input;
        update();
    }

    /**
     * Updates the outline page.
     */
    public void update() {
        TreeViewer viewer = getTreeViewer();

        m_outliner = null;
        m_reference = null;
        m_model = null;

        if (fInput instanceof org.eclipse.ui.IFileEditorInput) {
            //org.eclipse.ui.IFileEditorInput fi=
            //      (org.eclipse.ui.IFileEditorInput)fInput;

            // TODO: Need to parse model - will need to determine
            // which notation, and select the appropriate parser

            m_outliner = new DefaultModelOutliner();
        }

        if (viewer != null) {
            Control control = viewer.getControl();
            if (control != null && !control.isDisposed()) {

                control.setRedraw(false);

                if (m_model != null) {
                    viewer.setInput(m_model);
                } else {

                    viewer.setInput(fInput);
                }

                viewer.expandAll();
                control.setRedraw(true);
            }
        }
    }

    private org.scribble.protocol.model.ProtocolModel m_model = null;
    private org.scribble.protocol.model.ModelReference m_reference = null;
    private org.scribble.protocol.designer.editor.outliner.ModelOutliner m_outliner = null;
}