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