net.sourceforge.veditor.editor.HdlContentOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.veditor.editor.HdlContentOutlinePage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2006 KOBAYASHI Tadashi 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:
 *    KOBAYASHI Tadashi - initial API and implementation
 *******************************************************************************/

package net.sourceforge.veditor.editor;

import net.sourceforge.veditor.VerilogPlugin;
import net.sourceforge.veditor.editor.VhdlHierarchyProvider;
import net.sourceforge.veditor.document.VhdlDocument;
import net.sourceforge.veditor.parser.OutlineElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogFunctionElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogInstanceElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogModuleElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogParameterElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogPortElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogRegElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogSignalElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogTaskElement;
import net.sourceforge.veditor.parser.verilog.VerilogOutlineElementFactory.VerilogWireElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.AliasElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.ArchitectureElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.ComponentDeclElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.ComponentInstElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.ConstantElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.EntityDeclElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.EntityInstElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.GenericElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.PackageBodyElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.PackageDeclElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.ProcedureElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.ProcessElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.VhdlPortElement;
import net.sourceforge.veditor.parser.vhdl.VhdlOutlineElementFactory.VhdlSignalElement;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

public class HdlContentOutlinePage extends ContentOutlinePage implements IDoubleClickListener {
    private HdlEditor editor;
    private static final String FILTER_SIGNAL_ACTION_IMAGE = "$nl$/icons/filter_signal.gif";
    private static final String FILTER_PORT_ACTION_IMAGE = "$nl$/icons/filter_port.gif";
    private static final String ENABLE_SORT_ACTION_IMAGE = "$nl$/icons/sort.gif";

    private boolean m_bFilterSignals;
    private boolean m_bPortSignals;
    private boolean enableSort;

    public HdlContentOutlinePage(HdlEditor editor) {
        super();
        this.editor = editor;
        m_bFilterSignals = VerilogPlugin.getPreferenceBoolean("Outline.FilterSignals");
        m_bPortSignals = VerilogPlugin.getPreferenceBoolean("Outline.FilterPorts");
        enableSort = VerilogPlugin.getPreferenceBoolean("Outline.Sort");
    }

    public void createControl(Composite parent) {
        super.createControl(parent);

        TreeViewer viewer = getTreeViewer();
        viewer.setContentProvider(new HdlContentOutlineProvider());
        viewer.setLabelProvider(editor.getOutlineLabelProvider());
        viewer.addSelectionChangedListener(this);
        viewer.addDoubleClickListener(this);
        viewer.addFilter(new SignalFilter());
        viewer.addFilter(new PortFilter());
        if (enableSort) {
            viewer.setSorter(new Sorter());
        }
        createToolbar();
        createContextMenu(viewer.getTree());

        IDocument doc = editor.getDocument();
        if (doc != null) {
            viewer.setInput(doc);
        }

    }

    private void createToolbar() {
        IToolBarManager mgr = getSite().getActionBars().getToolBarManager();
        mgr.add(new EnableSortAction());
        mgr.add(new SignalFilterAction());
        mgr.add(new PortFilterAction());
        mgr.add(new CollapseAllAction());
    }

