/*******************************************************************************
 * Copyright (c) 2010, 2016 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.help.ui.internal.views;

import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;


public class LocalScopeDialog extends TrayDialog {

	private static final String ORG_ECLIPSE_HELP_UI_LOCAL_SEARCH = "org.eclipse.help.ui.localSearch"; //$NON-NLS-1$
	private EngineDescriptorManager descManager;
	private IPreferenceStore preferenceStore;
	private PreferencePage localHelpPage;
	private ScopeSet scopeSet;

	public LocalScopeDialog(Shell parentShell, PreferenceManager manager, EngineDescriptorManager descManager,
			ScopeSet set) {
		super(parentShell);
		this.descManager = descManager;
		this.preferenceStore = set.getPreferenceStore();
		this.scopeSet = set;
	}

	@Override
	protected boolean isResizable() {
		return true;
	}

	@Override
	protected Control createDialogArea(Composite parent) {
		EngineDescriptor localSearchDesc = null;
		for (int i = 0; localSearchDesc == null && i < descManager.getDescriptors().length; i++) {
			if (ORG_ECLIPSE_HELP_UI_LOCAL_SEARCH.equals(descManager.getDescriptors()[i].getEngineTypeId())) {
				localSearchDesc = descManager.getDescriptors()[i];
			}
		}
		String id = localSearchDesc.getEngineTypeId();
		localHelpPage = localSearchDesc.createRootPage(scopeSet.getName());
    	localHelpPage.setTitle(localSearchDesc.getLabel() + '_' + id);
    	localHelpPage.setImageDescriptor(localSearchDesc.getImageDescriptor());
    	localHelpPage.setDescription(localSearchDesc.getDescription());
    	localHelpPage.setPreferenceStore(preferenceStore);
    	localHelpPage.createControl(parent);
		Control helpPageControl = localHelpPage.getControl();
		GridData layoutData = new GridData(GridData.FILL_BOTH);
		helpPageControl.setLayoutData(layoutData);
		return helpPageControl;
	}

	@Override
	protected void okPressed() {
		localHelpPage.performOk();
		super.okPressed();
	}

}
