com.google.dart.tools.search.internal.ui.text.TextSearchPage.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.tools.search.internal.ui.text.TextSearchPage.java

Source

/*
 * Copyright (c) 2012, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.dart.tools.search.internal.ui.text;

import com.google.dart.tools.search.internal.core.text.PatternConstructor;
import com.google.dart.tools.search.internal.ui.ISearchHelpContextIds;
import com.google.dart.tools.search.internal.ui.SearchMessages;
import com.google.dart.tools.search.internal.ui.SearchPlugin;
import com.google.dart.tools.search.internal.ui.util.FileTypeEditor;
import com.google.dart.tools.search.internal.ui.util.SWTUtil;
import com.google.dart.tools.search.ui.ISearchPage;
import com.google.dart.tools.search.ui.ISearchPageContainer;
import com.google.dart.tools.search.ui.ISearchQuery;
import com.google.dart.tools.search.ui.NewSearchUI;
import com.google.dart.tools.search.ui.text.FileTextSearchScope;
import com.google.dart.tools.search.ui.text.TextSearchQueryProvider;
import com.google.dart.tools.search.ui.text.TextSearchQueryProvider.TextSearchInput;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.fieldassist.ComboContentAdapter;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
import org.eclipse.jface.text.FindReplaceDocumentAdapterContentProposalProvider;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.PatternSyntaxException;

// TODO (pquitslund): Implement IReplacePage when we have refactoring support
public class TextSearchPage extends DialogPage implements ISearchPage /* ,IReplacePage */ {

    private static class SearchPatternData {
        public static SearchPatternData create(IDialogSettings settings) {
            String textPattern = settings.get("textPattern"); //$NON-NLS-1$
            String[] wsIds = settings.getArray("workingSets"); //$NON-NLS-1$
            IWorkingSet[] workingSets = null;
            if (wsIds != null && wsIds.length > 0) {
                IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
                workingSets = new IWorkingSet[wsIds.length];
                for (int i = 0; workingSets != null && i < wsIds.length; i++) {
                    workingSets[i] = workingSetManager.getWorkingSet(wsIds[i]);
                    if (workingSets[i] == null) {
                        workingSets = null;
                    }
                }
            }
            String[] fileNamePatterns = settings.getArray("fileNamePatterns"); //$NON-NLS-1$
            if (fileNamePatterns == null) {
                fileNamePatterns = new String[0];
            }
            try {
                int scope = settings.getInt("scope"); //$NON-NLS-1$
                boolean isRegExSearch = settings.getBoolean("isRegExSearch"); //$NON-NLS-1$
                boolean ignoreCase = settings.getBoolean("ignoreCase"); //$NON-NLS-1$

                return new SearchPatternData(textPattern, !ignoreCase, isRegExSearch, fileNamePatterns, scope,
                        workingSets);
            } catch (NumberFormatException e) {
                return null;
            }
        }

        public final boolean isCaseSensitive;
        public final boolean isRegExSearch;
        public final String textPattern;
        public final String[] fileNamePatterns;
        public final int scope;

        public final IWorkingSet[] workingSets;

        public SearchPatternData(String textPattern, boolean isCaseSensitive, boolean isRegExSearch,
                String[] fileNamePatterns, int scope, IWorkingSet[] workingSets) {
            Assert.isNotNull(fileNamePatterns);
            this.isCaseSensitive = isCaseSensitive;
            this.isRegExSearch = isRegExSearch;
            this.textPattern = textPattern;
            this.fileNamePatterns = fileNamePatterns;
            this.scope = scope;
            this.workingSets = workingSets; // can be null
        }

        public void store(IDialogSettings settings) {
            settings.put("ignoreCase", !isCaseSensitive); //$NON-NLS-1$
            settings.put("isRegExSearch", isRegExSearch); //$NON-NLS-1$
            settings.put("textPattern", textPattern); //$NON-NLS-1$
            settings.put("fileNamePatterns", fileNamePatterns); //$NON-NLS-1$
            settings.put("scope", scope); //$NON-NLS-1$
            if (workingSets != null) {
                String[] wsIds = new String[workingSets.length];
                for (int i = 0; i < workingSets.length; i++) {
                    wsIds[i] = workingSets[i].getLabel();
                }
                settings.put("workingSets", wsIds); //$NON-NLS-1$
            } else {
                settings.put("workingSets", new String[0]); //$NON-NLS-1$
            }

        }

    }

