Java tutorial
import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Vector; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StyledText; 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.SelectionListener; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; 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.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.CoolBar; import org.eclipse.swt.widgets.CoolItem; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Slider; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public class LayoutExample { private TabFolder tabFolder; /** * Creates an instance of a LayoutExample embedded inside the supplied * parent Composite. * * @param parent * the container of the example */ public LayoutExample(Composite parent) { tabFolder = new TabFolder(parent, SWT.NULL); Tab[] tabs = new Tab[] { new FillLayoutTab(this), new RowLayoutTab(this), new GridLayoutTab(this), new FormLayoutTab(this), }; for (int i = 0; i < tabs.length; i++) { TabItem item = new TabItem(tabFolder, SWT.NULL); item.setText(tabs[i].getTabText()); item.setControl(tabs[i].createTabFolderPage(tabFolder)); } } /** * Grabs input focus. */ public void setFocus() { tabFolder.setFocus(); } /** * Disposes of all resources associated with a particular instance of the * LayoutExample. */ public void dispose() { tabFolder = null; } /** * Invokes as a standalone program. */ public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); new LayoutExample(shell); shell.setText(getResourceString("window.title")); shell.addShellListener(new ShellAdapter() { public void shellClosed(ShellEvent e) { Shell[] shells = display.getShells(); for (int i = 0; i < shells.length; i++) { if (shells[i] != shell) shells[i].close(); } } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } /** * Gets a string from the resource bundle. We don't want to crash because of * a missing String. Returns the key if not found. */ static String getResourceString(String key) { return key; } /** * Gets a string from the resource bundle and binds it with the given * arguments. If the key is not found, return the key. */ static String getResourceString(String key, Object[] args) { try { return MessageFormat.format(getResourceString(key), args); } catch (MissingResourceException e) { return key; } catch (NullPointerException e) { return "!" + key + "!"; } } } /******************************************************************************* * 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 ******************************************************************************/ /** * <code>Tab</code> is the abstract superclass of every page in the example's * tab folder. Each page in the tab folder displays a layout, and allows the * user to manipulate the layout. * * A typical page in a Tab contains a two column composite. The left column * contains the layout group, which contains the "layout composite" (the one * that has the example layout). The right column contains the "control" group. * The "control" group allows the user to interact with the example. Typical * operations are modifying layout parameters, adding children to the "layout * composite", and modifying child layout data. The "Code" button in the * "control" group opens a new window containing code that will regenerate the * layout. This code (or parts of it) can be selected and copied to the * clipboard. */ abstract class Tab { /* Common groups and composites */ Composite tabFolderPage; SashForm sash; Group layoutGroup, controlGroup, childGroup; /* The composite that contains the example layout */ Composite layoutComposite; /* Common controls for modifying the example layout */ String[] names; Control[] children; Button size, add, delete, clear, code; /* Common values for working with TableEditors */ Table table; int index; TableItem newItem, lastSelected; Vector data = new Vector(); /* Controlling instance */ final LayoutExample instance; /* Listeners */ SelectionListener selectionListener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { resetEditors(); } }; TraverseListener traverseListener = new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_RETURN) { e.doit = false; resetEditors(); } } }; /** * Creates the Tab within a given instance of LayoutExample. */ Tab(LayoutExample instance) { this.instance = instance; } /** * Creates the "child" group. This is the group that allows you to add * children to the layout. It exists within the controlGroup. */ void createChildGroup() { childGroup = new Group(controlGroup, SWT.NONE); childGroup.setText(LayoutExample.getResourceString("Children")); GridLayout layout = new GridLayout(); layout.numColumns = 3; childGroup.setLayout(layout); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 2; childGroup.setLayoutData(data); createChildWidgets(); } /** * Creates the controls for modifying the "children" table, and the table * itself. Subclasses override this method to augment the standard table. */ void createChildWidgets() { /* Controls for adding and removing children */ add = new Button(childGroup, SWT.PUSH); add.setText(LayoutExample.getResourceString("Add")); add.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); delete = new Button(childGroup, SWT.PUSH); delete.setText(LayoutExample.getResourceString("Delete")); delete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); delete.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { resetEditors(); int[] selected = table.getSelectionIndices(); table.remove(selected); /* Refresh the control indices of the table */ for (int i = 0; i < table.getItemCount(); i++) { table.getItem(i).setText(0, String.valueOf(i)); } refreshLayoutComposite(); layoutComposite.layout(true); layoutGroup.layout(true); } }); clear = new Button(childGroup, SWT.PUSH); clear.setText(LayoutExample.getResourceString("Clear")); clear.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); clear.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { resetEditors(); children = layoutComposite.getChildren(); for (int i = 0; i < children.length; i++) { children[i].dispose(); } table.removeAll(); data.clear(); children = new Control[0]; layoutGroup.layout(true); } }); /* Create the "children" table */ table = new Table(childGroup, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION); table.setLinesVisible(true); table.setHeaderVisible(true); GridData gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 3; gridData.heightHint = 150; table.setLayoutData(gridData); table.addTraverseListener(traverseListener); /* Add columns to the table */ String[] columnHeaders = getLayoutDataFieldNames(); for (int i = 0; i < columnHeaders.length; i++) { TableColumn column = new TableColumn(table, SWT.NONE); column.setText(columnHeaders[i]); if (i == 0) column.setWidth(20); else if (i == 1) column.setWidth(80); else column.pack(); } } /** * Creates the TableEditor with a CCombo in the first column of the table. * This CCombo lists all the controls that the user can select to place on * their layout. */ void createComboEditor(CCombo combo, TableEditor comboEditor) { combo.setItems(new String[] { "Button", "Canvas", "Combo", "Composite", "CoolBar", "Group", "Label", "List", "ProgressBar", "Scale", "Slider", "StyledText", "Table", "Text", "ToolBar", "Tree" }); combo.setText(newItem.getText(1)); /* Set up editor */ comboEditor.horizontalAlignment = SWT.LEFT; comboEditor.grabHorizontal = true; comboEditor.minimumWidth = 50; comboEditor.setEditor(combo, newItem, 1); /* Add listener */ combo.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_RETURN) { resetEditors(); } if (e.detail == SWT.TRAVERSE_ESCAPE) { disposeEditors(); } } }); } /** * Creates the "control" group. This is the group on the right half of each * example tab. It contains controls for adding new children to the * layoutComposite, and for modifying the children's layout data. */ void createControlGroup() { controlGroup = new Group(sash, SWT.NONE); controlGroup.setText(LayoutExample.getResourceString("Parameters")); GridLayout layout = new GridLayout(); layout.numColumns = 2; controlGroup.setLayout(layout); size = new Button(controlGroup, SWT.CHECK); size.setText(LayoutExample.getResourceString("Preferred_Size")); size.setSelection(false); size.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { resetEditors(); if (size.getSelection()) { layoutComposite.setLayoutData(new GridData()); layoutGroup.layout(true); } else { layoutComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); layoutGroup.layout(true); } } }); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; size.setLayoutData(data); createControlWidgets(); } /** * Creates the "control" widget children. Subclasses override this method to * augment the standard controls created. */ void createControlWidgets() { createChildGroup(); code = new Button(controlGroup, SWT.PUSH); code.setText(LayoutExample.getResourceString("Code")); GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL); gridData.horizontalSpan = 2; code.setLayoutData(gridData); code.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { final Shell shell = new Shell(); shell.setText(LayoutExample.getResourceString("Generated_Code")); shell.setLayout(new FillLayout()); final StyledText text = new StyledText(shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); String layoutCode = generateCode().toString(); if (layoutCode.length() == 0) return; text.setText(layoutCode); Menu bar = new Menu(shell, SWT.BAR); shell.setMenuBar(bar); MenuItem editItem = new MenuItem(bar, SWT.CASCADE); editItem.setText(LayoutExample.getResourceString("Edit")); Menu menu = new Menu(bar); MenuItem select = new MenuItem(menu, SWT.PUSH); select.setText(LayoutExample.getResourceString("Select_All")); select.setAccelerator(SWT.MOD1 + 'A'); select.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { text.selectAll(); } }); MenuItem copy = new MenuItem(menu, SWT.PUSH); copy.setText(LayoutExample.getResourceString("Copy")); copy.setAccelerator(SWT.MOD1 + 'C'); copy.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { text.copy(); } }); MenuItem exit = new MenuItem(menu, SWT.PUSH); exit.setText(LayoutExample.getResourceString("Exit")); exit.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { shell.close(); } }); editItem.setMenu(menu); shell.pack(); shell.setSize(400, 500); shell.open(); Display display = shell.getDisplay(); while (!shell.isDisposed()) if (!display.readAndDispatch()) display.sleep(); } }); } /** * Creates the example layout. Subclasses override this method. */ void createLayout() { } /** * Creates the composite that contains the example layout. */ void createLayoutComposite() { layoutComposite = new Composite(layoutGroup, SWT.BORDER); layoutComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); createLayout(); } /** * Creates the layout group. This is the group on the left half of each * example tab. */ void createLayoutGroup() { layoutGroup = new Group(sash, SWT.NONE); layoutGroup.setText(LayoutExample.getResourceString("Layout")); layoutGroup.setLayout(new GridLayout()); createLayoutComposite(); } /** * Creates the tab folder page. * * @param tabFolder * org.eclipse.swt.widgets.TabFolder * @return the new page for the tab folder */ Composite createTabFolderPage(TabFolder tabFolder) { /* Create a two column page with a SashForm */ tabFolderPage = new Composite(tabFolder, SWT.NULL); tabFolderPage.setLayout(new FillLayout()); sash = new SashForm(tabFolderPage, SWT.HORIZONTAL); /* Create the "layout" and "control" columns */ createLayoutGroup(); createControlGroup(); return tabFolderPage; } /** * Creates the TableEditor with a Text in the given column of the table. */ void createTextEditor(Text text, TableEditor textEditor, int column) { text.setFont(table.getFont()); text.selectAll(); textEditor.horizontalAlignment = SWT.LEFT; textEditor.grabHorizontal = true; textEditor.setEditor(text, newItem, column); text.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT) { resetEditors(true); } if (e.detail == SWT.TRAVERSE_ESCAPE) { disposeEditors(); } } }); } /** * Disposes the editors without placing their contents into the table. * Subclasses override this method. */ void disposeEditors() { } /** * Generates the code needed to produce the example layout. */ StringBuffer generateCode() { /* Make sure all information being entered is stored in the table */ resetEditors(); /* Get names for controls in the layout */ names = new String[children.length]; for (int i = 0; i < children.length; i++) { Control control = children[i]; String controlClass = control.getClass().toString(); String controlType = controlClass.substring(controlClass.lastIndexOf('.') + 1); names[i] = controlType.toLowerCase() + i; } /* Create StringBuffer containing the code */ StringBuffer code = new StringBuffer(); code.append("import org.eclipse.swt.*;\n"); code.append("import org.eclipse.swt.custom.*;\n"); code.append("import org.eclipse.swt.graphics.*;\n"); code.append("import org.eclipse.swt.layout.*;\n"); code.append("import org.eclipse.swt.widgets.*;\n\n"); code.append("public class MyLayout {\n"); code.append("\tpublic static void main (String [] args) {\n"); code.append("\t\tDisplay display = new Display ();\n"); code.append("\t\tShell shell = new Shell (display);\n"); /* Get layout specific code */ code.append(generateLayoutCode()); code.append("\n\t\tshell.pack ();\n\t\tshell.open ();\n\n"); code.append("\t\twhile (!shell.isDisposed ()) {\n"); code.append("\t\t\tif (!display.readAndDispatch ())\n"); code.append("\t\t\t\tdisplay.sleep ();\n\t\t}\n\t\tdisplay.dispose ();\n\t}\n}"); return code; } /** * Generates layout specific code for the example layout. Subclasses * override this method. */ StringBuffer generateLayoutCode() { return new StringBuffer(); } /** * Returns the StringBuffer for the code which will create a child control. */ StringBuffer getChildCode(Control control, int i) { StringBuffer code = new StringBuffer(); /* Find the type of control */ String controlClass = control.getClass().toString(); String controlType = controlClass.substring(controlClass.lastIndexOf('.') + 1); /* Find the style of the control */ String styleString; if (controlType.equals("Button")) { styleString = "SWT.PUSH"; } else if (controlType.equals("Text")) { styleString = "SWT.BORDER"; } else if (controlType.equals("StyledText")) { styleString = "SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL"; } else if (controlType.equals("Canvas") || controlType.equals("Composite") || controlType.equals("Table") || controlType.equals("StyledText") || controlType.equals("ToolBar") || controlType.equals("Tree") || controlType.equals("List")) { styleString = "SWT.BORDER"; } else styleString = "SWT.NONE"; /* Write out the control being declared */ code.append("\n\t\t" + controlType + " " + names[i] + " = new " + controlType + " (shell, " + styleString + ");\n"); /* Add items to those controls that need items */ if (controlType.equals("Combo") || controlType.equals("List")) { code.append("\t\t" + names[i] + ".setItems (new String [] {\"Item 1\", \"Item 2\", \"Item 2\"});\n"); } else if (controlType.equals("Table")) { code.append("\t\t" + names[i] + ".setLinesVisible (true);\n"); for (int j = 1; j < 3; j++) { code.append("\t\tTableItem tableItem" + j + " = new TableItem (" + names[i] + ", SWT.NONE);\n"); code.append("\t\ttableItem" + j + ".setText (\"Item" + j + "\");\n"); } } else if (controlType.equals("Tree")) { for (int j = 1; j < 3; j++) { code.append("\t\tTreeItem treeItem" + j + " = new TreeItem (" + names[i] + ", SWT.NONE);\n"); code.append("\t\ttreeItem" + j + ".setText (\"Item" + j + "\");\n"); } } else if (controlType.equals("ToolBar")) { for (int j = 1; j < 3; j++) { code.append("\t\tToolItem toolItem" + j + " = new ToolItem (" + names[i] + ", SWT.NONE);\n"); code.append("\t\ttoolItem" + j + ".setText (\"Item" + j + "\");\n"); } } else if (controlType.equals("CoolBar")) { code.append("\t\tToolBar coolToolBar = new ToolBar (" + names[i] + ", SWT.BORDER);\n"); code.append("\t\tToolItem coolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n"); code.append("\t\tcoolToolItem.setText (\"Item 1\");\n"); code.append("\t\tcoolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n"); code.append("\t\tcoolToolItem.setText (\"Item 2\");\n"); code.append("\t\tCoolItem coolItem1 = new CoolItem (" + names[i] + ", SWT.NONE);\n"); code.append("\t\tcoolItem1.setControl (coolToolBar);\n"); code.append("\t\tPoint size = coolToolBar.computeSize (SWT.DEFAULT, SWT.DEFAULT);\n"); code.append("\t\tcoolItem1.setSize (coolItem1.computeSize (size.x, size.y));\n"); code.append("\t\tcoolToolBar = new ToolBar (" + names[i] + ", SWT.BORDER);\n"); code.append("\t\tcoolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n"); code.append("\t\tcoolToolItem.setText (\"Item 3\");\n"); code.append("\t\tcoolToolItem = new ToolItem (coolToolBar, SWT.NONE);\n"); code.append("\t\tcoolToolItem.setText (\"Item 4\");\n"); code.append("\t\tCoolItem coolItem2 = new CoolItem (" + names[i] + ", SWT.NONE);\n"); code.append("\t\tcoolItem2.setControl (coolToolBar);\n"); code.append("\t\tsize = coolToolBar.computeSize (SWT.DEFAULT, SWT.DEFAULT);\n"); code.append("\t\tcoolItem2.setSize (coolItem2.computeSize (size.x, size.y));\n"); code.append( "\t\t" + names[i] + ".setSize (" + names[i] + ".computeSize (SWT.DEFAULT, SWT.DEFAULT));\n"); } else if (controlType.equals("ProgressBar")) { code.append("\t\t" + names[i] + ".setSelection (50);\n"); } /* Set text for those controls that support it */ if (controlType.equals("Button") || controlType.equals("Combo") || controlType.equals("Group") || controlType.equals("Label") || controlType.equals("StyledText") || controlType.equals("Text")) { code.append("\t\t" + names[i] + ".setText (\"" + names[i] + "\");\n"); } return code; } /** * Returns the layout data field names. Subclasses override this method. */ String[] getLayoutDataFieldNames() { return new String[] {}; } /** * Gets the text for the tab folder item. Subclasses override this method. */ String getTabText() { return ""; } /** * Refreshes the composite and draws all controls in the layout example. */ void refreshLayoutComposite() { /* Remove children that are already laid out */ children = layoutComposite.getChildren(); for (int i = 0; i < children.length; i++) { children[i].dispose(); } /* Add all children listed in the table */ TableItem[] items = table.getItems(); children = new Control[items.length]; String[] itemValues = new String[] { LayoutExample.getResourceString("Item", new String[] { "1" }), LayoutExample.getResourceString("Item", new String[] { "2" }), LayoutExample.getResourceString("Item", new String[] { "3" }) }; for (int i = 0; i < items.length; i++) { String control = items[i].getText(1); if (control.equals("Button")) { Button button = new Button(layoutComposite, SWT.PUSH); button.setText(LayoutExample.getResourceString("Button_Index", new String[] { new Integer(i).toString() })); children[i] = button; } else if (control.equals("Canvas")) { Canvas canvas = new Canvas(layoutComposite, SWT.BORDER); children[i] = canvas; } else if (control.equals("Combo")) { Combo combo = new Combo(layoutComposite, SWT.NONE); combo.setItems(itemValues); combo.setText( LayoutExample.getResourceString("Combo_Index", new String[] { new Integer(i).toString() })); children[i] = combo; } else if (control.equals("Composite")) { Composite composite = new Composite(layoutComposite, SWT.BORDER); children[i] = composite; } else if (control.equals("CoolBar")) { CoolBar coolBar = new CoolBar(layoutComposite, SWT.NONE); ToolBar toolBar = new ToolBar(coolBar, SWT.BORDER); ToolItem item = new ToolItem(toolBar, 0); item.setText(LayoutExample.getResourceString("Item", new String[] { "1" })); item = new ToolItem(toolBar, 0); item.setText(LayoutExample.getResourceString("Item", new String[] { "2" })); CoolItem coolItem1 = new CoolItem(coolBar, 0); coolItem1.setControl(toolBar); toolBar = new ToolBar(coolBar, SWT.BORDER); item = new ToolItem(toolBar, 0); item.setText(LayoutExample.getResourceString("Item", new String[] { "3" })); item = new ToolItem(toolBar, 0); item.setText(LayoutExample.getResourceString("Item", new String[] { "4" })); CoolItem coolItem2 = new CoolItem(coolBar, 0); coolItem2.setControl(toolBar); Point size = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT); coolItem1.setSize(coolItem1.computeSize(size.x, size.y)); coolItem2.setSize(coolItem2.computeSize(size.x, size.y)); coolBar.setSize(coolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); children[i] = coolBar; } else if (control.equals("Group")) { Group group = new Group(layoutComposite, SWT.NONE); group.setText( LayoutExample.getResourceString("Group_Index", new String[] { new Integer(i).toString() })); children[i] = group; } else if (control.equals("Label")) { Label label = new Label(layoutComposite, SWT.NONE); label.setText( LayoutExample.getResourceString("Label_Index", new String[] { new Integer(i).toString() })); children[i] = label; } else if (control.equals("List")) { List list = new List(layoutComposite, SWT.BORDER); list.setItems(itemValues); children[i] = list; } else if (control.equals("ProgressBar")) { ProgressBar progress = new ProgressBar(layoutComposite, SWT.NONE); progress.setSelection(50); children[i] = progress; } else if (control.equals("Scale")) { Scale scale = new Scale(layoutComposite, SWT.NONE); children[i] = scale; } else if (control.equals("Slider")) { Slider slider = new Slider(layoutComposite, SWT.NONE); children[i] = slider; } else if (control.equals("StyledText")) { StyledText styledText = new StyledText(layoutComposite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); styledText.setText(LayoutExample.getResourceString("StyledText_Index", new String[] { new Integer(i).toString() })); children[i] = styledText; } else if (control.equals("Table")) { Table table = new Table(layoutComposite, SWT.BORDER); table.setLinesVisible(true); TableItem item1 = new TableItem(table, 0); item1.setText(LayoutExample.getResourceString("Item", new String[] { "1" })); TableItem item2 = new TableItem(table, 0); item2.setText(LayoutExample.getResourceString("Item", new String[] { "2" })); children[i] = table; } else if (control.equals("Text")) { Text text = new Text(layoutComposite, SWT.BORDER); text.setText( LayoutExample.getResourceString("Text_Index", new String[] { new Integer(i).toString() })); children[i] = text; } else if (control.equals("ToolBar")) { ToolBar toolBar = new ToolBar(layoutComposite, SWT.BORDER); ToolItem item1 = new ToolItem(toolBar, 0); item1.setText(LayoutExample.getResourceString("Item", new String[] { "1" })); ToolItem item2 = new ToolItem(toolBar, 0); item2.setText(LayoutExample.getResourceString("Item", new String[] { "2" })); children[i] = toolBar; } else { Tree tree = new Tree(layoutComposite, SWT.BORDER); TreeItem item1 = new TreeItem(tree, 0); item1.setText(LayoutExample.getResourceString("Item", new String[] { "1" })); TreeItem item2 = new TreeItem(tree, 0); item2.setText(LayoutExample.getResourceString("Item", new String[] { "2" })); children[i] = tree; } } } /** * Takes information from TableEditors and stores it. Subclasses override * this method. */ void resetEditors() { resetEditors(false); } void resetEditors(boolean tab) { } /** * Sets the layout data for the children of the layout. Subclasses override * this method. */ void setLayoutData() { } /** * Sets the state of the layout. Subclasses override this method. */ void setLayoutState() { } } /******************************************************************************* * 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 ******************************************************************************/ class RowLayoutTab extends Tab { /* Controls for setting layout parameters */ Button horizontal, vertical; Button wrap, pack, justify; Combo marginRight, marginLeft, marginTop, marginBottom, spacing; /* The example layout instance */ RowLayout rowLayout; /* TableEditors and related controls */ TableEditor comboEditor, widthEditor, heightEditor; CCombo combo; Text widthText, heightText; /* Constants */ final int COMBO_COL = 1; final int WIDTH_COL = 2; final int HEIGHT_COL = 3; final int TOTAL_COLS = 4; /** * Creates the Tab within a given instance of LayoutExample. */ RowLayoutTab(LayoutExample instance) { super(instance); } /** * Creates the widgets in the "child" group. */ void createChildWidgets() { /* Add common controls */ super.createChildWidgets(); /* Add TableEditors */ comboEditor = new TableEditor(table); widthEditor = new TableEditor(table); heightEditor = 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); 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; 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" }; item.setText(insert); data.addElement(insert); resetEditors(); } }); } /** * Creates the control widgets. */ void createControlWidgets() { /* Controls the type of RowLayout */ Group typeGroup = new Group(controlGroup, SWT.NONE); typeGroup.setText(LayoutExample.getResourceString("Type")); typeGroup.setLayout(new GridLayout()); GridData data = new GridData(GridData.FILL_HORIZONTAL); typeGroup.setLayoutData(data); horizontal = new Button(typeGroup, SWT.RADIO); horizontal.setText("SWT.HORIZONTAL"); horizontal.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); horizontal.setSelection(true); horizontal.addSelectionListener(selectionListener); vertical = new Button(typeGroup, SWT.RADIO); vertical.setText("SWT.VERTICAL"); vertical.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); vertical.addSelectionListener(selectionListener); /* Controls the margins and spacing of the RowLayout */ String[] marginValues = new String[] { "0", "3", "5", "10" }; Group marginGroup = new Group(controlGroup, SWT.NONE); marginGroup.setText(LayoutExample.getResourceString("Margins_Spacing")); data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); data.verticalSpan = 2; marginGroup.setLayoutData(data); GridLayout layout = new GridLayout(); layout.numColumns = 2; marginGroup.setLayout(layout); new Label(marginGroup, SWT.NONE).setText("marginRight"); marginRight = new Combo(marginGroup, SWT.NONE); marginRight.setItems(marginValues); marginRight.select(1); marginRight.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); marginRight.addSelectionListener(selectionListener); marginRight.addTraverseListener(traverseListener); new Label(marginGroup, SWT.NONE).setText("marginLeft"); marginLeft = new Combo(marginGroup, SWT.NONE); marginLeft.setItems(marginValues); marginLeft.select(1); marginLeft.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); marginLeft.addSelectionListener(selectionListener); marginLeft.addTraverseListener(traverseListener); new Label(marginGroup, SWT.NONE).setText("marginTop"); marginTop = new Combo(marginGroup, SWT.NONE); marginTop.setItems(marginValues); marginTop.select(1); marginTop.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); marginTop.addSelectionListener(selectionListener); marginTop.addTraverseListener(traverseListener); new Label(marginGroup, SWT.NONE).setText("marginBottom"); marginBottom = new Combo(marginGroup, SWT.NONE); marginBottom.setItems(marginValues); marginBottom.select(1); marginBottom.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); marginBottom.addSelectionListener(selectionListener); marginBottom.addTraverseListener(traverseListener); new Label(marginGroup, SWT.NONE).setText("spacing"); spacing = new Combo(marginGroup, SWT.NONE); spacing.setItems(marginValues); spacing.select(1); spacing.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); spacing.addSelectionListener(selectionListener); spacing.addTraverseListener(traverseListener); /* Controls other parameters of the RowLayout */ Group specGroup = new Group(controlGroup, SWT.NONE); specGroup.setText(LayoutExample.getResourceString("Properties")); specGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); specGroup.setLayout(new GridLayout()); wrap = new Button(specGroup, SWT.CHECK); wrap.setText("wrap"); wrap.setSelection(true); wrap.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); wrap.addSelectionListener(selectionListener); pack = new Button(specGroup, SWT.CHECK); pack.setText("pack"); pack.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); pack.setSelection(true); pack.addSelectionListener(selectionListener); justify = new Button(specGroup, SWT.CHECK); justify.setText("justify"); justify.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); justify.addSelectionListener(selectionListener); /* Add common controls */ super.createControlWidgets(); /* Position the sash */ sash.setWeights(new int[] { 6, 5 }); } /** * Creates the example layout. */ void createLayout() { rowLayout = new RowLayout(); layoutComposite.setLayout(rowLayout); } /** * Disposes the editors without placing their contents into the table. */ void disposeEditors() { comboEditor.setEditor(null, null, -1); combo.dispose(); widthText.dispose(); heightText.dispose(); } /** * Generates code for the example layout. */ StringBuffer generateLayoutCode() { StringBuffer code = new StringBuffer(); code.append("\t\tRowLayout rowLayout = new RowLayout ();\n"); if (rowLayout.type == SWT.VERTICAL) { code.append("\t\trowLayout.type = SWT.VERTICAL;\n"); } if (rowLayout.wrap == false) { code.append("\t\trowLayout.wrap = false;\n"); } if (rowLayout.pack == false) { code.append("\t\trowLayout.pack = false;\n"); } if (rowLayout.justify == true) { code.append("\t\trowLayout.justify = true;\n"); } if (rowLayout.marginLeft != 3) { code.append("\t\trowLayout.marginLeft = " + rowLayout.marginLeft + ";\n"); } if (rowLayout.marginRight != 3) { code.append("\t\trowLayout.marginRight = " + rowLayout.marginRight + ";\n"); } if (rowLayout.marginTop != 3) { code.append("\t\trowLayout.marginTop = " + rowLayout.marginTop + ";\n"); } if (rowLayout.marginBottom != 3) { code.append("\t\trowLayout.marginBottom = " + rowLayout.marginBottom + ";\n"); } if (rowLayout.spacing != 3) { code.append("\t\trowLayout.spacing = " + rowLayout.spacing + ";\n"); } code.append("\t\tshell.setLayout (rowLayout);\n"); boolean first = true; for (int i = 0; i < children.length; i++) { Control control = children[i]; code.append(getChildCode(control, i)); RowData data = (RowData) control.getLayoutData(); if (data != null) { if (data.width != -1 || data.height != -1) { code.append("\t\t"); if (first) { code.append("RowData "); first = false; } if (data.width == -1) { code.append("data = new RowData (SWT.DEFAULT, " + data.height + ");\n"); } else if (data.height == -1) { code.append("data = new RowData (" + data.width + ", SWT.DEFAULT);\n"); } else { code.append("data = new RowData (" + data.width + ", " + data.height + ");\n"); } 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" }; } /** * Gets the text for the tab folder item. */ String getTabText() { return "RowLayout"; } /** * 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); /* Make sure user has entered valid data */ 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)); } String[] insert = new String[] { String.valueOf(row), combo.getText(), widthText.getText(), heightText.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(); RowData data; int width, height; for (int i = 0; i < children.length; i++) { width = new Integer(items[i].getText(WIDTH_COL)).intValue(); height = new Integer(items[i].getText(HEIGHT_COL)).intValue(); data = new RowData(width, height); children[i].setLayoutData(data); } } /** * Sets the state of the layout. */ void setLayoutState() { /* Set the type of layout */ if (vertical.getSelection()) { rowLayout.type = SWT.VERTICAL; } else { rowLayout.type = SWT.HORIZONTAL; } /* Set the margins and spacing */ try { rowLayout.marginRight = new Integer(marginRight.getText()).intValue(); } catch (NumberFormatException e) { rowLayout.marginRight = 3; marginRight.select(1); } try { rowLayout.marginLeft = new Integer(marginLeft.getText()).intValue(); } catch (NumberFormatException e) { rowLayout.marginLeft = 3; marginLeft.select(1); } try { rowLayout.marginTop = new Integer(marginTop.getText()).intValue(); } catch (NumberFormatException e) { rowLayout.marginTop = 3; marginTop.select(1); } try { rowLayout.marginBottom = new Integer(marginBottom.getText()).intValue(); } catch (NumberFormatException e) { rowLayout.marginBottom = 3; marginBottom.select(1); } try { rowLayout.spacing = new Integer(spacing.getText()).intValue(); } catch (NumberFormatException e) { rowLayout.spacing = 3; spacing.select(1); } /* Set the other layout properties */ rowLayout.wrap = wrap.getSelection(); rowLayout.pack = pack.getSelection(); rowLayout.justify = justify.getSelection(); } } /******************************************************************************* * 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 ******************************************************************************/ class GridLayoutTab extends Tab { /* Controls for setting layout parameters */ Text numColumns; Button makeColumnsEqualWidth; Combo marginHeight, marginWidth, horizontalSpacing, verticalSpacing; /* The example layout instance */ GridLayout gridLayout; /* TableEditors and related controls */ TableEditor comboEditor, widthEditor, heightEditor; TableEditor vAlignEditor, hAlignEditor, hIndentEditor; TableEditor hSpanEditor, vSpanEditor, hGrabEditor, vGrabEditor; CCombo combo, vAlign, hAlign, hGrab, vGrab; Text widthText, heightText, hIndent, hSpan, vSpan; /* Constants */ final int COMBO_COL = 1; final int WIDTH_COL = 2; final int HEIGHT_COL = 3; final int HALIGN_COL = 4; final int VALIGN_COL = 5; final int HINDENT_COL = 6; final int HSPAN_COL = 7; final int VSPAN_COL = 8; final int HGRAB_COL = 9; final int VGRAB_COL = 10; final int TOTAL_COLS = 11; /** * 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 { 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(hIndent.getText()).intValue(); } catch (NumberFormatException e) { hIndent.setText(oldItem.getText(HINDENT_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)); } 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 = 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 = 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 = new Integer(items[i].getText(HINDENT_COL)).intValue(); data.horizontalIndent = hIndent; hSpan = new Integer(items[i].getText(HSPAN_COL)).intValue(); data.horizontalSpan = hSpan; vSpan = new Integer(items[i].getText(VSPAN_COL)).intValue(); 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 = new Integer(numColumns.getText()).intValue(); } catch (NumberFormatException e) { gridLayout.numColumns = 1; } gridLayout.makeColumnsEqualWidth = makeColumnsEqualWidth.getSelection(); /* Set the margins and spacing */ try { gridLayout.marginHeight = new Integer(marginHeight.getText()).intValue(); } catch (NumberFormatException e) { gridLayout.marginHeight = 5; marginHeight.select(2); } try { gridLayout.marginWidth = new Integer(marginWidth.getText()).intValue(); } catch (NumberFormatException e) { gridLayout.marginWidth = 5; marginWidth.select(2); } try { gridLayout.horizontalSpacing = new Integer(horizontalSpacing.getText()).intValue(); } catch (NumberFormatException e) { gridLayout.horizontalSpacing = 5; horizontalSpacing.select(2); } try { gridLayout.verticalSpacing = new Integer(verticalSpacing.getText()).intValue(); } catch (NumberFormatException e) { gridLayout.verticalSpacing = 5; verticalSpacing.select(2); } } } /******************************************************************************* * 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 ******************************************************************************/ class FormLayoutTab extends Tab { /* Controls for setting layout parameters */ Combo marginHeight, marginWidth; /* The example layout instance */ FormLayout formLayout; /* TableEditors and related controls */ TableEditor comboEditor, widthEditor, heightEditor; TableEditor leftEditor, rightEditor, topEditor, bottomEditor; CCombo combo; Text widthText, heightText; Button leftAttach, rightAttach, topAttach, bottomAttach; /* Constants */ final int COMBO_COL = 1; final int WIDTH_COL = 2; final int HEIGHT_COL = 3; final int LEFT_COL = 4; final int RIGHT_COL = 5; final int TOP_COL = 6; final int BOTTOM_COL = 7; final int MODIFY_COLS = 4; // The number of columns with combo or text // editors final int TOTAL_COLS = 8; /** * Creates the Tab within a given instance of LayoutExample. */ FormLayoutTab(LayoutExample instance) { super(instance); } /** * Returns the constant for the alignment for an attachment given a string. */ int alignmentConstant(String align) { if (align.equals("LEFT")) return SWT.LEFT; if (align.equals("RIGHT")) return SWT.RIGHT; if (align.equals("TOP")) return SWT.TOP; if (align.equals("BOTTOM")) return SWT.BOTTOM; if (align.equals("CENTER")) return SWT.CENTER; return SWT.DEFAULT; } /** * Returns a string representing the alignment for an attachment given a * constant. */ String alignmentString(int align) { switch (align) { case SWT.LEFT: return "LEFT"; case SWT.RIGHT: return "RIGHT"; case SWT.TOP: return "TOP"; case SWT.BOTTOM: return "BOTTOM"; case SWT.CENTER: return "CENTER"; } return "DEFAULT"; } /** * Update the attachment field in case the type of control has changed. */ String checkAttachment(String oldAttach, FormAttachment newAttach) { String controlClass = newAttach.control.getClass().toString(); String controlType = controlClass.substring(controlClass.lastIndexOf('.') + 1); int i = 0; while (i < oldAttach.length() && !Character.isDigit(oldAttach.charAt(i))) { i++; } String index = oldAttach.substring(i, oldAttach.indexOf(',')); return controlType + index + "," + newAttach.offset + ":" + alignmentString(newAttach.alignment); } /** * Creates the widgets in the "child" group. */ void createChildWidgets() { /* Add common controls */ super.createChildWidgets(); /* Resize the columns */ table.getColumn(LEFT_COL).setWidth(100); table.getColumn(RIGHT_COL).setWidth(100); table.getColumn(TOP_COL).setWidth(100); table.getColumn(BOTTOM_COL).setWidth(100); /* Add TableEditors */ comboEditor = new TableEditor(table); widthEditor = new TableEditor(table); heightEditor = new TableEditor(table); leftEditor = new TableEditor(table); rightEditor = new TableEditor(table); topEditor = new TableEditor(table); bottomEditor = 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); leftAttach = new Button(table, SWT.PUSH); leftAttach.setText(LayoutExample.getResourceString("Attach_Edit")); leftEditor.horizontalAlignment = SWT.LEFT; leftEditor.grabHorizontal = true; leftEditor.minimumWidth = leftAttach.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; leftEditor.setEditor(leftAttach, newItem, LEFT_COL); leftAttach.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Shell shell = tabFolderPage.getShell(); AttachDialog dialog = new AttachDialog(shell); dialog.setText(LayoutExample.getResourceString("Left_Attachment")); dialog.setColumn(LEFT_COL); String attach = dialog.open(); newItem.setText(LEFT_COL, attach); resetEditors(); } }); rightAttach = new Button(table, SWT.PUSH); rightAttach.setText(LayoutExample.getResourceString("Attach_Edit")); rightEditor.horizontalAlignment = SWT.LEFT; rightEditor.grabHorizontal = true; rightEditor.minimumWidth = rightAttach.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; rightEditor.setEditor(rightAttach, newItem, RIGHT_COL); rightAttach.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Shell shell = tabFolderPage.getShell(); AttachDialog dialog = new AttachDialog(shell); dialog.setText(LayoutExample.getResourceString("Right_Attachment")); dialog.setColumn(RIGHT_COL); String attach = dialog.open(); newItem.setText(RIGHT_COL, attach); if (newItem.getText(LEFT_COL).endsWith(")")) newItem.setText(LEFT_COL, ""); resetEditors(); } }); topAttach = new Button(table, SWT.PUSH); topAttach.setText(LayoutExample.getResourceString("Attach_Edit")); topEditor.horizontalAlignment = SWT.LEFT; topEditor.grabHorizontal = true; topEditor.minimumWidth = topAttach.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; topEditor.setEditor(topAttach, newItem, TOP_COL); topAttach.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Shell shell = tabFolderPage.getShell(); AttachDialog dialog = new AttachDialog(shell); dialog.setText(LayoutExample.getResourceString("Top_Attachment")); dialog.setColumn(TOP_COL); String attach = dialog.open(); newItem.setText(TOP_COL, attach); resetEditors(); } }); bottomAttach = new Button(table, SWT.PUSH); bottomAttach.setText(LayoutExample.getResourceString("Attach_Edit")); bottomEditor.horizontalAlignment = SWT.LEFT; bottomEditor.grabHorizontal = true; bottomEditor.minimumWidth = bottomAttach.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; bottomEditor.setEditor(bottomAttach, newItem, BOTTOM_COL); bottomAttach.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Shell shell = tabFolderPage.getShell(); AttachDialog dialog = new AttachDialog(shell); dialog.setText(LayoutExample.getResourceString("Bottom_Attachment")); dialog.setColumn(BOTTOM_COL); String attach = dialog.open(); newItem.setText(BOTTOM_COL, attach); if (newItem.getText(TOP_COL).endsWith(")")) newItem.setText(TOP_COL, ""); resetEditors(); } }); for (int i = 0; i < table.getColumnCount(); i++) { Rectangle rect = newItem.getBounds(i); if (rect.contains(pt)) { switch (i) { case 0: resetEditors(); break; case COMBO_COL: combo.setFocus(); break; case WIDTH_COL: widthText.setFocus(); break; case HEIGHT_COL: heightText.setFocus(); break; default: 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", "0,0 (" + LayoutExample.getResourceString("Default") + ")", "", "0,0 (" + LayoutExample.getResourceString("Default") + ")", "" }; item.setText(insert); data.addElement(insert); resetEditors(); } }); } /** * Creates the control widgets. */ void createControlWidgets() { /* Controls the margins and spacing of the FormLayout */ String[] marginValues = new String[] { "0", "3", "5", "10" }; Group marginGroup = new Group(controlGroup, SWT.NONE); marginGroup.setText(LayoutExample.getResourceString("Margins")); GridLayout layout = new GridLayout(); layout.numColumns = 2; marginGroup.setLayout(layout); marginGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); new Label(marginGroup, SWT.NONE).setText("marginHeight"); marginHeight = new Combo(marginGroup, SWT.NONE); marginHeight.setItems(marginValues); marginHeight.select(0); marginHeight.addSelectionListener(selectionListener); marginHeight.addTraverseListener(traverseListener); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = 60; marginHeight.setLayoutData(data); new Label(marginGroup, SWT.NONE).setText("marginWidth"); marginWidth = new Combo(marginGroup, SWT.NONE); marginWidth.setItems(marginValues); marginWidth.select(0); marginWidth.addSelectionListener(selectionListener); marginWidth.addTraverseListener(traverseListener); data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = 60; marginWidth.setLayoutData(data); /* Add common controls */ super.createControlWidgets(); /* Position the sash */ sash.setWeights(new int[] { 6, 4 }); } /** * Creates the example layout. */ void createLayout() { formLayout = new FormLayout(); layoutComposite.setLayout(formLayout); } /** * Disposes the editors without placing their contents into the table. */ void disposeEditors() { comboEditor.setEditor(null, null, -1); combo.dispose(); widthText.dispose(); heightText.dispose(); leftAttach.dispose(); rightAttach.dispose(); topAttach.dispose(); bottomAttach.dispose(); } /** * Generates code for the example layout. */ StringBuffer generateLayoutCode() { StringBuffer code = new StringBuffer(); code.append("\t\tFormLayout formLayout = new FormLayout ();\n"); if (formLayout.marginHeight != 0) { code.append("\t\tformLayout.marginHeight = " + formLayout.marginHeight + ";\n"); } if (formLayout.marginWidth != 0) { code.append("\t\tformLayout.marginWidth = " + formLayout.marginWidth + ";\n"); } code.append("\t\tshell.setLayout (formLayout);\n"); boolean first = true; for (int i = 0; i < children.length; i++) { Control control = children[i]; code.append(getChildCode(control, i)); FormData data = (FormData) control.getLayoutData(); if (data != null) { code.append("\t\t"); if (first) { code.append("FormData "); first = false; } code.append("data = new FormData ();\n"); if (data.width != SWT.DEFAULT) { code.append("\t\tdata.width = " + data.width + ";\n"); } if (data.height != SWT.DEFAULT) { code.append("\t\tdata.height = " + data.height + ";\n"); } if (data.left != null) { if (data.left.control != null) { TableItem item = table.getItem(i); String controlString = item.getText(LEFT_COL); int index = new Integer( controlString.substring(controlString.indexOf(',') - 1, controlString.indexOf(','))) .intValue(); code.append("\t\tdata.left = new FormAttachment (" + names[index] + ", " + data.left.offset + ", SWT." + alignmentString(data.left.alignment) + ");\n"); } else { if (data.right != null || (data.left.numerator != 0 || data.left.offset != 0)) { code.append("\t\tdata.left = new FormAttachment (" + data.left.numerator + ", " + data.left.offset + ");\n"); } } } if (data.right != null) { if (data.right.control != null) { TableItem item = table.getItem(i); String controlString = item.getText(RIGHT_COL); int index = new Integer( controlString.substring(controlString.indexOf(',') - 1, controlString.indexOf(','))) .intValue(); code.append("\t\tdata.right = new FormAttachment (" + names[index] + ", " + data.right.offset + ", SWT." + alignmentString(data.right.alignment) + ");\n"); } else { code.append("\t\tdata.right = new FormAttachment (" + data.right.numerator + ", " + data.right.offset + ");\n"); } } if (data.top != null) { if (data.top.control != null) { TableItem item = table.getItem(i); String controlString = item.getText(TOP_COL); int index = new Integer( controlString.substring(controlString.indexOf(',') - 1, controlString.indexOf(','))) .intValue(); code.append("\t\tdata.top = new FormAttachment (" + names[index] + ", " + data.top.offset + ", SWT." + alignmentString(data.top.alignment) + ");\n"); } else { if (data.bottom != null || (data.top.numerator != 0 || data.top.offset != 0)) { code.append("\t\tdata.top = new FormAttachment (" + data.top.numerator + ", " + data.top.offset + ");\n"); } } } if (data.bottom != null) { if (data.bottom.control != null) { TableItem item = table.getItem(i); String controlString = item.getText(BOTTOM_COL); int index = new Integer( controlString.substring(controlString.indexOf(',') - 1, controlString.indexOf(','))) .intValue(); code.append("\t\tdata.bottom = new FormAttachment (" + names[index] + ", " + data.bottom.offset + ", SWT." + alignmentString(data.bottom.alignment) + ");\n"); } else { code.append("\t\tdata.bottom = new FormAttachment (" + data.bottom.numerator + ", " + data.bottom.offset + ");\n"); } } 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", "left", "right", "top", "bottom" }; } /** * Gets the text for the tab folder item. */ String getTabText() { return "FormLayout"; } /** * 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 { 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)); } String[] insert = new String[] { String.valueOf(row), combo.getText(), widthText.getText(), heightText.getText() }; data.setElementAt(insert, row); for (int i = 0; i < MODIFY_COLS; i++) { oldItem.setText(i, ((String[]) data.elementAt(row))[i]); } if (!tab) disposeEditors(); } setLayoutState(); refreshLayoutComposite(); setLayoutData(); layoutComposite.layout(true); layoutGroup.layout(true); } /** * Sets an attachment to the edge of a widget using the information in the * table. */ FormAttachment setAttachment(String attachment) { String control, align; int position, offset; int comma = attachment.indexOf(','); char first = attachment.charAt(0); if (Character.isLetter(first)) { /* Case where there is a control */ control = attachment.substring(0, comma); int i = 0; while (i < control.length() && !Character.isDigit(control.charAt(i))) { i++; } String end = control.substring(i); int index = new Integer(end).intValue(); Control attachControl = children[index]; int colon = attachment.indexOf(':'); try { offset = new Integer(attachment.substring(comma + 1, colon)).intValue(); } catch (NumberFormatException e) { offset = 0; } align = attachment.substring(colon + 1); return new FormAttachment(attachControl, offset, alignmentConstant(align)); } else { /* Case where there is a position */ try { position = new Integer(attachment.substring(0, comma)).intValue(); } catch (NumberFormatException e) { position = 0; } try { offset = new Integer(attachment.substring(comma + 1)).intValue(); } catch (NumberFormatException e) { offset = 0; } return new FormAttachment(position, offset); } } /** * Sets the layout data for the children of the layout. */ void setLayoutData() { Control[] children = layoutComposite.getChildren(); TableItem[] items = table.getItems(); FormData data; int width, height; String left, right, top, bottom; for (int i = 0; i < children.length; i++) { width = new Integer(items[i].getText(WIDTH_COL)).intValue(); height = new Integer(items[i].getText(HEIGHT_COL)).intValue(); data = new FormData(); if (width > 0) data.width = width; if (height > 0) data.height = height; left = items[i].getText(LEFT_COL); if (left.length() > 0) { data.left = setAttachment(left); if (data.left.control != null) { String attachment = checkAttachment(left, data.left); items[i].setText(LEFT_COL, attachment); } } right = items[i].getText(RIGHT_COL); if (right.length() > 0) { data.right = setAttachment(right); if (data.right.control != null) { String attachment = checkAttachment(right, data.right); items[i].setText(RIGHT_COL, attachment); } } top = items[i].getText(TOP_COL); if (top.length() > 0) { data.top = setAttachment(top); if (data.top.control != null) { String attachment = checkAttachment(top, data.top); items[i].setText(TOP_COL, attachment); } } bottom = items[i].getText(BOTTOM_COL); if (bottom.length() > 0) { data.bottom = setAttachment(bottom); if (data.bottom.control != null) { String attachment = checkAttachment(bottom, data.bottom); items[i].setText(BOTTOM_COL, attachment); } } children[i].setLayoutData(data); } } /** * Sets the state of the layout. */ void setLayoutState() { /* Set the margins and spacing */ try { formLayout.marginHeight = new Integer(marginHeight.getText()).intValue(); } catch (NumberFormatException e) { formLayout.marginHeight = 0; marginHeight.select(0); } try { formLayout.marginWidth = new Integer(marginWidth.getText()).intValue(); } catch (NumberFormatException e) { formLayout.marginWidth = 0; marginWidth.select(0); } } /** * <code>AttachDialog</code> is the class that creates a dialog specific * for this example. It creates a dialog with controls to set the values in * a FormAttachment. */ public class AttachDialog extends Dialog { String result = ""; String controlInput, positionInput, alignmentInput, offsetInput; int col = 0; public AttachDialog(Shell parent, int style) { super(parent, style); } public AttachDialog(Shell parent) { this(parent, 0); } public void setColumn(int col) { this.col = col; } public String open() { Shell parent = getParent(); final Shell shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); shell.setText(getText()); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.makeColumnsEqualWidth = true; shell.setLayout(layout); /* Find out what was previously set as an attachment */ TableItem newItem = leftEditor.getItem(); result = newItem.getText(col); String oldAttach = result; String oldPos = "0", oldControl = "", oldAlign = "DEFAULT", oldOffset = "0"; boolean isControl = false; if (oldAttach.length() != 0) { char first = oldAttach.charAt(0); if (Character.isLetter(first)) { /* We have a control */ isControl = true; oldControl = oldAttach.substring(0, oldAttach.indexOf(',')); oldAlign = oldAttach.substring(oldAttach.indexOf(':') + 1); oldOffset = oldAttach.substring(oldAttach.indexOf(',') + 1, oldAttach.indexOf(':')); } else { /* We have a position */ oldPos = oldAttach.substring(0, oldAttach.indexOf(',')); oldOffset = oldAttach.substring(oldAttach.indexOf(',') + 1); if (oldOffset.endsWith(")")) { // i.e. (Default) oldOffset = oldOffset.substring(0, oldOffset.indexOf(' ')); } } } /* Add position field */ final Button posButton = new Button(shell, SWT.RADIO); posButton.setText(LayoutExample.getResourceString("Position")); posButton.setSelection(!isControl); final Combo position = new Combo(shell, SWT.NONE); position.setItems(new String[] { "0", "25", "50", "75", "100" }); position.setText(oldPos); position.setEnabled(!isControl); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; position.setLayoutData(data); /* Add control field */ final Button contButton = new Button(shell, SWT.RADIO); contButton.setText(LayoutExample.getResourceString("Control")); contButton.setSelection(isControl); final Combo control = new Combo(shell, SWT.READ_ONLY); TableItem[] items = table.getItems(); TableItem currentItem = leftEditor.getItem(); for (int i = 0; i < table.getItemCount(); i++) { if (items[i].getText(0).length() > 0) { if (items[i] != currentItem) { control.add(items[i].getText(COMBO_COL) + i); } } } if (oldControl.length() != 0) control.setText(oldControl); else control.select(0); control.setEnabled(isControl); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; control.setLayoutData(data); /* Add alignment field */ new Label(shell, SWT.NONE).setText(LayoutExample.getResourceString("Alignment")); final Combo alignment = new Combo(shell, SWT.NONE); String[] alignmentValues; if (col == LEFT_COL || col == RIGHT_COL) { alignmentValues = new String[] { "SWT.LEFT", "SWT.RIGHT", "SWT.CENTER", "SWT.DEFAULT" }; } else { // col == TOP_COL || col == BOTTOM_COL alignmentValues = new String[] { "SWT.TOP", "SWT.BOTTOM", "SWT.CENTER", "SWT.DEFAULT" }; } alignment.setItems(alignmentValues); alignment.setText("SWT." + oldAlign); alignment.setEnabled(isControl); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; alignment.setLayoutData(data); /* Add offset field */ new Label(shell, SWT.NONE).setText(LayoutExample.getResourceString("Offset")); final Text offset = new Text(shell, SWT.SINGLE | SWT.BORDER); offset.setText(oldOffset); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; offset.setLayoutData(data); /* Add listeners for choosing between position and control */ posButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { position.setEnabled(true); control.setEnabled(false); alignment.setEnabled(false); } }); contButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { position.setEnabled(false); control.setEnabled(true); alignment.setEnabled(true); } }); Button clear = new Button(shell, SWT.PUSH); clear.setText(LayoutExample.getResourceString("Clear")); clear.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END)); clear.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { result = ""; shell.close(); } }); /* OK button sets data into table */ Button ok = new Button(shell, SWT.PUSH); ok.setText(LayoutExample.getResourceString("OK")); ok.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); ok.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { controlInput = control.getText(); alignmentInput = alignment.getText().substring(4); positionInput = position.getText(); if (positionInput.length() == 0) positionInput = "0"; try { new Integer(positionInput).intValue(); } catch (NumberFormatException except) { positionInput = "0"; } offsetInput = offset.getText(); if (offsetInput.length() == 0) offsetInput = "0"; try { new Integer(offsetInput).intValue(); } catch (NumberFormatException except) { offsetInput = "0"; } if (posButton.getSelection() || controlInput.length() == 0) { result = positionInput + "," + offsetInput; } else { result = controlInput + "," + offsetInput + ":" + alignmentInput; } shell.close(); } }); Button cancel = new Button(shell, SWT.PUSH); cancel.setText(LayoutExample.getResourceString("Cancel")); cancel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); cancel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { shell.close(); } }); shell.setDefaultButton(ok); shell.pack(); /* Center the dialog */ Point center = parent.getLocation(); center.x = center.x + (parent.getBounds().width / 2) - (shell.getBounds().width / 2); center.y = center.y + (parent.getBounds().height / 2) - (shell.getBounds().height / 2); shell.setLocation(center); shell.open(); Display display = shell.getDisplay(); while (!shell.isDisposed()) { if (display.readAndDispatch()) display.sleep(); } return result; } } } /******************************************************************************* * 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 ******************************************************************************/ class FillLayoutTab extends Tab { /* Controls for setting layout parameters */ Button horizontal, vertical; /* The example layout instance */ FillLayout fillLayout; /* TableEditors and related controls */ TableEditor comboEditor; CCombo combo; /** * Creates the Tab within a given instance of LayoutExample. */ FillLayoutTab(LayoutExample instance) { super(instance); } /** * Creates the widgets in the "child" group. */ void createChildWidgets() { /* Add common controls */ super.createChildWidgets(); /* Add TableEditors */ comboEditor = new TableEditor(table); table.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { resetEditors(); index = table.getSelectionIndex(); if (index == -1) return; TableItem oldItem = comboEditor.getItem(); newItem = table.getItem(index); if (newItem == oldItem || newItem != lastSelected) { lastSelected = newItem; return; } table.showSelection(); combo = new CCombo(table, SWT.READ_ONLY); createComboEditor(combo, comboEditor); } }); /* Add listener to add an element to the table */ add.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { TableItem item = new TableItem(table, 0); item.setText(0, String.valueOf(table.indexOf(item))); item.setText(1, "Button"); data.addElement("Button"); resetEditors(); } }); } /** * Creates the control widgets. */ void createControlWidgets() { /* Controls the type of FillLayout */ Group typeGroup = new Group(controlGroup, SWT.NONE); typeGroup.setText(LayoutExample.getResourceString("Type")); typeGroup.setLayout(new GridLayout()); typeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); horizontal = new Button(typeGroup, SWT.RADIO); horizontal.setText("SWT.HORIZONTAL"); horizontal.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); horizontal.setSelection(true); horizontal.addSelectionListener(selectionListener); vertical = new Button(typeGroup, SWT.RADIO); vertical.setText("SWT.VERTICAL"); vertical.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); vertical.addSelectionListener(selectionListener); /* Add common controls */ super.createControlWidgets(); /* Position the sash */ sash.setWeights(new int[] { 4, 1 }); } /** * Creates the example layout. */ void createLayout() { fillLayout = new FillLayout(); layoutComposite.setLayout(fillLayout); } /** * Disposes the editors without placing their contents into the table. */ void disposeEditors() { comboEditor.setEditor(null, null, -1); combo.dispose(); } /** * Generates code for the example layout. */ StringBuffer generateLayoutCode() { StringBuffer code = new StringBuffer(); code.append("\t\tFillLayout fillLayout = new FillLayout ();\n"); if (fillLayout.type == SWT.VERTICAL) { code.append("\t\tfillLayout.type = SWT.VERTICAL;\n"); } code.append("\t\tshell.setLayout (fillLayout);\n"); for (int i = 0; i < children.length; i++) { Control control = children[i]; code.append(getChildCode(control, i)); } return code; } /** * Returns the layout data field names. */ String[] getLayoutDataFieldNames() { return new String[] { "", "Control" }; } /** * Gets the text for the tab folder item. */ String getTabText() { return "FillLayout"; } /** * Takes information from TableEditors and stores it. */ void resetEditors() { TableItem oldItem = comboEditor.getItem(); comboEditor.setEditor(null, null, -1); if (oldItem != null) { int row = table.indexOf(oldItem); data.insertElementAt(combo.getText(), row); oldItem.setText(1, data.elementAt(row).toString()); combo.dispose(); } setLayoutState(); refreshLayoutComposite(); layoutComposite.layout(true); layoutGroup.layout(true); } /** * Sets the state of the layout. */ void setLayoutState() { if (vertical.getSelection()) { fillLayout.type = SWT.VERTICAL; } else { fillLayout.type = SWT.HORIZONTAL; } } }