/*******************************************************************************
* Copyright (c) 2000, 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.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.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
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.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
class GridLayoutTab extends Tab {
CCombo combo, vAlign, hAlign, hGrab, vGrab;
/* Constants */
final int COMBO_COL = 1;
/* TableEditors and related controls */
TableEditor comboEditor, widthEditor, heightEditor;
/* The example layout instance */
GridLayout gridLayout;
final int HALIGN_COL = 4;
final int HEIGHT_COL = 3;
final int HGRAB_COL = 9;
final int HINDENT_COL = 6;
final int HSPAN_COL = 7;
TableEditor hSpanEditor, vSpanEditor, hGrabEditor, vGrabEditor;
Button makeColumnsEqualWidth;
Combo marginHeight, marginWidth, horizontalSpacing, verticalSpacing;
/* Controls for setting layout parameters */
Text numColumns;
final int TOTAL_COLS = 11;
final int VALIGN_COL = 5;
TableEditor vAlignEditor, hAlignEditor, hIndentEditor;
final int VGRAB_COL = 10;
final int VSPAN_COL = 8;
final int WIDTH_COL = 2;
Text widthText, heightText, hIndent, hSpan, vSpan;
/**
* Creates the Tab within a given instance of LayoutExample.
*/
GridLayoutTab(LayoutExample instance) {
super(instance);
}
/**
* Creates the widgets in the "child" group.
*/
void createChildWidgets() {
/* Create the TraverseListener */
final TraverseListener traverseListener = new TraverseListener() {
public void keyTraversed(TraverseEvent 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 TableEditors */
comboEditor = new TableEditor(table);
widthEditor = new TableEditor(table);
heightEditor = new TableEditor(table);
vAlignEditor = new TableEditor(table);
hAlignEditor = new TableEditor(table);
hIndentEditor = new TableEditor(table);
hSpanEditor = new TableEditor(table);
vSpanEditor = new TableEditor(table);
hGrabEditor = new TableEditor(table);
vGrabEditor = new TableEditor(table);
table.addMouseListener(new MouseAdapter() {
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();
combo = new CCombo(table, SWT.READ_ONLY);
createComboEditor(combo, comboEditor);
widthText = new Text(table, SWT.SINGLE);
widthText.setText(((String[]) data.elementAt(index))[WIDTH_COL]);
createTextEditor(widthText, widthEditor, WIDTH_COL);
heightText = new Text(table, SWT.SINGLE);
heightText.setText(((String[]) data.elementAt(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);
hIndent = new Text(table, SWT.SINGLE);
hIndent.setText(((String[]) data.elementAt(index))[HINDENT_COL]);
createTextEditor(hIndent, hIndentEditor, HINDENT_COL);
hSpan = new Text(table, SWT.SINGLE);
hSpan.setText(((String[]) data.elementAt(index))[HSPAN_COL]);
createTextEditor(hSpan, hSpanEditor, HSPAN_COL);
vSpan = new Text(table, SWT.SINGLE);
vSpan.setText(((String[]) data.elementAt(index))[VSPAN_COL]);
createTextEditor(vSpan, vSpanEditor, VSPAN_COL);
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);
for (int i = 0; i < table.getColumnCount(); i++) {
Rectangle rect = newItem.getBounds(i);
if (rect.contains(pt))
switch (i) {
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 HINDENT_COL:
hIndent.setFocus();
break;
case HSPAN_COL:
hSpan.setFocus();
break;
case VSPAN_COL:
vSpan.setFocus();
break;
case HGRAB_COL:
hGrab.setFocus();
break;
case VGRAB_COL:
vGrab.setFocus();
break;
default:
resetEditors();
break;
}
}
}
});
/* Add listener to add an element to the table */
add.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem item = new TableItem(table, 0);
String[] insert = new String[] { String.valueOf(table.indexOf(item)), "Button", "-1", "-1",
"BEGINNING", "CENTER", "0", "1", "1", "false", "false" };
item.setText(insert);
data.addElement(insert);
resetEditors();
}
});
}
/**
* Creates the control widgets.
*/
void createControlWidgets() {
/* Rearrange the layout of the control group */
size.setLayoutData(new GridData());
/* Controls the margins and spacing of the GridLayout */
String[] marginValues = new String[] { "0", "3", "5", "10" };
Group marginGroup = new Group(controlGroup, SWT.NONE);
marginGroup.setText(LayoutExample.getResourceString("Margins_Spacing"));
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.verticalSpan = 2;
marginGroup.setLayoutData(data);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
marginGroup.setLayout(layout);
new Label(marginGroup, SWT.NONE).setText("marginHeight");
marginHeight = new Combo(marginGroup, SWT.NONE);
marginHeight.setItems(marginValues);
marginHeight.select(2);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 60;
marginHeight.setLayoutData(data);
marginHeight.addSelectionListener(selectionListener);
marginHeight.addTraverseListener(traverseListener);
new Label(marginGroup, SWT.NONE).setText("marginWidth");
marginWidth = new Combo(marginGroup, SWT.NONE);
marginWidth.setItems(marginValues);
marginWidth.select(2);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 60;
marginWidth.setLayoutData(data);
marginWidth.addSelectionListener(selectionListener);
marginWidth.addTraverseListener(traverseListener);
new Label(marginGroup, SWT.NONE).setText("horizontalSpacing");
horizontalSpacing = new Combo(marginGroup, SWT.NONE);
horizontalSpacing.setItems(marginValues);
horizontalSpacing.select(2);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 60;
horizontalSpacing.setLayoutData(data);
horizontalSpacing.addSelectionListener(selectionListener);
horizontalSpacing.addTraverseListener(traverseListener);
new Label(marginGroup, SWT.NONE).setText("verticalSpacing");
verticalSpacing = new Combo(marginGroup, SWT.NONE);
verticalSpacing.setItems(marginValues);
verticalSpacing.select(2);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 60;
verticalSpacing.setLayoutData(data);
verticalSpacing.addSelectionListener(selectionListener);
verticalSpacing.addTraverseListener(traverseListener);
/* Controls the columns in the GridLayout */
Group columnGroup = new Group(controlGroup, SWT.NONE);
columnGroup.setText(LayoutExample.getResourceString("Columns"));
layout = new GridLayout();
layout.numColumns = 2;
columnGroup.setLayout(layout);
data = new GridData(GridData.VERTICAL_ALIGN_FILL);
columnGroup.setLayoutData(data);
numColumns = new Text(columnGroup, SWT.BORDER);
numColumns.setText("1");
numColumns.addSelectionListener(selectionListener);
numColumns.addTraverseListener(traverseListener);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 15;
numColumns.setLayoutData(data);
new Label(columnGroup, SWT.NONE).setText("numColumns");
makeColumnsEqualWidth = new Button(columnGroup, SWT.CHECK);
makeColumnsEqualWidth.setText("makeColumnsEqualWidth");
makeColumnsEqualWidth.addSelectionListener(selectionListener);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
data.horizontalIndent = 14;
makeColumnsEqualWidth.setLayoutData(data);
/* Add common controls */
super.createControlWidgets();
controlGroup.pack();
}
/**
* Creates the example layout.
*/
void createLayout() {
gridLayout = new GridLayout();
layoutComposite.setLayout(gridLayout);
}
/**
* Disposes the editors without placing their contents into the table.
*/
void disposeEditors() {
comboEditor.setEditor(null, null, -1);
combo.dispose();
widthText.dispose();
heightText.dispose();
hAlign.dispose();
vAlign.dispose();
hIndent.dispose();
hSpan.dispose();
vSpan.dispose();
hGrab.dispose();
vGrab.dispose();
}
/**
* Generates code for the example layout.
*/
StringBuffer generateLayoutCode() {
StringBuffer code = new StringBuffer();
code.append("\t\tGridLayout gridLayout = new GridLayout ();\n");
if (gridLayout.numColumns != 1)
code.append("\t\tgridLayout.numColumns = " + gridLayout.numColumns + ";\n");
if (gridLayout.makeColumnsEqualWidth)
code.append("\t\tgridLayout.makeColumnsEqualWidth = true;\n");
if (gridLayout.marginHeight != 5)
code.append("\t\tgridLayout.marginHeight = " + gridLayout.marginHeight + ";\n");
if (gridLayout.marginWidth != 5)
code.append("\t\tgridLayout.marginWidth = " + gridLayout.marginWidth + ";\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;
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) {
code.append("\t\t");
if (first) {
code.append("GridData ");
first = false;
}
code.append("data = new GridData ();\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");
if (data.horizontalAlignment != GridData.BEGINNING) {
String alignment;
int hAlignment = data.horizontalAlignment;
if (hAlignment == GridData.CENTER)
alignment = "GridData.CENTER";
else if (hAlignment == GridData.END)
alignment = "GridData.END";
else
alignment = "GridData.FILL";
code.append("\t\tdata.horizontalAlignment = " + alignment + ";\n");
}
if (data.verticalAlignment != GridData.CENTER) {
String alignment;
int vAlignment = data.verticalAlignment;
if (vAlignment == GridData.BEGINNING)
alignment = "GridData.BEGINNING";
else if (vAlignment == GridData.END)
alignment = "GridData.END";
else
alignment = "GridData.FILL";
code.append("\t\tdata.verticalAlignment = " + alignment + ";\n");
}
if (data.horizontalIndent != 0)
code.append("\t\tdata.horizontalIndent = " + data.horizontalIndent + ";\n");
if (data.horizontalSpan != 1)
code.append("\t\tdata.horizontalSpan = " + data.horizontalSpan + ";\n");
if (data.verticalSpan != 1)
code.append("\t\tdata.verticalSpan = " + data.verticalSpan + ";\n");
if (data.grabExcessHorizontalSpace)
code.append("\t\tdata.grabExcessHorizontalSpace = true;\n");
if (data.grabExcessVerticalSpace)
code.append("\t\tdata.grabExcessVerticalSpace = 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;
}
/**
* Returns the layout data field names.
*/
String[] getLayoutDataFieldNames() {
return new String[] { "", "Control", "width", "height", "horizontalAlignment", "verticalAlignment",
"horizontalIndent", "horizontalSpan", "verticalSpan", "grabExcessHorizontalSpace",
"grabExcessVerticalSpace" };
}
/**
* Gets the text for the tab folder item.
*/
String getTabText() {
return "GridLayout";
}
/**
* Takes information from TableEditors and stores it.
*/
void resetEditors() {
resetEditors(false);
}
void resetEditors(boolean tab) {
TableItem oldItem = comboEditor.getItem();
if (oldItem != null) {
int row = table.indexOf(oldItem);
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(hIndent.getText());
} catch (NumberFormatException e) {
hIndent.setText(oldItem.getText(HINDENT_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));
}
String[] insert = new String[] { String.valueOf(row), combo.getText(), widthText.getText(),
heightText.getText(), hAlign.getText(), vAlign.getText(), hIndent.getText(), hSpan.getText(),
vSpan.getText(), hGrab.getText(), vGrab.getText() };
data.setElementAt(insert, row);
for (int i = 0; i < TOTAL_COLS; i++)
oldItem.setText(i, ((String[]) data.elementAt(row))[i]);
if (!tab)
disposeEditors();
}
setLayoutState();
refreshLayoutComposite();
setLayoutData();
layoutComposite.layout(true);
layoutGroup.layout(true);
}
/**
* Sets the layout data for the children of the layout.
*/
void setLayoutData() {
Control[] children = layoutComposite.getChildren();
TableItem[] items = table.getItems();
GridData data;
int hIndent, hSpan, vSpan;
String vAlign, hAlign, vGrab, hGrab;
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 = GridData.CENTER;
else if (hAlign.equals("END"))
data.horizontalAlignment = GridData.END;
else if (hAlign.equals("FILL"))
data.horizontalAlignment = GridData.FILL;
else
data.horizontalAlignment = GridData.BEGINNING;
vAlign = items[i].getText(VALIGN_COL);
if (vAlign.equals("BEGINNING"))
data.verticalAlignment = GridData.BEGINNING;
else if (vAlign.equals("END"))
data.verticalAlignment = GridData.END;
else if (vAlign.equals("FILL"))
data.verticalAlignment = GridData.FILL;
else
data.verticalAlignment = GridData.CENTER;
/* Set indents and spans */
hIndent = Integer.parseInt(items[i].getText(HINDENT_COL));
data.horizontalIndent = hIndent;
hSpan = Integer.parseInt(items[i].getText(HSPAN_COL));
data.horizontalSpan = hSpan;
vSpan = Integer.parseInt(items[i].getText(VSPAN_COL));
data.verticalSpan = vSpan;
/* Set grabbers */
hGrab = items[i].getText(HGRAB_COL);
if (hGrab.equals("true"))
data.grabExcessHorizontalSpace = true;
else
data.grabExcessHorizontalSpace = false;
vGrab = items[i].getText(VGRAB_COL);
if (vGrab.equals("true"))
data.grabExcessVerticalSpace = true;
else
data.grabExcessVerticalSpace = false;
children[i].setLayoutData(data);
}
}
/**
* Sets the state of the layout.
*/
void setLayoutState() {
/* Set the columns for the layout */
try {
gridLayout.numColumns = Integer.parseInt(numColumns.getText());
} catch (NumberFormatException e) {
gridLayout.numColumns = 1;
}
gridLayout.makeColumnsEqualWidth = makeColumnsEqualWidth.getSelection();
/* Set the margins and spacing */
try {
gridLayout.marginHeight = Integer.parseInt(marginHeight.getText());
} catch (NumberFormatException e) {
gridLayout.marginHeight = 5;
marginHeight.select(2);
}
try {
gridLayout.marginWidth = Integer.parseInt(marginWidth.getText());
} catch (NumberFormatException e) {
gridLayout.marginWidth = 5;
marginWidth.select(2);
}
try {
gridLayout.horizontalSpacing = Integer.parseInt(horizontalSpacing.getText());
} catch (NumberFormatException e) {
gridLayout.horizontalSpacing = 5;
horizontalSpacing.select(2);
}
try {
gridLayout.verticalSpacing = Integer.parseInt(verticalSpacing.getText());
} catch (NumberFormatException e) {
gridLayout.verticalSpacing = 5;
verticalSpacing.select(2);
}
}
}