org.xkonnex.repo.dsl.servicedsl.service.ui.hierarchy.HierarchyInformationControl.java Source code

Java tutorial

Introduction

Here is the source code for org.xkonnex.repo.dsl.servicedsl.service.ui.hierarchy.HierarchyInformationControl.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Andr Arnold      - deliberately  copied from JDT and adapted to 
 *                     IEObjectDescriptions
 *******************************************************************************/
package org.xkonnex.repo.dsl.servicedsl.service.ui.hierarchy;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.keys.KeySequence;
import org.eclipse.ui.keys.SWTKeySupport;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.xkonnex.repo.dsl.basedsl.resource.IEObjectDescriptionBuilder;
import org.xkonnex.repo.dsl.basedsl.ui.hierarchy.EObjectDescriptionHierarchy;
import org.xkonnex.repo.dsl.basedsl.ui.hierarchy.IEObjectDescriptionHierarchyLifeCycle;
import org.xkonnex.repo.dsl.servicedsl.service.ui.hierarchy.SuperTypeHierarchyViewer.SuperTypeHierarchyContentProvider;
import org.xkonnex.repo.dsl.servicedsl.service.ui.hierarchy.TraditionalHierarchyViewer.TraditionalHierarchyContentProvider;
import org.xkonnex.repo.dsl.servicedsl.serviceDsl.Property;
import org.xkonnex.repo.dsl.servicedsl.ui.internal.Messages;
import org.xkonnex.repo.dsl.servicedsl.ui.internal.ServiceDslActivator;
import org.xkonnex.repo.dsl.servicedsl.ui.internal.ServiceDslCustomActivator;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.inject.Injector;

/**
 * Show hierarchy in light-weight control.
 *
 * @since 1.6
 */
