Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2011 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 API and implementation *******************************************************************************/ package com.siteview.mde.internal.ui.search; import java.util.*; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import com.siteview.mde.internal.core.search.*; import com.siteview.mde.internal.ui.IHelpContextIds; import com.siteview.mde.internal.ui.MDEUIMessages; import org.eclipse.search.ui.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.*; public class PluginSearchPage extends DialogPage implements ISearchPage { class QueryData { public String text; public boolean isCaseSensitive; public int searchElement; public int limit; public int externalScope; public int workspaceScope; public IWorkingSet[] workingSets; public boolean equals(Object obj) { if (obj instanceof QueryData) { if (((QueryData) obj).text.equals(text)) return true; } return false; } } private static ArrayList previousQueries = new ArrayList(); private Button caseSensitive; private ISearchPageContainer container; private Button[] externalScopeButtons = new Button[3]; private boolean firstTime = true; private Button[] limitToButtons = new Button[3]; private Combo patternCombo; private Button[] searchForButtons = new Button[3]; public void createControl(Composite parent) { Composite result = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, true); layout.marginHeight = 0; layout.marginWidth = 0; result.setLayout(layout); result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); createPatternSection(result); createSettingsSection(result); hookListeners(); setControl(result); Dialog.applyDialogFont(result); PlatformUI.getWorkbench().getHelpSystem().setHelp(result, IHelpContextIds.SEARCH_PAGE); } private void createGroup(Composite parent, Button[] buttons, String groupLabel, String[] buttonLabels, int defaultEnabled) { Group group = new Group(parent, SWT.NONE); group.setLayout(new GridLayout(1, true)); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); group.setText(groupLabel); for (int i = 0; i < buttonLabels.length; i++) { buttons[i] = new Button(group, SWT.RADIO); buttons[i].setText(buttonLabels[i]); buttons[i].setSelection(i == defaultEnabled); } } private void createPatternSection(Composite parent) { Composite result = new Composite(parent, SWT.NONE); result.setLayout(new GridLayout(2, false)); result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label label = new Label(result, SWT.NONE); GridData data = new GridData(); data.horizontalSpan = 2; label.setLayoutData(data); label.setText(MDEUIMessages.SearchPage_searchString); patternCombo = new Combo(result, SWT.SINGLE | SWT.BORDER); patternCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); caseSensitive = new Button(result, SWT.CHECK); caseSensitive.setText(MDEUIMessages.SearchPage_caseSensitive); } private void createSettingsSection(Composite parent) { Composite result = new Composite(parent, SWT.NONE); result.setLayout(new GridLayout(3, true)); result.setLayoutData(new GridData(GridData.FILL_BOTH)); createGroup(result, searchForButtons, MDEUIMessages.SearchPage_searchFor, new String[] { MDEUIMessages.SearchPage_plugin, MDEUIMessages.SearchPage_fragment, MDEUIMessages.SearchPage_extPt }, 2); createGroup(result, limitToButtons, MDEUIMessages.SearchPage_limitTo, new String[] { MDEUIMessages.SearchPage_declarations, MDEUIMessages.SearchPage_references, MDEUIMessages.SearchPage_allOccurrences }, 1); createGroup(result, externalScopeButtons, MDEUIMessages.SearchPage_externalScope, new String[] { MDEUIMessages.SearchPage_all, MDEUIMessages.SearchPage_enabledOnly, MDEUIMessages.SearchPage_none }, 1); } private int getExternalScope() { if (externalScopeButtons[0].getSelection()) return PluginSearchScope.EXTERNAL_SCOPE_ALL; if (externalScopeButtons[1].getSelection()) return PluginSearchScope.EXTERNAL_SCOPE_ENABLED; return PluginSearchScope.EXTERNAL_SCOPE_NONE; } private PluginSearchInput getInput() { PluginSearchInput input = new PluginSearchInput(); int searchFor = getSearchFor(); input.setSearchElement(searchFor); input.setSearchLimit(getLimitTo()); PluginSearchScope scope = null; String searchString = patternCombo.getText().trim(); if (searchFor == PluginSearchInput.ELEMENT_EXTENSION_POINT) { if (searchString.indexOf('.') == -1) { searchString = "*." + searchString; //$NON-NLS-1$ } // if not using wildcards, use optimized search scope if (searchString.indexOf('*') == -1) { scope = new ExtensionPluginSearchScope(getWorkspaceScope(), getExternalScope(), getSelectedResources(), input); } } if (scope == null) scope = new PluginSearchScope(getWorkspaceScope(), getExternalScope(), getSelectedResources()); input.setSearchScope(scope); input.setSearchString(searchString); input.setCaseSensitive(caseSensitive.getSelection()); return input; } private int getLimitTo() { if (limitToButtons[0].getSelection()) return PluginSearchInput.LIMIT_DECLARATIONS; if (limitToButtons[1].getSelection()) return PluginSearchInput.LIMIT_REFERENCES; return PluginSearchInput.LIMIT_ALL; } private int getSearchFor() { if (searchForButtons[0].getSelection()) return PluginSearchInput.ELEMENT_PLUGIN; if (searchForButtons[1].getSelection()) return PluginSearchInput.ELEMENT_FRAGMENT; return PluginSearchInput.ELEMENT_EXTENSION_POINT; } private HashSet getSelectedResources() { HashSet result = new HashSet(); int scope = container.getSelectedScope(); if (scope == ISearchPageContainer.WORKSPACE_SCOPE) return null; if (scope == ISearchPageContainer.SELECTION_SCOPE || scope == ISearchPageContainer.SELECTED_PROJECTS_SCOPE) { if (container.getSelection() instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection) container.getSelection(); Iterator iter = selection.iterator(); while (iter.hasNext()) { Object item = iter.next(); if (item instanceof IResource) result.add(((IResource) item).getProject()); } } else if (container.getActiveEditorInput() != null) { result.add(container.getActiveEditorInput().getAdapter(IFile.class)); } } else if (scope == ISearchPageContainer.WORKING_SET_SCOPE) { IWorkingSet[] workingSets = container.getSelectedWorkingSets(); if (workingSets != null) { for (int i = 0; i < workingSets.length; i++) { IAdaptable[] elements = workingSets[i].getElements(); for (int j = 0; j < elements.length; j++) { IResource resource = (IResource) elements[j].getAdapter(IResource.class); if (resource != null) result.add(resource.getProject()); } } } } return result; } private int getWorkspaceScope() { switch (container.getSelectedScope()) { case ISearchPageContainer.SELECTION_SCOPE: return PluginSearchScope.SCOPE_SELECTION; case ISearchPageContainer.WORKING_SET_SCOPE: return PluginSearchScope.SCOPE_WORKING_SETS; default: return PluginSearchScope.SCOPE_WORKSPACE; } } private void hookListeners() { searchForButtons[1].addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { boolean selected = searchForButtons[1].getSelection(); if (selected) { limitToButtons[0].setSelection(true); limitToButtons[1].setSelection(false); limitToButtons[2].setSelection(false); } limitToButtons[1].setEnabled(!selected); limitToButtons[2].setEnabled(!selected); } }); patternCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int index = previousQueries.size() - patternCombo.getSelectionIndex() - 1; if (previousQueries.size() > index) { QueryData data = (QueryData) previousQueries.get(index); resetPage(data); } container.setPerformActionEnabled(patternCombo.getText().length() > 0); } }); patternCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { container.setPerformActionEnabled(patternCombo.getText().trim().length() > 0); } }); } public boolean performAction() { saveQueryData(); NewSearchUI.activateSearchResultView(); NewSearchUI.runQueryInBackground(new PluginSearchQuery(getInput())); return true; } private void resetPage(QueryData data) { caseSensitive.setSelection(data.isCaseSensitive); searchForButtons[0].setSelection(data.searchElement == PluginSearchInput.ELEMENT_PLUGIN); searchForButtons[1].setSelection(data.searchElement == PluginSearchInput.ELEMENT_FRAGMENT); searchForButtons[2].setSelection(data.searchElement == PluginSearchInput.ELEMENT_EXTENSION_POINT); limitToButtons[0].setSelection(data.limit == PluginSearchInput.LIMIT_DECLARATIONS); limitToButtons[1].setSelection(data.limit == PluginSearchInput.LIMIT_REFERENCES); limitToButtons[1].setEnabled(!searchForButtons[1].getSelection()); limitToButtons[2].setSelection(data.limit == PluginSearchInput.LIMIT_ALL); limitToButtons[2].setEnabled(!searchForButtons[1].getSelection()); externalScopeButtons[0].setSelection(data.externalScope == PluginSearchScope.EXTERNAL_SCOPE_ALL); externalScopeButtons[1].setSelection(data.externalScope == PluginSearchScope.EXTERNAL_SCOPE_ENABLED); externalScopeButtons[2].setSelection(data.externalScope == PluginSearchScope.EXTERNAL_SCOPE_NONE); container.setSelectedScope(data.workspaceScope); if (data.workingSets != null) container.setSelectedWorkingSets(data.workingSets); } private void saveQueryData() { QueryData data = new QueryData(); data.text = patternCombo.getText(); data.isCaseSensitive = caseSensitive.getSelection(); data.searchElement = getSearchFor(); data.limit = getLimitTo(); data.externalScope = getExternalScope(); data.workspaceScope = container.getSelectedScope(); data.workingSets = container.getSelectedWorkingSets(); if (previousQueries.contains(data)) previousQueries.remove(data); previousQueries.add(data); if (previousQueries.size() > 10) previousQueries.remove(0); } public void setContainer(ISearchPageContainer container) { this.container = container; } public void setVisible(boolean visible) { if (visible && patternCombo != null) { if (firstTime) { firstTime = false; String[] patterns = new String[previousQueries.size()]; for (int i = previousQueries.size() - 1, j = 0; i >= 0; i--, j++) { patterns[j] = ((QueryData) previousQueries.get(i)).text; } patternCombo.setItems(patterns); initSelections(); container.setPerformActionEnabled(patternCombo.getText().length() > 0); } patternCombo.setFocus(); } IEditorInput editorInput = container.getActiveEditorInput(); container.setActiveEditorCanProvideScopeSelection( editorInput != null && editorInput.getAdapter(IFile.class) != null); super.setVisible(visible); } private void initSelections() { ISelection selection = container.getSelection(); if (selection instanceof TextSelection) { patternCombo.setText(((TextSelection) selection).getText()); } } }