/******************************************************************************* * 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; } }