/*******************************************************************************
 * Copyright (c) 2000, 2012 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.eclipse.search2.internal.ui;

import java.util.Iterator;
import java.util.LinkedList;

import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;

import org.eclipse.search.internal.ui.SearchPlugin;
import org.eclipse.search.internal.ui.SearchPreferencePage;
import org.eclipse.search.internal.ui.util.ExceptionHandler;
import org.eclipse.search.ui.IQueryListener;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.ISearchResultViewPart;
import org.eclipse.search.ui.NewSearchUI;

/**
 *
 */
public class SearchViewManager {

	private IQueryListener fNewQueryListener;
	private int fViewCount= 0;

	private LinkedList<SearchView> fLRUSearchViews;


	public SearchViewManager(QueryManager queryManager) {
		fNewQueryListener= new IQueryListener() {

			@Override
			public void queryAdded(ISearchQuery query) {
				showNewSearchQuery(query);
			}

			@Override
			public void queryRemoved(ISearchQuery query) {}
			@Override
			public void queryStarting(ISearchQuery query) {}
			@Override
			public void queryFinished(ISearchQuery query) {}

		};

		queryManager.addQueryListener(fNewQueryListener);

		fLRUSearchViews= new LinkedList<>();

	}

	public void dispose(QueryManager queryManager) {
		queryManager.removeQueryListener(fNewQueryListener);
	}


	protected boolean showNewSearchQuery(ISearchQuery query) {
		if (!fLRUSearchViews.isEmpty()) {
			SearchView view= fLRUSearchViews.getFirst();
			view.showSearchResult(query.getSearchResult());
			return true;
		}
		return false;
	}

	public ISearchResultViewPart activateSearchView(boolean avoidPinnedViews) {
		return activateSearchView(avoidPinnedViews, false);
	}

	public ISearchResultViewPart activateSearchView(boolean avoidPinnedViews, boolean openInNew) {
		IWorkbenchPage activePage= SearchPlugin.getActivePage();

		String defaultPerspectiveId= NewSearchUI.getDefaultPerspectiveId();
		if (defaultPerspectiveId != null) {
			IWorkbenchWindow window= activePage.getWorkbenchWindow();
			if (window != null && window.getShell() != null && !window.getShell().isDisposed()) {
				try {
					activePage= PlatformUI.getWorkbench().showPerspective(defaultPerspectiveId, window);
				} catch (WorkbenchException ex) {
					// show view in current perspective
				}
			}
		}
		if (activePage != null) {
			try {
				ISearchResultViewPart viewPart= null;
				if (!openInNew) {
					viewPart= findLRUSearchResultView(activePage, avoidPinnedViews);
				}
				String secondaryId= null;
				if (viewPart == null) {
					if (activePage.findViewReference(NewSearchUI.SEARCH_VIEW_ID) != null)
						secondaryId= String.valueOf(++fViewCount); // avoid a secondary ID because of bug 125315
				} else if (!SearchPreferencePage.isViewBroughtToFront())
					return viewPart;
				else
					secondaryId= viewPart.getViewSite().getSecondaryId();

				return (ISearchResultViewPart) activePage.showView(NewSearchUI.SEARCH_VIEW_ID, secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
			} catch (PartInitException ex) {
				ExceptionHandler.handle(ex, SearchMessages.Search_Error_openResultView_title, SearchMessages.Search_Error_openResultView_message);
			}
		}
		return null;
	}

	public boolean isShown(ISearchQuery query) {
		for (Iterator<SearchView> iter= fLRUSearchViews.iterator(); iter.hasNext();) {
			SearchView view= iter.next();
			ISearchResult currentSearchResult= view.getCurrentSearchResult();
			if (currentSearchResult != null && query == currentSearchResult.getQuery()) {
				return true;
			}
		}
		return false;
	}

	public void activateSearchView(ISearchResultViewPart viewPart) {
		try {
			IWorkbenchPage activePage= viewPart.getSite().getPage();
			String secondaryId= viewPart.getViewSite().getSecondaryId();
			activePage.showView(NewSearchUI.SEARCH_VIEW_ID, secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
		} catch (PartInitException ex) {
			ExceptionHandler.handle(ex, SearchMessages.Search_Error_openResultView_title, SearchMessages.Search_Error_openResultView_message);
		}
	}

	private ISearchResultViewPart findLRUSearchResultView(IWorkbenchPage page, boolean avoidPinnedViews) {
		boolean viewFoundInPage= false;
		for (Iterator<SearchView> iter= fLRUSearchViews.iterator(); iter.hasNext();) {
			SearchView view= iter.next();
			if (page.equals(view.getSite().getPage())) {
				if (!avoidPinnedViews || !view.isPinned()) {
					return view;
				}
				viewFoundInPage= true;
			}
		}
		if (!viewFoundInPage) {
			// find unresolved views
			IViewReference[] viewReferences= page.getViewReferences();
			for (int i= 0; i < viewReferences.length; i++) {
				IViewReference curr= viewReferences[i];
				if (NewSearchUI.SEARCH_VIEW_ID.equals(curr.getId()) && page.equals(curr.getPage())) {
					SearchView view= (SearchView) curr.getView(true);
					if (view != null && (!avoidPinnedViews || !view.isPinned())) {
						return view;
					}

				}
			}
		}
		return null;
	}


	public void searchViewActivated(SearchView view) {
		fLRUSearchViews.remove(view);
		fLRUSearchViews.addFirst(view);
	}

	public void searchViewClosed(SearchView view) {
		fLRUSearchViews.remove(view);
	}

	public ISearchResultViewPart getActiveSearchView() {
		IWorkbenchPage activePage= SearchPlugin.getActivePage();
		if (activePage != null) {
			return findLRUSearchResultView(activePage, false);
		}
		return null;
	}





}
