/*******************************************************************************
 * Copyright (c) 2005 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;

import java.io.UnsupportedEncodingException;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.internal.ui.DebugUIMessages;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.internal.help.WorkbenchHelpSystem;


/**
 * Dialog to allow user to change code page preference
 * @since 3.1
 */
public class CodePagesPrefDialog extends Dialog {

	private Text fAsciiCodePage;
	private Text fEbcdicCodePage;
	
	/**
	 * @param parentShell
	 */
	public CodePagesPrefDialog(Shell parentShell) {
		super(parentShell);
		setShellStyle(getShellStyle() | SWT.RESIZE);
		WorkbenchHelpSystem.getInstance().setHelp(parentShell, DebugUIPlugin.getUniqueIdentifier() + ".CodePagesPrefDialog_context"); //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
	 */
	protected Control createDialogArea(Composite parent) {
	
		getShell().setText(DebugUIMessages.CodePagesPrefDialog_1); //$NON-NLS-1$
		setShellStyle(SWT.RESIZE);
		
		Composite canvas = new Composite(parent, SWT.NONE);
		canvas.setLayout(new GridLayout(2, false));
		GridData spec2= new GridData();
		spec2.grabExcessVerticalSpace= true;
		spec2.grabExcessHorizontalSpace= true;
		spec2.horizontalAlignment= GridData.FILL;
		spec2.verticalAlignment= GridData.CENTER;
		canvas.setLayoutData(spec2);

		Label textLabel = new Label(canvas, SWT.WRAP);
		textLabel.setText(DebugUIMessages.CodePagesPrefDialog_2); //$NON-NLS-1$
		GridData textLayout = new GridData();
		textLayout.widthHint = 280;
		textLayout.horizontalSpan = 2;
		textLabel.setLayoutData(textLayout);
		
		fAsciiCodePage = new Text(canvas, SWT.BORDER);
		GridData asciispec= new GridData();
		asciispec.grabExcessVerticalSpace= false;
		asciispec.grabExcessHorizontalSpace= true;
		asciispec.horizontalAlignment= GridData.FILL;
		asciispec.verticalAlignment= GridData.BEGINNING;
		asciispec.horizontalSpan = 1;
		fAsciiCodePage.setLayoutData(asciispec);
		
		String codepage = DebugUITools.getPreferenceStore().getString(IDebugUIConstants.PREF_DEFAULT_ASCII_CODE_PAGE);
		if (codepage == null || codepage.length() == 0)
			codepage = IDebugPreferenceConstants.DEFAULT_ASCII_CP; //$NON-NLS-1$
		fAsciiCodePage.setText(codepage);
		
		Label ebcdicLabel = new Label(canvas, SWT.WRAP);
		ebcdicLabel.setText(DebugUIMessages.CodePagesPrefDialog_4); //$NON-NLS-1$
		GridData ebcdicLayout = new GridData();
		ebcdicLayout.widthHint = 280;
		ebcdicLayout.horizontalSpan = 2;
		ebcdicLabel.setLayoutData(ebcdicLayout);
		
		fEbcdicCodePage = new Text(canvas, SWT.BORDER);
		GridData ebcdicspec= new GridData();
		ebcdicspec.grabExcessVerticalSpace= false;
		ebcdicspec.grabExcessHorizontalSpace= true;
		ebcdicspec.horizontalAlignment= GridData.FILL;
		ebcdicspec.verticalAlignment= GridData.BEGINNING;
		ebcdicspec.horizontalSpan = 1;
		fAsciiCodePage.setLayoutData(ebcdicspec);		
		fEbcdicCodePage.setLayoutData(asciispec);

		codepage = DebugUITools.getPreferenceStore().getString(IDebugUIConstants.PREF_DEFAULT_EBCDIC_CODE_PAGE);
		fEbcdicCodePage.setText(codepage);
		
		if (codepage == null || codepage.length() == 0)
			codepage = IDebugPreferenceConstants.DEFAULT_EBCDIC_CP; //$NON-NLS-1$	
		
		return canvas;
	}
	protected void okPressed() {

		// check that the codepages are supported
		String asciiCodePage = fAsciiCodePage.getText();
		asciiCodePage = asciiCodePage.trim();
		try {
			new String(new byte[]{1}, asciiCodePage);
		} catch (UnsupportedEncodingException e) {
			Shell shell = DebugUIPlugin.getShell();
			if (shell != null)
			{
				IStatus status = DebugUIPlugin.newErrorStatus(DebugUIMessages.CodePagesPrefDialog_0, e); //$NON-NLS-1$
				ErrorDialog.openError(shell, DebugUIMessages.CodePagesPrefDialog_6,  DebugUIMessages.CodePagesPrefDialog_7, status);		 //$NON-NLS-1$ //$NON-NLS-2$
			}
			return;
		}
		
		String ebcdicCodePage = fEbcdicCodePage.getText();
		ebcdicCodePage = ebcdicCodePage.trim();
		try {
			new String(new byte[]{1}, ebcdicCodePage);
		} catch (UnsupportedEncodingException e) {
			Shell shell = DebugUIPlugin.getShell();
			if (shell != null)
			{
				IStatus status = DebugUIPlugin.newErrorStatus(DebugUIMessages.CodePagesPrefDialog_0, e); //$NON-NLS-1$
				ErrorDialog.openError(shell, DebugUIMessages.CodePagesPrefDialog_8,  DebugUIMessages.CodePagesPrefDialog_9, status);		 //$NON-NLS-1$ //$NON-NLS-2$
			}
			return;
		}
		
		IPreferenceStore store = DebugUITools.getPreferenceStore();
		store.setValue(IDebugUIConstants.PREF_DEFAULT_ASCII_CODE_PAGE, asciiCodePage);
		store.setValue(IDebugUIConstants.PREF_DEFAULT_EBCDIC_CODE_PAGE, ebcdicCodePage);
		
		super.okPressed();
	}
	
	/**
	 * @param shell
	 */
	
	protected void createButtonsForButtonBar(Composite parent) {
		Button defaultButton = createButton(parent, 3, DebugUIMessages.CodePagesPrefDialog_13, false); //$NON-NLS-1$
		defaultButton.addSelectionListener(new SelectionAdapter() {

			public void widgetSelected(SelectionEvent e) {
				String defaultASCII = IDebugPreferenceConstants.DEFAULT_ASCII_CP;
				fAsciiCodePage.setText(defaultASCII);
				String defaulgEBCDIC = IDebugPreferenceConstants.DEFAULT_EBCDIC_CP;
				fEbcdicCodePage.setText(defaulgEBCDIC);
			}});
		super.createButtonsForButtonBar(parent);
	}
}
