/*******************************************************************************
 * 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 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.swt.examples.addressbook;


/* Imports */
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import java.util.ResourceBundle;

/**
 * DataEntryDialog class uses <code>org.eclipse.swt</code> 
 * libraries to implement a dialog that accepts basic personal information that
 * is added to a <code>Table</code> widget or edits a <code>TableItem</code> entry 
 * to represent the entered data.
 */
public class DataEntryDialog {

	private static ResourceBundle resAddressBook = ResourceBundle.getBundle("examples_addressbook");
	
	Shell shell;
	String[] values;
	String[] labels;
	
public DataEntryDialog(Shell parent) {
	shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);
	shell.setLayout(new GridLayout());		
}

private void addTextListener(final Text text) {
	text.addModifyListener(new ModifyListener() {
		public void modifyText(ModifyEvent e){
			Integer index = (Integer)(text.getData("index"));
			values[index.intValue()] = text.getText();
		}
	});
}
private void createControlButtons() {
	Composite composite = new Composite(shell, SWT.NONE);
	composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
	GridLayout layout = new GridLayout();
	layout.numColumns = 2;
	composite.setLayout(layout);
	
	Button okButton = new Button(composite, SWT.PUSH);
	okButton.setText(resAddressBook.getString("OK"));
	okButton.addSelectionListener(new SelectionAdapter() {
		public void widgetSelected(SelectionEvent e) {
			shell.close();
		}
	});
	
	Button cancelButton = new Button(composite, SWT.PUSH);
	cancelButton.setText(resAddressBook.getString("Cancel"));
	cancelButton.addSelectionListener(new SelectionAdapter() {
		public void widgetSelected(SelectionEvent e) {
			values = null;
			shell.close();
		}
	});
	
	shell.setDefaultButton(okButton);
}

private void createTextWidgets() {
	if (labels == null) return;
	
	Composite composite = new Composite(shell, SWT.NONE);
	composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
	GridLayout layout= new GridLayout();
	layout.numColumns = 2;
	composite.setLayout(layout);
	
	if (values == null)
		values = new String[labels.length];
	
	for (int i = 0; i < labels.length; i++) {
		Label label = new Label(composite, SWT.RIGHT);
		label.setText(labels[i]);	
		Text text = new Text(composite, SWT.BORDER);
		GridData gridData = new GridData();
		gridData.widthHint = 400;
		text.setLayoutData(gridData);
		if (values[i] != null) {
			text.setText(values[i]);
		}
		text.setData("index", new Integer(i));
		addTextListener(text);	
	}
}

public String[] getLabels() {
	return labels;
}
public String getTitle() {
	return shell.getText();
}
/**
 * Returns the contents of the <code>Text</code> widgets in the dialog in a 
 * <code>String</code> array.
 *
 * @return	String[]	
 *			The contents of the text widgets of the dialog.
 *			May return null if all text widgets are empty.
 */ 
public String[] getValues() {
	return values;
}
/** 
 * Opens the dialog in the given state.  Sets <code>Text</code> widget contents 
 * and dialog behaviour accordingly.
 *
 * @param 	dialogState	int
 *					The state the dialog should be opened in.
 */
public String[] open() {
	createTextWidgets();
	createControlButtons();
	shell.pack();
	shell.open();
	Display display = shell.getDisplay();
	while(!shell.isDisposed()){
		if(!display.readAndDispatch())
			display.sleep();
	}
	
	return getValues();
}
public void setLabels(String[] labels) {
	this.labels = labels;
}
public void setTitle(String title) {
	shell.setText(title);
}
/**
 * Sets the values of the <code>Text</code> widgets of the dialog to
 * the values supplied in the parameter array.
 *
 * @param	itemInfo	String[]
 * 						The values to which the dialog contents will be set.
 */
public void setValues(String[] itemInfo) {
	if (labels == null) return;
	
	if (values == null)
		values = new String[labels.length];

	int numItems = Math.min(values.length, itemInfo.length);
	for(int i = 0; i < numItems; i++) {
		values[i] = itemInfo[i];
	}	
}
}
