/*******************************************************************************
 * Copyright (c) 2000, 2016 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.layoutexample;


import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

class GridLayoutTab extends Tab {
	/* Controls for setting layout parameters */
	Spinner numColumns;
	Button makeColumnsEqualWidth;
	Spinner marginWidth, marginHeight, marginLeft, marginRight, marginTop, marginBottom, horizontalSpacing, verticalSpacing;
	/* The example layout instance */
	GridLayout gridLayout;
	/* TableEditors and related controls*/
	TableEditor nameEditor, comboEditor, widthEditor, heightEditor;
	TableEditor vAlignEditor, hAlignEditor, hGrabEditor, vGrabEditor, hSpanEditor, vSpanEditor;
	TableEditor hIndentEditor, vIndentEditor, minWidthEditor, minHeightEditor, excludeEditor;
	CCombo combo, vAlign, hAlign, hGrab, vGrab, exclude;
	Text nameText, widthText, heightText, hSpan, vSpan, hIndent, vIndent, minWidthText, minHeightText;
	/* Constants */
	static final int NAME_COL = 0;
	static final int COMBO_COL = 1;
	static final int WIDTH_COL = 2;
	static final int HEIGHT_COL = 3;
	static final int HALIGN_COL = 4;
	static final int VALIGN_COL = 5;
	static final int HGRAB_COL = 6;
	static final int VGRAB_COL = 7;
	static final int HSPAN_COL = 8;
	static final int VSPAN_COL = 9;
	static final int HINDENT_COL = 10;
	static final int VINDENT_COL = 11;
	static final int MINWIDTH_COL = 12;
	static final int MINHEIGHT_COL = 13;
	static final int EXCLUDE_COL = 14;

	static final int TOTAL_COLS = 15;

	/**
	 * Creates the Tab within a given instance of LayoutExample.
	 */
	GridLayoutTab(LayoutExample instance) {
		super(instance);
	}

	/**
	 * Creates the widgets in the "child" group.
	 */
	@Override
	void createChildWidgets () {
		/* Create the TraverseListener */
		final TraverseListener traverseListener = e -> {
			if (e.detail == SWT.TRAVERSE_RETURN || e.detail == SWT.TRAVERSE_TAB_NEXT)
				resetEditors ();
			if (e.detail == SWT.TRAVERSE_ESCAPE)
				disposeEditors ();
		};

		/* Add common controls */
		super.createChildWidgets ();

		/* Add hovers to the column headers whose field names have been shortened to save space */
		table.getColumn (HALIGN_COL).setToolTipText ("horizontalAlignment");
		table.getColumn (VALIGN_COL).setToolTipText ("verticalAlignment");
		table.getColumn (HGRAB_COL).setToolTipText ("grabExcessHorizontalSpace");
		table.getColumn (VGRAB_COL).setToolTipText ("grabExcessVerticalSpace");
		table.getColumn (HSPAN_COL).setToolTipText ("horizontalSpan");
		table.getColumn (VSPAN_COL).setToolTipText ("verticalSpan");
		table.getColumn (HINDENT_COL).setToolTipText ("horizontalIndent");
		table.getColumn (VINDENT_COL).setToolTipText ("verticalIndent");
		table.getColumn (MINWIDTH_COL).setToolTipText ("minimumWidth");
		table.getColumn (MINHEIGHT_COL).setToolTipText ("minimumHeight");

		/* Add TableEditors */
		nameEditor = new TableEditor (table);
		comboEditor = new TableEditor (table);
		widthEditor = new TableEditor (table);
		heightEditor = new TableEditor (table);
		vAlignEditor = new TableEditor (table);
		hAlignEditor = new TableEditor (table);
		hGrabEditor = new TableEditor (table);
		vGrabEditor = new TableEditor (table);
		hSpanEditor = new TableEditor (table);
		vSpanEditor = new TableEditor (table);
		hIndentEditor = new TableEditor (table);
		vIndentEditor = new TableEditor (table);
		minWidthEditor = new TableEditor (table);
		minHeightEditor = new TableEditor (table);
		excludeEditor = new TableEditor (table);
		table.addMouseListener (new MouseAdapter () {
			@Override
			public void mouseDown(MouseEvent e) {
				resetEditors();
				index = table.getSelectionIndex ();
				Point pt = new Point (e.x, e.y);
                newItem = table.getItem (pt);
                if (newItem == null) return;
                TableItem oldItem = comboEditor.getItem ();
                if (newItem == oldItem || newItem != lastSelected) {
					lastSelected = newItem;
					return;
				}
				table.showSelection ();

				nameText = new Text (table, SWT.SINGLE);
				nameText.setText (data.get (index) [NAME_COL]);
				createTextEditor (nameText, nameEditor, NAME_COL);

				combo = new CCombo (table, SWT.READ_ONLY);
				createComboEditor (combo, comboEditor);

				widthText = new Text (table, SWT.SINGLE);
				widthText.setText (data.get (index) [WIDTH_COL]);
				createTextEditor (widthText, widthEditor, WIDTH_COL);

				heightText = new Text (table, SWT.SINGLE);
				heightText.setText (data.get (index) [HEIGHT_COL]);
				createTextEditor (heightText, heightEditor, HEIGHT_COL);

				String [] alignValues = new String [] {"BEGINNING","CENTER","END","FILL"};
				hAlign = new CCombo (table, SWT.NONE);
				hAlign.setItems (alignValues);
				hAlign.setText (newItem.getText (HALIGN_COL));
				hAlignEditor.horizontalAlignment = SWT.LEFT;
				hAlignEditor.grabHorizontal = true;
				hAlignEditor.minimumWidth = 50;
				hAlignEditor.setEditor (hAlign, newItem, HALIGN_COL);
				hAlign.addTraverseListener (traverseListener);

				vAlign = new CCombo (table, SWT.NONE);
				vAlign.setItems (alignValues);
				vAlign.setText (newItem.getText (VALIGN_COL));
				vAlignEditor.horizontalAlignment = SWT.LEFT;
				vAlignEditor.grabHorizontal = true;
				vAlignEditor.minimumWidth = 50;
				vAlignEditor.setEditor (vAlign, newItem, VALIGN_COL);
				vAlign.addTraverseListener (traverseListener);

				String [] boolValues = new String [] {"false", "true"};
				hGrab = new CCombo (table, SWT.NONE);
				hGrab.setItems (boolValues);
				hGrab.setText (newItem.getText (HGRAB_COL));
				hGrabEditor.horizontalAlignment = SWT.LEFT;
				hGrabEditor.grabHorizontal = true;
				hGrabEditor.minimumWidth = 50;
				hGrabEditor.setEditor (hGrab, newItem, HGRAB_COL);
				hGrab.addTraverseListener (traverseListener);

				vGrab = new CCombo (table, SWT.NONE);
				vGrab.setItems (boolValues);
				vGrab.setText (newItem.getText (VGRAB_COL));
				vGrabEditor.horizontalAlignment = SWT.LEFT;
				vGrabEditor.grabHorizontal = true;
				vGrabEditor.minimumWidth = 50;
				vGrabEditor.setEditor (vGrab, newItem, VGRAB_COL);
				vGrab.addTraverseListener (traverseListener);

				hSpan = new Text (table, SWT.SINGLE);
				hSpan.setText (data.get (index) [HSPAN_COL]);
				createTextEditor (hSpan, hSpanEditor, HSPAN_COL);

				vSpan = new Text (table, SWT.SINGLE);
				vSpan.setText (data.get (index) [VSPAN_COL]);
				createTextEditor (vSpan, vSpanEditor, VSPAN_COL);

				hIndent = new Text (table, SWT.SINGLE);
				hIndent.setText (data.get (index) [HINDENT_COL]);
				createTextEditor (hIndent, hIndentEditor, HINDENT_COL);

				vIndent = new Text (table, SWT.SINGLE);
				vIndent.setText (data.get (index) [VINDENT_COL]);
				createTextEditor (vIndent, vIndentEditor, VINDENT_COL);

				minWidthText = new Text (table, SWT.SINGLE);
				minWidthText.setText (data.get (index) [MINWIDTH_COL]);
				createTextEditor (minWidthText, minWidthEditor, MINWIDTH_COL);

				minHeightText = new Text (table, SWT.SINGLE);
				minHeightText.setText (data.get (index) [MINHEIGHT_COL]);
				createTextEditor (minHeightText, minHeightEditor, MINHEIGHT_COL);

				exclude = new CCombo (table, SWT.NONE);
				exclude.setItems (boolValues);
				exclude.setText (newItem.getText (EXCLUDE_COL));
				excludeEditor.horizontalAlignment = SWT.LEFT;
				excludeEditor.grabHorizontal = true;
				excludeEditor.minimumWidth = 50;
				excludeEditor.setEditor (exclude, newItem, EXCLUDE_COL);
				exclude.addTraverseListener (traverseListener);

                for (int i=0; i<table.getColumnCount (); i++) {
                	Rectangle rect = newItem.getBounds (i);
                    if (rect.contains (pt)) {
                    	switch (i) {
                    		case NAME_COL:
                    			nameText.setFocus ();
                    			break;
							case COMBO_COL :
								combo.setFocus ();
								break;
							case WIDTH_COL :
								widthText.setFocus ();
								break;
							case HEIGHT_COL :
								heightText.setFocus ();
								break;
							case HALIGN_COL :
								hAlign.setFocus ();
								break;
							case VALIGN_COL :
								vAlign.setFocus ();
								break;
							case HGRAB_COL :
								hGrab.setFocus ();
								break;
							case VGRAB_COL :
								vGrab.setFocus ();
								break;
							case HSPAN_COL :
								hSpan.setFocus ();
								break;
							case VSPAN_COL :
								vSpan.setFocus ();
								break;
							case HINDENT_COL :
								hIndent.setFocus ();
								break;
							case VINDENT_COL :
								vIndent.setFocus ();
								break;
							case MINWIDTH_COL :
								minWidthText.setFocus ();
								break;
							case MINHEIGHT_COL :
								minHeightText.setFocus ();
								break;
							case EXCLUDE_COL :
								exclude.setFocus ();
								break;
							default :
								resetEditors ();
								break;
						}
                    }
                }
			}
		});
	}

	/**
	 * Creates the control widgets.
	 */
	@Override
	void createControlWidgets () {
        /* Controls the columns in the GridLayout */
		Group columnGroup = new Group (controlGroup, SWT.NONE);
		columnGroup.setText (LayoutExample.getResourceString ("Columns"));
		columnGroup.setLayout(new GridLayout(2, false));
		columnGroup.setLayoutData(new GridData (SWT.FILL, SWT.FILL, false, false));
		new Label(columnGroup, SWT.NONE).setText ("numColumns");
		numColumns = new Spinner (columnGroup, SWT.BORDER);
		numColumns.setMinimum (1);
		numColumns.addSelectionListener (selectionListener);
		makeColumnsEqualWidth = new Button (columnGroup, SWT.CHECK);
		makeColumnsEqualWidth.setText ("makeColumnsEqualWidth");
		makeColumnsEqualWidth.addSelectionListener (selectionListener);
		makeColumnsEqualWidth.setEnabled (false);
		makeColumnsEqualWidth.setLayoutData (new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));

		/* Controls the margins and spacing of the GridLayout */
		Group marginGroup = new Group(controlGroup, SWT.NONE);
		marginGroup.setText (LayoutExample.getResourceString("Margins_Spacing"));
		marginGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
		marginGroup.setLayout(new GridLayout(2, false));
		new Label (marginGroup, SWT.NONE).setText("marginWidth");
		marginWidth = new Spinner (marginGroup, SWT.BORDER);
		marginWidth.setSelection(5);
		marginWidth.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("marginHeight");
		marginHeight = new Spinner(marginGroup, SWT.BORDER);
		marginHeight.setSelection(5);
		marginHeight.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("marginLeft");
		marginLeft = new Spinner(marginGroup, SWT.BORDER);
		marginLeft.setSelection(0);
		marginLeft.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("marginRight");
		marginRight = new Spinner(marginGroup, SWT.BORDER);
		marginRight.setSelection(0);
		marginRight.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("marginTop");
		marginTop = new Spinner(marginGroup, SWT.BORDER);
		marginTop.setSelection(0);
		marginTop.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("marginBottom");
		marginBottom = new Spinner(marginGroup, SWT.BORDER);
		marginBottom.setSelection(0);
		marginBottom.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("horizontalSpacing");
		horizontalSpacing = new Spinner(marginGroup, SWT.BORDER);
		horizontalSpacing.setSelection(5);
		horizontalSpacing.addSelectionListener(selectionListener);
		new Label(marginGroup, SWT.NONE).setText("verticalSpacing");
		verticalSpacing = new Spinner(marginGroup, SWT.BORDER);
		verticalSpacing.setSelection(5);
		verticalSpacing.addSelectionListener(selectionListener);

		/* Add common controls */
		super.createControlWidgets ();
		controlGroup.pack();
	}

	/**
	 * Creates the example layout.
	 */
	@Override
	void createLayout () {
		gridLayout = new GridLayout ();
		layoutComposite.setLayout (gridLayout);
	}

	/**
	 * Disposes the editors without placing their contents
	 * into the table.
	 */
	@Override
	void disposeEditors () {
		comboEditor.setEditor (null, null, -1);
		combo.dispose ();
		nameText.dispose ();
		widthText.dispose ();
		heightText.dispose ();
		hAlign.dispose ();
		vAlign.dispose ();
		hGrab.dispose ();
		vGrab.dispose ();
		hSpan.dispose ();
		vSpan.dispose ();
		hIndent.dispose ();
		vIndent.dispose ();
		minWidthText.dispose ();
		minHeightText.dispose ();
		exclude.dispose ();
	}

	/**
	 * Generates code for the example layout.
	 */
	@Override
	StringBuffer generateLayoutCode () {
		StringBuffer code = new StringBuffer ();
		code.append ("\t\tGridLayout gridLayout = new GridLayout (");
		if (gridLayout.numColumns != 1 || gridLayout.makeColumnsEqualWidth) {
			code.append (gridLayout.numColumns + ", " + gridLayout.makeColumnsEqualWidth);
		}
		code.append(");\n");
		if (gridLayout.marginWidth != 5) {
			code.append("\t\tgridLayout.marginWidth = " + gridLayout.marginWidth + ";\n");
		}
		if (gridLayout.marginHeight != 5) {
			code.append ("\t\tgridLayout.marginHeight = " + gridLayout.marginHeight + ";\n");
		}
		if (gridLayout.marginLeft != 0) {
			code.append ("\t\tgridLayout.marginLeft = " + gridLayout.marginLeft + ";\n");
		}
		if (gridLayout.marginRight != 0) {
			code.append ("\t\tgridLayout.marginRight = " + gridLayout.marginRight + ";\n");
		}
		if (gridLayout.marginTop != 0) {
			code.append ("\t\tgridLayout.marginTop = " + gridLayout.marginTop + ";\n");
		}
		if (gridLayout.marginBottom != 0) {
			code.append ("\t\tgridLayout.marginBottom = " + gridLayout.marginBottom + ";\n");
		}
		if (gridLayout.horizontalSpacing != 5) {
			code.append ("\t\tgridLayout.horizontalSpacing = " + gridLayout.horizontalSpacing + ";\n");
		}
		if (gridLayout.verticalSpacing != 5) {
			code.append ("\t\tgridLayout.verticalSpacing = " + gridLayout.verticalSpacing + ";\n");
		}
		code.append ("\t\tshell.setLayout (gridLayout);\n");

		boolean first = true;
		boolean bounds, align, grab, span;
		for (int i = 0; i < children.length; i++) {
			Control control = children [i];
			code.append (getChildCode (control, i));
			GridData data = (GridData) control.getLayoutData ();
			if (data != null) {
				/* Use the most efficient constructor */
				bounds = data.widthHint != SWT.DEFAULT || data.heightHint != SWT.DEFAULT;
				align = data.horizontalAlignment != SWT.BEGINNING || data.verticalAlignment != SWT.CENTER;
				grab = data.grabExcessHorizontalSpace || data.grabExcessVerticalSpace;
				span = data.horizontalSpan != 1 || data.verticalSpan != 1;

				code.append ("\t\t");
				if (first) {
					code.append ("GridData ");
					first = false;
				}
				if (align || grab || span) {
					code.append ("data = new GridData (");
					code.append (alignmentString(data.horizontalAlignment) + ", ");
					code.append (alignmentString(data.verticalAlignment) + ", ");
					code.append (data.grabExcessHorizontalSpace + ", ");
					code.append (data.grabExcessVerticalSpace);
					if (span) {
						code.append (", " + data.horizontalSpan);
						code.append (", " + data.verticalSpan);
					}
					code.append(");\n");
					if (data.widthHint != SWT.DEFAULT) {
						code.append ("\t\tdata.widthHint = " + data.widthHint + ";\n");
					}
					if (data.heightHint != SWT.DEFAULT) {
						code.append ("\t\tdata.heightHint = " + data.heightHint + ";\n");
					}
				} else {
					if (bounds) {
						code.append ("data = new GridData (");
						code.append (data.widthHint == SWT.DEFAULT ? "SWT.DEFAULT" : String.valueOf(data.widthHint) + ", ");
						code.append (data.heightHint == SWT.DEFAULT ? "SWT.DEFAULT" : String.valueOf(data.heightHint));
						code.append(");\n");
					} else {
						code.append ("data = new GridData ();\n");
					}
				}
				if (data.horizontalIndent != 0) {
					code.append ("\t\tdata.horizontalIndent = " + data.horizontalIndent + ";\n");
				}
				if (data.verticalIndent != 0) {
					code.append ("\t\tdata.verticalIndent = " + data.verticalIndent + ";\n");
				}
				if (data.minimumWidth != 0) {
					code.append ("\t\tdata.minimumWidth = " + data.minimumWidth + ";\n");
				}
				if (data.minimumHeight != 0) {
					code.append ("\t\tdata.minimumHeight = " + data.minimumHeight + ";\n");
				}
				if (data.exclude) {
					code.append ("\t\tdata.exclude = true;\n");
				}
				if (code.substring (code.length () - 33).equals ("GridData data = new GridData ();\n")) {
					code.delete (code.length () - 33, code.length ());
					first = true;
				} else if (code.substring (code.length () - 24).equals ("data = new GridData ();\n")) {
					code.delete (code.length () - 24, code.length ());
				} else {
					code.append ("\t\t" + names [i] + ".setLayoutData (data);\n");
				}
			}
		}
		return code;
	}

	String alignmentString(int alignment) {
		if (alignment == SWT.BEGINNING) return "SWT.BEGINNING";
		if (alignment == SWT.CENTER) return "SWT.CENTER";
		if (alignment == SWT.END) return "SWT.END";
		return "SWT.FILL";
	}

	/**
	 * Returns the string to insert when a new child control is added to the table.
	 */
	@Override
	String[] getInsertString (String name, String controlType) {
		return new String [] {name, controlType,
				"-1","-1","BEGINNING","CENTER",
				"false","false","1","1","0","0",
				"0","0","false"};
	}

	/**
	 * Returns the layout data field names.
	 */
	@Override
	String [] getLayoutDataFieldNames() {
		return new String [] {
			"Control Name",
			"Control Type",
			"width",
			"height",
			"hAlignment", //"horizontalAlignment",
			"vAlignment", //"verticalAlignment",
			"grabH", //"grabExcessHorizontalSpace",
			"grabV", //"grabExcessVerticalSpace",
			"hSpan", //"horizontalSpan",
			"vSpan", //"verticalSpan",
			"hIndent", //"horizontalIndent",
			"vIndent", //"verticalIndent",
			"minWidth", //"minimumWidth",
			"minHeight", //"minimumHeight",
			"exclude"
		};
	}

	/**
	 * Gets the text for the tab folder item.
	 */
	@Override
	String getTabText () {
		return "GridLayout";
	}

	/**
	 * Takes information from TableEditors and stores it.
	 */
	@Override
	void resetEditors (boolean tab) {
		TableItem oldItem = comboEditor.getItem ();
		if (oldItem != null) {
			int row = table.indexOf (oldItem);
			/** Make sure user enters a valid data*/
			try {
				new String (nameText.getText ());
			} catch (NumberFormatException e) {
				nameText.setText (oldItem.getText (NAME_COL));
			}
			try {
				new Integer (widthText.getText ()).intValue ();
			} catch (NumberFormatException e) {
				widthText.setText (oldItem.getText (WIDTH_COL));
			}
			try {
				new Integer (heightText.getText ()).intValue ();
			} catch (NumberFormatException e) {
				heightText.setText (oldItem.getText (HEIGHT_COL));
			}
			try {
				new Integer (hSpan.getText ()).intValue ();
			} catch (NumberFormatException e) {
				hSpan.setText (oldItem.getText (HSPAN_COL));
			}
			try {
				new Integer (vSpan.getText ()).intValue ();
			} catch (NumberFormatException e) {
				vSpan.setText (oldItem.getText (VSPAN_COL));
			}
			try {
				new Integer (hIndent.getText ()).intValue ();
			} catch (NumberFormatException e) {
				hIndent.setText (oldItem.getText (HINDENT_COL));
			}
			try {
				new Integer (vIndent.getText ()).intValue ();
			} catch (NumberFormatException e) {
				vIndent.setText (oldItem.getText (VINDENT_COL));
			}
			try {
				new Integer (minWidthText.getText ()).intValue ();
			} catch (NumberFormatException e) {
				minWidthText.setText (oldItem.getText (MINWIDTH_COL));
			}
			try {
				new Integer (minHeightText.getText ()).intValue ();
			} catch (NumberFormatException e) {
				minHeightText.setText (oldItem.getText (MINHEIGHT_COL));
			}
			String [] insert = new String [] {
				nameText.getText (), combo.getText (), widthText.getText (), heightText.getText (),
				hAlign.getText (), vAlign.getText (), hGrab.getText (), vGrab.getText (),
				hSpan.getText (), vSpan.getText (), hIndent.getText (), vIndent.getText (),
				minWidthText.getText (), minHeightText.getText (), exclude.getText ()
			};
			data.set (row, insert);
			for (int i = 0; i < TOTAL_COLS; i++) {
				oldItem.setText (i, data.get (row) [i]);
			}
			if (!tab) disposeEditors ();
		}
		setLayoutState ();
		refreshLayoutComposite ();
		setLayoutData ();
		layoutComposite.layout (true);
		layoutGroup.layout (true);
	}

	/**
	 * Return the initial weight of the layout and control groups within the SashForm.
	 * @return the desired sash weights for the tab page
	 */
	@Override
	int[] sashWeights () {
		return new int[] {35, 65};
	}

	/**
	 * Sets the layout data for the children of the layout.
	 */
	@Override
	void setLayoutData () {
		Control [] children = layoutComposite.getChildren ();
		TableItem [] items = table.getItems ();
		GridData data;
		int hSpan, vSpan, hIndent, vIndent;
		String vAlign, hAlign, vGrab, hGrab, exclude;
		for (int i = 0; i < children.length; i++) {
			data = new GridData ();
			/* Set widthHint and heightHint */
			data.widthHint = new Integer (items [i].getText (WIDTH_COL)).intValue ();
			data.heightHint = new Integer (items [i].getText (HEIGHT_COL)).intValue ();
			/* Set vertical alignment and horizontal alignment */
			hAlign = items [i].getText (HALIGN_COL);
			if (hAlign.equals ("CENTER")) {
				data.horizontalAlignment = SWT.CENTER;
			} else if (hAlign.equals ("END")) {
				data.horizontalAlignment = SWT.END;
			} else if (hAlign.equals ("FILL")) {
				data.horizontalAlignment = SWT.FILL;
			} else {
				data.horizontalAlignment = SWT.BEGINNING;
			}
			vAlign = items [i].getText (VALIGN_COL);
			if (vAlign.equals ("BEGINNING")) {
				data.verticalAlignment = SWT.BEGINNING;
			} else if (vAlign.equals ("END")) {
				data.verticalAlignment = SWT.END;
			} else if (vAlign.equals ("FILL")) {
				data.verticalAlignment = SWT.FILL;
			} else {
				data.verticalAlignment = SWT.CENTER;
			}
			/* Set spans and indents */
			hSpan = new Integer (items [i].getText (HSPAN_COL)).intValue ();
			data.horizontalSpan = hSpan;
			vSpan = new Integer (items [i].getText (VSPAN_COL)).intValue ();
			data.verticalSpan = vSpan;
			hIndent = new Integer (items [i].getText (HINDENT_COL)).intValue ();
			data.horizontalIndent = hIndent;
			vIndent = new Integer (items [i].getText (VINDENT_COL)).intValue ();
			data.verticalIndent = vIndent;
			/* Set grabs */
			hGrab = items [i].getText (HGRAB_COL);
			data.grabExcessHorizontalSpace = hGrab.equals ("true");
			vGrab = items [i].getText (VGRAB_COL);
			data.grabExcessVerticalSpace = vGrab.equals ("true");
			/* Set minimum width and height */
			data.minimumWidth = new Integer (items [i].getText (MINWIDTH_COL)).intValue ();
			data.minimumHeight = new Integer (items [i].getText (MINHEIGHT_COL)).intValue ();
			/* Set exclude boolean */
			exclude = items [i].getText (EXCLUDE_COL);
			data.exclude = exclude.equals ("true");

			children [i].setLayoutData (data);
		}
	}

	/**
	 * Sets the state of the layout.
	 */
	@Override
	void setLayoutState () {
		/* Set the columns for the layout */
		gridLayout.numColumns = numColumns.getSelection ();
		gridLayout.makeColumnsEqualWidth = makeColumnsEqualWidth.getSelection ();
		makeColumnsEqualWidth.setEnabled (numColumns.getSelection () > 1);

		/* Set the margins and spacing */
		gridLayout.marginWidth = marginWidth.getSelection ();
		gridLayout.marginHeight = marginHeight.getSelection ();
		gridLayout.marginLeft = marginLeft.getSelection ();
		gridLayout.marginRight = marginRight.getSelection ();
		gridLayout.marginTop = marginTop.getSelection ();
		gridLayout.marginBottom = marginBottom.getSelection ();
		gridLayout.horizontalSpacing = horizontalSpacing.getSelection ();
		gridLayout.verticalSpacing = verticalSpacing.getSelection ();
	}
}