    private static class TextSearchPageInput extends TextSearchInput {

        private final String fSearchText;
        private final boolean fIsCaseSensitive;
        private final boolean fIsRegEx;
        private final FileTextSearchScope fScope;

        public TextSearchPageInput(String searchText, boolean isCaseSensitive, boolean isRegEx,
                FileTextSearchScope scope) {
            fSearchText = searchText;
            fIsCaseSensitive = isCaseSensitive;
            fIsRegEx = isRegEx;
            fScope = scope;
        }

        @Override
        public FileTextSearchScope getScope() {
            return fScope;
        }

        @Override
        public String getSearchText() {
            return fSearchText;
        }

        @Override
        public boolean isCaseSensitiveSearch() {
            return fIsCaseSensitive;
        }

        @Override
        public boolean isRegExSearch() {
            return fIsRegEx;
        }
    }

    private static final int HISTORY_SIZE = 12;
    public static final String EXTENSION_POINT_ID = "com.google.dart.tools.search.internal.ui.text.TextSearchPage"; //$NON-NLS-1$
    // Dialog store id constants
    private static final String PAGE_NAME = "TextSearchPage"; //$NON-NLS-1$
    private static final String STORE_CASE_SENSITIVE = "CASE_SENSITIVE"; //$NON-NLS-1$
    private static final String STORE_IS_REG_EX_SEARCH = "REG_EX_SEARCH"; //$NON-NLS-1$
    private static final String STORE_SEARCH_DERIVED = "SEARCH_DERIVED"; //$NON-NLS-1$

    private static final String STORE_HISTORY = "HISTORY"; //$NON-NLS-1$

    private static final String STORE_HISTORY_SIZE = "HISTORY_SIZE"; //$NON-NLS-1$

    /**
     * Section name for the stored file extensions.
     */
    private static final String STORE_EXTENSIONS = "EXTENSIONS"; //$NON-NLS-1$
    private List<SearchPatternData> fPreviousSearchPatterns = new ArrayList<SearchPatternData>(HISTORY_SIZE);
    private boolean fFirstTime = true;
    private boolean fIsCaseSensitive;

    private boolean fIsRegExSearch;
    private boolean fSearchDerived;
    private Combo fPattern;
    private Button fIsCaseSensitiveCheckbox;
    private Combo fExtensions;
    private Button fIsRegExCheckbox;

    private CLabel fStatusLabel;
    //  private Button fSearchDerivedCheckbox;

    private ISearchPageContainer fContainer;

    private FileTypeEditor fFileTypeEditor;

    private ContentAssistCommandAdapter fPatterFieldContentAssist;

    /**
     * The previous file extensions.
     */
    private String[] fPreviousExtensions;

    //---- Action Handling ------------------------------------------------

    @Override
    public void createControl(Composite parent) {
        initializeDialogUnits(parent);
        readConfiguration();

        Composite result = new Composite(parent, SWT.NONE);
        result.setFont(parent.getFont());
        GridLayout layout = new GridLayout(2, false);
        result.setLayout(layout);

        addTextPatternControls(result);

        Label separator = new Label(result, SWT.NONE);
        separator.setVisible(false);
        GridData data = new GridData(GridData.FILL, GridData.FILL, false, false, 2, 1);
        data.heightHint = convertHeightInCharsToPixels(1) / 3;
        separator.setLayoutData(data);

        addFileNameControls(result);

        setControl(result);
        Dialog.applyDialogFont(result);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(result, ISearchHelpContextIds.TEXT_SEARCH_PAGE);
    }

    public FileTextSearchScope createTextSearchScope() {
        // Setup search scope
        switch (getContainer().getSelectedScope()) {
        case ISearchPageContainer.WORKSPACE_SCOPE:
            return FileTextSearchScope.newWorkspaceScope(getExtensions(), fSearchDerived);
        case ISearchPageContainer.SELECTION_SCOPE:
            return getSelectedResourcesScope();
        case ISearchPageContainer.SELECTED_PROJECTS_SCOPE:
            return getEnclosingProjectScope();
        case ISearchPageContainer.WORKING_SET_SCOPE:
            IWorkingSet[] workingSets = getContainer().getSelectedWorkingSets();
            return FileTextSearchScope.newSearchScope(workingSets, getExtensions(), fSearchDerived);
        default:
            // unknown scope
            return FileTextSearchScope.newWorkspaceScope(getExtensions(), fSearchDerived);
        }
    }

