//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.search.ui;

import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.search.ui.internal.MethodSearchInput;
import org.eclipse.epf.search.ui.internal.MethodSearchQuery;
import org.eclipse.epf.search.ui.internal.MethodSearchScope;
import org.eclipse.epf.search.ui.internal.MethodSearchScopeViewer;
import org.eclipse.epf.search.ui.preferences.SearchUIPreferences;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.search.ui.ISearchPage;
import org.eclipse.search.ui.ISearchPageContainer;
import org.eclipse.search.ui.NewSearchUI;
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.Group;
import org.eclipse.swt.widgets.Label;

/**
 * Displays the Method Search page in the Search dialog.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
public class MethodSearchPage extends DialogPage implements ISearchPage {

	public static final String SEARCH_PAGE_ID = MethodSearchPage.class
			.getName();

	private Combo searchStringCombo;

	private Combo namePatternCombo;

	private Button caseSensitiveCheckbox;

	private MethodSearchScopeViewer searchScopeViewer;

	private ISearchPageContainer container;

	/**
	 * Creates a new instance.
	 */
	public MethodSearchPage() {
		super();
	}

	/**
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
	 */
	public void createControl(Composite parent) {
		initializeDialogUnits(parent);

		Composite composite = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout(2, false);
		layout.horizontalSpacing = 10;
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		Label searchStringLabel = new Label(composite, SWT.NONE);
		searchStringLabel.setText(SearchUIResources.searchStringLabel_text); 

		new Label(composite, SWT.NONE);

		searchStringCombo = new Combo(composite, SWT.NONE);
		searchStringCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		String savedSearchString = SearchUIPreferences.getSearchString();
		if (savedSearchString != null && savedSearchString.length() > 0) {
			searchStringCombo.setText(savedSearchString);
		}

		caseSensitiveCheckbox = new Button(composite, SWT.CHECK);
		caseSensitiveCheckbox.setText(SearchUIResources.caseSensitiveCheckbox_text); 
		caseSensitiveCheckbox.setSelection(SearchUIPreferences
				.getCaseSensitive());

		Label elementNameLabel = new Label(composite, SWT.NONE);
		elementNameLabel.setText(SearchUIResources.elementNameLabel_text); 

		new Label(composite, SWT.NONE);

		namePatternCombo = new Combo(composite, SWT.NONE);
		namePatternCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		String savedNamePattern = SearchUIPreferences.getNamePattern();
		if (savedNamePattern != null && savedNamePattern.length() > 0) {
			namePatternCombo.setText(savedNamePattern);
		} else {
			namePatternCombo.setText("*"); //$NON-NLS-1$
		}

		namePatternCombo.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				container.setPerformActionEnabled(getSearchButtonEnabled());
			}
		});
		namePatternCombo.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent event) {
				container.setPerformActionEnabled(getSearchButtonEnabled());
			}
		});

		new Label(composite, SWT.NONE);

		Group searchScopeGroup = new Group(composite, SWT.NONE);
		searchScopeGroup.setLayout(new GridLayout(1, false));
		GridData searchScopeGroupGridData = new GridData(GridData.FILL_BOTH);
		searchScopeGroupGridData.heightHint = 200;
		searchScopeGroup.setLayoutData(searchScopeGroupGridData);
		searchScopeGroup.setText(SearchUIResources.scopeGroup_text); 

		searchScopeViewer = new MethodSearchScopeViewer(searchScopeGroup,
				SWT.NONE);

		container.setPerformActionEnabled(getSearchButtonEnabled());

		setControl(composite);
		Dialog.applyDialogFont(composite);
	}

	/**
	 * @see org.eclipse.search.ui.ISearchPage#performAction()
	 */
	public boolean performAction() {
		MethodLibrary library = LibraryService.getInstance().getCurrentMethodLibrary();
		if (library == null) {
			SearchUIPlugin.getDefault().getMsgDialog().displayError(
					SearchUIResources.searchError_title, 
					SearchUIResources.searchError_msg, 
					SearchUIResources.searchError_reason); 
			return false;
		}
		String searchString = searchStringCombo.getText();
		String namePattern = namePatternCombo.getText();
		MethodSearchScope searchScope = searchScopeViewer.getSearchScope();
		MethodSearchInput searchInput = new MethodSearchInput(searchString,
				namePattern, caseSensitiveCheckbox.getSelection(), false,
				false, searchScope);
		MethodSearchQuery searchQuery = new MethodSearchQuery(searchInput);
		NewSearchUI.activateSearchResultView();
		NewSearchUI.runQueryInBackground(searchQuery);
		SearchUIPreferences.setSearchString(searchStringCombo.getText());
		SearchUIPreferences.setNamePattern(namePatternCombo.getText());
		SearchUIPreferences.setCaseSensitive(caseSensitiveCheckbox
				.getSelection());
		return true;
	}

	/**
	 * @see org.eclipse.search.ui.ISearchPage#setContainer(ISearchPageContainer)
	 */
	public void setContainer(ISearchPageContainer container) {
		this.container = container;
	}

	/**
	 * @see org.eclipse.search.ui.IReplacePage#performReplace()
	 */
	public boolean performReplace() {
		return true;
	}

	/**
	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
	 */
	public void dispose() {
		super.dispose();
	}

	/**
	 * Gets the enabled status of the Search button.
	 * 
	 * @return <code>true<code> if the Search button should be enabled
	 */
	private boolean getSearchButtonEnabled() {
		return namePatternCombo.getText().trim().length() > 0;
	}

}
