/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.internal.ui.preferences;


import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.help.WorkbenchHelp;

/**
 * Preference page to manage launch history & favorites
 */
public class LaunchHistoryPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
	
	private IntegerFieldEditor fHistoryMaxEditor;
	/**
	 * History tabs.
	 */
	protected LaunchHistoryPreferenceTab[] fTabs;
		
	protected Control createContents(Composite parent) {
		Font font= parent.getFont();
		initializeDialogUnits(parent);
		Composite composite = new Composite(parent, SWT.NULL);
		GridLayout layout = new GridLayout();
		layout.marginWidth = 0;
		layout.marginHeight = 0;
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
		
		fHistoryMaxEditor = new IntegerFieldEditor(IDebugUIConstants.PREF_MAX_HISTORY_SIZE, DebugPreferencesMessages.getString("LaunchHistoryPreferencePage.Maximum_launch_history_size_1"), composite); //$NON-NLS-1$
		int historyMax = IDebugPreferenceConstants.MAX_LAUNCH_HISTORY_SIZE;
		fHistoryMaxEditor.setPreferenceStore(DebugUIPlugin.getDefault().getPreferenceStore());
		fHistoryMaxEditor.setPreferencePage(this);
		fHistoryMaxEditor.setTextLimit(Integer.toString(historyMax).length());
		fHistoryMaxEditor.setErrorMessage(MessageFormat.format(DebugPreferencesMessages.getString("LaunchHistoryPreferencePage.The_size_of_the_launch_history_should_be_between_{0}_and_{1}_1"), new Object[] { new Integer(1), new Integer(historyMax)})); //$NON-NLS-1$
		fHistoryMaxEditor.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
		fHistoryMaxEditor.setValidRange(1, historyMax);
		fHistoryMaxEditor.load();
		fHistoryMaxEditor.getTextControl(composite).setFont(font);
		fHistoryMaxEditor.getLabelControl(composite).setFont(font);
		
		fHistoryMaxEditor.setPropertyChangeListener(new IPropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent event) {
				if (event.getProperty().equals(FieldEditor.IS_VALID)) 
					setValid(fHistoryMaxEditor.isValid());
			}
		});
		fHistoryMaxEditor.fillIntoGrid(composite, 2);

		TabFolder tabFolder = new TabFolder(composite, SWT.NONE);
		GridData gd = new GridData(GridData.FILL_BOTH);
		gd.horizontalSpan= 2;
		tabFolder.setLayoutData(gd);
		tabFolder.setFont(font);
		
		// create tabs (debug and run first) 
		LaunchConfigurationManager manager = DebugUIPlugin.getDefault().getLaunchConfigurationManager();
		LaunchGroupExtension[] groups = manager.getLaunchGroups();
		List tabList = new ArrayList();
		LaunchHistory history = manager.getLaunchHistory(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
		tabList.add(createTab(history, tabFolder));
		history = manager.getLaunchHistory(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
		tabList.add(createTab(history, tabFolder));
		
		// create other tabs
		for (int i = 0; i < groups.length; i++) {
			LaunchGroupExtension extension = groups[i];
			String id = extension.getIdentifier();
			if (!(id.equals(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP) || id.equals(IDebugUIConstants.ID_RUN_LAUNCH_GROUP))) {
				history = manager.getLaunchHistory(id);
				if (history != null) {
					tabList.add(createTab(history, tabFolder));
				}
			}
		}				
		fTabs = (LaunchHistoryPreferenceTab[])tabList.toArray(new LaunchHistoryPreferenceTab[tabList.size()]);
		return composite;
	}
	
	protected LaunchHistoryPreferenceTab createTab(LaunchHistory history, TabFolder tabFolder) {
		TabItem tab = new TabItem(tabFolder, SWT.NONE);
		tab.setText(history.getLaunchGroup().getLabel());
		ImageDescriptor descriptor = history.getLaunchGroup().getImageDescriptor();
		Image image = null;
		if (descriptor != null) {
			image = descriptor.createImage();
			tab.setImage(image);
		}
		LaunchHistoryPreferenceTab prefTab = new LaunchHistoryPreferenceTab(history, this);
		prefTab.setImage(image);
		tab.setControl(prefTab.createControl(tabFolder));	
		return prefTab;	
	}
	
	/**
	 * @see IWorkbenchPreferencePage#init(IWorkbench)
	 */
	public void init(IWorkbench workbench) {
		setDescription(DebugPreferencesMessages.getString("LaunchHistoryPreferencePage.description")); //$NON-NLS-1$
	}

	/**
	 * @see PreferencePage#performOk()
	 */
	public boolean performOk() {
		
		for (int i = 0; i < fTabs.length; i++) {
			LaunchHistoryPreferenceTab tab = fTabs[i];
			tab.performOK();
		}
		
		if (fHistoryMaxEditor.getIntValue() != fHistoryMaxEditor.getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_HISTORY_SIZE)) {
			fHistoryMaxEditor.store();
			LaunchHistory.launchHistoryChanged();
		}		
		
		DebugUIPlugin.getDefault().savePluginPreferences();
		return true;
	}
	
	/**
	 * @see PreferencePage#performDefaults()
	 */
	protected void performDefaults() {
		for (int i = 0; i < fTabs.length; i++) {
			LaunchHistoryPreferenceTab tab = fTabs[i];
			tab.performDefaults();
		}
		fHistoryMaxEditor.loadDefault();
		super.performDefaults();
	}
	
	/**
	 * @see IDialogPage#createControl(Composite)
	 */
	public void createControl(Composite parent) {
		super.createControl(parent);
		WorkbenchHelp.setHelp(getControl(), IDebugHelpContextIds.LAUNCH_HISTORY_PREFERENCE_PAGE);
	}

	/**
	 * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
	 */
	public void dispose() {
		super.dispose();
		for (int i = 0; i < fTabs.length; i++) {
			LaunchHistoryPreferenceTab tab = fTabs[i];
			tab.dispose();
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.DialogPage#setButtonLayoutData(org.eclipse.swt.widgets.Button)
	 */
	protected GridData setButtonLayoutData(Button button) {
		//exists here for package visibility
		return super.setButtonLayoutData(button);
	}
}