    @Override
    public void dispose() {
        writeConfiguration();
        super.dispose();
    }

    @Override
    public boolean performAction() {
        try {
            NewSearchUI.runQueryInBackground(newQuery());
        } catch (CoreException e) {
            ErrorDialog.openError(getShell(), SearchMessages.TextSearchPage_replace_searchproblems_title,
                    SearchMessages.TextSearchPage_replace_searchproblems_message, e.getStatus());
            return false;
        }
        return true;
    }

    //TODO (pquitslund): Implement IReplacePage when we have refactoring support
    /* @Override */
    public boolean performReplace() {
        try {
            IStatus status = NewSearchUI.runQueryInForeground(getContainer().getRunnableContext(), newQuery());
            if (status.matches(IStatus.CANCEL)) {
                return false;
            }
            if (!status.isOK()) {
                ErrorDialog.openError(getShell(), SearchMessages.TextSearchPage_replace_searchproblems_title,
                        SearchMessages.TextSearchPage_replace_runproblem_message, status);
            }

            Display.getCurrent().asyncExec(new Runnable() {
                @Override
                public void run() {
                    /* ISearchResultViewPart view = */
                    NewSearchUI.activateSearchResultView();
                    //refactoring support          
                    //          if (view != null) {
                    //            ISearchResultPage page = view.getActivePage();
                    //            if (page instanceof FileSearchPage) {
                    //              FileSearchPage filePage = (FileSearchPage) page;
                    //              new ReplaceAction(filePage.getSite().getShell(),
                    //                  (FileSearchResult) filePage.getInput(), null).run();
                    //            }
                    //          }
                }
            });
            return true;
        } catch (CoreException e) {
            ErrorDialog.openError(getShell(), SearchMessages.TextSearchPage_replace_searchproblems_title,
                    SearchMessages.TextSearchPage_replace_querycreationproblem_message, e.getStatus());
            return false;
        }
    }

    /**
     * Sets the search page's container.
     * 
     * @param container the container to set
     */
    @Override
    public void setContainer(ISearchPageContainer container) {
        fContainer = container;
    }

    /*
     * Implements method from IDialogPage
     */
    @Override
    public void setVisible(boolean visible) {
        if (visible && fPattern != null) {
            if (fFirstTime) {
                fFirstTime = false;
                // Set item and text here to prevent page from resizing
                fPattern.setItems(getPreviousSearchPatterns());
                fExtensions.setItems(fPreviousExtensions);
                //            if (fExtensions.getItemCount() == 0) {
                //               loadFilePatternDefaults();
                //            }
                if (!initializePatternControl()) {
                    fPattern.select(0);
                    fExtensions.setText("*"); //$NON-NLS-1$
                    handleWidgetSelected();
                }
            }
            fPattern.setFocus();
        }
        updateOKStatus();

        IEditorInput editorInput = getContainer().getActiveEditorInput();
        getContainer().setActiveEditorCanProvideScopeSelection(
                editorInput != null && editorInput.getAdapter(IFile.class) != null);

        super.setVisible(visible);
    }

    final void updateOKStatus() {
        boolean regexStatus = validateRegex();
        boolean hasFilePattern = fExtensions.getText().length() > 0;
        getContainer().setPerformActionEnabled(regexStatus && hasFilePattern);
    }

