com.nokia.carbide.search.system2.internal.ui.SearchView.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.search.system2.internal.ui.SearchView.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation, Nokia 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
 *     Michael Fraenkel (fraenkel@us.ibm.com) - contributed a fix for:
 *       o New search view sets incorrect title
 *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=60966)
 *******************************************************************************/
package com.nokia.carbide.search.system2.internal.ui;

import com.ibm.icu.text.MessageFormat;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.commands.operations.IUndoContext;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;

import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.osgi.util.NLS;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;

import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;

import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.keys.IBindingService;
import org.eclipse.ui.operations.UndoRedoActionGroup;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.IPageBookViewPage;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.Page;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.PageBookView;
import org.eclipse.ui.part.PageSwitcher;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;

import com.nokia.carbide.search.system.internal.ui.ISearchHelpContextIds;
import com.nokia.carbide.search.system.internal.ui.OpenSearchDialogAction;
import com.nokia.carbide.search.system.internal.ui.SearchPlugin;
import com.nokia.carbide.search.system.ui.IContextMenuConstants;
import com.nokia.carbide.search.system.ui.IQueryListener;
import com.nokia.carbide.search.system.ui.ISearchQuery;
import com.nokia.carbide.search.system.ui.ISearchResult;
import com.nokia.carbide.search.system.ui.ISearchResultPage;
import com.nokia.carbide.search.system.ui.ISearchResultViewPart;
import com.nokia.carbide.search.system.ui.NewSearchUI;

public class SearchView extends PageBookView implements ISearchResultViewPart, IQueryListener {

    private static final String MEMENTO_TYPE = "view"; //$NON-NLS-1$
    private static final String MEMENTO_KEY_IS_PINNED = "isPinned"; //$NON-NLS-1$
    private static final String MEMENTO_KEY_LAST_ACTIVATION = "com.nokia.carbide.search.system.lastActivation"; //$NON-NLS-1$
    private static final String MEMENTO_KEY_RESTORE = "com.nokia.carbide.search.system.restore"; //$NON-NLS-1$
    private HashMap fPartsToPages;
    private HashMap fPagesToParts;
    private HashMap fSearchViewStates;
    private SearchPageRegistry fSearchViewPageService;
    private SearchHistoryDropDownAction fSearchesDropDownAction;
    private ISearchResult fCurrentSearch;
    private DummyPart fDefaultPart;
    private SearchAgainAction fSearchAgainAction;
    private CancelSearchAction fCancelAction;
    private PinSearchViewAction fPinSearchViewAction;
    private UndoRedoActionGroup fUndoRedoActionGroup;

    private IMemento fPageState;
    private boolean fIsPinned;
    private int fActivationCount = 0;
    private String fDefaultPartName;

    private Composite fPageContent;
    private Link fDescription;
    private Composite fDescriptionComposite;

