com.aptana.ide.views.outline.UnifiedOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.views.outline.UnifiedOutlinePage.java

Source

/**
 * This file Copyright (c) 2005-2008 Aptana, Inc. This program is
 * dual-licensed under both the Aptana Public License and the GNU General
 * Public license. You may elect to use one or the other of these licenses.
 * 
 * This program is distributed in the hope that it will be useful, but
 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
 * NONINFRINGEMENT. Redistribution, except as permitted by whichever of
 * the GPL or APL you select, is prohibited.
 *
 * 1. For the GPL license (GPL), you can redistribute and/or modify this
 * program under the terms of the GNU General Public License,
 * Version 3, as published by the Free Software Foundation.  You should
 * have received a copy of the GNU General Public License, Version 3 along
 * with this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 * Aptana provides a special exception to allow redistribution of this file
 * with certain other free and open source software ("FOSS") code and certain additional terms
 * pursuant to Section 7 of the GPL. You may view the exception and these
 * terms on the web at http://www.aptana.com/legal/gpl/.
 * 
 * 2. For the Aptana Public License (APL), this program and the
 * accompanying materials are made available under the terms of the APL
 * v1.0 which accompanies this distribution, and is available at
 * http://www.aptana.com/legal/apl/.
 * 
 * You may view the GPL, Aptana's exception and additional terms, and the
 * APL in the file titled license.html at the root of the corresponding
 * plugin containing this source file.
 * 
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ide.views.outline;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

import com.aptana.ide.core.IdeLog;
import com.aptana.ide.editors.UnifiedEditorsPlugin;
import com.aptana.ide.editors.preferences.IPreferenceConstants;
import com.aptana.ide.editors.unified.ContributedOutline;
import com.aptana.ide.editors.unified.EditorFileContext;
import com.aptana.ide.editors.unified.UnifiedEditor;
import com.aptana.ide.lexer.IRange;
import com.aptana.ide.parsing.nodes.IParseNode;

/**
 * @author Paul Colton
 * @author Kevin Sawicki
 * @author Kevin Lindsey
 */
