/******************************************************************************* * 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.errorlibrary.ui.views; import org.apache.commons.lang.StringUtils; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.errorlibrary.providers.ErrorLibraryProviderFactory; import org.ebayopensource.turmeric.eclipse.errorlibrary.providers.IErrorRegistryViewProvider; import org.ebayopensource.turmeric.eclipse.errorlibrary.ui.resources.SOAMessages; import org.ebayopensource.turmeric.eclipse.errorlibrary.utils.ErrLibComparator; import org.ebayopensource.turmeric.eclipse.errorlibrary.views.ISOAErrDomain; import org.ebayopensource.turmeric.eclipse.errorlibrary.views.ISOAErrLibrary; import org.ebayopensource.turmeric.eclipse.errorlibrary.views.ISOAError; import org.ebayopensource.turmeric.eclipse.errorlibrary.views.SOAErrContentFactory; import org.ebayopensource.turmeric.eclipse.ui.SOAPerspectiveFactory; import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; 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.dnd.DND; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; 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.Menu; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IViewPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.part.ViewPart; /** * The Class ErrorRegistryView. * * @author smathew */ public class ErrorRegistryView extends ViewPart { private static final SOALogger logger = SOALogger.getLogger(); private TreeViewer errorLibraryViewer; private Text searchError; /** * {@inheritDoc} */ @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); createToolbar(); createContextMenu(); } catch (Exception e) { logger.error(e); throw new RuntimeException(e); } } 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.UI_FILTER_ERROR); label.setLayoutData(new GridData()); searchError = toolkit.createText(composite, "", SWT.LEFT | SWT.BORDER); final GridData data = new GridData(); data.widthHint = 200; searchError.setLayoutData(data); searchError.addModifyListener(new RegModifyListener()); searchError.setToolTipText(SOAMessages.SEARCH_TIP); } private void createClientArea(Composite parent, FormToolkit toolkit) throws Exception { // TypeLibrary viewer final Group errorLibGroup = new Group(parent, SWT.SHADOW_ETCHED_OUT); errorLibGroup.setBackground(toolkit.getColors().getBackground()); errorLibGroup.setText(SOAMessages.ERROR_LIBRARIES); errorLibGroup.setToolTipText(SOAMessages.ERROR_LIBRARIES); errorLibGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); final FillLayout layout = new FillLayout(SWT.VERTICAL); layout.marginHeight = 5; errorLibGroup.setLayout(layout); final Tree typeLibTree = toolkit.createTree(errorLibGroup, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE); // typeLibTree.setLayoutData(new GridData(GridData.FILL_VERTICAL)); errorLibraryViewer = new TreeViewer(typeLibTree); errorLibraryViewer .setContentProvider(new ErrorLibViewContentProvider()); errorLibraryViewer.setLabelProvider(new ErrorLibViewLabelProvider()); errorLibraryViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IViewPart view = UIUtil.getActivePage().findView(SOAPerspectiveFactory.VIEWID_PROPERTY); if (view == null) { //if the Properties view is not opened yet, then open it automatically try { UIUtil.getActivePage().showView(SOAPerspectiveFactory.VIEWID_PROPERTY); } catch (PartInitException e) { logger.error(e); } } } }); errorLibraryViewer.addFilter(new ViewerFilter(){ @Override public boolean select(Viewer viewer, Object parentElement, Object element) { boolean result = false; if (searchError != null && StringUtils.isNotBlank(searchError.getText())) { if (element instanceof ISOAError) { return isMatch(((ISOAError)element).getName(), searchError.getText()); } else if (element instanceof ISOAErrDomain) { if (!isMatch(((ISOAErrDomain)element).getName() , searchError.getText())) { for (ISOAError err : ((ISOAErrDomain)element).getErrors()) { if (StringUtils.contains(err.getName(), searchError.getText())) { return true; } } } else { return true; } } else if (element instanceof ISOAErrLibrary) { result = isMatch(((ISOAErrLibrary)element).getName() , searchError.getText()); if (result != true) { for (ISOAErrDomain domain : ((ISOAErrLibrary)element).getDomains()) { if (!isMatch(domain.getName() , searchError.getText())) { for (ISOAError err : domain.getErrors()) { if (isMatch(err.getName(), searchError.getText())) { return true; } } } else { return true; } } } } return result; } return true; } }); errorLibraryViewer.setInput(SOAErrContentFactory.getProvider()); errorLibraryViewer.getControl().setToolTipText(SOAMessages.TREE_TIP); { int ops = DND.DROP_COPY | DND.DROP_MOVE; Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() }; errorLibraryViewer.addDragSupport(ops, transfers, new ErrorViewerDragListener(errorLibraryViewer)); } getSite().setSelectionProvider(errorLibraryViewer); } private boolean isMatch(String str, String searchStr) { if (str == null || searchStr == null) { return false; } return StringUtils.contains(str.toUpperCase(), searchStr.toUpperCase()); } /** * {@inheritDoc} */ @Override public void setFocus() { } /** * {@inheritDoc} */ @Override public void dispose() { super.dispose(); } private void createContextMenu() throws Exception { ErrorLibraryProviderFactory factory = ErrorLibraryProviderFactory.getInstance(); IErrorRegistryViewProvider vProvider = factory.getPreferredProvider().getErrorRegistryViewProvider(); if (vProvider != null) { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); vProvider.createContextMenu(menuMgr, this.errorLibraryViewer); Menu menu = menuMgr.createContextMenu(this.errorLibraryViewer.getTree()); this.errorLibraryViewer.getTree().setMenu(menu); getSite().registerContextMenu(menuMgr, this.errorLibraryViewer); } } /** * Create toolbar. */ private void createToolbar() throws Exception { IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); RefreshErrRegistry refreshAction = new RefreshErrRegistry( errorLibraryViewer); mgr.add(refreshAction); final ErrLibComparator errLibComparator = new ErrLibComparator(); final ViewerComparator comparator = new ViewerComparator( errLibComparator) { @Override public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof ISOAError && e2 instanceof ISOAError) { return errLibComparator.compare((ISOAError) e1, (ISOAError) e2); } return String.CASE_INSENSITIVE_ORDER.compare(e1.toString(), e2 .toString()); } }; mgr.add(new SortRegistry(errorLibraryViewer, comparator)); ErrorLibraryProviderFactory factory = ErrorLibraryProviderFactory.getInstance(); IErrorRegistryViewProvider vProvider = factory.getPreferredProvider().getErrorRegistryViewProvider(); if (vProvider != null) { vProvider.createToolBar(mgr, this.errorLibraryViewer); } } /** * The listener interface for receiving regModify events. * The class that is interested in processing a regModify * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addRegModifyListener</code> method. When * the regModify event occurs, that object's appropriate * method is invoked. * * @see RegModifyEvent */ class RegModifyListener implements ModifyListener { /** * {@inheritDoc} */ @Override public void modifyText(ModifyEvent e) { if (e.getSource() instanceof Text) { if (errorLibraryViewer != null) { errorLibraryViewer.refresh(true); } } } } }