public class HierarchyInformationControl
        extends org.xkonnex.repo.dsl.servicedsl.service.ui.hierarchy.AbstractInformationControl {

    private IWorkbench workbench;

    private IQualifiedNameProvider nameProvider;

    private IEObjectDescriptionBuilder ieDescBuilder;

    private IEObjectDescriptionHierarchyLifeCycle fLifeCycle;
    private HierarchyLabelProvider fLabelProvider;
    private KeyAdapter fKeyAdapter;

    private Object[] fOtherExpandedElements;
    private TypeHierarchyContentProvider fOtherContentProvider;

    private boolean fDoFilter;

    private Object locked;

    public HierarchyInformationControl(Shell parent, int shellStyle, int treeStyle, Injector injector) {
        super(parent, shellStyle, treeStyle,
                "org.xkonnex.repo.dsl.semanticsdsl.ServiceDsl.ui.hierarchy.QuickTypeHierarchy"/*IJavaEditorActionDefinitionIds.OPEN_HIERARCHY*/,
                true);
        fOtherExpandedElements = null;
        fDoFilter = true;
        this.injector = injector;
        workbench = injector.getInstance(IWorkbench.class);
        nameProvider = injector.getInstance(IQualifiedNameProvider.class);
        ieDescBuilder = injector.getInstance(IEObjectDescriptionBuilder.class);
        if (fLifeCycle != null)
            fLifeCycle.setInjector(injector);
    }

    private KeyAdapter getKeyAdapter() {
        if (fKeyAdapter == null) {
            fKeyAdapter = new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    int accelerator = SWTKeySupport.convertEventToUnmodifiedAccelerator(e);
                    KeySequence keySequence = KeySequence
                            .getInstance(SWTKeySupport.convertAcceleratorToKeyStroke(accelerator));
                    KeySequence[] sequences = getInvokingCommandKeySequences();
                    if (sequences == null)
                        return;

                    for (int i = 0; i < sequences.length; i++) {
                        if (sequences[i].equals(keySequence)) {
                            e.doit = false;
                            toggleHierarchy();
                            return;
                        }
                    }
                }
            };
        }
        return fKeyAdapter;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected boolean hasHeader() {
        return true;
    }

    @Override
    protected Text createFilterText(Composite parent) {
        // text set later
        Text text = super.createFilterText(parent);
        text.addKeyListener(getKeyAdapter());
        return text;
    }

    @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);

        TreeViewer treeViewer = new TreeViewer(tree);
        treeViewer.addFilter(new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                return element instanceof IEObjectDescription;
            }
        });

        fLifeCycle = new EObjectDescriptionHierarchyLifeCycle(false);

        treeViewer.setComparator(new HierarchyViewerSorter(fLifeCycle));
        treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
        injector = ServiceDslCustomActivator.getInstance()
                .getInjector(ServiceDslActivator.ORG_XKONNEX_REPO_DSL_SERVICEDSL_SERVICEDSL);
        fLabelProvider = injector.getInstance(HierarchyLabelProvider.class);

        treeViewer.setLabelProvider(fLabelProvider);

        treeViewer.getTree().addKeyListener(getKeyAdapter());

        return treeViewer;
    }

    private IEObjectDescription findMember(IEObjectDescription filteredMember,
            IEObjectDescription elementToFindIn) {
        EObject container = filteredMember.getEObjectOrProxy().eContainer();
        IEObjectDescription containerDesc = ieDescBuilder.buildDescription(container);
        if (containerDesc.equals(elementToFindIn)) {
            return filteredMember;
        }

        EObjectDescriptionHierarchy hierarchy = fLifeCycle.getHierarchy();
        return null;
    }

    /**
     * {@inheritDoc}
     * 
     * 
     */
    @Override
    public void setInput(Object information) {
        if (!(information instanceof EObject)) {
            inputChanged(null, null);
            return;
        }
        EObject input = (EObject) information;
        IEObjectDescription inputDesc = ieDescBuilder.buildDescription(input);

        super.setTitleText(getHeaderLabel(inputDesc));
        try {
            fLifeCycle.ensureRefreshedTypeHierarchy(inputDesc, workbench.getActiveWorkbenchWindow());
        } catch (Exception e) {
            dispose();
            return;
        }
        Predicate<IEObjectDescription> memberFilter = Predicates.alwaysTrue();

        TraditionalHierarchyContentProvider contentProvider = new TraditionalHierarchyContentProvider(fLifeCycle);
        contentProvider.setMemberFilter(memberFilter);
        getTreeViewer().setContentProvider(contentProvider);

        fOtherContentProvider = new SuperTypeHierarchyContentProvider(fLifeCycle);
        fOtherContentProvider.setMemberFilter(memberFilter);

        Object[] topLevelObjects = contentProvider.getElements(fLifeCycle);
        if (topLevelObjects.length > 0 && contentProvider.getChildren(topLevelObjects[0]).length > 40) {
            fDoFilter = false;
        } else {
            getTreeViewer().addFilter(new NamePatternFilter());
        }

        Object selection = null;
        if (input instanceof Property) {
            selection = input;
        } else if (topLevelObjects.length > 0) {
            selection = topLevelObjects[0];
        }
        inputChanged(fLifeCycle, selection);
    }

    @Override
    protected void stringMatcherUpdated() {
        if (fDoFilter) {
            super.stringMatcherUpdated(); // refresh the view
        } else {
            selectFirstMatch();
        }
    }

    protected void toggleHierarchy() {
        TreeViewer treeViewer = getTreeViewer();

        treeViewer.getTree().setRedraw(false);

        Object[] expandedElements = treeViewer.getExpandedElements();
        TypeHierarchyContentProvider contentProvider = (TypeHierarchyContentProvider) treeViewer
                .getContentProvider();
        treeViewer.setContentProvider(fOtherContentProvider);

        treeViewer.refresh();
        if (fOtherExpandedElements != null) {
            treeViewer.setExpandedElements(fOtherExpandedElements);
        } else {
            treeViewer.expandAll();
        }

        // reveal selection
        Object selectedElement = getSelectedElement();
        if (selectedElement != null)
            getTreeViewer().reveal(selectedElement);
        else
            selectFirstMatch();

        treeViewer.getTree().setRedraw(true);

        fOtherContentProvider = contentProvider;
        fOtherExpandedElements = expandedElements;

        updateStatusFieldText();
    }

    private String getHeaderLabel(IEObjectDescription input) {
        if (input != null) {
            String arg = input.getName().getLastSegment();
            return Messages.format(EObjectDescrHierarchyMessages.HierarchyInformationControl_hierarchy_label, arg);
        } else {
            return ""; //$NON-NLS-1$
        }
    }

    @Override
    protected String getStatusFieldText() {
        KeySequence[] sequences = getInvokingCommandKeySequences();
        String keyName = ""; //$NON-NLS-1$
        if (sequences != null && sequences.length > 0)
            keyName = sequences[0].format();

        if (fOtherContentProvider instanceof TraditionalHierarchyContentProvider) {
            return Messages.format(
                    EObjectDescrHierarchyMessages.HierarchyInformationControl_toggle_traditionalhierarchy_label,
                    keyName);
        } else {
            return Messages.format(
                    EObjectDescrHierarchyMessages.HierarchyInformationControl_toggle_superhierarchy_label, keyName);
        }
    }

    /*
     * @see org.eclipse.jdt.internal.ui.text.AbstractInformationControl#getId()
     */
    @Override
    protected String getId() {
        return "org.xkonnex.repo.dsl.semanticsdsl.service.ui.hierarchy.QuickTypeHierarchy"; //$NON-NLS-1$
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected Object getSelectedElement() {
        Object selectedElement = super.getSelectedElement();
        return selectedElement;
    }
}