public class UnifiedOutlinePage extends ContentOutlinePage
        implements ISelectionChangedListener, IUnifiedOutlinePage {
    /**
     * @author Pavel Petrochenko
     */
    private static final class OpenExternalAction extends Action {
        IResolvableItem item;

        String editorId;

        /**
         * @param item
         */
        OpenExternalAction(IResolvableItem item) {

            IEditorDescriptor editorDescriptor;
            try {
                editorDescriptor = IDE.getEditorDescriptor(item.getEditorInput().getName());
                editorId = editorDescriptor.getId();
                this.setImageDescriptor(editorDescriptor.getImageDescriptor());
            } catch (PartInitException e) {
                IdeLog.logError(UnifiedEditorsPlugin.getDefault(), e.getMessage());
            }
            this.item = item;
            this.setToolTipText(Messages.UnifiedOutlinePage_Open);
        }

        /**
         * opens editor on external item
         * 
         * @see org.eclipse.jface.action.Action#run()
         */
        public void run() {
            IEditorInput input = item.getEditorInput();

            IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            try {
                IEditorPart openEditor = IDE.openEditor(activePage, input, editorId);
                if (openEditor instanceof ITextEditor) {
                    ITextEditor ed = (ITextEditor) openEditor;
                    if (item instanceof IRange) {
                        int position = ((IRange) item).getStartingOffset();
                        ed.selectAndReveal(position, 0);
                        return;
                    }
                    if (item instanceof OutlineItem) {
                        int position = ((OutlineItem) item).getStartingOffset();
                        ed.selectAndReveal(position, 0);
                        return;
                    }
                }
                return;
            } catch (PartInitException e) {
                IdeLog.logError(UnifiedEditorsPlugin.getDefault(), e.getMessage());
                return;
            }

        }
    }

    private Composite _composite;
    private SashForm _outlineSash;
    private SashForm _outlineTabsSash;
    private CTabFolder _outlineTabs;
    private UnifiedEditor _editor;
    private PatternFilter _filter;
    private TreeViewer _treeViewer;

    private boolean _hide;

    private ActionContributionItem _sortItem;
    private ActionContributionItem _collapseItem;
    private ActionContributionItem _expandItem;
    private ActionContributionItem _hidePrivateItem;
    private ActionContributionItem _splitItem;
    private HidePrivateAction _hidePrivateAction;

    private Map<String, ContributedOutline> _outlines;
    private UnifiedOutlineProvider outlineProvider;
    private BaseFilter[] _filters;

    private IActionBars _actionBars;

    private ActionContributionItem openAction;

    /**
     * UnifiedOutlinePage
     * 
     * @param editor
     */
    public UnifiedOutlinePage(UnifiedEditor editor) {
        this._editor = editor;
        editor.getViewer().getTextWidget().addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                if (outlineProvider != null) {
                    // notify provider that active editor was changed
                    outlineProvider.pageActivated(UnifiedOutlinePage.this);
                }
            }
        });
        editor.getViewer().getTextWidget().addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                if (outlineProvider != null) {
                    outlineProvider.pageClosed(UnifiedOutlinePage.this);
                }
            }
        });
        this._outlines = new HashMap<String, ContributedOutline>();
    }

    /**
     * addOutline
     * 
     * @param outline
     * @param name
     */
    public void addOutline(ContributedOutline outline, String name) {
        this._outlines.put(name, outline);
    }

    /**
     * createComposite
     * 
     * @param parent
     * @return Composite
     */
    private Composite createComposite(Composite parent) {
        GridLayout contentAreaLayout = new GridLayout();

        contentAreaLayout.numColumns = 1;
        contentAreaLayout.makeColumnsEqualWidth = false;
        contentAreaLayout.marginHeight = 0;
        contentAreaLayout.marginWidth = 0;
        contentAreaLayout.verticalSpacing = 0;
        contentAreaLayout.horizontalSpacing = 0;

        Composite result = new Composite(parent, SWT.NONE);

        result.setLayout(contentAreaLayout);
        result.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        return result;
    }

    /**
     * createContributedOutlines
     */
    private void createContributedOutlines(CTabFolder outlineTabs, SashForm outlineSash) {
        Iterator<String> iter = this._outlines.keySet().iterator();

        while (iter.hasNext()) {
            String key = iter.next();
            ContributedOutline outline = this._outlines.get(key);
            CTabItem tab = new CTabItem(outlineTabs, SWT.NONE);

            Composite previewComp = new Composite(outlineSash, SWT.NONE);
            GridLayout contentAreaLayout = new GridLayout();

            contentAreaLayout.numColumns = 1;
            contentAreaLayout.makeColumnsEqualWidth = true;
            contentAreaLayout.marginHeight = 0;
            contentAreaLayout.marginWidth = 0;
            contentAreaLayout.verticalSpacing = 0;
            contentAreaLayout.horizontalSpacing = 0;
            previewComp.setLayout(contentAreaLayout);
            previewComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            Label outlineLabel = new Label(previewComp, SWT.NONE);
            outlineLabel.setText(key);
            outlineLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

            tab.setText(key);
            SashForm preForm = new SashForm(outlineTabs, SWT.NONE);
            contentAreaLayout = new GridLayout();
            contentAreaLayout.numColumns = 1;
            contentAreaLayout.makeColumnsEqualWidth = false;
            contentAreaLayout.marginHeight = 0;
            contentAreaLayout.marginWidth = 0;
            contentAreaLayout.verticalSpacing = 0;
            contentAreaLayout.horizontalSpacing = 0;
            preForm.setLayout(contentAreaLayout);
            preForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            outline.createControl(preForm);
            tab.setControl(preForm);
        }
    }

    /**
     * Creates page control.
     * 
     * @param parent
     *            - page parent.
     * @param createSearchArea
     *            - whether to create search area or it would be created separately through calling
     *            {@link UnifiedOutlinePage#createSearchArea(Composite)} by a third party.
     */
    public void createControl(Composite parent) {
        // create main container
        this._composite = createComposite(parent);

        createFilters(this._composite);

        // create tab sash
        this._outlineSash = this.createSash(this._composite);

        this.createSourceSash(this._outlineSash);

        // create tabs
        this._outlineTabsSash = this.createOutlineTabs(this._composite);

        // create tree view
        this._filter = new PatternFilter() {
            /**
             * @see org.eclipse.ui.dialogs.PatternFilter#isLeafMatch(org.eclipse.jface.viewers.Viewer, java.lang.Object)
             */
            protected boolean isLeafMatch(Viewer viewer, Object element) {
                boolean result = true;
                String label = null;

                if (element instanceof OutlineItem) {
                    label = ((OutlineItem) element).getLabel();
                } else if (element instanceof IParseNode) {
                    label = UnifiedOutlineProvider.getInstance().getText(element);
                }

                if (label != null) {
                    result = this.wordMatches(label);
                }

                return result;
            }
        };
        this._filter.setIncludeLeadingWildcard(true);
        this._treeViewer = this.createTreeViewer(this._outlineTabsSash, this._filter);

        // apply tree filters
        this._treeViewer.addFilter(new UnifiedViewerFilter(this));
        // add filters
        for (BaseFilter filter : this._filters) {
            this._treeViewer.addFilter(filter);
        }

        // add listeners
        this._treeViewer.addSelectionChangedListener(this);

        // refresh tree
        this.updateProviders();
        this.refresh();
    }

    private void createFilters(Composite result) {
        // create filter toolbar
        ToolBar toolBar = new ToolBar(result, SWT.HORIZONTAL);
        toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));

        List<BaseFilter> filters = new ArrayList<BaseFilter>();

        EditorFileContext fileContext = this._editor.getFileContext();
        String language = fileContext.getDefaultLanguage();

        for (FilterActionInfo filterInfo : UnifiedOutlineProvider.getInstance().getFilterActionInfos(language)) {
            final BaseFilter filter = filterInfo.getFilter();
            ToolItem item = new ToolItem(toolBar, SWT.CHECK);

            filters.add(filter);

            item.setImage(filterInfo.getImageDescriptor().createImage());
            item.setToolTipText(filterInfo.getToolTip());
            item.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    ToolItem item = (ToolItem) e.widget;

                    filter.setActive(item.getSelection());
                    _treeViewer.refresh(true);
                }
            });
        }

        this._filters = filters.toArray(new BaseFilter[filters.size()]);
    }

    /**
     * createOutlineTabs
     * 
     * @param parent
     * @return tab folder
     */
    private SashForm createOutlineTabs(Composite parent) {
        this._outlineTabs = new CTabFolder(parent, SWT.BOTTOM);

        this._outlineTabs.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        // create source tab
        SashForm sourceForm = new SashForm(this._outlineTabs, SWT.NONE);

        sourceForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        CTabItem sourceTab = new CTabItem(this._outlineTabs, SWT.NONE);

        sourceTab.setText(Messages.UnifiedOutlinePage_Source);
        sourceTab.setControl(sourceForm);

        this._outlineTabs.setSelection(sourceTab);

        // create contributed outline tabs
        this.createContributedOutlines(this._outlineTabs, this._outlineSash);

        return sourceForm;
    }

    /**
     * createSash
     * 
     * @param parent
     * @return sash form
     */
    private SashForm createSash(Composite parent) {
        // create layout
        GridLayout contentAreaLayout = new GridLayout();

        contentAreaLayout.numColumns = 1;
        contentAreaLayout.makeColumnsEqualWidth = false;
        contentAreaLayout.marginHeight = 0;
        contentAreaLayout.marginWidth = 0;
        contentAreaLayout.verticalSpacing = 0;
        contentAreaLayout.horizontalSpacing = 0;

        // create layout data
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);

        gridData.exclude = true;

        // create form
        SashForm result = new SashForm(parent, SWT.VERTICAL);

        // set layout and layout data
        result.setLayoutData(gridData);
        result.setLayout(contentAreaLayout);
        result.setVisible(false);

        return result;
    }

    /**
     * createSourceSash
     */
    private void createSourceSash(Composite parent) {
        Composite previewComp = new Composite(parent, SWT.NONE);
        GridLayout contentAreaLayout = new GridLayout();

        contentAreaLayout.numColumns = 1;
        contentAreaLayout.makeColumnsEqualWidth = false;
        contentAreaLayout.marginHeight = 0;
        contentAreaLayout.marginWidth = 0;
        contentAreaLayout.verticalSpacing = 0;
        contentAreaLayout.horizontalSpacing = 0;
        previewComp.setLayout(contentAreaLayout);
        previewComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        Label outlineLabel = new Label(previewComp, SWT.NONE);
        outlineLabel.setText(Messages.UnifiedOutlinePage_Source);
        outlineLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    }

    /**
     * createTreeViewer
     * 
     * @param parent
     * @return TreeViewer
     */
    private TreeViewer createTreeViewer(Composite parent, PatternFilter filter) {
        FilteredTree tree = null;
        try {
            // When available (3.5+) use new constructor
            Constructor<FilteredTree> cons = FilteredTree.class.getConstructor(Composite.class, int.class,
                    PatternFilter.class, boolean.class);
            tree = cons.newInstance(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL, filter, true);
        } catch (Exception e) {
            // fallback to deprecated old constructor when new one not available
            tree = new FilteredTree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL, filter);
        }

        TreeViewer result = tree.getViewer();

        outlineProvider = UnifiedOutlineProvider.getInstance();
        outlineProvider.setOutlinePage(this);

        result.setLabelProvider(outlineProvider);
        result.setContentProvider(outlineProvider);
        result.setInput(this._editor);

        // add selection changed listener
        result.addSelectionChangedListener(new ISelectionChangedListener() {
            /**
             * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
             */
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();

                if (selection.size() == 1) {
                    Object item = selection.getFirstElement();

                    if (item != null && item instanceof OutlineItem) {
                        OutlineItem outlineItem = (OutlineItem) selection.getFirstElement();

                        // Only select and reveal in editor if the tree viewer is focused meaning the selection
                        // originated from a user selection on the tree itself

                        // move cursor to start of this item's text
                        if (_treeViewer != null && _treeViewer.getTree() != null
                                && !_treeViewer.getTree().isDisposed() && _treeViewer.getTree().isFocusControl()) {
                            _editor.selectAndReveal(outlineItem.getStartingOffset(), 0);
                        }

                        // TODO: activate the editor window
                        // Note this code works, but should only be called on mouse clicks so users can
                        // navigate through outline items using the keyboard
                        // IWorkbenchWindow window = JSPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
                        //               
                        // if (window != null)
                        // {
                        // IWorkbenchPage page = window.getActivePage();
                        //                  
                        // page.activate(_editor);
                        // }
                    }
                }
            }
        });

        result.setComparer(new IElementComparer() {
            /**
             * @see org.eclipse.jface.viewers.IElementComparer#equals(java.lang.Object, java.lang.Object)
             */
            public boolean equals(Object a, Object b) {
                boolean result = false;

                if (a instanceof OutlineItem && b instanceof OutlineItem) {
                    OutlineItem item1 = (OutlineItem) a;
                    OutlineItem item2 = (OutlineItem) b;

                    result = item1.equals(item2);
                } else if (a instanceof IParseNode && b instanceof IParseNode) {
                    if (a == b) {
                        result = true;
                    } else {
                        IParseNode node1 = (IParseNode) a;
                        IParseNode node2 = (IParseNode) b;
                        String path1 = node1.getUniquePath();
                        String path2 = node2.getUniquePath();

                        result = path1.equals(path2);
                    }
                } else {
                    result = (a == b);
                }

                return result;
            }

            /**
             * @see org.eclipse.jface.viewers.IElementComparer#hashCode(java.lang.Object)
             */
            public int hashCode(Object element) {
                return 0;
            }
        });

        return result;
    }

    /**
     * @see org.eclipse.ui.part.Page#dispose()
     */
    public void dispose() {
        super.dispose();

        // if (this._delayedRefreshJob != null && this._editor != null)
        // {
        // IEditorInput editorInput = this._editor.getEditorInput();
        // IDocument document = this._editor.getDocumentProvider().getDocument(editorInput);
        // // may be null in some cases
        // if (document != null)
        // {
        // document.removeDocumentListener(this._documentListener);
        // }
        // this._editor.removeFileServiceChangeListener(_serviceListener);
        // }
    }

    /**
     * getContributedOutlines
     * 
     * @return HashMap
     */
    public Map<String, ContributedOutline> getContributedOutlines() {
        return this._outlines;
    }

    /**
     * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#getControl()
     */
    public Control getControl() {
        return this._composite;
    }

    /**
     * getOutlineSash
     * 
     * @return SashForm
     */
    public SashForm getOutlineSash() {
        return this._outlineSash;
    }

    /**
     * getOutlineTabs
     * 
     * @return CTabFolder
     */
    public CTabFolder getOutlineTabs() {
        return this._outlineTabs;
    }

    /**
     * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#getTreeViewer()
     */
    public TreeViewer getTreeViewer() {
        return this._treeViewer;
    }

    /**
     * @return editor
     */
    public UnifiedEditor getUnifiedEditor() {
        return this._editor;
    }

    /**
     * {@inheritDoc}
     */
    public boolean hidePrivateMembers() {
        return this._hide;
    }

    /**
     * refresh
     */
    public void refresh() {
        if (!_treeViewer.getControl().isDisposed()) {
            this._treeViewer.refresh();
        }
    }

    /**
     * removeOpenActionIfNeeded
     */
    private void removeOpenActionIfNeeded() {
        if (this.openAction != null) {
            _actionBars.getToolBarManager().remove(openAction);
            openAction = null;
            _actionBars.getToolBarManager().update(false);
        }
    }

    /**
     * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
     */
    public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();

        // If a node in the outline view is selected
        if (selection.size() == 1) {
            Object element = selection.getFirstElement();

            if (element instanceof IResolvableItem) {
                IResolvableItem item = (IResolvableItem) element;
                // if item is resolvable and is targeting on external content
                if (item.isResolvable()) {
                    // removing all item if needed
                    if (openAction != null) {
                        _actionBars.getToolBarManager().remove(openAction);
                    }
                    openAction = new ActionContributionItem(new OpenExternalAction(item));
                    _actionBars.getToolBarManager().add(openAction);
                    _actionBars.getToolBarManager().update(false);
                    // while item is not able to be resolved in current file
                    // getting parent item
                    while (!item.stillHighlight()) {
                        item = item.getParentItem();
                        if (item == null) {
                            return;
                        }
                    }
                    // selecting it in editor
                    if (item instanceof IParseNode) {
                        int position = ((IParseNode) item).getStartingOffset();
                        this._editor.selectAndReveal(position, 0);
                        return;
                    }
                } else {
                    // removing item from toolbar
                    removeOpenActionIfNeeded();
                }
            }
            removeOpenActionIfNeeded();
            if (element instanceof IRange) {
                int position = ((IRange) element).getStartingOffset();

                this._editor.selectAndReveal(position, 0);
            }

        } else {
            removeOpenActionIfNeeded();
            this._editor.getViewer().removeRangeIndication();
        }
    }

    /**
     * @see org.eclipse.ui.part.Page#setActionBars(org.eclipse.ui.IActionBars)
     */
    public void setActionBars(IActionBars actionBars) {
        // add split action
        if (this._outlines.size() > 0) {
            SplitOutlinesAction splitAction = new SplitOutlinesAction(this);

            splitAction.setEnabled(this._composite.isReparentable());
            this._splitItem = new ActionContributionItem(splitAction);
            actionBars.getToolBarManager().add(this._splitItem);
        }
        this._actionBars = actionBars;
        // add sort action
        SortAction sortAction = new SortAction(this);
        IPreferenceStore store = UnifiedEditorsPlugin.getDefault().getPreferenceStore();
        boolean sort = store.getBoolean(IPreferenceConstants.SORT_OUTLINE_ALPHABETICALLY);
        sortAction.setChecked(sort);
        if (sort) {
            getTreeViewer().setSorter(SortAction.SORTER);
        }
        this._sortItem = new ActionContributionItem(sortAction);
        actionBars.getToolBarManager().add(this._sortItem);

        // add hide private members action
        this._hidePrivateAction = new HidePrivateAction(this);
        this._hidePrivateItem = new ActionContributionItem(this._hidePrivateAction);
        actionBars.getToolBarManager().add(this._hidePrivateItem);

        // add collapse all action
        CollapseAction collapseAction = new CollapseAction(this);
        this._collapseItem = new ActionContributionItem(collapseAction);
        actionBars.getToolBarManager().add(this._collapseItem);

        Action expandAction = new Action(Messages.UnifiedOutlinePage_ExpandAll) {
            public void run() {
                getTreeViewer().expandAll();
            }
        };
        expandAction.setImageDescriptor(UnifiedEditorsPlugin.getImageDescriptor("icons/expandall.gif")); //$NON-NLS-1$
        expandAction.setToolTipText(Messages.UnifiedOutlinePage_CollapseAll);
        this._expandItem = new ActionContributionItem(expandAction);
        actionBars.getToolBarManager().add(this._expandItem);

        super.setActionBars(actionBars);
    }

    /**
     * Contibutes actions to quick outline menu.
     * 
     * @param manager
     *            - menu manager.
     */
    public void contributeToQuickOutlineMenu(IMenuManager manager) {
        // add split action
        if (this._outlines.size() > 0) {
            SplitOutlinesAction splitAction = new SplitOutlinesAction(this);

            splitAction.setEnabled(this._composite.isReparentable());
            this._splitItem = new ActionContributionItem(splitAction);
            manager.add(this._splitItem);
        }
        // add sort action
        SortAction sortAction = new SortAction(this);
        IPreferenceStore store = UnifiedEditorsPlugin.getDefault().getPreferenceStore();
        boolean sort = store.getBoolean(IPreferenceConstants.SORT_OUTLINE_ALPHABETICALLY);
        sortAction.setChecked(sort);
        if (sort) {
            getTreeViewer().setSorter(SortAction.SORTER);
        }
        this._sortItem = new ActionContributionItem(sortAction);
        manager.add(this._sortItem);

        // add hide private members action
        this._hidePrivateAction = new HidePrivateAction(this);
        this._hidePrivateItem = new ActionContributionItem(this._hidePrivateAction);
        manager.add(this._hidePrivateItem);

        // add collapse all action
        CollapseAction collapseAction = new CollapseAction(this);
        this._collapseItem = new ActionContributionItem(collapseAction);
        manager.add(this._collapseItem);

        Action expandAction = new Action(Messages.UnifiedOutlinePage_ExpandAll) {
            public void run() {
                getTreeViewer().expandAll();
            }
        };
        expandAction.setImageDescriptor(UnifiedEditorsPlugin.getImageDescriptor("icons/expandall.gif")); //$NON-NLS-1$
        expandAction.setToolTipText(Messages.UnifiedOutlinePage_CollapseAll);
        this._expandItem = new ActionContributionItem(expandAction);
        manager.add(this._expandItem);
    }

    /**
     * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#setFocus()
     */
    public void setFocus() {
        this._treeViewer.getControl().setFocus();
    }

    /**
     * togglePrivateMemberVisibility
     */
    public void togglePrivateMemberVisibility() {
        this._hide = (this._hide == false);

        this.refresh();
    }

    /**
     * updateProviders
     */
    private void updateProviders() {
        EditorFileContext fileContext = _editor.getFileContext();

        if (fileContext != null) {
            UnifiedOutlineProvider provider = UnifiedOutlineProvider.getInstance();

            provider.setCurrentLanguage(fileContext.getDefaultLanguage());
            provider.fireBeforeRefreshEvent(fileContext);
        }
    }
}