/******************************************************************************* * 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); } } }