    /**
     * Creates the groups and separators for the search view's context menu
     * 
     * @param menu the context menu
     */
    public static void createContextMenuGroups(IMenuManager menu) {
        menu.add(new Separator(IContextMenuConstants.GROUP_NEW));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_GOTO));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_OPEN));
        menu.add(new Separator(IContextMenuConstants.GROUP_SHOW));
        menu.add(new Separator(IContextMenuConstants.GROUP_EDIT));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_REMOVE_MATCHES));
        menu.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_GENERATE));
        menu.add(new Separator(IContextMenuConstants.GROUP_SEARCH));
        menu.add(new Separator(IContextMenuConstants.GROUP_BUILD));
        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        menu.add(new Separator(IContextMenuConstants.GROUP_VIEWER_SETUP));
        menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES));
    }

    /**
     * Creates the groups and separators for the search view's context menu
     * 
     * @param menu the context menu
     */
    private static void createViewMenuGroups(IMenuManager menu) {
        menu.add(new Separator(IContextMenuConstants.GROUP_VIEWER_SETUP));
        menu.add(new Separator(IContextMenuConstants.GROUP_NEW));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_GOTO));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_OPEN));
        menu.add(new Separator(IContextMenuConstants.GROUP_SHOW));
        menu.add(new Separator(IContextMenuConstants.GROUP_EDIT));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_REMOVE_MATCHES));
        menu.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_GENERATE));
        menu.add(new Separator(IContextMenuConstants.GROUP_SEARCH));
        menu.add(new Separator(IContextMenuConstants.GROUP_BUILD));
        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        menu.add(new Separator(IContextMenuConstants.GROUP_FILTERING));
        menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES));
    }

    /**
     * Creates the groups and separators for the search view's 
     * tool bar
     * 
     * @param toolbar the toolbar
     */
    public static void createToolBarGroups(IToolBarManager toolbar) {
        toolbar.add(new Separator(IContextMenuConstants.GROUP_NEW));
        toolbar.add(new GroupMarker(IContextMenuConstants.GROUP_GOTO));
        toolbar.add(new GroupMarker(IContextMenuConstants.GROUP_OPEN));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_SHOW));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_BUILD));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_EDIT));
        toolbar.add(new GroupMarker(IContextMenuConstants.GROUP_REMOVE_MATCHES));
        toolbar.add(new GroupMarker(IContextMenuConstants.GROUP_GENERATE));
        toolbar.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_VIEWER_SETUP));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES));
        toolbar.add(new Separator(IContextMenuConstants.GROUP_SEARCH));
    }

    static class DummyPart implements IWorkbenchPart {
        private int fLastActivation = 0;

        public void setLastActivation(int lastActivation) {
            fLastActivation = lastActivation;
        }

        public int getLastActivation() {
            return fLastActivation;
        }

        public void addPropertyListener(IPropertyListener listener) {
            /*dummy*/}

        public void createPartControl(Composite parent) {
            /*dummy*/}

        public void dispose() {
            /*dummy*/}

        public IWorkbenchPartSite getSite() {
            return null;
        }

        public String getTitle() {
            return null;
        }

        public Image getTitleImage() {
            return null;
        }

        public String getTitleToolTip() {
            return null;
        }

        public void removePropertyListener(IPropertyListener listener) {
            /*dummy*/}

        public void setFocus() {
            /*dummy*/}

        public Object getAdapter(Class adapter) {
            return null;
        }
    }

    static class EmptySearchView extends Page implements ISearchResultPage {
        private Composite fControl;
        private String fId;

        public void createControl(Composite parent) {
            Color background = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);

            Composite composite = new Composite(parent, SWT.NONE);
            composite.setLayout(new GridLayout(1, false));

            composite.setBackground(background);

            Link link = new Link(composite, SWT.NONE);
            link.setText(SearchMessages.SearchView_empty_search_label);
            link.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
            link.setBackground(background);
            link.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    new OpenSearchDialogAction().run();
                }
            });

            fControl = composite;
        }

        public Control getControl() {
            return fControl;
        }

        public void setFocus() {
            if (fControl != null)
                fControl.setFocus();
        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system2.ui.ISearchResultsPage#setInput(com.nokia.carbide.search.system2.ui.ISearchResult, java.lang.Object)
         */
        public void setInput(ISearchResult search, Object viewState) {
            // do nothing
        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system2.ui.ISearchResultsPage#setViewPart(com.nokia.carbide.search.system2.ui.ISearchResultView)
         */
        public void setViewPart(ISearchResultViewPart part) {
            // do nothing
        }

        public Object getUIState() {
            // empty implementation
            return null;
        }

        public void init(IPageSite pageSite) {
            super.init(pageSite);
            getSite().setSelectionProvider(null);
            // add something to avoid the empty menu
            IMenuManager menuManager = pageSite.getActionBars().getMenuManager();
            menuManager.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, new OpenSearchPreferencesAction());
        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system.ui.ISearchResultPage#saveState(org.eclipse.ui.IMemento)
         */
        public void saveState(IMemento memento) {
            // do nothing

        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system.ui.ISearchResultPage#restoreState(org.eclipse.ui.IMemento)
         */
        public void restoreState(IMemento memento) {
            // do nothing
        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system.ui.ISearchResultPage#setID(java.lang.String)
         */
        public void setID(String id) {
            fId = id;
        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system.ui.ISearchResultPage#getID()
         */
        public String getID() {
            return fId;
        }

        /* (non-Javadoc)
         * @see com.nokia.carbide.search.system.ui.ISearchResultPage#getLabel()
         */
        public String getLabel() {
            return ""; //$NON-NLS-1$
        }
    }

    public SearchView() {
        super();
        fPartsToPages = new HashMap();
        fPagesToParts = new HashMap();
        fSearchViewPageService = new SearchPageRegistry();
        fSearchViewStates = new HashMap();
        fIsPinned = false;
    }

    /**
     * @return the search result page registry
     */
    public SearchPageRegistry getSearchPageRegistry() {
        return fSearchViewPageService;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.PageBookView#partActivated(org.eclipse.ui.IWorkbenchPart)
     */
    public void partActivated(IWorkbenchPart part) {
        super.partActivated(part);
        if (part == this) {
            InternalSearchUI.getInstance().getSearchViewManager().searchViewActivated(this);
        }
    }

    protected IPage createDefaultPage(PageBook book) {
        IPageBookViewPage page = new EmptySearchView();
        page.createControl(book);
        initPage(page);
        DummyPart part = new DummyPart();
        fPartsToPages.put(part, page);
        fPagesToParts.put(page, part);
        fDefaultPart = part;
        return page;
    }

    protected PageRec doCreatePage(IWorkbenchPart part) {
        IPageBookViewPage page = (IPageBookViewPage) fPartsToPages.get(part);
        initPage(page);
        page.createControl(getPageBook());
        PageRec rec = new PageRec(part, page);
        return rec;
    }

    protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
        IPage page = pageRecord.page;
        page.dispose();
        pageRecord.dispose();

        // empty cross-reference cache
        fPartsToPages.remove(part);
    }

    protected IWorkbenchPart getBootstrapPart() {
        return null;
    }

    protected boolean isImportant(IWorkbenchPart part) {
        return part instanceof DummyPart;
    }

    public void showSearchResult(ISearchResult search) {
        ISearchResultPage newPage = null;
        if (search != null) {
            newPage = fSearchViewPageService.findPageForSearchResult(search, true);
            if (newPage == null) {
                String format = SearchMessages.SearchView_error_noResultPage;
                String message = MessageFormat.format(format, new Object[] { search.getClass().getName() });
                SearchPlugin.log(new Status(IStatus.ERROR, SearchPlugin.getID(), 0, message, null));
                return;
            }
        }
        internalShowSearchPage(newPage, search);
    }

    public void showEmptySearchPage(String pageId) {
        ISearchResultPage newPage = fSearchViewPageService.findPageForPageId(pageId, true);
        internalShowSearchPage(newPage, null);
    }

    private void internalShowSearchPage(ISearchResultPage page, ISearchResult search) {
        // detach the previous page.
        ISearchResultPage currentPage = (ISearchResultPage) getCurrentPage();
        if (fCurrentSearch != null && currentPage != null) {
            fSearchViewStates.put(fCurrentSearch, currentPage.getUIState());
            currentPage.setInput(null, null);
        }

        fCurrentSearch = search;

        if (page != null) {
            if (page != currentPage) {
                DummyPart part = (DummyPart) fPagesToParts.get(page);
                if (part == null) {
                    part = new DummyPart();
                    fPagesToParts.put(page, part);
                    fPartsToPages.put(part, page);
                    page.setViewPart(this);
                }
                part.setLastActivation(++fActivationCount);
                partActivated(part);
            }

            // connect to the new pages
            Object uiState = search != null ? fSearchViewStates.get(search) : null;
            page.setInput(search, uiState);
        }
        updatePartName();
        updateLabel();
        updateCancelAction();

        updateHelpContextID(page);

    }

    private void updateHelpContextID(ISearchResultPage page) {
        String helpContextId = null;
        String pageId = null;

        if (page != null)
            pageId = page.getID();

        if (pageId != null)
            helpContextId = fSearchViewPageService.getHelpContextId(pageId);

        if (helpContextId == null)
            helpContextId = ISearchHelpContextIds.New_SEARCH_VIEW;

        PlatformUI.getWorkbench().getHelpSystem().setHelp(fPageContent.getParent(), helpContextId);
    }

    public void updateLabel() {
        ISearchResultPage page = getActivePage();
        String label = ""; //$NON-NLS-1$
        if (page != null) {
            label = page.getLabel();
        }
        if (!fPageContent.isDisposed()) {
            if (label.length() == 0) {
                if (fDescriptionComposite != null) {
                    fDescriptionComposite.dispose();
                    fDescriptionComposite = null;
                    fPageContent.layout();
                }
            } else {
                if (fDescriptionComposite == null) {
                    fDescriptionComposite = new Composite(fPageContent, SWT.NONE);
                    fDescriptionComposite.moveAbove(null);

                    GridLayout layout = new GridLayout();
                    layout.marginHeight = 0;
                    layout.marginWidth = 0;
                    layout.verticalSpacing = 0;
                    fDescriptionComposite.setLayout(layout);
                    fDescriptionComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

                    fDescription = new Link(fDescriptionComposite, SWT.NONE);
                    GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
                    gridData.horizontalIndent = 5;
                    fDescription.setLayoutData(gridData);
                    fDescription.setText(label);

                    Label separator = new Label(fDescriptionComposite, SWT.SEPARATOR | SWT.HORIZONTAL);
                    separator.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
                    fPageContent.layout();
                } else {
                    fDescription.setText(label);
                }
            }
        }
    }

    public ISearchResult getCurrentSearchResult() {
        return fCurrentSearch;
    }

    public void createPartControl(Composite parent) {
        createActions();

        fPageContent = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.horizontalSpacing = 0;
        layout.verticalSpacing = 0;
        fPageContent.setLayout(layout);

        fDescriptionComposite = null;

        super.createPartControl(fPageContent);
        getPageBook().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        fDefaultPartName = getPartName();
        initializeToolBar();
        InternalSearchUI.getInstance().getSearchManager().addQueryListener(this);
        initializePageSwitcher();

        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ISearchHelpContextIds.New_SEARCH_VIEW);
        restorePageFromMemento();
    }

    private void initializePageSwitcher() {
        new PageSwitcher(this) {
            public void activatePage(Object page) {
                ISearchResult searchResult = ((ISearchQuery) page).getSearchResult();
                InternalSearchUI.getInstance().showSearchResult(SearchView.this, searchResult, false);
            }

            public ImageDescriptor getImageDescriptor(Object page) {
                ISearchResult searchResult = ((ISearchQuery) page).getSearchResult();
                return searchResult.getImageDescriptor();
            }

            public String getName(Object page) {
                ISearchResult searchResult = ((ISearchQuery) page).getSearchResult();
                return searchResult.getLabel();
            }

            public Object[] getPages() {
                return NewSearchUI.getQueries();
            }
        };
    }

    private void restorePageFromMemento() {
        if (fPageState != null) {
            int bestActivation = -1;
            IMemento restorePageMemento = null;
            IMemento[] children = fPageState.getChildren(MEMENTO_TYPE);
            for (int i = 0; i < children.length; i++) {
                IMemento pageMemento = children[i];
                if (pageMemento.getString(MEMENTO_KEY_RESTORE) != null) {
                    Integer lastActivation = pageMemento.getInteger(MEMENTO_KEY_LAST_ACTIVATION);
                    if (lastActivation != null && lastActivation.intValue() > bestActivation) {
                        bestActivation = lastActivation.intValue();
                        restorePageMemento = pageMemento;
                    }
                }
            }
            if (restorePageMemento != null) {
                showEmptySearchPage(restorePageMemento.getID());
                String pinned = fPageState.getString(MEMENTO_KEY_IS_PINNED);
                if (String.valueOf(true).equals(pinned)) {
                    setPinned(true);
                    fPinSearchViewAction.update();
                }
            }
        }
    }

    private void initializeToolBar() {
        IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
        createToolBarGroups(tbm);
        tbm.appendToGroup(IContextMenuConstants.GROUP_SEARCH, fSearchAgainAction);
        tbm.appendToGroup(IContextMenuConstants.GROUP_SEARCH, fCancelAction);
        tbm.appendToGroup(IContextMenuConstants.GROUP_SEARCH, fSearchesDropDownAction);
        tbm.appendToGroup(IContextMenuConstants.GROUP_SEARCH, fPinSearchViewAction);
        getViewSite().getActionBars().updateActionBars();
    }

    private void createActions() {
        fSearchesDropDownAction = new SearchHistoryDropDownAction(this);
        fSearchesDropDownAction.updateEnablement();
        fSearchAgainAction = new SearchAgainAction(this);
        fSearchAgainAction.setEnabled(false);
        // hackery to get the shortcut to show up
        fSearchAgainAction.setActionDefinitionId("org.eclipse.ui.file.refresh"); //$NON-NLS-1$
        fCancelAction = new CancelSearchAction(this);
        fCancelAction.setEnabled(false);
        fPinSearchViewAction = new PinSearchViewAction(this);

        IUndoContext workspaceContext = (IUndoContext) ResourcesPlugin.getWorkspace()
                .getAdapter(IUndoContext.class);
        fUndoRedoActionGroup = new UndoRedoActionGroup(getViewSite(), workspaceContext, true);
    }

    public void dispose() {
        if (fUndoRedoActionGroup != null) {
            fUndoRedoActionGroup.dispose();
        }
        InternalSearchUI.getInstance().getSearchViewManager().searchViewClosed(this);
        InternalSearchUI.getInstance().getSearchManager().removeQueryListener(this);
        super.dispose();
    }

    public void queryStarting(ISearchQuery query) {
        if (fCurrentSearch != null && fCurrentSearch.equals(query.getSearchResult())) {
            updateCancelAction();
        }
    }

    public void queryFinished(ISearchQuery query) {
        if (fCurrentSearch != null && fCurrentSearch.equals(query.getSearchResult())) {
            updateCancelAction();
        }
    }

    private void updateCancelAction() {
        ISearchResult result = getCurrentSearchResult();
        boolean queryRunning = false;
        if (result != null) {
            queryRunning = InternalSearchUI.getInstance().isQueryRunning(result.getQuery());
        }
        fCancelAction.setEnabled(queryRunning);
        fSearchAgainAction.setEnabled(!queryRunning && result != null && result.getQuery().canRerun());
    }

    public void queryAdded(ISearchQuery query) {
        fSearchesDropDownAction.updateEnablement();
    }

    public void queryRemoved(ISearchQuery query) {
        InternalSearchUI.getInstance().cancelSearch(query);
        if (query.getSearchResult().equals(fCurrentSearch)) {
            showSearchResult(null);
            partActivated(fDefaultPart);
        }
        fSearchViewStates.remove(query.getSearchResult());
        fSearchesDropDownAction.disposeMenu();
        fSearchesDropDownAction.updateEnablement();
    }

    /* (non-Javadoc)
     * @see com.nokia.carbide.search.system2.ui.ISearchView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
     */
    public void fillContextMenu(IMenuManager menuManager) {
        ISearchResult result = getCurrentSearchResult();
        if (result != null) {
            menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, fSearchAgainAction);
            // first check if we have a selection for the show in mechanism, bugzilla 127718
            IShowInSource showInSource = (IShowInSource) getAdapter(IShowInSource.class);
            if (showInSource != null) {
                ShowInContext context = showInSource.getShowInContext();
                if (context != null) {
                    ISelection sel = context.getSelection();
                    if (sel != null && !sel.isEmpty()) {
                        MenuManager showInSubMenu = new MenuManager(getShowInMenuLabel());
                        showInSubMenu.add(
                                ContributionItemFactory.VIEWS_SHOW_IN.create(getViewSite().getWorkbenchWindow()));
                        menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, showInSubMenu);
                    }
                }
            }
        }
    }

    private String getShowInMenuLabel() {
        String keyBinding = null;

        IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench()
                .getAdapter(IBindingService.class);
        if (bindingService != null)
            keyBinding = bindingService.getBestActiveBindingFormattedFor("org.eclipse.ui.navigate.showInQuickMenu"); //$NON-NLS-1$

        if (keyBinding == null)
            keyBinding = ""; //$NON-NLS-1$

        return NLS.bind(SearchMessages.SearchView_showIn_menu, keyBinding);
    }

    // Methods related to saving page state. -------------------------------------------

    public void saveState(IMemento memento) {
        for (Iterator iter = fPagesToParts.entrySet().iterator(); iter.hasNext();) {
            Map.Entry entry = (Map.Entry) iter.next();
            ISearchResultPage page = (ISearchResultPage) entry.getKey();
            DummyPart part = (DummyPart) entry.getValue();

            IMemento child = memento.createChild(MEMENTO_TYPE, page.getID());
            page.saveState(child);
            child.putInteger(MEMENTO_KEY_LAST_ACTIVATION, part.getLastActivation());
        }
        memento.putString(MEMENTO_KEY_IS_PINNED, String.valueOf(isPinned()));
    }

    public void init(IViewSite site, IMemento memento) throws PartInitException {
        super.init(site, memento);
        IMenuManager menuManager = site.getActionBars().getMenuManager();
        createViewMenuGroups(menuManager);
        fPageState = memento;
        IWorkbenchSiteProgressService progressService = getProgressService();
        if (progressService != null)
            progressService.showBusyForFamily(InternalSearchUI.FAMILY_SEARCH);
    }

    protected void initPage(IPageBookViewPage page) {
        super.initPage(page);
        IActionBars actionBars = page.getSite().getActionBars();
        actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), fSearchAgainAction);
        actionBars.updateActionBars();

        fUndoRedoActionGroup.fillActionBars(actionBars);

        ISearchResultPage srPage = (ISearchResultPage) page;
        IMemento memento = null;
        if (fPageState != null) {
            IMemento[] mementos = fPageState.getChildren(MEMENTO_TYPE);
            for (int i = 0; i < mementos.length; i++) {
                if (mementos[i].getID().equals(srPage.getID())) {
                    memento = mementos[i];
                    break;
                }
            }
        }
        srPage.restoreState(memento);
    }

    /*
     *  TODO workaround for focus problem. Clarify focus behavior.
     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        IPage currentPage = getCurrentPage();
        if (currentPage != null)
            currentPage.setFocus();
        else
            super.setFocus();
    }

    public ISearchResultPage getActivePage() {
        IPage page = getCurrentPage();
        if (page instanceof ISearchResultPage)
            return (ISearchResultPage) page;
        return null;
    }

    public IWorkbenchSiteProgressService getProgressService() {
        IWorkbenchSiteProgressService service = null;
        Object siteService = getSite().getAdapter(IWorkbenchSiteProgressService.class);
        if (siteService != null)
            service = (IWorkbenchSiteProgressService) siteService;
        return service;
    }

    public void showBusy(boolean busy) {
        super.showBusy(busy);
        getProgressService().warnOfContentChange();
    }

    public Object getAdapter(Class adapter) {
        Object superAdapter = super.getAdapter(adapter);
        if (superAdapter != null)
            return superAdapter;
        if (adapter == IShowInSource.class) {
            return new IShowInSource() {
                public ShowInContext getShowInContext() {
                    return new ShowInContext(null, getSelectionProvider().getSelection());
                }
            };
        }
        return null;
    }

    /**
     * Marks the view as pinned. 
     * 
     * @param pinned if <code>true</code> the view is marked as pinned 
     */
    public void setPinned(boolean pinned) {
        fIsPinned = pinned;
    }

    /**
     * @return returns <code>true</code> the view is marked as pinned 
     */
    public boolean isPinned() {
        return fIsPinned;
    }

    public void updatePartName() {
        if (fDefaultPartName != null) {
            // mstodo not yet enabled.
            //         String partName= null;
            //         ISearchResultPage page= getActivePage();
            //         if (page != null && isPinned()) {
            //            partName= getSearchPageRegistry().findLabelForPageId(page.getID());
            //         }
            //         setPartName(partName != null ? partName : fDefaultPartName);
        }
    }
}