blob: be13f81396e9c4eae899c19f55ace213d4d1bb34 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.search.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.edit.util.ExtensionManager;
import org.eclipse.epf.search.ui.internal.IMethodSearchInputExtension;
import org.eclipse.epf.search.ui.internal.IMethodSearchInputFactory;
import org.eclipse.epf.search.ui.internal.IMethodSearchScopeGroup;
import org.eclipse.epf.search.ui.internal.IMethodSearchScopeGroupFactory;
import org.eclipse.epf.search.ui.internal.MethodSearchInput;
import org.eclipse.epf.search.ui.internal.MethodSearchQuery;
import org.eclipse.epf.search.ui.internal.MethodSearchScope;
import org.eclipse.epf.search.ui.internal.MethodSearchScopeViewer;
import org.eclipse.epf.search.ui.preferences.SearchUIPreferences;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.search.ui.ISearchPage;
import org.eclipse.search.ui.ISearchPageContainer;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.osgi.framework.Bundle;
/**
* Displays the Method Search page in the Search dialog.
*
* @author Kelvin Low
* @author Phong Nguyen Le
* @since 1.0
*/
public class MethodSearchPage extends DialogPage implements ISearchPage {
public static final String SEARCH_PAGE_ID = MethodSearchPage.class
.getName();
private static List<IMethodSearchInputFactory> searchInputFactories;
private Combo searchStringCombo;
private Combo namePatternCombo;
private Button caseSensitiveCheckbox;
private MethodSearchScopeViewer searchScopeViewer;
private ISearchPageContainer container;
private List<IMethodSearchInputExtension> additionalSearchInputs = new ArrayList<IMethodSearchInputExtension>();
/**
* Creates a new instance.
*/
public MethodSearchPage() {
super();
}
/**
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
*/
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 5;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label searchStringLabel = new Label(composite, SWT.NONE);
searchStringLabel.setText(SearchUIResources.searchStringLabel_text);
new Label(composite, SWT.NONE);
searchStringCombo = new Combo(composite, SWT.NONE);
searchStringCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
String savedSearchString = SearchUIPreferences.getSearchString();
if (savedSearchString != null && savedSearchString.length() > 0) {
searchStringCombo.setText(savedSearchString);
}
caseSensitiveCheckbox = new Button(composite, SWT.CHECK);
caseSensitiveCheckbox.setText(SearchUIResources.caseSensitiveCheckbox_text);
caseSensitiveCheckbox.setSelection(SearchUIPreferences
.getCaseSensitive());
Label elementNameLabel = new Label(composite, SWT.NONE);
elementNameLabel.setText(SearchUIResources.elementNameLabel_text);
new Label(composite, SWT.NONE);
namePatternCombo = new Combo(composite, SWT.NONE);
namePatternCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
String savedNamePattern = SearchUIPreferences.getNamePattern();
if (savedNamePattern != null && savedNamePattern.length() > 0) {
namePatternCombo.setText(savedNamePattern);
}
// else {
// namePatternCombo.setText("*"); //$NON-NLS-1$
// }
namePatternCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
container.setPerformActionEnabled(getSearchButtonEnabled());
}
});
namePatternCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
container.setPerformActionEnabled(getSearchButtonEnabled());
}
});
new Label(composite, SWT.NONE);
collectContributedSearchInputs(composite);
searchScopeViewer = createSearchScopeGroup(composite).getSearchScopeViewer();
container.setPerformActionEnabled(getSearchButtonEnabled());
setControl(composite);
Dialog.applyDialogFont(composite);
}
private IMethodSearchScopeGroup createSearchScopeGroup(Composite parent) {
Object ext = ExtensionManager.getExtension(SearchUIPlugin.getDefault().getId(), "searchScopeGroupFactory"); //$NON-NLS-1$
if(ext instanceof IMethodSearchScopeGroupFactory) {
IMethodSearchScopeGroup group = ((IMethodSearchScopeGroupFactory) ext).createSearchScopeGroup(parent);
if(group != null) {
return group;
}
}
Group searchScopeGroup = new Group(parent, SWT.NONE);
searchScopeGroup.setLayout(new GridLayout(1, false));
GridData searchScopeGroupGridData = new GridData(GridData.FILL_BOTH);
searchScopeGroupGridData.heightHint = 200;
searchScopeGroup.setLayoutData(searchScopeGroupGridData);
searchScopeGroup.setText(SearchUIResources.scopeGroup_text);
final MethodSearchScopeViewer viewer = new MethodSearchScopeViewer(searchScopeGroup, SWT.BORDER);
return new IMethodSearchScopeGroup() {
public MethodSearchScopeViewer getSearchScopeViewer() {
return viewer;
}
};
}
private static List<IMethodSearchInputFactory> getSearchInputFactories() {
if (searchInputFactories == null) {
searchInputFactories = new ArrayList<IMethodSearchInputFactory>();
// Process the contributors.
//
IExtensionRegistry extensionRegistry = Platform
.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry
.getExtensionPoint(SearchUIPlugin.getDefault().getId(),
"searchInputFactories"); //$NON-NLS-1$
if (extensionPoint != null) {
IExtension[] extensions = extensionPoint.getExtensions();
Object ext = null;
for (int i = 0; i < extensions.length; i++) {
IExtension extension = extensions[i];
String pluginId = extension.getNamespaceIdentifier();
Bundle bundle = Platform.getBundle(pluginId);
IConfigurationElement[] configElements = extension
.getConfigurationElements();
for (int j = 0; j < configElements.length; j++) {
IConfigurationElement configElement = configElements[j];
try {
String className = configElement
.getAttribute("class"); //$NON-NLS-1$
if (className != null) {
ext = bundle.loadClass(className).newInstance();
if (ext instanceof IMethodSearchInputFactory) {
searchInputFactories
.add((IMethodSearchInputFactory) ext);
}
}
} catch (Exception e) {
SearchUIPlugin.getDefault().getLogger().logError(e);
}
}
}
}
}
return searchInputFactories;
}
private void collectContributedSearchInputs(Composite parent) {
for (IMethodSearchInputFactory factory : getSearchInputFactories()) {
try {
IMethodSearchInputExtension searchInput = factory.createSearchInput(parent);
if(searchInput != null) {
additionalSearchInputs .add(searchInput);
}
}
catch(Exception e) {
SearchUIPlugin.getDefault().getLogger().logError(e);
}
}
}
/**
* @see org.eclipse.search.ui.ISearchPage#performAction()
*/
public boolean performAction() {
MethodLibrary library = LibraryService.getInstance().getCurrentMethodLibrary();
if (library == null) {
SearchUIPlugin.getDefault().getMsgDialog().displayError(
SearchUIResources.searchError_title,
SearchUIResources.searchError_msg,
SearchUIResources.searchError_reason);
return false;
}
String searchString = searchStringCombo.getText().trim();
String namePattern = namePatternCombo.getText().trim();
if(StrUtil.isBlank(namePattern)) {
namePattern = "*"; //$NON-NLS-1$
}
MethodSearchScope searchScope = searchScopeViewer.getSearchScope();
MethodSearchInput searchInput = new MethodSearchInput(searchString,
namePattern, caseSensitiveCheckbox.getSelection(), false,
false, searchScope);
if(!additionalSearchInputs.isEmpty()) {
for (IMethodSearchInputExtension input : additionalSearchInputs) {
searchInput.getAdditionalInput().putAll(input.getInput());
}
}
MethodSearchQuery searchQuery = new MethodSearchQuery(searchInput);
NewSearchUI.activateSearchResultView();
NewSearchUI.runQueryInBackground(searchQuery);
SearchUIPreferences.setSearchString(searchStringCombo.getText());
SearchUIPreferences.setNamePattern(namePatternCombo.getText());
SearchUIPreferences.setCaseSensitive(caseSensitiveCheckbox
.getSelection());
return true;
}
/**
* @see org.eclipse.search.ui.ISearchPage#setContainer(ISearchPageContainer)
*/
public void setContainer(ISearchPageContainer container) {
this.container = container;
}
/**
* @see org.eclipse.search.ui.IReplacePage#performReplace()
*/
public boolean performReplace() {
return true;
}
/**
* @see org.eclipse.jface.dialogs.DialogPage#dispose()
*/
public void dispose() {
super.dispose();
}
/**
* Gets the enabled status of the Search button.
*
* @return <code>true<code> if the Search button should be enabled
*/
private boolean getSearchButtonEnabled() {
return true;
}
}