    private void addFileNameControls(Composite group) {
        // grid layout with 2 columns

        // Line with label, combo and button
        Label label = new Label(group, SWT.LEAD);
        label.setText(SearchMessages.SearchPage_fileNamePatterns_text);
        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
        label.setFont(group.getFont());

        fExtensions = new Combo(group, SWT.SINGLE | SWT.BORDER);
        fExtensions.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                updateOKStatus();
            }
        });
        GridData data = new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1);
        data.widthHint = convertWidthInCharsToPixels(50);
        fExtensions.setLayoutData(data);
        fExtensions.setFont(group.getFont());

        Button button = new Button(group, SWT.PUSH);
        button.setText(SearchMessages.SearchPage_browse);
        GridData gridData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 1, 1);
        gridData.widthHint = SWTUtil.getButtonWidthHint(button);
        button.setLayoutData(gridData);
        button.setFont(group.getFont());

        fFileTypeEditor = new FileTypeEditor(fExtensions, button);

        // Text line which explains the special characters
        Label description = new Label(group, SWT.LEAD);
        description.setText(SearchMessages.SearchPage_fileNamePatterns_hint);
        description.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
        description.setFont(group.getFont());

        //    fSearchDerivedCheckbox = new Button(group, SWT.CHECK);
        //    fSearchDerivedCheckbox.setText(SearchMessages.TextSearchPage_searchDerived_label);
        //
        //    fSearchDerivedCheckbox.setSelection(fSearchDerived);
        //    fSearchDerivedCheckbox.addSelectionListener(new SelectionAdapter() {
        //      @Override
        //      public void widgetSelected(SelectionEvent e) {
        //        fSearchDerived = fSearchDerivedCheckbox.getSelection();
        //        writeConfiguration();
        //      }
        //    });
        //    fSearchDerivedCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
        //    fSearchDerivedCheckbox.setFont(group.getFont());
    }

    private void addTextPatternControls(Composite group) {
        // grid layout with 2 columns

        // Info text
        Label label = new Label(group, SWT.LEAD);
        label.setText(SearchMessages.SearchPage_containingText_text);
        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
        label.setFont(group.getFont());

        // Pattern combo
        fPattern = new Combo(group, SWT.SINGLE | SWT.BORDER);
        // Not done here to prevent page from resizing
        // fPattern.setItems(getPreviousSearchPatterns());
        fPattern.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                handleWidgetSelected();
                updateOKStatus();
            }
        });
        // add some listeners for regex syntax checking
        fPattern.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                updateOKStatus();
            }
        });
        fPattern.setFont(group.getFont());
        GridData data = new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1);
        data.widthHint = convertWidthInCharsToPixels(50);
        fPattern.setLayoutData(data);

        ComboContentAdapter contentAdapter = new ComboContentAdapter();
        FindReplaceDocumentAdapterContentProposalProvider findProposer = new FindReplaceDocumentAdapterContentProposalProvider(
                true);
        fPatterFieldContentAssist = new ContentAssistCommandAdapter(fPattern, contentAdapter, findProposer,
                ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true);
        fPatterFieldContentAssist.setEnabled(fIsRegExSearch);

        fIsCaseSensitiveCheckbox = new Button(group, SWT.CHECK);
        fIsCaseSensitiveCheckbox.setText(SearchMessages.SearchPage_caseSensitive);
        fIsCaseSensitiveCheckbox.setSelection(fIsCaseSensitive);
        fIsCaseSensitiveCheckbox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                fIsCaseSensitive = fIsCaseSensitiveCheckbox.getSelection();
            }
        });
        fIsCaseSensitiveCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        fIsCaseSensitiveCheckbox.setFont(group.getFont());

        // Text line which explains the special characters
        fStatusLabel = new CLabel(group, SWT.LEAD);
        fStatusLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        fStatusLabel.setFont(group.getFont());
        fStatusLabel.setAlignment(SWT.LEFT);
        fStatusLabel.setText(SearchMessages.SearchPage_containingText_hint);

        // RegEx checkbox
        fIsRegExCheckbox = new Button(group, SWT.CHECK);
        fIsRegExCheckbox.setText(SearchMessages.SearchPage_regularExpression);
        fIsRegExCheckbox.setSelection(fIsRegExSearch);

        fIsRegExCheckbox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                fIsRegExSearch = fIsRegExCheckbox.getSelection();
                updateOKStatus();

                writeConfiguration();
                fPatterFieldContentAssist.setEnabled(fIsRegExSearch);
            }
        });
        fIsRegExCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        fIsRegExCheckbox.setFont(group.getFont());
    }

    private SearchPatternData findInPrevious(String pattern) {
        for (Iterator<SearchPatternData> iter = fPreviousSearchPatterns.iterator(); iter.hasNext();) {
            SearchPatternData element = iter.next();
            if (pattern.equals(element.textPattern)) {
                return element;
            }
        }
        return null;
    }

    private ISearchPageContainer getContainer() {
        return fContainer;
    }

    /**
     * Returns the page settings for this Text search page.
     * 
     * @return the page settings to be used
     */
    private IDialogSettings getDialogSettings() {
        return SearchPlugin.getDefault().getDialogSettingsSection(PAGE_NAME);
    }

    private FileTextSearchScope getEnclosingProjectScope() {
        String[] enclosingProjectName = getContainer().getSelectedProjectNames();
        if (enclosingProjectName == null) {
            return FileTextSearchScope.newWorkspaceScope(getExtensions(), fSearchDerived);
        }

        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        IResource[] res = new IResource[enclosingProjectName.length];
        for (int i = 0; i < res.length; i++) {
            res[i] = root.getProject(enclosingProjectName[i]);
        }

        return FileTextSearchScope.newSearchScope(res, getExtensions(), fSearchDerived);
    }

    private String getExtensionFromEditor() {
        IEditorPart ep = SearchPlugin.getActivePage().getActiveEditor();
        if (ep != null) {
            Object elem = ep.getEditorInput();
            if (elem instanceof IFileEditorInput) {
                String extension = ((IFileEditorInput) elem).getFile().getFileExtension();
                if (extension == null) {
                    return ((IFileEditorInput) elem).getFile().getName();
                }
                return "*." + extension; //$NON-NLS-1$
            }
        }
        return null;
    }

    //---- Widget creation ------------------------------------------------

    private String[] getExtensions() {
        return fFileTypeEditor.getFileTypes();
    }

    private String getPattern() {
        return fPattern.getText();
    }

    /**
     * Return search pattern data and update previous searches. An existing entry will be updated.
     * 
     * @return the search pattern data
     */
    private SearchPatternData getPatternData() {
        SearchPatternData match = findInPrevious(fPattern.getText());
        if (match != null) {
            fPreviousSearchPatterns.remove(match);
        }
        match = new SearchPatternData(getPattern(), isCaseSensitive(), fIsRegExCheckbox.getSelection(),
                getExtensions(), getContainer().getSelectedScope(), getContainer().getSelectedWorkingSets());
        fPreviousSearchPatterns.add(0, match);
        return match;
    }

    private String[] getPreviousExtensionsOldStyle() {
        List<String> extensions = new ArrayList<String>(fPreviousSearchPatterns.size());
        int size = fPreviousSearchPatterns.size();
        for (int i = 0; i < size; i++) {
            SearchPatternData data = fPreviousSearchPatterns.get(i);
            String text = FileTypeEditor.typesToString(data.fileNamePatterns);
            if (!extensions.contains(text)) {
                extensions.add(text);
            }
        }
        return extensions.toArray(new String[extensions.size()]);
    }

    private String[] getPreviousSearchPatterns() {
        int size = fPreviousSearchPatterns.size();
        String[] patterns = new String[size];
        for (int i = 0; i < size; i++) {
            patterns[i] = fPreviousSearchPatterns.get(i).textPattern;
        }
        return patterns;
    }

    //   private void loadFilePatternDefaults() {
    //      SearchMatchInformationProviderRegistry registry= SearchPlugin.getDefault().getSearchMatchInformationProviderRegistry();
    //      String[] defaults= registry.getDefaultFilePatterns();
    //      fExtensions.setItems(defaults);
    //      fExtensions.setText(defaults[0]);
    //   }

    private FileTextSearchScope getSelectedResourcesScope() {
        HashSet<Object> resources = new HashSet<Object>();
        ISelection sel = getContainer().getSelection();
        if (sel instanceof IStructuredSelection && !sel.isEmpty()) {
            Iterator<?> iter = ((IStructuredSelection) sel).iterator();
            while (iter.hasNext()) {
                Object curr = iter.next();
                if (curr instanceof IWorkingSet) {
                    IWorkingSet workingSet = (IWorkingSet) curr;
                    if (workingSet.isAggregateWorkingSet() && workingSet.isEmpty()) {
                        return FileTextSearchScope.newWorkspaceScope(getExtensions(), fSearchDerived);
                    }
                    IAdaptable[] elements = workingSet.getElements();
                    for (int i = 0; i < elements.length; i++) {
                        IResource resource = (IResource) elements[i].getAdapter(IResource.class);
                        if (resource != null && resource.isAccessible()) {
                            resources.add(resource);
                        }
                    }
                } else if (curr instanceof LineElement) {
                    FileResource<?> fileResource = ((LineElement) curr).getParent();
                    if (fileResource instanceof WorkspaceFile) {
                        IResource resource = ((WorkspaceFile) fileResource).getResource();
                        if (resource != null && resource.isAccessible()) {
                            resources.add(resource);
                        }
                    }
                } else if (curr instanceof IAdaptable) {
                    IResource resource = (IResource) ((IAdaptable) curr).getAdapter(IResource.class);
                    if (resource != null && resource.isAccessible()) {
                        resources.add(resource);
                    }
                }
            }
        } else if (getContainer().getActiveEditorInput() != null) {
            resources.add(getContainer().getActiveEditorInput().getAdapter(IFile.class));
        }
        IResource[] arr = resources.toArray(new IResource[resources.size()]);
        return FileTextSearchScope.newSearchScope(arr, getExtensions(), fSearchDerived);
    }

    private ISelection getSelection() {
        return fContainer.getSelection();
    }

    private void handleWidgetSelected() {
        int selectionIndex = fPattern.getSelectionIndex();
        if (selectionIndex < 0 || selectionIndex >= fPreviousSearchPatterns.size()) {
            return;
        }

        SearchPatternData patternData = fPreviousSearchPatterns.get(selectionIndex);
        if (!fPattern.getText().equals(patternData.textPattern)) {
            return;
        }
        fIsCaseSensitiveCheckbox.setSelection(patternData.isCaseSensitive);
        fIsRegExSearch = patternData.isRegExSearch;
        fIsRegExCheckbox.setSelection(fIsRegExSearch);
        fPattern.setText(patternData.textPattern);
        fPatterFieldContentAssist.setEnabled(fIsRegExSearch);
        fFileTypeEditor.setFileTypes(patternData.fileNamePatterns);
        if (patternData.workingSets != null) {
            getContainer().setSelectedWorkingSets(patternData.workingSets);
        } else {
            getContainer().setSelectedScope(patternData.scope);
        }
    }

    private boolean initializePatternControl() {
        ISelection selection = getSelection();
        if (selection instanceof ITextSelection && !selection.isEmpty()
                && ((ITextSelection) selection).getLength() > 0) {
            String text = ((ITextSelection) selection).getText();
            if (text != null) {
                if (fIsRegExSearch) {
                    fPattern.setText(FindReplaceDocumentAdapter.escapeForRegExPattern(text));
                } else {
                    fPattern.setText(insertEscapeChars(text));
                }

                if (fPreviousExtensions.length > 0) {
                    fExtensions.setText(fPreviousExtensions[0]);
                } else {
                    String extension = getExtensionFromEditor();
                    if (extension != null) {
                        fExtensions.setText(extension);
                    } else {
                        fExtensions.setText("*"); //$NON-NLS-1$
                    }
                }
                return true;
            }
        }
        return false;
    }

    private String insertEscapeChars(String text) {
        if (text == null || text.equals("")) {
            return ""; //$NON-NLS-1$
        }
        StringBuffer sbIn = new StringBuffer(text);
        BufferedReader reader = new BufferedReader(new StringReader(text));
        int lengthOfFirstLine = 0;
        try {
            lengthOfFirstLine = reader.readLine().length();
        } catch (IOException ex) {
            return ""; //$NON-NLS-1$
        }
        StringBuffer sbOut = new StringBuffer(lengthOfFirstLine + 5);
        int i = 0;
        while (i < lengthOfFirstLine) {
            char ch = sbIn.charAt(i);
            if (ch == '*' || ch == '?' || ch == '\\') {
                sbOut.append("\\"); //$NON-NLS-1$
            }
            sbOut.append(ch);
            i++;
        }
        return sbOut.toString();
    }

    private boolean isCaseSensitive() {
        return fIsCaseSensitiveCheckbox.getSelection();
    }

    //--------------- Configuration handling --------------

    private ISearchQuery newQuery() throws CoreException {
        SearchPatternData data = getPatternData();
        TextSearchPageInput input = new TextSearchPageInput(data.textPattern, data.isCaseSensitive,
                data.isRegExSearch, createTextSearchScope());
        return TextSearchQueryProvider.getPreferred().createQuery(input);
    }

    /**
     * Initializes itself from the stored page settings.
     */
    private void readConfiguration() {
        IDialogSettings s = getDialogSettings();
        fIsCaseSensitive = s.getBoolean(STORE_CASE_SENSITIVE);
        fIsRegExSearch = s.getBoolean(STORE_IS_REG_EX_SEARCH);
        fSearchDerived = s.getBoolean(STORE_SEARCH_DERIVED);

        try {
            int historySize = s.getInt(STORE_HISTORY_SIZE);
            for (int i = 0; i < historySize; i++) {
                IDialogSettings histSettings = s.getSection(STORE_HISTORY + i);
                if (histSettings != null) {
                    SearchPatternData data = SearchPatternData.create(histSettings);
                    if (data != null) {
                        fPreviousSearchPatterns.add(data);
                    }
                }
            }
        } catch (NumberFormatException e) {
            // ignore
        }

        Set<String> previousExtensions = new LinkedHashSet<String>(HISTORY_SIZE);
        IDialogSettings extensionsSettings = s.getSection(STORE_EXTENSIONS);
        if (extensionsSettings != null) {
            for (int i = 0; i < HISTORY_SIZE; i++) {
                String extension = extensionsSettings.get(Integer.toString(i));
                if (extension == null) {
                    break;
                }
                previousExtensions.add(extension);
            }
            fPreviousExtensions = new String[previousExtensions.size()];
            previousExtensions.toArray(fPreviousExtensions);
        } else {
            fPreviousExtensions = getPreviousExtensionsOldStyle();
        }

    }

    private void statusMessage(boolean error, String message) {
        fStatusLabel.setText(message);
        if (error) {
            fStatusLabel.setForeground(JFaceColors.getErrorText(fStatusLabel.getDisplay()));
        } else {
            fStatusLabel.setForeground(null);
        }
    }

    private boolean validateRegex() {
        if (fIsRegExCheckbox.getSelection()) {
            try {
                PatternConstructor.createPattern(fPattern.getText(), fIsCaseSensitive, true);
            } catch (PatternSyntaxException e) {
                String locMessage = e.getLocalizedMessage();
                int i = 0;
                while (i < locMessage.length() && "\n\r".indexOf(locMessage.charAt(i)) == -1) { //$NON-NLS-1$
                    i++;
                }
                statusMessage(true, locMessage.substring(0, i)); // only take first line
                return false;
            }
            statusMessage(false, ""); //$NON-NLS-1$
        } else {
            statusMessage(false, SearchMessages.SearchPage_containingText_hint);
        }
        return true;
    }

    /**
     * Stores it current configuration in the dialog store.
     */
    private void writeConfiguration() {
        IDialogSettings s = getDialogSettings();
        s.put(STORE_CASE_SENSITIVE, fIsCaseSensitive);
        s.put(STORE_IS_REG_EX_SEARCH, fIsRegExSearch);
        s.put(STORE_SEARCH_DERIVED, fSearchDerived);

        int historySize = Math.min(fPreviousSearchPatterns.size(), HISTORY_SIZE);
        s.put(STORE_HISTORY_SIZE, historySize);
        for (int i = 0; i < historySize; i++) {
            IDialogSettings histSettings = s.addNewSection(STORE_HISTORY + i);
            SearchPatternData data = fPreviousSearchPatterns.get(i);
            data.store(histSettings);
        }

        IDialogSettings extensionsSettings = s.addNewSection(STORE_EXTENSIONS);
        extensionsSettings.put(Integer.toString(0), fExtensions.getText());
        Set<String> extensions = new HashSet<String>(HISTORY_SIZE);
        extensions.add(fExtensions.getText());
        int length = Math.min(fExtensions.getItemCount(), HISTORY_SIZE - 1);
        int j = 1;
        for (int i = 0; i < length; i++) {
            String extension = fExtensions.getItem(i);
            if (extensions.add(extension)) {
                extensionsSettings.put(Integer.toString(j++), extension);
            }
        }

    }

}