com.redhat.ceylon.eclipse.code.outline.OutlinePopup.java Source code

Java tutorial

Introduction

Here is the source code for com.redhat.ceylon.eclipse.code.outline.OutlinePopup.java

Source

/*******************************************************************************
* Copyright (c) 2007 IBM Corporation.
* 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:
*    Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation
    
*******************************************************************************/

package com.redhat.ceylon.eclipse.code.outline;

import static com.redhat.ceylon.eclipse.code.parse.CeylonSourcePositionLocator.gotoNode;
import static com.redhat.ceylon.eclipse.ui.CeylonResources.CEYLON_OUTLINE;
import static org.eclipse.jface.viewers.AbstractTreeViewer.ALL_LEVELS;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.Widget;

import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree.ImportList;
import com.redhat.ceylon.eclipse.code.editor.CeylonEditor;
import com.redhat.ceylon.eclipse.code.parse.CeylonParseController;
import com.redhat.ceylon.eclipse.code.parse.CeylonTokenColorer;
import com.redhat.ceylon.eclipse.ui.CeylonPlugin;

public class OutlinePopup extends TreeViewPopup {

    private CeylonOutlineContentProvider outlineContentProvider;
    private OutlineSorter outlineSorter;
    private CeylonLabelProvider labelProvider;
    private LexicalSortingAction lexicalSortingAction;

    protected static final Object[] NO_CHILDREN = new Object[0];

    private class OutlineTreeViewer extends TreeViewer {
        private boolean fIsFiltering = false;

        private OutlineTreeViewer(Tree tree) {
            super(tree);
        }

        protected Object[] getFilteredChildren(Object parent) {
            Object[] result = getRawChildren(parent);
            int unfilteredChildren = result.length;
            ViewerFilter[] filters = getFilters();
            if (filters != null) {
                for (int i = 0; i < filters.length; i++)
                    result = filters[i].filter(this, parent, result);
            }
            fIsFiltering = unfilteredChildren != result.length;
            return result;
        }

        protected void internalExpandToLevel(Widget w, int level) {
            if (!fIsFiltering && w instanceof Item) {
                Item i = (Item) w;
                Node node = ((CeylonOutlineNode) i.getData()).getTreeNode();
                /*if (node instanceof Declaration) {
                   boolean shared = ((Declaration) node).getDeclarationModel().isShared();
                setExpanded(i, shared);
                }
                else*/
                if (node instanceof ImportList) {
                    setExpanded(i, false);
                    return;
                }
            }
            super.internalExpandToLevel(w, level);
        }

    }

    private class OutlineSorter extends ViewerSorter {

        private static final int OTHER = 1;

        public void sort(Viewer viewer, Object[] elements) {
            if (!lexicalSortingAction.isChecked())
                return;
            super.sort(viewer, elements);
        }

        public int compare(Viewer viewer, Object e1, Object e2) {
            int cat1 = category(e1);
            int cat2 = category(e2);
            if (cat1 != cat2)
                return cat1 - cat2;
            String label1 = labelProvider.getText(e1);
            String label2 = labelProvider.getText(e2);

            return label1.compareTo(label2);
        }

        public int category(Object element) {
            return OTHER;
        }
    }

    private class LexicalSortingAction extends Action {
        private static final String STORE_LEXICAL_SORTING_CHECKED = "LexicalSortingAction.isChecked";
        private TreeViewer fOutlineViewer;

        private LexicalSortingAction(TreeViewer outlineViewer) {
            super("Sort", IAction.AS_CHECK_BOX);
            setToolTipText("Sort by name");
            setDescription("Sort entries lexically by name");
            CeylonPlugin.getInstance().image("alphab_sort_co.gif");
            fOutlineViewer = outlineViewer;
            boolean checked = getDialogSettings().getBoolean(STORE_LEXICAL_SORTING_CHECKED);
            setChecked(checked);
        }

        public void run() {
            valueChanged(isChecked(), true);
        }

        private void valueChanged(final boolean on, boolean store) {
            setChecked(on);
            BusyIndicator.showWhile(fOutlineViewer.getControl().getDisplay(), new Runnable() {
                public void run() {
                    fOutlineViewer.refresh(false);
                }
            });
            if (store)
                getDialogSettings().put(STORE_LEXICAL_SORTING_CHECKED, on);
        }
    }

    public OutlinePopup(CeylonEditor editor, Shell parent, int shellStyle, int treeStyle) {
        super(parent, shellStyle, treeStyle, editor, CeylonTokenColorer.getCurrentThemeColor("outline"));
        setTitleText("Outline of " + editor.getEditorInput().getName());
    }

    @Override
    protected TreeViewer createTreeViewer(Composite parent, int style) {
        Tree tree = new Tree(parent, SWT.SINGLE | (style & ~SWT.MULTI));
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = tree.getItemHeight() * 12;
        tree.setLayoutData(gd);
        final TreeViewer treeViewer = new OutlineTreeViewer(tree);
        lexicalSortingAction = new LexicalSortingAction(treeViewer);
        outlineContentProvider = new CeylonOutlineContentProvider();
        labelProvider = new CeylonLabelProvider();
        treeViewer.setLabelProvider(labelProvider);
        treeViewer.addFilter(new NamePatternFilter());
        //   fSortByDefiningTypeAction= new SortByDefiningTypeAction(treeViewer);
        //   fShowOnlyMainTypeAction= new ShowOnlyMainTypeAction(treeViewer);
        treeViewer.setContentProvider(outlineContentProvider);
        outlineSorter = new OutlineSorter();
        treeViewer.setSorter(outlineSorter);
        treeViewer.setAutoExpandLevel(ALL_LEVELS);
        //treeViewer.getTree().addKeyListener(getKeyAdapter());
        return treeViewer;
    }

    @Override
    protected String getId() {
        return "org.eclipse.jdt.internal.ui.text.QuickOutline";
    }

    @Override
    protected Control createTitleControl(Composite parent) {
        getPopupLayout().copy().numColumns(3).applyTo(parent);
        Label label = new Label(parent, SWT.NONE);
        label.setImage(CeylonPlugin.getInstance().getImageRegistry().get(CEYLON_OUTLINE));
        return super.createTitleControl(parent);
    }

    public void setInput(Object information) {
        if (information == null || information instanceof String) {
            inputChanged(null, null);
        } else {
            inputChanged(information, information);
        }
    }

    @Override
    protected void fillViewMenu(IMenuManager viewMenu) {
        super.fillViewMenu(viewMenu);
        //   viewMenu.add(fShowOnlyMainTypeAction);
        viewMenu.add(new Separator("Sorters"));
        if (lexicalSortingAction != null)
            viewMenu.add(lexicalSortingAction);
        //   viewMenu.add(fSortByDefiningTypeAction);
    }

    @Override
    protected void gotoSelectedElement() {
        CeylonParseController cpc = editor.getParseController();
        if (cpc != null) {
            Object object = getSelectedElement();
            if (object instanceof CeylonOutlineNode) {
                dispose();
                gotoNode(((CeylonOutlineNode) object).getTreeNode(), cpc.getProject(), cpc.getTypeChecker());
            }
            /*if (object instanceof Declaration) {
               dispose();
               Declaration dec = (Declaration) object;
               //TODO: this is broken for Java declarations
               gotoNode(getReferencedNode(dec, getCompilationUnit(cpc, dec)), 
                cpc.getProject(), cpc.getTypeChecker());
            }*/
        }
    }

}