/*******************************************************************************
 * Copyright (c) 2005, 2007 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.debug.internal.ui.views.memory.renderings;

import org.eclipse.debug.internal.ui.DebugUIMessages;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.ui.PlatformUI;

public class TableRenderingPreferencePage extends PreferencePage implements
	IPropertyChangeListener, SelectionListener{

	private Button fAuto;
	private Button fManual;
	private IntegerFieldEditor fPreBufferSize;
	private IntegerFieldEditor fPostBufferSize;
	private IntegerFieldEditor fPageSize;
	private Group fGroup;
	private Composite fComposite;
	
	
	public TableRenderingPreferencePage(String title) {
		super(title);
	}

	protected Control createContents(Composite parent) {

		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".table_renderings_preference_page_context"); //$NON-NLS-1$
		
		fComposite = new Composite(parent, SWT.NONE);
		fComposite.setLayout(new GridLayout());
		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
		fComposite.setLayoutData(data); 

		GridData hspanData = new GridData(SWT.FILL, SWT.FILL, true, false);
		hspanData.horizontalSpan = 2;
		
		SWTFactory.createWrapLabel(fComposite, DebugUIMessages.TableRenderingPreferencePage_10, 2, 300);
		
		fAuto = new Button(fComposite, SWT.RADIO);
		fAuto.setText(DebugUIMessages.TableRenderingPreferencePage_0);
		fAuto.setLayoutData(hspanData);
		
		fGroup = new Group(fComposite, SWT.NONE);
		fGroup.setText(DebugUIMessages.TableRenderingPreferencePage_5);
		GridData groupData = new GridData(SWT.FILL, SWT.FILL, true, false);
		groupData.horizontalSpan = 2;
		fGroup.setLayoutData(groupData);
		fPreBufferSize = new IntegerFieldEditor(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PRE_BUFFER_SIZE, DebugUIMessages.TableRenderingPreferencePage_6, fGroup);
		fPreBufferSize.setPreferenceStore(getPreferenceStore());
		fPreBufferSize.load();
		fPostBufferSize = new IntegerFieldEditor(IDebugPreferenceConstants.PREF_TABLE_RENDERING_POST_BUFFER_SIZE, DebugUIMessages.TableRenderingPreferencePage_7, fGroup);
		fPostBufferSize.setPreferenceStore(getPreferenceStore());
		fPostBufferSize.load();
		
		fManual = new Button(fComposite, SWT.RADIO);
		fManual.setText(DebugUIMessages.TableRenderingPreferencePage_8);
		fManual.setLayoutData(hspanData);
		
		fPageSize = new IntegerFieldEditor(IDebugPreferenceConstants.PREF_TABLE_RENDERING_PAGE_SIZE, DebugUIMessages.TableRenderingPreferencePage_2, fComposite);
		fPageSize.setPreferenceStore(getPreferenceStore());
		fPageSize.load();
		
		fPreBufferSize.setPropertyChangeListener(this);
		fPostBufferSize.setPropertyChangeListener(this);
		fPageSize.setPropertyChangeListener(this);
		
		fAuto.addSelectionListener(this);
		fManual.addSelectionListener(this);
		
		loadLoadingModeFromPreference();
		updateTextEditorsEnablement();
		
		return fComposite;
	}

	/**
	 * 
	 */
	private void loadLoadingModeFromPreference() {
		boolean isAuto = getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
		fAuto.setSelection(isAuto);
		fManual.setSelection(!isAuto);
	}

	public void propertyChange(PropertyChangeEvent event) {
		if (event.getProperty().equals(FieldEditor.VALUE))
		{
			if (event.getSource().equals(fPageSize) ||
				event.getSource().equals(fPostBufferSize) ||
				event.getSource().equals(fPreBufferSize))
			{
				validatePageSize();
			}
		}
		
	}
	
	private void validatePageSize() {
		boolean autoLoad = fAuto.getSelection();
		try {
			int bufferSize = fPageSize.getIntValue();
			int preBuffer = fPreBufferSize.getIntValue();
			int postBuffer = fPostBufferSize.getIntValue();
			if (!autoLoad && bufferSize < 1)
			{
				setValid(false);
				setErrorMessage(DebugUIMessages.TableRenderingPreferencePage_3);
			}
			else if (autoLoad)
			{
				// For auto load mode, we must have have > 1 buffer size
				// otherwise, the rendering cannot be loaded dynamically
				
				if (preBuffer < 1 || postBuffer < 1)
				{
					setValid(false);
					setErrorMessage(DebugUIMessages.TableRenderingPreferencePage_9);
				}
				else
				{
					setValid(true);
					setErrorMessage(null);
				}
			}
			else
			{
				setValid(true);
				setErrorMessage(null);
				
			}
		} catch (NumberFormatException e) {
				setValid(false);
				setErrorMessage(DebugUIMessages.TableRenderingPreferencePage_4);
		}
	}
	
	protected IPreferenceStore doGetPreferenceStore() {
		return DebugUIPlugin.getDefault().getPreferenceStore();
	}
	
	public void dispose() {
		fAuto.removeSelectionListener(this);
		fManual.removeSelectionListener(this);
		fPageSize.setPropertyChangeListener(null);
		fPreBufferSize.setPropertyChangeListener(null);
		fPostBufferSize.setPropertyChangeListener(null);
		super.dispose();
	}

	public void widgetDefaultSelected(SelectionEvent e) {
		// do nothing
	}

	public void widgetSelected(SelectionEvent e) {
		updateTextEditorsEnablement();
	}
	
	public boolean performOk() {
		boolean auto = fAuto.getSelection();
		boolean currentValue = getPreferenceStore().getBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
		if (auto != currentValue)
			getPreferenceStore().setValue(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM, auto);
		
		fPageSize.store();
		fPreBufferSize.store();
		fPostBufferSize.store();
		return super.performOk();
	}
	
	protected void performDefaults() {
		
		boolean auto = getPreferenceStore().getDefaultBoolean(IDebugPreferenceConstants.PREF_DYNAMIC_LOAD_MEM);
		fAuto.setSelection(auto);
		fManual.setSelection(!auto);
		updateTextEditorsEnablement();
		
		fPageSize.loadDefault();
		fPreBufferSize.loadDefault();
		fPostBufferSize.loadDefault();
		super.performDefaults();
	}

	/**
	 * 
	 */
	private void updateTextEditorsEnablement() {
		boolean auto = fAuto.getSelection();
		fPreBufferSize.setEnabled(auto, fGroup);
		fPostBufferSize.setEnabled(auto, fGroup);
		fPageSize.setEnabled(!auto, fComposite);
	}
}
