com.aptana.ide.xul.FirefoxOutline.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.xul.FirefoxOutline.java

Source

/**
 * Copyright (c) 2005-2006 Aptana, Inc.
 *
 * 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. If redistributing this code,
 * this entire header must remain intact.
 */
package com.aptana.ide.xul;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.progress.WorkbenchJob;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMNode;

import com.aptana.ide.editors.unified.ContributedBrowser;
import com.aptana.ide.editors.unified.ContributedOutline;
import com.aptana.ide.xul.browser.Activator;
import com.aptana.ide.xul.browser.FirefoxBrowser;

/**
 * FirefoxOutline
 */
public class FirefoxOutline extends ContributedOutline {
    private TreeViewer treeViewer;
    private FirefoxBrowser browser;
    private WorkbenchJob refreshJob;
    private PatternFilter filter;
    private String pattern;

    /**
     * @see com.aptana.ide.editors.unified.ContributedOutline#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        treeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE);
        treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        treeViewer.getTree().setLayout(new GridLayout(1, true));
        treeViewer.setLabelProvider(new DOMLabelProvider());
        treeViewer.setAutoExpandLevel(3);
        treeViewer.setContentProvider(new DOMContentProvider());
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (selection.size() == 1) {
                    nsIDOMNode node = (nsIDOMNode) selection.getFirstElement();
                    browser.highlightElement(node);
                }
            }

        });
        treeViewer.addFilter(new InternalNodeFilter());
        filter = new PatternFilter() {

            protected boolean isLeafMatch(Viewer viewer, Object element) {
                if (element instanceof nsIDOMNode) {
                    if (((nsIDOMNode) element).getNodeType() == nsIDOMNode.ELEMENT_NODE) {
                        nsIDOMElement e = (nsIDOMElement) ((nsIDOMNode) element)
                                .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
                        if (Activator.INTERNAL_ID.equals(e.getAttribute("class"))) //$NON-NLS-1$
                        {
                            return false;
                        }
                    }
                    DOMLabelProvider prov = (DOMLabelProvider) treeViewer.getLabelProvider();
                    return this.wordMatches(prov.getText(element));
                }
                return true;
            }

        };
        treeViewer.addFilter(filter);
        refreshJob = new WorkbenchJob("Refresh Filter") {//$NON-NLS-1$
            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
             */
            public IStatus runInUIThread(IProgressMonitor monitor) {
                if (treeViewer.getControl().isDisposed()) {
                    return Status.CANCEL_STATUS;
                }

                if (pattern == null) {
                    return Status.OK_STATUS;
                }

                filter.setPattern(pattern);

                try {
                    // don't want the user to see updates that will be made to the tree
                    treeViewer.getControl().setRedraw(false);
                    treeViewer.refresh(true);

                    if (pattern.length() > 0) {
                        /*
                         * Expand elements one at a time. After each is expanded, check to see if the filter text has
                         * been modified. If it has, then cancel the refresh job so the user doesn't have to endure
                         * expansion of all the nodes.
                         */
                        IStructuredContentProvider provider = (IStructuredContentProvider) treeViewer
                                .getContentProvider();
                        Object[] elements = provider.getElements(treeViewer.getInput());
                        for (int i = 0; i < elements.length; i++) {
                            if (monitor.isCanceled()) {
                                return Status.CANCEL_STATUS;
                            }
                            treeViewer.expandToLevel(elements[i], AbstractTreeViewer.ALL_LEVELS);
                        }

                        TreeItem[] items = treeViewer.getTree().getItems();
                        if (items.length > 0) {
                            // to prevent scrolling
                            treeViewer.getTree().showItem(items[0]);
                        }

                    }
                } finally {
                    // done updating the tree - set redraw back to true
                    treeViewer.getControl().setRedraw(true);
                }
                return Status.OK_STATUS;
            }

        };
        TreeItem item = new TreeItem(treeViewer.getTree(), SWT.NONE);
        item.setText(Messages.getString("FirefoxOutline.Select_Tab_To_Load_Outline")); //$NON-NLS-1$
        refreshJob.setSystem(true);
        refresh();
    }

    /**
     * @see com.aptana.ide.editors.unified.ContributedOutline#setBrowser(com.aptana.ide.editors.unified.ContributedBrowser)
     */
    public void setBrowser(ContributedBrowser browser) {
        this.browser = (FirefoxBrowser) browser;
    }

    /**
     * @see com.aptana.ide.editors.unified.ContributedOutline#refresh()
     */
    public void refresh() {
        if (treeViewer != null && browser != null && browser.getDocument() != null) {
            treeViewer.setInput(browser.getDocument());
        }
    }

    /**
     * @see com.aptana.ide.editors.unified.ContributedOutline#getParent()
     */
    public Composite getParent() {
        return treeViewer.getControl().getParent();
    }

    /**
     * @see com.aptana.ide.editors.unified.ContributedOutline#getViewer()
     */
    public Viewer getViewer() {
        return treeViewer;
    }

    /**
     * @see com.aptana.ide.editors.unified.ContributedOutline#setFilterText(java.lang.String)
     */
    public void setFilterText(String text) {
        pattern = text;
        if (filter != null) {
            filter.setPattern(text);
        }
        if (refreshJob != null) {
            refreshJob.cancel();
            refreshJob.schedule(200);
        }
    }
}