/*******************************************************************************
 * Copyright (c) 2010 University of Illinois. 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:
 * 	Albert L. Rossi (NCSA) - design and implementation
 *                           added readOnly option 05/11/2010
 *                         - modified (09/14/2010) to use non-nls interface
 ******************************************************************************/
package org.eclipse.ptp.rm.jaxb.ui.dialogs;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
import org.eclipse.ptp.rm.jaxb.ui.util.WidgetBuilderUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * Displays text contents for editing/saving. Note: the font hint used is
 * Courier, which should be available on Mac, Windows and Linux platforms. More
 * lightweight than a full-blown text editor.
 * 
 * @author arossi
 */
public class ScrollingEditableMessageDialog extends MessageDialog implements IJAXBUINonNLSConstants {
	public static final int DEFAULT_INDEX = 0;
	public static final String[] DEFAULT_LABELS = { Messages.DialogClose };

	protected Button okButton;
	protected boolean readOnly;
	protected Text scrollable;
	protected String title;
	protected String value;

	/**
	 * @param parentShell
	 * @param name
	 *            message label for text
	 * @param value
	 *            initial text value
	 */
	public ScrollingEditableMessageDialog(Shell parentShell, String name, String value) {
		this(parentShell, name, value, false);
	}

	/**
	 * @param parentShell
	 * @param name
	 *            message label for text
	 * @param value
	 *            initial text value
	 * @param readOnly
	 *            if the text box if read only
	 */
	public ScrollingEditableMessageDialog(Shell parentShell, String name, String value, boolean readOnly) {
		this(parentShell, name, value, name, null, MessageDialog.NONE, DEFAULT_LABELS, DEFAULT_INDEX);
		this.readOnly = readOnly;
	}

	/**
	 * @param parentShell
	 * @param name
	 *            message label for text
	 * @param value
	 *            initial text value
	 * @param dialogTitle
	 * @param dialogTitleImage
	 * @param dialogImageType
	 * @param dialogButtonLabels
	 * @param defaultIndex
	 */
	public ScrollingEditableMessageDialog(Shell parentShell, String name, String value, String dialogTitle, Image dialogTitleImage,
			int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
		super(parentShell, dialogTitle, dialogTitleImage, name, dialogImageType, dialogButtonLabels, defaultIndex);
		this.value = value;
		readOnly = false;
	}

	/**
	 * The entered value.
	 */
	public String getValue() {
		return value;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.MessageDialog#open()
	 */
	@Override
	public int open() {
		createDialogArea(getParentShell());
		return super.open();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.MessageDialog#buttonPressed(int)
	 */
	@Override
	protected void buttonPressed(int buttonId) {
		if (buttonId == IDialogConstants.OK_ID) {
			value = scrollable.getText();
		} else {
			value = null;
		}
		super.buttonPressed(buttonId);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.dialogs.MessageDialog#configureShell(org.eclipse.swt
	 * .widgets.Shell)
	 */
	@Override
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		if (title != null) {
			shell.setText(title);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.dialogs.MessageDialog#createButtonsForButtonBar(org
	 * .eclipse.swt.widgets.Composite)
	 */
	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		// create OK and Cancel buttons by default
		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
		// do this here because setting the text will also set enablement on the
		// OK button
		scrollable.setFocus();
		if (value != null) {
			scrollable.setText(value);
			scrollable.selectAll();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.dialogs.MessageDialog#createDialogArea(org.eclipse.
	 * swt.widgets.Composite)
	 */
	@Override
	protected Control createDialogArea(Composite parent) {
		Control c = super.createDialogArea(parent);
		GridData data = WidgetBuilderUtils.createGridDataFill(convertWidthInCharsToPixels(160), 550, 1);
		scrollable = WidgetBuilderUtils.createText(parent, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL, data,
				readOnly, null);
		WidgetBuilderUtils.applyMonospace(scrollable);
		return c;
	}
}
