org.ebayopensource.turmeric.eclipse.ui.views.registry.RegistryView.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.ui.views.registry.RegistryView.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *******************************************************************************/
package org.ebayopensource.turmeric.eclipse.ui.views.registry;

import org.ebayopensource.turmeric.common.config.LibraryType;
import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.SOAGlobalRegistryAdapter;
import org.ebayopensource.turmeric.eclipse.ui.resources.SOAMessages;
import org.ebayopensource.turmeric.tools.library.SOATypeRegistry;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.ViewPart;

/**
 * The Types Explorer view. The main class that represents the types
 * available for consumption in one place. Other actions like refresh, import
 * are also provided in this view. It also has the quick search functionality.
 * Technically this is just another view part. The default data source is either
 * the maven repository or the clearcase view based on the user selection. The
 * main functionality are all hosted in this viewer and that way this is the
 * heart of the type library system.
 * 
 * @author smathew
 * 
 */
public class RegistryView extends ViewPart {

    /** The Constant VIEW_ID. */
    public static final String VIEW_ID = "org.ebayopensource.turmeric.eclipse.typelibrary.registryView";
    private static final SOALogger logger = SOALogger.getLogger();
    private TreeViewer typeLibraryViewer;
    private TypeViewer typeViewer;
    private Text typeNameText;
    private TypeLibrarySelectionChangedListener typeLibrarySelectionChangedListener;
    private TypeSelectionListener typeSelectionListener;

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        final FormToolkit toolkit = new FormToolkit(parent.getDisplay());
        final Composite composite = toolkit.createComposite(parent);
        composite.setLayout(new GridLayout(1, true));

        createSearchArea(composite, toolkit);

