/*******************************************************************************
 * Copyright (c) 2000, 2018 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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.MouseListener;
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(MouseListener.mouseDownAdapter(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
	StringBuilder generateLayoutCode () {
		StringBuilder code = new StringBuilder ();
		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 {
				Integer.parseInt(widthText.getText ());
			} catch (NumberFormatException e) {
				widthText.setText (oldItem.getText (WIDTH_COL));
			}
			try {
				Integer.parseInt(heightText.getText ());
			} catch (NumberFormatException e) {
				heightText.setText (oldItem.getText (HEIGHT_COL));
			}
			try {
				Integer.parseInt(hSpan.getText ());
			} catch (NumberFormatException e) {
				hSpan.setText (oldItem.getText (HSPAN_COL));
			}
			try {
				Integer.parseInt(vSpan.getText ());
			} catch (NumberFormatException e) {
				vSpan.setText (oldItem.getText (VSPAN_COL));
			}
			try {
				Integer.parseInt(hIndent.getText ());
			} catch (NumberFormatException e) {
				hIndent.setText (oldItem.getText (HINDENT_COL));
			}
			try {
				Integer.parseInt(vIndent.getText ());
			} catch (NumberFormatException e) {
				vIndent.setText (oldItem.getText (VINDENT_COL));
			}
			try {
				Integer.parseInt(minWidthText.getText ());
			} catch (NumberFormatException e) {
				minWidthText.setText (oldItem.getText (MINWIDTH_COL));
			}
			try {
				Integer.parseInt(minHeightText.getText ());
			} 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 = Integer.parseInt(items [i].getText (WIDTH_COL));
			data.heightHint = Integer.parseInt(items [i].getText (HEIGHT_COL));
			/* 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 = Integer.parseInt (items [i].getText (HSPAN_COL));
			data.horizontalSpan = hSpan;
			vSpan = Integer.parseInt(items [i].getText (VSPAN_COL));
			data.verticalSpan = vSpan;
			hIndent = Integer.parseInt(items [i].getText (HINDENT_COL));
			data.horizontalIndent = hIndent;
			vIndent = Integer.parseInt(items [i].getText (VINDENT_COL));
			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 = Integer.parseInt(items [i].getText (MINWIDTH_COL));
			data.minimumHeight = Integer.parseInt(items [i].getText (MINHEIGHT_COL));
			/* 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 ();
	}
}
