Package org.erlide.ui.internal.search

Source Code of org.erlide.ui.internal.search.ErlangSearchPage

/*******************************************************************************
* Copyright (c) 2000, 2007 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 org.erlide.ui.internal.search;

import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
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.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.search.ui.ISearchPage;
import org.eclipse.search.ui.ISearchPageContainer;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.erlide.core.services.search.SearchCoreUtil;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.erlang.IErlModule;
import org.erlide.engine.model.root.IErlElement;
import org.erlide.engine.services.search.ErlSearchScope;
import org.erlide.engine.services.search.ErlangSearchPattern;
import org.erlide.engine.services.search.LimitTo;
import org.erlide.engine.services.search.OpenResult;
import org.erlide.engine.services.search.OpenService;
import org.erlide.engine.services.search.SearchFor;
import org.erlide.engine.services.search.SearchPatternFactory;
import org.erlide.runtime.rpc.RpcException;
import org.erlide.ui.editors.erl.AbstractErlangEditor;
import org.erlide.ui.editors.erl.ErlangEditor;
import org.erlide.ui.editors.erl.IErlangHelpContextIds;
import org.erlide.ui.internal.ErlideUIPlugin;
import org.erlide.util.ErlLogger;

import com.google.common.collect.Lists;

public class ErlangSearchPage extends DialogPage implements ISearchPage {

    private static final ErlSearchScope EMPTY_SCOPE = new ErlSearchScope();

    private static class SearchPatternData {
        private final String pattern;
        private final int scope;
        private final IWorkingSet[] workingSets;
        private final LimitTo limitTo;
        private final SearchFor searchFor;
        private final int includeMask;

        public SearchPatternData(final String pattern, final int scope,
                final LimitTo limitTo, final SearchFor searchFor,
                final IWorkingSet[] workingSets, final int includeMask) {
            this.pattern = pattern;
            this.scope = scope;
            this.limitTo = limitTo;
            this.workingSets = workingSets;
            this.searchFor = searchFor;
            this.includeMask = includeMask;
        }

        public int getScope() {
            return scope;
        }

        public LimitTo getLimitTo() {
            return limitTo;
        }

        public IWorkingSet[] getWorkingSets() {
            return workingSets;
        }

        public void store(final IDialogSettings settings) {
            settings.put("pattern", pattern); //$NON-NLS-1$
            settings.put("scope", scope); //$NON-NLS-1$
            settings.put("limitTo", limitTo.toString()); //$NON-NLS-1$
            settings.put("searchFor", searchFor.toString()); //$NON-NLS-1$
            settings.put("includeMask", getIncludeMask()); //$NON-NLS-1$
            if (workingSets != null) {
                final String[] wsIds = new String[workingSets.length];
                for (int i = 0; i < workingSets.length; i++) {
                    wsIds[i] = workingSets[i].getName();
                }
                settings.put("workingSets", wsIds);
            } else {
                settings.put("workingSets", new String[0]);
            }
        }

        public static SearchPatternData create(final IDialogSettings settings) {
            final String pattern = settings.get("pattern");
            if (pattern.length() == 0) {
                return null;
            }
            final String[] wsIds = settings.getArray("workingSets");

            IWorkingSet[] workingSets = null;
            if (wsIds != null && wsIds.length > 0) {
                final 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;
                    }
                }
            }

            try {
                final int scope = settings.getInt("scope"); //$NON-NLS-1$
                LimitTo limitTo;
                try {
                    limitTo = LimitTo.valueOf(settings.get("limitTo")); // //$NON-NLS-1$
                } catch (final IllegalArgumentException e) {
                    limitTo = LimitTo.REFERENCES;
                }
                SearchFor searchFor;
                try {
                    searchFor = SearchFor.valueOf(settings.get("searchFor")); // //$NON-NLS-1$
                } catch (final IllegalArgumentException e) {
                    searchFor = SearchFor.FUNCTION;
                }
                final int includeMask = settings.getInt("includeMask"); //$NON-NLS-1$
                return new SearchPatternData(pattern, scope, limitTo, searchFor,
                        workingSets, includeMask);

            } catch (final NumberFormatException e) {
            }
            return null;
        }

        public String getPattern() {
            return pattern;
        }

        public SearchFor getSearchFor() {
            return searchFor;
        }

        public int getIncludeMask() {
            return includeMask;
        }
    }

    private static final int HISTORY_SIZE = 12;

    // Dialog store id constants
    private final static String PAGE_NAME = "ErlangSearchPage"; //$NON-NLS-1$
    private final static String STORE_INCLUDE_MASK = "INCLUDE_MASK"; //$NON-NLS-1$
    private final static String STORE_HISTORY = "HISTORY"; //$NON-NLS-1$
    private final static String STORE_HISTORY_SIZE = "HISTORY_SIZE"; //$NON-NLS-1$

    private final List<SearchPatternData> fPreviousSearchPatterns;

    private SearchPatternData fInitialData;
    private boolean fFirstTime = true;
    private IDialogSettings fDialogSettings;

    private Combo fPattern;
    private ISearchPageContainer fContainer;

    private Button[] fSearchFor;
    private Button[] fLimitTo;
    private Button[] fIncludeMasks;

    /**
     *
     */
    public ErlangSearchPage() {
        fPreviousSearchPatterns = Lists.newArrayList();
    }

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

    @Override
    public boolean performAction() {
        try {
            return performNewSearch();
        } catch (final CoreException e) {
            ErrorDialog.openError(getShell(), "Search",
                    "Problems occurred while searching. "
                            + "The affected files will be skipped.", e.getStatus());
            return false;
        }
    }

    private boolean performNewSearch() throws CoreException {
        final SearchPatternData data = getPatternData();
        final int includeMask = getIncludeMask();
        // Setup search scope
        ErlSearchScope scope = EMPTY_SCOPE;
        String scopeDescription = null;
        final boolean searchSources = (includeMask & SearchUtil.SEARCH_IN_SOURCES) != 0;
        final boolean searchExternals = (includeMask & SearchUtil.SEARCH_IN_EXTERNALS) != 0;
        final boolean searchOtp = (includeMask & SearchUtil.SEARCH_IN_OTP_LIBRARIES) != 0;
        final int selectedScope = getContainer().getSelectedScope();
        switch (selectedScope) {
        case ISearchPageContainer.WORKSPACE_SCOPE:
            if (searchSources) {
                scope = SearchCoreUtil.getWorkspaceScope(searchExternals, searchOtp);
            }
            scopeDescription = SearchUtil.getWorkspaceScopeDescription();
            break;
        case ISearchPageContainer.SELECTED_PROJECTS_SCOPE:
            final String[] projectNames = getContainer().getSelectedProjectNames();
            if (searchSources) {
                scope = SearchCoreUtil.getProjectsScope(
                        SearchCoreUtil.getProjects(projectNames), searchExternals,
                        searchOtp);
            }
            scopeDescription = SearchUtil.getProjectScopeDescription(SearchCoreUtil
                    .getProjects(projectNames));
            break;
        case ISearchPageContainer.SELECTION_SCOPE:
            if (searchSources) {
                scope = SearchUtil.getSelectionScope(getContainer().getSelection(),
                        searchExternals, searchOtp);
            }
            scopeDescription = SearchUtil.getSelectionScopeDescription(getContainer()
                    .getSelection());
            break;
        case ISearchPageContainer.WORKING_SET_SCOPE: {
            final IWorkingSet[] workingSets = getContainer().getSelectedWorkingSets();
            // should not happen - just to be sure
            if (workingSets == null || workingSets.length < 1) {
                return false;
            }
            scopeDescription = SearchUtil.getWorkingSetsScopeDescription(workingSets);
            if (searchSources) {
                scope = SearchUtil.getWorkingSetsScope(workingSets, searchExternals,
                        searchOtp);
            }
            SearchUtil.updateLRUWorkingSets(workingSets);
        }
        }
        final ErlangSearchPattern searchPattern = SearchUtil.getSearchPattern(null,
                data.getSearchFor(), data.getPattern(), data.getLimitTo());
        SearchUtil.runQuery(searchPattern, scope, scopeDescription, getShell());
        return true;
    }

    private String[] getPreviousSearchPatterns() {
        // Search results are not persistent
        final int patternCount = fPreviousSearchPatterns.size();
        final String[] patterns = new String[patternCount];
        for (int i = 0; i < patternCount; i++) {
            patterns[i] = fPreviousSearchPatterns.get(i).getPattern();
        }
        return patterns;
    }

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

    private SearchPatternData findInPrevious(final String pattern) {
        for (final SearchPatternData i : fPreviousSearchPatterns) {
            if (pattern.equals(i.getPattern())) {
                return i;
            }
        }
        return null;
    }

    /**
     * Return search pattern data and update previous searches. An existing
     * entry will be updated.
     *
     * @return the pattern data
     */
    private SearchPatternData getPatternData() {
        final String pattern = getPattern();
        SearchPatternData match = findInPrevious(pattern);
        if (match != null) {
            fPreviousSearchPatterns.remove(match);
        }
        match = new SearchPatternData(pattern, getContainer().getSelectedScope(),
                getLimitTo(), getSearchFor(), getContainer().getSelectedWorkingSets(),
                getIncludeMask());

        fPreviousSearchPatterns.add(0, match); // insert on top
        return match;
    }

    /*
     * Implements method from IDialogPage
     */
    @Override
    public void setVisible(final boolean visible) {
        if (visible && fPattern != null) {
            if (fFirstTime) {
                fFirstTime = false;
                // Set item and text here to prevent page from resizing
                fPattern.setItems(getPreviousSearchPatterns());
                try {
                    initSelections();
                } catch (final ErlModelException e) {
                }
            }
            fPattern.setFocus();
        }
        updateOKStatus();
        super.setVisible(visible);
    }

    public boolean isValid() {
        return true;
    }

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

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

        final Composite result = new Composite(parent, SWT.NONE);

        final GridLayout layout = new GridLayout(2, false);
        layout.horizontalSpacing = 10;
        result.setLayout(layout);

        final Control expressionComposite = createExpression(result);
        expressionComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER,
                true, false, 2, 1));

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

        final Control searchFor = createSearchFor(result);
        searchFor.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false,
                1, 1));

        final Control limitTo = createLimitTo(result);
        limitTo.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 1,
                1));

        final Control includeMask = createIncludeMask(result);
        includeMask.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false,
                2, 1));

        setControl(result);

        Dialog.applyDialogFont(result);
        PlatformUI.getWorkbench().getHelpSystem()
                .setHelp(result, IErlangHelpContextIds.ERLANG_SEARCH_PAGE);
    }

    private Control createIncludeMask(final Composite parent) {
        final Group result = new Group(parent, SWT.NONE);
        result.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        result.setText("Search In");
        result.setLayout(new GridLayout(3, false));
        fIncludeMasks = new Button[] {
                createCheckButton(result, "Sourc&es", SearchUtil.SEARCH_IN_SOURCES, true),
                createCheckButton(result, "E&xternals", SearchUtil.SEARCH_IN_EXTERNALS,
                        false),
                createCheckButton(result, "&OTP libraries",
                        SearchUtil.SEARCH_IN_OTP_LIBRARIES, false) };
        return result;
    }

    private Control createExpression(final Composite parent) {
        final Composite result = new Composite(parent, SWT.NONE);
        final GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        result.setLayout(layout);

        // Pattern text + info
        final Label label = new Label(result, SWT.LEFT);
        label.setText("Expression"); // SearchMessages.SearchPage_expression_label
        // );
        label.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false, 2, 1));

        // Pattern combo
        fPattern = new Combo(result, SWT.SINGLE | SWT.BORDER);
        fPattern.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings("synthetic-access")
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handlePatternSelected();
                updateOKStatus();
            }
        });
        fPattern.addModifyListener(new ModifyListener() {
            @Override
            @SuppressWarnings("synthetic-access")
            public void modifyText(final ModifyEvent e) {
                doPatternModified();
                updateOKStatus();

            }
        });
        // TextFieldNavigationHandler.install(fPattern);
        final GridData data = new GridData(GridData.FILL, GridData.FILL, true, false, 1,
                1);
        data.widthHint = convertWidthInCharsToPixels(50);
        fPattern.setLayoutData(data);

        return result;
    }

    final void updateOKStatus() {
        final boolean isValid = isValidSearchPattern();
        getContainer().setPerformActionEnabled(isValid);
    }

    private boolean isValidSearchPattern() {
        // FIXME borde kollas ordentligt! kanske via open
        if (getPattern().length() > 0) {
            return true;
        }
        return false;
    }

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

    private void doPatternModified() {
        if (fInitialData != null && getPattern().equals(fInitialData.getPattern())) {
        }
    }

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

        final SearchPatternData initialData = fPreviousSearchPatterns.get(selectionIndex);

        setSearchFor(initialData.getSearchFor());
        setIncludeMask(initialData.getIncludeMask());
        setLimitTo(initialData.getLimitTo());
        // final int limitToVal = setLimitTo(initialData.getSearchFor(),
        // initialData.getLimitTo());

        fPattern.setText(initialData.getPattern());

        if (initialData.getWorkingSets() != null) {
            getContainer().setSelectedWorkingSets(initialData.getWorkingSets());
        } else {
            getContainer().setSelectedScope(initialData.getScope());
        }

        fInitialData = initialData;
    }

    private SearchFor getSearchFor() {
        for (int i = 0; i < fSearchFor.length; i++) {
            final Button button = fSearchFor[i];
            if (button.getSelection()) {
                return (SearchFor) button.getData();
            }
        }
        Assert.isTrue(false, "shouldNeverHappen"); //$NON-NLS-1$
        return SearchFor.FUNCTION;
    }

    private void setSearchFor(final SearchFor searchFor) {
        for (final Button button : fSearchFor) {
            button.setSelection(searchFor == button.getData());
        }
    }

    private void setLimitTo(final LimitTo limitTo) {
        for (final Button button : fLimitTo) {
            button.setSelection(limitTo == button.getData());
        }
    }

    private void setIncludeMask(final int includeMask) {
        for (int i = 0; i < fIncludeMasks.length; i++) {
            final Button button = fIncludeMasks[i];
            button.setSelection((includeMask & getIntData(button)) != 0);
        }
    }

    private Control createSearchFor(final Composite parent) {
        final Group result = new Group(parent, SWT.NONE);
        result.setText("Search For");
        result.setLayout(new GridLayout(2, true));

        fSearchFor = new Button[] {
                createRadioButton(result, "Function", SearchFor.FUNCTION),
                createRadioButton(result, "Record", SearchFor.RECORD),
                createRadioButton(result, "Macro", SearchFor.MACRO),
                createRadioButton(result, "Type", SearchFor.TYPE),
                createRadioButton(result, "Include", SearchFor.INCLUDE),
                createRadioButton(result, "Record field", SearchFor.RECORD_FIELD),
                createRadioButton(result, "Variable", SearchFor.VARIABLE) };

        // Fill with dummy radio buttons
        final Label filler = new Label(result, SWT.NONE);
        filler.setVisible(false);
        filler.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));

        return result;
    }

    private Control createLimitTo(final Composite parent) {
        final Group result = new Group(parent, SWT.NONE);
        result.setText("Limit to");
        result.setLayout(new GridLayout(2, true));
        fLimitTo = new Button[] {
                createRadioButton(result, "Definitions", LimitTo.DEFINITIONS),
                createRadioButton(result, "References", LimitTo.REFERENCES, true),
                createRadioButton(result, "All occurrences", LimitTo.ALL_OCCURRENCES) };
        return result;
    }

    private Button createRadioButton(final Composite parent, final String text,
            final Object data) {
        return createRadioButton(parent, text, data, false);
    }

    private Button createRadioButton(final Composite parent, final String text,
            final Object data, final boolean isSelected) {
        final Button button = new Button(parent, SWT.RADIO);
        button.setText(text);
        button.setData(data);
        button.setLayoutData(new GridData());
        button.setSelection(isSelected);
        return button;
    }

    private Button createCheckButton(final Composite parent, final String text,
            final int data, final boolean isSelected) {
        final Button button = new Button(parent, SWT.CHECK);
        button.setText(text);
        button.setData(Integer.valueOf(data));
        button.setLayoutData(new GridData());
        button.setSelection(isSelected);
        return button;
    }

    private void initSelections() throws ErlModelException {
        final ISelection sel = getContainer().getSelection();
        SearchPatternData initData = null;
        if (sel instanceof IStructuredSelection) {
            initData = tryStructuredSelection((IStructuredSelection) sel);
        } else if (sel instanceof ITextSelection) {
            final IEditorPart activePart = getActiveEditor();
            if (activePart instanceof ErlangEditor) {
                initData = tryErlangTextSelection(initData, activePart);
            }
            if (initData == null) {
                initData = trySimpleTextSelection((ITextSelection) sel);
            }
        }
        if (initData == null) {
            initData = getDefaultInitValues();
        }

        fInitialData = initData;

        fPattern.setText(initData.getPattern());
        setSearchFor(initData.getSearchFor());
    }

    public SearchPatternData tryErlangTextSelection(final SearchPatternData initData0,
            final IEditorPart activePart) throws ErlModelException {
        final AbstractErlangEditor erlangEditor = (AbstractErlangEditor) activePart;
        final IErlModule module = erlangEditor.getModule();
        SearchPatternData initData = initData0;
        if (module != null) {
            final ISelection ssel = erlangEditor.getSite().getSelectionProvider()
                    .getSelection();
            final ITextSelection textSel = (ITextSelection) ssel;
            final int offset = textSel.getOffset();
            OpenResult res;
            try {
                res = ErlangEngine
                        .getInstance()
                        .getService(OpenService.class)
                        .open(module.getScannerName(),
                                offset,
                                ErlangEngine.getInstance().getModelUtilService()
                                        .getImportsAsList(module),
                                "",
                                ErlangEngine.getInstance().getModel()
                                        .getPathVars(module.getCorrespondingResource()));
            } catch (final RpcException e) {
                res = null;
            }
            ErlLogger.debug("searchPage(open) " + res);
            initData = determineInitValuesFrom(module, offset, res);
        }
        return initData;
    }

    private SearchPatternData tryStructuredSelection(final IStructuredSelection selection) {
        if (selection == null || selection.size() > 1) {
            return null;
        }
        final Object o = selection.getFirstElement();
        SearchPatternData res = null;
        if (o instanceof IErlElement) {
            res = determineInitValuesFrom((IErlElement) o);
        }
        return res;
    }

    private int getIntData(final Button button) {
        return ((Integer) button.getData()).intValue();
    }

    private LimitTo getLimitTo() {
        for (int i = 0; i < fLimitTo.length; i++) {
            final Button button = fLimitTo[i];
            if (button.getSelection()) {
                return (LimitTo) button.getData();
            }
        }
        Assert.isTrue(false, "shouldNeverHappen"); //$NON-NLS-1$
        return LimitTo.ALL_OCCURRENCES;
    }

    private int getIncludeMask() {
        int mask = 0;
        for (int i = 0; i < fIncludeMasks.length; i++) {
            final Button button = fIncludeMasks[i];
            if (button.getSelection()) {
                mask |= getIntData(button);
            }
        }
        return mask;
    }

    private int getLastIncludeMask() {
        try {
            return getDialogSettings().getInt(STORE_INCLUDE_MASK);
        } catch (final NumberFormatException e) {
        }
        return 0;
    }

    private SearchPatternData determineInitValuesFrom(final IErlModule module,
            final int offset, final OpenResult res) throws ErlModelException {
        if (res == null) {
            return null;
        }
        final ErlangSearchPattern pattern = SearchUtil
                .getSearchPatternFromOpenResultAndLimitTo(res, module, offset,
                        LimitTo.REFERENCES, true);
        final String patternString = pattern == null ? "" : pattern.patternString();
        final SearchFor searchFor = pattern == null ? SearchFor.FUNCTION : pattern
                .getSearchFor();
        final SearchPatternData searchPatternData = new SearchPatternData(patternString,
                ISearchPageContainer.WORKSPACE_SCOPE, LimitTo.REFERENCES, searchFor,
                null, SearchUtil.SEARCH_IN_SOURCES);
        return searchPatternData;
    }

    private SearchPatternData determineInitValuesFrom(final IErlElement e) {
        final ErlangSearchPattern pattern = new SearchPatternFactory(ErlangEngine
                .getInstance().getModelUtilService())
                .getSearchPatternFromErlElementAndLimitTo(e, getLimitTo());
        if (pattern == null) {
            return null;
        }
        return new SearchPatternData(pattern.patternString(),
                ISearchPageContainer.WORKSPACE_SCOPE, LimitTo.REFERENCES,
                pattern.getSearchFor(), null, getLastIncludeMask());
    }

    private SearchPatternData trySimpleTextSelection(final ITextSelection selection) {
        final String selectedText = selection.getText();
        if (selectedText != null && selectedText.length() > 0) {
            int i = 0;
            while (i < selectedText.length()
                    && !SearchCoreUtil.isLineDelimiterChar(selectedText.charAt(i))) {
                i++;
            }
            if (i > 0) {
                final String s = selectedText.substring(0, i);
                // FIXME find the module from the editor somehow
                return new SearchPatternData(s, getContainer().getSelectedScope(),
                        getLimitTo(), getSearchFor(), getContainer()
                                .getSelectedWorkingSets(), getLastIncludeMask());
            }
        }
        return null;
    }

    private SearchPatternData getDefaultInitValues() {
        if (!fPreviousSearchPatterns.isEmpty()) {
            return fPreviousSearchPatterns.get(0);
        }

        return new SearchPatternData("", ISearchPageContainer.WORKSPACE_SCOPE,
                LimitTo.REFERENCES, SearchFor.FUNCTION, null,
                SearchUtil.SEARCH_IN_SOURCES);
    }

    /*
     * Implements method from ISearchPage
     */
    @Override
    public void setContainer(final ISearchPageContainer container) {
        fContainer = container;
    }

    /**
     * Returns the search page's container.
     *
     * @return the search page container
     */
    private ISearchPageContainer getContainer() {
        return fContainer;
    }

    private IEditorPart getActiveEditor() {
        final IWorkbenchPage activePage = ErlideUIPlugin.getActivePage();
        if (activePage != null) {
            return activePage.getActiveEditor();
        }
        return null;
    }

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

    /**
     * Returns the page settings for this Erlang search page.
     *
     * @return the page settings to be used
     */
    private IDialogSettings getDialogSettings() {
        if (fDialogSettings == null) {
            fDialogSettings = ErlideUIPlugin.getDefault().getDialogSettingsSection(
                    PAGE_NAME);
        }
        return fDialogSettings;
    }

    /**
     * Initializes itself from the stored page settings.
     */
    private void readConfiguration() {
        final IDialogSettings s = getDialogSettings();

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

    /**
     * Stores the current configuration in the dialog store.
     */
    private void writeConfiguration() {
        final IDialogSettings s = getDialogSettings();

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

Related Classes of org.erlide.ui.internal.search.ErlangSearchPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.