        try {
            createClientArea(composite, toolkit);
        } catch (Exception e) {
            logger.error(e);
            throw new RuntimeException(e);
        }
        createToolbar();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        if (typeLibraryViewer != null && typeLibrarySelectionChangedListener != null) {
            typeLibraryViewer.removeSelectionChangedListener(typeLibrarySelectionChangedListener);
        }
        if (typeViewer != null && typeSelectionListener != null) {
            typeViewer.removeSelectionChangedListener(typeSelectionListener);
        }
        super.dispose();
    }

    private void createSearchArea(final Composite parent, FormToolkit toolkit) {
        final Composite composite = toolkit.createComposite(parent);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        composite.setLayout(new GridLayout(2, false));

        final Label label = toolkit.createLabel(composite, SOAMessages.SEARCH);
        label.setLayoutData(new GridData());

        typeNameText = toolkit.createText(composite, "", SWT.LEFT | SWT.BORDER);
        final GridData data = new GridData();
        data.widthHint = 200;
        typeNameText.setLayoutData(data);
        typeNameText.addModifyListener(new RegModifyListener());
        typeNameText.setToolTipText(SOAMessages.SEARCH_TIP);
    }

    private void createClientArea(Composite parent, FormToolkit toolkit) throws Exception {
        SOATypeRegistry typeRegistry = null;
        try {
            typeRegistry = SOAGlobalRegistryAdapter.getInstance().getGlobalRegistry();
        } catch (Exception e) {
            logger.warning(e);
        }

        final SashForm sashComposite = new SashForm(parent, SWT.NONE);
        sashComposite.setOrientation(SWT.HORIZONTAL);
        sashComposite.SASH_WIDTH = 5;
        sashComposite.setBackground(toolkit.getColors().getBackground());
        sashComposite.setLayoutData(new GridData(GridData.FILL_BOTH));

        // TypeLibrary viewer
        final Group typeLibGroup = new Group(sashComposite, SWT.SHADOW_ETCHED_OUT);
        typeLibGroup.setBackground(toolkit.getColors().getBackground());
        typeLibGroup.setText(SOAMessages.TYPE_LIB);
        typeLibGroup.setToolTipText(SOAMessages.TYPE_LIB_WKS);
        typeLibGroup.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        final FillLayout layout = new FillLayout(SWT.VERTICAL);
        layout.marginHeight = 5;
        typeLibGroup.setLayout(layout);
        final Tree typeLibTree = toolkit.createTree(typeLibGroup, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE);
        // typeLibTree.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        typeLibraryViewer = new TreeViewer(typeLibTree);
        typeLibraryViewer.setContentProvider(new TypeLibraryContentProvider());
        typeLibraryViewer.setLabelProvider(new TypeLibraryLabelProvider());
        typeLibraryViewer.setInput(typeRegistry);
        typeLibraryViewer.getControl().setToolTipText(SOAMessages.TREE_TIP);
        // Type Viewer
        final Group typeGroup = new Group(sashComposite, SWT.SHADOW_ETCHED_OUT);
        typeGroup.setBackground(toolkit.getColors().getBackground());
        typeGroup.setText(SOAMessages.TYPES);
        typeGroup.setToolTipText(SOAMessages.TYPES_WKS);
        typeGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
        typeGroup.setLayout(layout);
        final Table typeTable = toolkit.createTable(typeGroup,
                SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
        // typeTable.setLayoutData(new GridData(GridData.FILL_BOTH));
        // RefreshRegistryAction refreshAction = new RefreshRegistryAction(
        // typeLibraryViewer);
        typeViewer = new TypeViewer(typeTable);
        typeViewer.setInput(typeRegistry);

        typeLibrarySelectionChangedListener = new TypeLibrarySelectionChangedListener(typeViewer);
        typeLibraryViewer.addSelectionChangedListener(typeLibrarySelectionChangedListener);

        typeSelectionListener = new TypeSelectionListener(typeLibraryViewer);
        typeViewer.addSelectionChangedListener(typeSelectionListener);

        int weightsParent[] = { 30, 70 };
        sashComposite.setWeights(weightsParent);
        toolkit.adapt(sashComposite);
        toolkit.paintBordersFor(sashComposite);
    }

    /**
     * This is a smart implementation quick search. Basically we remove and add
     * the filters based on the search text entered by the user rather than the
     * usual text.equals(text) and remove the ones not satisfying. The heavy
     * lifting is done by the eclipse framework.
     * 
     * @author smathew
     * 
     */
    class RegModifyListener implements ModifyListener {

        /**
         * {@inheritDoc}
         */
        @Override
        public void modifyText(ModifyEvent e) {
            if (e.getSource() instanceof Text) {
                String entered = ((Text) e.getSource()).getText();
                if (typeViewer != null) {
                    for (ViewerFilter filter : typeViewer.getFilters()) {
                        if (filter instanceof TypeFilterHonSearch) {
                            // there is one already. remove it first
                            typeViewer.removeFilter(filter);
                        }
                    }
                    typeViewer.addFilter(new TypeFilterHonSearch(entered));
                }
            }
        }
    }

    /**
     * Creates the toolbar.
     */
    private void createToolbar() {
        // IToolBarManager mgr =
        // getViewSite().getActionBars().getToolBarManager();
        // RefreshRegistryAction refreshAction = new RefreshRegistryAction(
        // typeLibraryViewer);
        // refreshAction.setTypeViewer(typeViewer);
        // mgr.add(refreshAction);
        // mgr.add(new SortRegistryAction(typeViewer, getLibraryComparator()));
    }

    /**
     * Gets the library comparator.
     *
     * @return the library comparator
     */
    public ViewerComparator getLibraryComparator() {
        final ViewerComparator comparator = new ViewerComparator() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof LibraryType && e2 instanceof LibraryType) {
                    return ((LibraryType) e1).getName().compareTo(((LibraryType) e2).getName());
                }
                return String.CASE_INSENSITIVE_ORDER.compare(e1.toString(), e2.toString());
            }

        };
        return comparator;
    }

    /**
     * Gets the type library viewer.
     *
     * @return the type library viewer
     */
    public TreeViewer getTypeLibraryViewer() {
        return typeLibraryViewer;
    }

    /**
     * Gets the type viewer.
     *
     * @return the type viewer
     */
    public TypeViewer getTypeViewer() {
        return typeViewer;
    }
}