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;
}
}
}
|