/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* 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:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.rcp.search;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
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.ViewerComparator;
import org.eclipse.jubula.client.core.events.DataEventDispatcher;
import org.eclipse.jubula.client.core.events.DataEventDispatcher.IProjectLoadedListener;
import org.eclipse.jubula.client.core.persistence.GeneralStorage;
import org.eclipse.jubula.client.ui.constants.ContextHelpIds;
import org.eclipse.jubula.client.ui.filter.JBPatternFilter;
import org.eclipse.jubula.client.ui.rcp.Plugin;
import org.eclipse.jubula.client.ui.rcp.filter.JBFilteredTree;
import org.eclipse.jubula.client.ui.rcp.i18n.Messages;
import org.eclipse.jubula.client.ui.rcp.provider.contentprovider.AbstractTreeViewContentProvider;
import org.eclipse.jubula.client.ui.rcp.search.result.BasicSearchResult;
import org.eclipse.jubula.client.ui.rcp.search.result.BasicSearchResult.SearchResultElement;
import org.eclipse.jubula.client.ui.utils.LayoutUtil;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.osgi.util.NLS;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.dialogs.FilteredTree;
/**
* @author BREDEX GmbH
* @created 07.12.2005
*/
public class SearchResultPage extends AbstractSearchResultPage
implements IProjectLoadedListener {
/** double click listener */
private DoubleClickListener m_doubleClickListener =
new DoubleClickListener();
/**
* <code>m_control</code>
*/
private Control m_control;
/** {@inheritDoc} */
public void createControl(Composite parent) {
Composite topLevelComposite = new Composite(parent, SWT.NONE);
setControl(topLevelComposite);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.verticalSpacing = 2;
layout.marginWidth = LayoutUtil.MARGIN_WIDTH;
layout.marginHeight = LayoutUtil.MARGIN_HEIGHT;
topLevelComposite.setLayout(layout);
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.grabExcessHorizontalSpace = true;
topLevelComposite.setLayoutData(layoutData);
final FilteredTree ft = new JBFilteredTree(topLevelComposite, SWT.MULTI
| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER,
new JBPatternFilter(), true);
setTreeViewer(ft.getViewer());
ColumnViewerToolTipSupport.enableFor(getTreeViewer());
getTreeViewer().addDoubleClickListener(m_doubleClickListener);
getTreeViewer().setContentProvider(
new SearchResultContentProvider());
getTreeViewer().setLabelProvider(
new DecoratingLabelProvider(new LabelProvider(), Plugin
.getDefault().getWorkbench().getDecoratorManager()
.getLabelDecorator()));
getTreeViewer().setComparator(new ViewerComparator());
getSite().setSelectionProvider(getTreeViewer());
DataEventDispatcher.getInstance().addProjectLoadedListener(this, true);
Plugin.getHelpSystem().setHelp(parent,
ContextHelpIds.JB_SEARCH_RESULT_VIEW);
// Create menu manager and menu
MenuManager menuMgr = new MenuManager();
Menu menu = menuMgr.createContextMenu(
getTreeViewer().getControl());
getTreeViewer().getControl().setMenu(menu);
// Register menu for extension.
getSite().registerContextMenu(getID(), menuMgr, getTreeViewer());
}
/**
* The label provider of the table.
*
* @author BREDEX GmbH
* @created 07.12.2005
*/
private static class LabelProvider extends ColumnLabelProvider {
/**
* {@inheritDoc}
*/
public String getText(Object element) {
if (element instanceof SearchResultElement) {
return ((SearchResultElement)element).getName();
}
return super.getText(element);
}
/**
* {@inheritDoc}
*/
public Image getImage(Object element) {
if (element instanceof SearchResultElement) {
SearchResultElement elem = (SearchResultElement)element;
return elem.getImage();
}
return super.getImage(element);
}
/**
* {@inheritDoc}
*/
public String getToolTipText(Object element) {
if (element instanceof SearchResultElement) {
SearchResultElement sr = (SearchResultElement)element;
String comment = sr.getComment();
if (comment != null) {
return comment;
}
}
return super.getToolTipText(element);
}
}
/** {@inheritDoc} */
public void setFocus() {
getTreeViewer().getControl().setFocus();
}
/**
* The content provider of the table.
*/
private static class SearchResultContentProvider extends
AbstractTreeViewContentProvider {
/** {@inheritDoc} */
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof BasicSearchResult) {
BasicSearchResult sr = (BasicSearchResult)parentElement;
return sr.getResultList().toArray();
}
return ArrayUtils.EMPTY_OBJECT_ARRAY;
}
}
/**
* DoubleClickListener for the TableViewer
*
* @author BREDEX GmbH
* @created 07.12.2005
*/
private static class DoubleClickListener implements IDoubleClickListener {
/** {@inheritDoc} */
public void doubleClick(DoubleClickEvent event) {
if (!(event.getSelection() instanceof IStructuredSelection)) {
return;
}
@SuppressWarnings("unchecked")
SearchResultElement<Long> element =
(SearchResultElement<Long>)((IStructuredSelection)event
.getSelection()).getFirstElement();
if (element != null) {
element.jumpToResult();
}
}
}
/** {@inheritDoc} */
public void dispose() {
getSite().setSelectionProvider(null);
getTreeViewer().removeDoubleClickListener(m_doubleClickListener);
DataEventDispatcher.getInstance().removeProjectLoadedListener(this);
super.dispose();
}
/** {@inheritDoc} */
public String getLabel() {
int resultSize = 0;
String queryLabel = StringConstants.EMPTY;
Object viewerInput = getTreeViewer().getInput();
if (viewerInput != null) {
BasicSearchResult sr = (BasicSearchResult) viewerInput;
resultSize = sr.getResultList().size();
ISearchQuery query = sr.getQuery();
if (query != null) {
queryLabel = query.getLabel();
}
}
return NLS.bind(Messages.SearchResultPageResultPageLabel,
resultSize, queryLabel);
}
/**
* @param control
* the control to set
*/
private void setControl(Control control) {
m_control = control;
}
/**
* @return the control
*/
public Control getControl() {
return m_control;
}
/**
* {@inheritDoc}
*/
public void handleProjectLoaded() {
if (GeneralStorage.getInstance().getProject() == null) {
Plugin.getDisplay().syncExec(new Runnable() {
public void run() {
getTreeViewer().setInput(null);
}
});
}
}
/**
* @param selection
* the selection to set
*/
public void setSelection(ISelection selection) {
getTreeViewer().setSelection(selection, true);
}
}