    /**
     * Creates a context menu for this view
     * @param control
     */
    private void createContextMenu(Control control) {
        MenuManager menuManager = new MenuManager();
        menuManager.setRemoveAllWhenShown(true);
        menuManager.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager menu) {
                menu.add(new CollapseAllAction());
            }
        });
        Menu menu = menuManager.createContextMenu(control);
        control.setMenu(menu);
    }

    public void selectionChanged(SelectionChangedEvent event) {
        super.selectionChanged(event);

        ISelection selection = event.getSelection();

        if (!selection.isEmpty()) {
            OutlineElement outlineElement = (OutlineElement) ((IStructuredSelection) selection).getFirstElement();

            editor.showElement(outlineElement);
        }
    }

    public void doubleClick(DoubleClickEvent event) {
        //VerilogPlugin.println("doubleclicked in ContentPage\n");
        ISelection selection = event.getSelection();
        //VerilogPlugin.println("selection "+selection.toString());

        if (selection instanceof IStructuredSelection) {
            IStructuredSelection elements = (IStructuredSelection) selection;
            if (elements.size() == 1) {
                Object element = elements.getFirstElement();
                //VerilogPlugin.println("element "+element.toString());
                if (element instanceof OutlineElement) {
                    OutlineElement outlineElement = (OutlineElement) element;

                    //VerilogPlugin.println("outlineElement "+outlineElement.toString());

                    //ITreeContentProvider prov = editor.getHirarchyProvider();
                    ITreeContentProvider prov = HdlEditor.current().getHirarchyProvider();

                    if (prov instanceof VhdlHierarchyProvider) {
                        String componenttype = outlineElement.getType();
                        ((VhdlHierarchyProvider) (prov)).scanOutline(
                                new VhdlDocument(editor.getHdlDocument().getProject(), outlineElement.getFile()));
                        //VerilogPlugin.println("VhdlHierarchyProvider!!! "+ componenttype);
                        if (componenttype.startsWith("componentInst#")) {
                            componenttype = componenttype.substring(14);
                            //VerilogPlugin.println("comptype: "+ componenttype);
                            ArchitectureElement el = ((VhdlHierarchyProvider) (prov)).getArchElement(componenttype);
                            if (el != null) {
                                //VerilogPlugin.println("showelement "+el);
                                editor.showElement(el);
                            }
                        }
                        if (componenttype.startsWith("entityInst#")) {
                            EntityInstElement entityInst = (EntityInstElement) outlineElement;

                            ArchitectureElement el = ((VhdlHierarchyProvider) (prov))
                                    .getArchElement(entityInst.GetEntityName());
                            if (el != null) {
                                editor.showElement(el);
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * Searches throught the tree item recursively and looks the specified element
     * @paaram element
     * @param item
     * @return
     */
    protected TreeItem findTreeItem(TreeItem item, OutlineElement element) {
        if (item.getData() instanceof OutlineElement) {
            OutlineElement e = (OutlineElement) item.getData();
            if (e.equals(element)) {
                return item;
            }
        }
        //look through the children
        for (TreeItem child : item.getItems()) {
            TreeItem temp = findTreeItem(child, element);
            if (temp != null) {
                return temp;
            }
        }

        return null;
    }

    /**
     * Searches for the given element and if found, makes it visible
     * @param element
     */
    public void showElement(OutlineElement element) {
        if (element == null)
            return;
        TreeViewer viewer = getTreeViewer();
        viewer.reveal(element);
        TreeItem[] treeItems = viewer.getTree().getItems();

        viewer.getControl().setRedraw(false);
        Object[] expandedElements = viewer.getExpandedElements();
        //force all the elements to be scanned in
        viewer.expandAll();
        viewer.setExpandedElements(expandedElements);
        viewer.getControl().setRedraw(true);

        for (TreeItem item : treeItems) {
            TreeItem target = findTreeItem(item, element);
            if (target != null) {
                viewer.getTree().setSelection(target);
                viewer.reveal(element);
                break;
            }
        }

    }

    public void setInput(Object input) {
        //update();
    }

    public void update() {
        TreeViewer viewer = getTreeViewer();

        if (viewer != null) {
            if (enableSort)
                viewer.setSorter(new Sorter());
            else
                viewer.setSorter(null);

            Control control = viewer.getControl();
            if (control != null && !control.isDisposed()) {
                Object expanded[] = viewer.getExpandedElements();
                control.setRedraw(false);
                viewer.setInput(editor.getDocument());
                if (expanded.length > 0) {
                    viewer.setExpandedElements(expanded);
                } else {
                    viewer.collapseAll();
                }
                control.setRedraw(true);
            }
        }
    }

    private class SignalFilter extends ViewerFilter {

        public boolean select(Viewer viewer, Object parentElement, Object element) {

            if (m_bFilterSignals) {
                if (element instanceof VhdlSignalElement) {
                    return false;
                }
                if (element instanceof VerilogSignalElement) {
                    return false;
                }
            }
            return true;
        }

    }

    private class PortFilter extends ViewerFilter {

        public boolean select(Viewer viewer, Object parentElement, Object element) {

            if (m_bPortSignals) {
                if (element instanceof VhdlPortElement) {
                    return false;
                }
                if (element instanceof VerilogPortElement) {
                    return false;
                }
            }
            return true;
        }

    }

    /**
     * Class used to sort the outline elements
     *
     */
    private class Sorter extends ViewerSorter {
        /**
         * Called to determine whether an object is sortable or not
         */
        public boolean isSorterProperty(Object element, String property) {
            return super.isSorterProperty(element, property);
        }

        public int compare(Viewer viewer, Object e1, Object e2) {
            return super.compare(viewer, e1, e2);
        }

        public int category(Object element) {
            //vhdl categories         
            if (element instanceof PackageDeclElement)
                return 10;
            if (element instanceof PackageBodyElement)
                return 15;
            if (element instanceof EntityDeclElement)
                return 20;
            if (element instanceof ComponentDeclElement)
                return 20;
            if (element instanceof EntityDeclElement)
                return 20;
            if (element instanceof ArchitectureElement)
                return 30;
            if (element instanceof GenericElement)
                return 40;
            if (element instanceof VhdlPortElement)
                return 45;
            if (element instanceof ConstantElement)
                return 50;
            if (element instanceof AliasElement)
                return 60;
            if (element instanceof VhdlSignalElement)
                return 70;
            if (element instanceof EntityInstElement)
                return 80;
            if (element instanceof ComponentInstElement)
                return 80;
            if (element instanceof VerilogFunctionElement)
                return 90;
            if (element instanceof ProcedureElement)
                return 90;
            if (element instanceof ProcessElement)
                return 100;

            //verilog elements can go here         
            if (element instanceof VerilogModuleElement)
                return 10;
            if (element instanceof VerilogFunctionElement)
                return 14;
            if (element instanceof VerilogTaskElement)
                return 15;
            if (element instanceof VerilogParameterElement)
                return 20;
            if (element instanceof VerilogPortElement)
                return 30;
            if (element instanceof VerilogRegElement)
                return 40;
            if (element instanceof VerilogWireElement)
                return 50;
            if (element instanceof VerilogSignalElement)
                return 60;
            if (element instanceof VerilogInstanceElement)
                return 70;
            //default sort
            return 100000;
        }
    }

    private class SignalFilterAction extends Action {
        public SignalFilterAction() {
            super();
            setText("Filter Signal");
            setChecked(m_bFilterSignals);
        }

        public void run() {
            m_bFilterSignals = !m_bFilterSignals;
            update();
        }

        public ImageDescriptor getImageDescriptor() {
            return VerilogPlugin.getPlugin().getImageDescriptor(FILTER_SIGNAL_ACTION_IMAGE);
        }

        public int getStyle() {
            return AS_CHECK_BOX;
        }

        public String getToolTipText() {
            return "Filter signals";
        }
    }

    private class PortFilterAction extends Action {
        public PortFilterAction() {
            super();
            setText("Filter Port");
            setChecked(m_bPortSignals);
        }

        public void run() {
            m_bPortSignals = !m_bPortSignals;
            update();
        }

        public ImageDescriptor getImageDescriptor() {
            return VerilogPlugin.getPlugin().getImageDescriptor(FILTER_PORT_ACTION_IMAGE);
        }

        public int getStyle() {
            return AS_CHECK_BOX;
        }

        public String getToolTipText() {
            return "Filter ports";
        }
    }

    private class EnableSortAction extends Action {
        public EnableSortAction() {
            super();
            setText("Sort");
            setChecked(enableSort);
        }

        public void run() {
            enableSort = !enableSort;
            update();
        }

        public ImageDescriptor getImageDescriptor() {
            return VerilogPlugin.getPlugin().getImageDescriptor(ENABLE_SORT_ACTION_IMAGE);
        }

        public int getStyle() {
            return AS_CHECK_BOX;
        }

        public String getToolTipText() {
            return "Sort";
        }
    }

    private class CollapseAllAction extends Action {
        private static final String COLLAPSE_ALL_ACTION_IMAGE = "$nl$/icons/collapse_all.gif";

        public CollapseAllAction() {
            super();
            setText("Collapse All");
        }

        public void run() {
            TreeViewer viewer = getTreeViewer();
            viewer.collapseAll();
        }

        public ImageDescriptor getImageDescriptor() {
            return VerilogPlugin.getPlugin().getImageDescriptor(COLLAPSE_ALL_ACTION_IMAGE);
        }

        public int getStyle() {
            return AS_PUSH_BUTTON;
        }

        public String getToolTipText() {
            return "Collapse all";
        }
    }
}