/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.examples.controlexample;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ArmEvent;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TypedEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
/**
* <code>Tab</code> is the abstract superclass of every page in the example's tab folder. Each page in the tab folder
* describes a control. A Tab itself is not a control but instead provides a hierarchy with which to share code that is
* common to every page in the folder. A typical page in a Tab contains a two column composite. The left column contains
* the "Example" group. The right column contains "Control" group. The "Control" group contains controls that allow the
* user to interact with the example control. The "Control" group typically contains a "Style", "Other" and "Size"
* group. Subclasses can override these defaults to augment a group or stop a group from being created.
*/
abstract class Tab {
static final int BACKGROUND_COLOR = 1;
static final Object[][] EVENT_NAMES = { { "Activate", Integer.valueOf(SWT.Activate) },
{ "Arm", Integer.valueOf(SWT.Arm) }, { "Close", Integer.valueOf(SWT.Close) },
{ "Collapse", Integer.valueOf(SWT.Collapse) }, { "Deactivate", Integer.valueOf(SWT.Deactivate) },
{ "DefaultSelection", Integer.valueOf(SWT.DefaultSelection) }, { "Deiconify", Integer.valueOf(SWT.Deiconify) },
{ "Dispose", Integer.valueOf(SWT.Dispose) }, { "DragDetect", Integer.valueOf(SWT.DragDetect) },
{ "EraseItem", Integer.valueOf(SWT.EraseItem) }, { "Expand", Integer.valueOf(SWT.Expand) },
{ "FocusIn", Integer.valueOf(SWT.FocusIn) }, { "FocusOut", Integer.valueOf(SWT.FocusOut) },
{ "HardKeyDown", Integer.valueOf(SWT.HardKeyDown) }, { "HardKeyUp", Integer.valueOf(SWT.HardKeyUp) },
{ "Help", Integer.valueOf(SWT.Help) }, { "Hide", Integer.valueOf(SWT.Hide) },
{ "Iconify", Integer.valueOf(SWT.Iconify) }, { "KeyDown", Integer.valueOf(SWT.KeyDown) },
{ "KeyUp", Integer.valueOf(SWT.KeyUp) }, { "MeasureItem", Integer.valueOf(SWT.MeasureItem) },
{ "MenuDetect", Integer.valueOf(SWT.MenuDetect) }, { "Modify", Integer.valueOf(SWT.Modify) },
{ "MouseDoubleClick", Integer.valueOf(SWT.MouseDoubleClick) }, { "MouseDown", Integer.valueOf(SWT.MouseDown) },
{ "MouseEnter", Integer.valueOf(SWT.MouseEnter) }, { "MouseExit", Integer.valueOf(SWT.MouseExit) },
{ "MouseHover", Integer.valueOf(SWT.MouseHover) }, { "MouseMove", Integer.valueOf(SWT.MouseMove) },
{ "MouseUp", Integer.valueOf(SWT.MouseUp) }, { "MouseWheel", Integer.valueOf(SWT.MouseWheel) },
{ "Move", Integer.valueOf(SWT.Move) }, { "Paint", Integer.valueOf(SWT.Paint) },
{ "PaintItem", Integer.valueOf(SWT.PaintItem) }, { "Resize", Integer.valueOf(SWT.Resize) },
{ "Selection", Integer.valueOf(SWT.Selection) }, { "SetData", Integer.valueOf(SWT.SetData) },
// {"Settings", Integer.valueOf(SWT.Settings)}, // note: this event only goes to Display
{ "Show", Integer.valueOf(SWT.Show) }, { "Traverse", Integer.valueOf(SWT.Traverse) },
{ "Verify", Integer.valueOf(SWT.Verify) }, };
static final int FONT = 2;
static final int FOREGROUND_COLOR = 0;
/* Controls and resources for the "Colors & Fonts" group */
static final int IMAGE_SIZE = 12;
static final int LARGE_SIZE = 100;
/* Right-to-left support */
static final boolean RTL_SUPPORT_ENABLE = false;
static final int SMALL_SIZE = 50;
/* Sizing constants for the "Size" group */
static final int TOO_SMALL_SIZE = 10;
/* Controls and resources for the "Background Mode" group */
Combo backgroundModeCombo;
Button backgroundModeImageButton, backgroundModeColorButton;
/* Common control buttons */
Button borderButton, enabledButton, visibleButton, backgroundImageButton, popupMenuButton;
Table colorAndFontTable;
ColorDialog colorDialog;
Display display;
/* Event logging variables and controls */
Text eventConsole;
boolean[] eventsFilter;
Group exampleGroup, controlGroup, listenersGroup, otherGroup, sizeGroup, styleGroup, colorGroup,
backgroundModeGroup;
Font font;
FontDialog fontDialog;
Color foregroundColor, backgroundColor;
Button getButton, setButton;
/* Controlling instance */
final ControlExample instance;
boolean logging = false;
/* Set/Get API controls */
Combo nameCombo;
Group orientationGroup;
Button preferredButton, tooSmallButton, smallButton, largeButton, fillHButton, fillVButton;
Label returnTypeLabel;
Button rtlButton, ltrButton, defaultOrietationButton;
boolean samplePopup = false;
Text setText, getText;
Shell shell;
/* Common groups and composites */
Composite tabFolderPage;
/**
* Creates the Tab within a given instance of ControlExample.
*/
Tab(ControlExample instance) {
this.instance = instance;
}
protected void specialPopupMenuItems(final Menu menu, final Event event) {
}
void changeFontOrColor(int index) {
switch (index) {
case FOREGROUND_COLOR: {
Color oldColor = foregroundColor;
if (oldColor == null) {
Control[] controls = getExampleControls();
if (controls.length > 0)
oldColor = controls[0].getForeground();
}
if (oldColor != null)
colorDialog.setRGB(oldColor.getRGB()); // seed dialog with current color
RGB rgb = colorDialog.open();
if (rgb == null)
return;
oldColor = foregroundColor; // save old foreground color to dispose when done
foregroundColor = new Color(display, rgb);
setExampleWidgetForeground();
if (oldColor != null)
oldColor.dispose();
}
break;
case BACKGROUND_COLOR: {
Color oldColor = backgroundColor;
if (oldColor == null) {
Control[] controls = getExampleControls();
if (controls.length > 0)
oldColor = controls[0].getBackground(); // seed dialog with current color
}
if (oldColor != null)
colorDialog.setRGB(oldColor.getRGB());
RGB rgb = colorDialog.open();
if (rgb == null)
return;
oldColor = backgroundColor; // save old background color to dispose when done
backgroundColor = new Color(display, rgb);
setExampleWidgetBackground();
if (oldColor != null)
oldColor.dispose();
}
break;
case FONT: {
Font oldFont = font;
if (oldFont == null) {
Control[] controls = getExampleControls();
if (controls.length > 0)
oldFont = controls[0].getFont();
}
if (oldFont != null)
fontDialog.setFontList(oldFont.getFontData()); // seed dialog with current font
FontData fontData = fontDialog.open();
if (fontData == null)
return;
oldFont = font; // dispose old font when done
font = new Font(display, fontData);
setExampleWidgetFont();
setExampleWidgetSize();
if (oldFont != null)
oldFont.dispose();
}
break;
}
}
Image colorImage(Color color) {
Image image = new Image(display, Tab.IMAGE_SIZE, Tab.IMAGE_SIZE);
GC gc = new GC(image);
gc.setBackground(color);
Rectangle bounds = image.getBounds();
gc.fillRectangle(0, 0, bounds.width, bounds.height);
gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
gc.dispose();
return image;
}
/**
* Creates the "Background Mode" group.
*/
void createBackgroundModeGroup() {
// note that this method must be called after createExampleWidgets
if (getExampleControls().length == 0)
return;
/* Create the group */
backgroundModeGroup = new Group(controlGroup, SWT.NONE);
backgroundModeGroup.setLayout(new GridLayout());
backgroundModeGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
backgroundModeGroup.setText(ControlExample.getResourceString("Background_Mode"));
/* Create the controls */
backgroundModeCombo = new Combo(backgroundModeGroup, SWT.READ_ONLY);
backgroundModeCombo.setItems(new String[] { "SWT.INHERIT_NONE", "SWT.INHERIT_DEFAULT", "SWT.INHERIT_FORCE" });
backgroundModeImageButton = new Button(backgroundModeGroup, SWT.CHECK);
backgroundModeImageButton.setText(ControlExample.getResourceString("BackgroundImage"));
backgroundModeColorButton = new Button(backgroundModeGroup, SWT.CHECK);
backgroundModeColorButton.setText(ControlExample.getResourceString("BackgroundColor"));
/* Add the listeners */
backgroundModeCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleGroupBackgroundMode();
}
});
backgroundModeImageButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleGroupBackgroundImage();
}
});
backgroundModeColorButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleGroupBackgroundColor();
}
});
/* Set the default state */
backgroundModeCombo.setText(backgroundModeCombo.getItem(0));
backgroundModeImageButton.setSelection(false);
backgroundModeColorButton.setSelection(false);
}
/**
* Creates the "Colors and Fonts" group. This is typically a child of the "Control" group. Subclasses override this
* method to customize color and font settings.
*/
void createColorAndFontGroup() {
/* Create the group. */
colorGroup = new Group(controlGroup, SWT.NONE);
colorGroup.setLayout(new GridLayout(2, true));
colorGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
colorGroup.setText(ControlExample.getResourceString("Colors"));
colorAndFontTable = new Table(colorGroup, SWT.BORDER | SWT.V_SCROLL);
colorAndFontTable.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1));
TableItem item = new TableItem(colorAndFontTable, SWT.None);
item.setText(ControlExample.getResourceString("Foreground_Color"));
colorAndFontTable.setSelection(0);
item = new TableItem(colorAndFontTable, SWT.None);
item.setText(ControlExample.getResourceString("Background_Color"));
item = new TableItem(colorAndFontTable, SWT.None);
item.setText(ControlExample.getResourceString("Font"));
Button changeButton = new Button(colorGroup, SWT.PUSH);
changeButton.setText(ControlExample.getResourceString("Change"));
changeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
Button defaultsButton = new Button(colorGroup, SWT.PUSH);
defaultsButton.setText(ControlExample.getResourceString("Defaults"));
defaultsButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
/* Add listeners to set/reset colors and fonts. */
colorDialog = new ColorDialog(shell);
fontDialog = new FontDialog(shell);
colorAndFontTable.addSelectionListener(new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent event) {
changeFontOrColor(colorAndFontTable.getSelectionIndex());
}
});
changeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
changeFontOrColor(colorAndFontTable.getSelectionIndex());
}
});
defaultsButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
resetColorsAndFonts();
}
});
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
if (foregroundColor != null)
foregroundColor.dispose();
if (backgroundColor != null)
backgroundColor.dispose();
if (font != null)
font.dispose();
foregroundColor = null;
backgroundColor = null;
font = null;
if (colorAndFontTable != null && !colorAndFontTable.isDisposed()) {
TableItem[] items = colorAndFontTable.getItems();
for (int i = 0; i < items.length; i++) {
Image image = items[i].getImage();
if (image != null)
image.dispose();
}
}
}
});
}
/**
* Creates the "Control" group. The "Control" group is typically the right hand column in the tab.
*/
void createControlGroup() {
/*
* Create the "Control" group. This is the group on the right half of each example tab. It consists of the
* "Style" group, the "Other" group and the "Size" group.
*/
controlGroup = new Group(tabFolderPage, SWT.NONE);
controlGroup.setLayout(new GridLayout(3, false));
controlGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
controlGroup.setText(ControlExample.getResourceString("Parameters"));
/* Create individual groups inside the "Control" group */
createStyleGroup();
createOtherGroup();
createSetGetGroup();
createSizeGroup();
createColorAndFontGroup();
if (Tab.RTL_SUPPORT_ENABLE)
createOrientationGroup();
/*
* For each Button child in the style group, add a selection listener that will recreate the example controls.
* If the style group button is a RADIO button, ensure that the radio button is selected before recreating the
* example controls. When the user selects a RADIO button, the current RADIO button in the group is deselected
* and the new RADIO button is selected automatically. The listeners are notified for both these operations but
* typically only do work when a RADIO button is selected.
*/
SelectionListener selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if ((event.widget.getStyle() & SWT.RADIO) != 0)
if (!((Button) event.widget).getSelection())
return;
recreateExampleWidgets();
}
};
Control[] children = styleGroup.getChildren();
for (int i = 0; i < children.length; i++)
if (children[i] instanceof Button) {
Button button = (Button) children[i];
button.addSelectionListener(selectionListener);
} else if (children[i] instanceof Composite) {
/* Look down one more level of children in the style group. */
Composite composite = (Composite) children[i];
Control[] grandchildren = composite.getChildren();
for (int j = 0; j < grandchildren.length; j++)
if (grandchildren[j] instanceof Button) {
Button button = (Button) grandchildren[j];
button.addSelectionListener(selectionListener);
}
}
if (Tab.RTL_SUPPORT_ENABLE) {
rtlButton.addSelectionListener(selectionListener);
ltrButton.addSelectionListener(selectionListener);
defaultOrietationButton.addSelectionListener(selectionListener);
}
}
/**
* Creates the "Control" widget children. Subclasses override this method to augment the standard controls created
* in the "Style", "Other" and "Size" groups.
*/
void createControlWidgets() {
}
/**
* Create the event console popup menu.
*/
void createEventConsolePopup() {
Menu popup = new Menu(shell, SWT.POP_UP);
eventConsole.setMenu(popup);
MenuItem cut = new MenuItem(popup, SWT.PUSH);
cut.setText(ControlExample.getResourceString("MenuItem_Cut"));
cut.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
eventConsole.cut();
}
});
MenuItem copy = new MenuItem(popup, SWT.PUSH);
copy.setText(ControlExample.getResourceString("MenuItem_Copy"));
copy.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
eventConsole.copy();
}
});
MenuItem paste = new MenuItem(popup, SWT.PUSH);
paste.setText(ControlExample.getResourceString("MenuItem_Paste"));
paste.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
eventConsole.paste();
}
});
new MenuItem(popup, SWT.SEPARATOR);
MenuItem selectAll = new MenuItem(popup, SWT.PUSH);
selectAll.setText(ControlExample.getResourceString("MenuItem_SelectAll"));
selectAll.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
eventConsole.selectAll();
}
});
}
/**
* Creates the "Example" group. The "Example" group is typically the left hand column in the tab.
*/
void createExampleGroup() {
exampleGroup = new Group(tabFolderPage, SWT.NONE);
exampleGroup.setLayout(new GridLayout());
exampleGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
}
/**
* Creates the "Example" widget children of the "Example" group. Subclasses override this method to create the
* particular example control.
*/
void createExampleWidgets() {
/* Do nothing */
}
/**
* Creates and opens the "Listener selection" dialog.
*/
void createListenerSelectionDialog() {
final Shell dialog = new Shell(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE);
dialog.setText(ControlExample.getResourceString("Select_Listeners"));
dialog.setLayout(new GridLayout(2, false));
final Table table = new Table(dialog, SWT.BORDER | SWT.V_SCROLL | SWT.CHECK);
GridData data = new GridData(GridData.FILL_BOTH);
data.verticalSpan = 2;
table.setLayoutData(data);
for (int i = 0; i < Tab.EVENT_NAMES.length; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText((String) Tab.EVENT_NAMES[i][0]);
item.setChecked(eventsFilter[i]);
}
final String[] customNames = getCustomEventNames();
for (int i = 0; i < customNames.length; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(customNames[i]);
item.setChecked(eventsFilter[Tab.EVENT_NAMES.length + i]);
}
Button selectAll = new Button(dialog, SWT.PUSH);
selectAll.setText(ControlExample.getResourceString("Select_All"));
selectAll.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
selectAll.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getItems();
for (int i = 0; i < Tab.EVENT_NAMES.length; i++)
items[i].setChecked(true);
for (int i = 0; i < customNames.length; i++)
items[Tab.EVENT_NAMES.length + i].setChecked(true);
}
});
Button deselectAll = new Button(dialog, SWT.PUSH);
deselectAll.setText(ControlExample.getResourceString("Deselect_All"));
deselectAll.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING));
deselectAll.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getItems();
for (int i = 0; i < Tab.EVENT_NAMES.length; i++)
items[i].setChecked(false);
for (int i = 0; i < customNames.length; i++)
items[Tab.EVENT_NAMES.length + i].setChecked(false);
}
});
new Label(dialog, SWT.NONE); /* Filler */
Button ok = new Button(dialog, SWT.PUSH);
ok.setText(ControlExample.getResourceString("OK"));
dialog.setDefaultButton(ok);
ok.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
ok.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getItems();
for (int i = 0; i < Tab.EVENT_NAMES.length; i++)
eventsFilter[i] = items[i].getChecked();
for (int i = 0; i < customNames.length; i++)
eventsFilter[Tab.EVENT_NAMES.length + i] = items[Tab.EVENT_NAMES.length + i].getChecked();
dialog.dispose();
}
});
dialog.pack();
dialog.open();
while (!dialog.isDisposed())
if (!display.readAndDispatch())
display.sleep();
}
/**
* Creates the "Listeners" group. The "Listeners" group goes below the "Example" and "Control" groups.
*/
void createListenersGroup() {
listenersGroup = new Group(tabFolderPage, SWT.NONE);
listenersGroup.setLayout(new GridLayout(3, false));
listenersGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
listenersGroup.setText(ControlExample.getResourceString("Listeners"));
/*
* Create the button to access the 'Listeners' dialog.
*/
Button listenersButton = new Button(listenersGroup, SWT.PUSH);
listenersButton.setText(ControlExample.getResourceString("Select_Listeners"));
listenersButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
createListenerSelectionDialog();
recreateExampleWidgets();
}
});
/*
* Create the checkbox to add/remove listeners to/from the example widgets.
*/
final Button listenCheckbox = new Button(listenersGroup, SWT.CHECK);
listenCheckbox.setText(ControlExample.getResourceString("Listen"));
listenCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
logging = listenCheckbox.getSelection();
recreateExampleWidgets();
}
});
/*
* Create the button to clear the text.
*/
Button clearButton = new Button(listenersGroup, SWT.PUSH);
clearButton.setText(ControlExample.getResourceString("Clear"));
clearButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
clearButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
eventConsole.setText("");
}
});
/* Initialize the eventsFilter to log all events. */
int customEventCount = getCustomEventNames().length;
eventsFilter = new boolean[Tab.EVENT_NAMES.length + customEventCount];
for (int i = 0; i < Tab.EVENT_NAMES.length + customEventCount; i++)
eventsFilter[i] = true;
/* Create the event console Text. */
eventConsole = new Text(listenersGroup, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 3;
data.heightHint = 80;
eventConsole.setLayoutData(data);
createEventConsolePopup();
eventConsole.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if ((e.keyCode == 'A' || e.keyCode == 'a') && (e.stateMask & SWT.MOD1) != 0) {
eventConsole.selectAll();
e.doit = false;
}
}
});
}
void createOrientationGroup() {
/* Create Orientation group */
orientationGroup = new Group(controlGroup, SWT.NONE);
orientationGroup.setLayout(new GridLayout());
orientationGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
orientationGroup.setText(ControlExample.getResourceString("Orientation"));
defaultOrietationButton = new Button(orientationGroup, SWT.RADIO);
defaultOrietationButton.setText(ControlExample.getResourceString("Default"));
defaultOrietationButton.setSelection(true);
ltrButton = new Button(orientationGroup, SWT.RADIO);
ltrButton.setText("SWT.LEFT_TO_RIGHT");
rtlButton = new Button(orientationGroup, SWT.RADIO);
rtlButton.setText("SWT.RIGHT_TO_LEFT");
}
/**
* Creates the "Other" group. This is typically a child of the "Control" group.
*/
void createOtherGroup() {
/* Create the group */
otherGroup = new Group(controlGroup, SWT.NONE);
otherGroup.setLayout(new GridLayout());
otherGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
otherGroup.setText(ControlExample.getResourceString("Other"));
/* Create the controls */
enabledButton = new Button(otherGroup, SWT.CHECK);
enabledButton.setText(ControlExample.getResourceString("Enabled"));
visibleButton = new Button(otherGroup, SWT.CHECK);
visibleButton.setText(ControlExample.getResourceString("Visible"));
backgroundImageButton = new Button(otherGroup, SWT.CHECK);
backgroundImageButton.setText(ControlExample.getResourceString("BackgroundImage"));
popupMenuButton = new Button(otherGroup, SWT.CHECK);
popupMenuButton.setText(ControlExample.getResourceString("PopupMenu"));
/* Add the listeners */
enabledButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleWidgetEnabled();
}
});
visibleButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleWidgetVisibility();
}
});
backgroundImageButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleWidgetBackgroundImage();
}
});
popupMenuButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleWidgetPopupMenu();
}
});
/* Set the default state */
enabledButton.setSelection(true);
visibleButton.setSelection(true);
backgroundImageButton.setSelection(false);
popupMenuButton.setSelection(false);
}
void createSetGetDialog(int x, int y, String[] methodNames) {
final Shell dialog = new Shell(shell, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MODELESS);
dialog.setLayout(new GridLayout(2, false));
dialog.setText(getTabText() + " " + ControlExample.getResourceString("Set_Get"));
nameCombo = new Combo(dialog, SWT.READ_ONLY);
nameCombo.setItems(methodNames);
nameCombo.setText(methodNames[0]);
nameCombo.setVisibleItemCount(methodNames.length);
nameCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
nameCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
resetLabels();
}
});
returnTypeLabel = new Label(dialog, SWT.NONE);
returnTypeLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
setButton = new Button(dialog, SWT.PUSH);
setButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
setButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
setValue();
setText.selectAll();
setText.setFocus();
}
});
setText = new Text(dialog, SWT.SINGLE | SWT.BORDER);
setText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
getButton = new Button(dialog, SWT.PUSH);
getButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
getButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
getValue();
}
});
getText = new Text(dialog, SWT.MULTI | SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.widthHint = 240;
data.heightHint = 200;
getText.setLayoutData(data);
resetLabels();
dialog.setDefaultButton(setButton);
dialog.pack();
dialog.setLocation(x, y);
dialog.open();
}
/**
* Append the Set/Get API controls to the "Other" group.
*/
void createSetGetGroup() {
/*
* Create the button to access set/get API functionality.
*/
final String[] methodNames = getMethodNames();
if (methodNames != null) {
Button setGetButton = new Button(otherGroup, SWT.PUSH);
setGetButton.setText(ControlExample.getResourceString("Set_Get"));
setGetButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
setGetButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button button = (Button) e.widget;
Point pt = button.getLocation();
pt = e.display.map(button, null, pt);
createSetGetDialog(pt.x, pt.y, methodNames);
}
});
}
}
/**
* Creates the "Size" group. The "Size" group contains controls that allow the user to change the size of the
* example widgets.
*/
void createSizeGroup() {
/* Create the group */
sizeGroup = new Group(controlGroup, SWT.NONE);
sizeGroup.setLayout(new GridLayout());
sizeGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
sizeGroup.setText(ControlExample.getResourceString("Size"));
/* Create the controls */
/*
* The preferred size of a widget is the size returned by widget.computeSize (SWT.DEFAULT, SWT.DEFAULT). This
* size is defined on a widget by widget basis. Many widgets will attempt to display their contents.
*/
preferredButton = new Button(sizeGroup, SWT.RADIO);
preferredButton.setText(ControlExample.getResourceString("Preferred"));
tooSmallButton = new Button(sizeGroup, SWT.RADIO);
tooSmallButton.setText(Tab.TOO_SMALL_SIZE + " X " + Tab.TOO_SMALL_SIZE);
smallButton = new Button(sizeGroup, SWT.RADIO);
smallButton.setText(Tab.SMALL_SIZE + " X " + Tab.SMALL_SIZE);
largeButton = new Button(sizeGroup, SWT.RADIO);
largeButton.setText(Tab.LARGE_SIZE + " X " + Tab.LARGE_SIZE);
fillHButton = new Button(sizeGroup, SWT.CHECK);
fillHButton.setText(ControlExample.getResourceString("Fill_X"));
fillVButton = new Button(sizeGroup, SWT.CHECK);
fillVButton.setText(ControlExample.getResourceString("Fill_Y"));
/* Add the listeners */
SelectionAdapter selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
setExampleWidgetSize();
}
};
preferredButton.addSelectionListener(selectionListener);
tooSmallButton.addSelectionListener(selectionListener);
smallButton.addSelectionListener(selectionListener);
largeButton.addSelectionListener(selectionListener);
fillHButton.addSelectionListener(selectionListener);
fillVButton.addSelectionListener(selectionListener);
/* Set the default state */
preferredButton.setSelection(true);
}
/**
* Creates the "Style" group. The "Style" group contains controls that allow the user to change the style of the
* example widgets. Changing a widget "Style" causes the widget to be destroyed and recreated.
*/
void createStyleGroup() {
styleGroup = new Group(controlGroup, SWT.NONE);
styleGroup.setLayout(new GridLayout());
styleGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
styleGroup.setText(ControlExample.getResourceString("Styles"));
}
/**
* Creates the tab folder page.
*
* @param tabFolder
* org.eclipse.swt.widgets.TabFolder
* @return the new page for the tab folder
*/
Composite createTabFolderPage(TabFolder tabFolder) {
/* Cache the shell and display. */
shell = tabFolder.getShell();
display = shell.getDisplay();
/* Create a two column page. */
tabFolderPage = new Composite(tabFolder, SWT.NONE);
tabFolderPage.setLayout(new GridLayout(2, false));
/* Create the "Example" and "Control" groups. */
createExampleGroup();
createControlGroup();
/* Create the "Listeners" group under the "Control" group. */
createListenersGroup();
/* Create and initialize the example and control widgets. */
createExampleWidgets();
hookExampleWidgetListeners();
createControlWidgets();
createBackgroundModeGroup();
setExampleWidgetState();
return tabFolderPage;
}
/**
* Disposes the "Example" widgets.
*/
void disposeExampleWidgets() {
Widget[] widgets = getExampleWidgets();
for (int i = 0; i < widgets.length; i++)
widgets[i].dispose();
}
Image fontImage(Font font) {
Image image = new Image(display, Tab.IMAGE_SIZE, Tab.IMAGE_SIZE);
GC gc = new GC(image);
Rectangle bounds = image.getBounds();
gc.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
gc.fillRectangle(0, 0, bounds.width, bounds.height);
gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
FontData data[] = font.getFontData();
int style = data[0].getStyle();
switch (style) {
case SWT.NORMAL:
gc.drawLine(3, 3, 3, 8);
gc.drawLine(4, 3, 7, 8);
gc.drawLine(8, 3, 8, 8);
break;
case SWT.BOLD:
gc.drawLine(3, 2, 3, 9);
gc.drawLine(4, 2, 4, 9);
gc.drawLine(5, 2, 7, 2);
gc.drawLine(5, 3, 8, 3);
gc.drawLine(5, 5, 7, 5);
gc.drawLine(5, 6, 7, 6);
gc.drawLine(5, 8, 8, 8);
gc.drawLine(5, 9, 7, 9);
gc.drawLine(7, 4, 8, 4);
gc.drawLine(7, 7, 8, 7);
break;
case SWT.ITALIC:
gc.drawLine(6, 2, 8, 2);
gc.drawLine(7, 3, 4, 8);
gc.drawLine(3, 9, 5, 9);
break;
case SWT.BOLD | SWT.ITALIC:
gc.drawLine(5, 2, 8, 2);
gc.drawLine(5, 3, 8, 3);
gc.drawLine(6, 4, 4, 7);
gc.drawLine(7, 4, 5, 7);
gc.drawLine(3, 8, 6, 8);
gc.drawLine(3, 9, 6, 9);
break;
}
gc.dispose();
return image;
}
/**
* Gets the list of custom event names.
*
* @return an array containing custom event names
*/
String[] getCustomEventNames() {
return new String[0];
}
/**
* Gets the default style for a widget
*
* @return the default style bit
*/
int getDefaultStyle() {
if (ltrButton != null && ltrButton.getSelection())
return SWT.LEFT_TO_RIGHT;
if (rtlButton != null && rtlButton.getSelection())
return SWT.RIGHT_TO_LEFT;
return SWT.NONE;
}
/**
* Gets the "Example" controls. This is the subset of "Example" widgets that are controls.
*
* @return an array containing the example controls
*/
Control[] getExampleControls() {
Widget[] widgets = getExampleWidgets();
Control[] controls = new Control[0];
for (int i = 0; i < widgets.length; i++)
if (widgets[i] instanceof Control) {
Control[] newControls = new Control[controls.length + 1];
System.arraycopy(controls, 0, newControls, 0, controls.length);
controls = newControls;
controls[controls.length - 1] = (Control) widgets[i];
}
return controls;
}
/**
* Gets the "Example" widget children's items, if any.
*
* @return an array containing the example widget children's items
*/
Item[] getExampleWidgetItems() {
return new Item[0];
}
/**
* Gets the "Example" widgets.
*
* @return an array containing the example widgets
*/
Widget[] getExampleWidgets() {
return new Widget[0];
}
/**
* Returns a list of set/get API method names (without the set/get prefix) that can be used to set/get values in the
* example control(s).
*/
String[] getMethodNames() {
return null;
}
Class getReturnType(String methodRoot) {
Class returnType = null;
String methodName = "get" + methodRoot;
Widget[] widgets = getExampleWidgets();
try {
java.lang.reflect.Method method = widgets[0].getClass().getMethod(methodName, null);
returnType = method.getReturnType();
} catch (Exception e) {
}
return returnType;
}
/**
* Gets the short text for the tab folder item.
*
* @return the short text for the tab item
*/
String getShortTabText() {
return getTabText();
}
/**
* Gets the text for the tab folder item.
*
* @return the text for the tab item
*/
String getTabText() {
return "";
}
void getValue() {
String methodName = "get" + nameCombo.getText();
getText.setText("");
Widget[] widgets = getExampleWidgets();
for (int i = 0; i < widgets.length; i++) {
try {
java.lang.reflect.Method method = widgets[i].getClass().getMethod(methodName, null);
Object result = method.invoke(widgets[i], null);
if (result == null)
getText.append("null");
else if (result.getClass().isArray()) {
int length = java.lang.reflect.Array.getLength(result);
if (length == 0)
getText.append(result.getClass().getComponentType() + "[0]");
for (int j = 0; j < length; j++)
getText.append(java.lang.reflect.Array.get(result, j).toString() + "\n");
} else
getText.append(result.toString());
} catch (Exception e) {
getText.append(e.toString());
}
if (i + 1 < widgets.length)
getText.append("\n\n");
}
}
/**
* Hooks the custom listener specified by eventName.
*/
void hookCustomListener(String eventName) {
}
/**
* Hooks all listeners to all example controls and example control items.
*/
void hookExampleWidgetListeners() {
if (logging) {
Widget[] widgets = getExampleWidgets();
for (int i = 0; i < widgets.length; i++)
hookListeners(widgets[i]);
Item[] exampleItems = getExampleWidgetItems();
for (int i = 0; i < exampleItems.length; i++)
hookListeners(exampleItems[i]);
String[] customNames = getCustomEventNames();
for (int i = 0; i < customNames.length; i++)
if (eventsFilter[Tab.EVENT_NAMES.length + i])
hookCustomListener(customNames[i]);
}
}
/**
* Hooks all listeners to the specified widget.
*/
void hookListeners(Widget widget) {
if (logging) {
Listener listener = new Listener() {
public void handleEvent(Event event) {
log(event);
}
};
for (int i = 0; i < Tab.EVENT_NAMES.length; i++)
if (eventsFilter[i])
widget.addListener(((Integer) Tab.EVENT_NAMES[i][1]).intValue(), listener);
}
}
/**
* Logs an untyped event to the event console.
*/
void log(Event event) {
int i = 0;
while (i < Tab.EVENT_NAMES.length) {
if (((Integer) Tab.EVENT_NAMES[i][1]).intValue() == event.type)
break;
i++;
}
String toString = (String) Tab.EVENT_NAMES[i][0] + " [" + event.type + "]: ";
switch (event.type) {
case SWT.KeyDown:
case SWT.KeyUp:
toString += new KeyEvent(event).toString();
break;
case SWT.MouseDown:
case SWT.MouseUp:
case SWT.MouseMove:
case SWT.MouseEnter:
case SWT.MouseExit:
case SWT.MouseDoubleClick:
case SWT.MouseWheel:
case SWT.MouseHover:
toString += new MouseEvent(event).toString();
break;
case SWT.Paint:
toString += new PaintEvent(event).toString();
break;
case SWT.Move:
case SWT.Resize:
toString += new ControlEvent(event).toString();
break;
case SWT.Dispose:
toString += new DisposeEvent(event).toString();
break;
case SWT.Selection:
case SWT.DefaultSelection:
toString += new SelectionEvent(event).toString();
break;
case SWT.FocusIn:
case SWT.FocusOut:
toString += new FocusEvent(event).toString();
break;
case SWT.Expand:
case SWT.Collapse:
toString += new TreeEvent(event).toString();
break;
case SWT.Iconify:
case SWT.Deiconify:
case SWT.Close:
case SWT.Activate:
case SWT.Deactivate:
toString += new ShellEvent(event).toString();
break;
case SWT.Show:
case SWT.Hide:
toString += event.widget instanceof Menu ? new MenuEvent(event).toString() : event.toString();
break;
case SWT.Modify:
toString += new ModifyEvent(event).toString();
break;
case SWT.Verify:
toString += new VerifyEvent(event).toString();
break;
case SWT.Help:
toString += new HelpEvent(event).toString();
break;
case SWT.Arm:
toString += new ArmEvent(event).toString();
break;
case SWT.Traverse:
toString += new TraverseEvent(event).toString();
break;
case SWT.HardKeyDown:
case SWT.HardKeyUp:
case SWT.DragDetect:
case SWT.MenuDetect:
case SWT.SetData:
default:
toString += event.toString();
}
eventConsole.append(toString);
eventConsole.append("\n");
}
/**
* Logs a string to the event console.
*/
void log(String string) {
eventConsole.append(string);
eventConsole.append("\n");
}
/**
* Logs a typed event to the event console.
*/
void log(String eventName, TypedEvent event) {
eventConsole.append(eventName + ": ");
eventConsole.append(event.toString());
eventConsole.append("\n");
}
Object[] parameterForType(String typeName, String value, Widget widget) {
return new Object[] { value };
}
String parameterInfo(String methodRoot) {
String typeName = null;
Class returnType = getReturnType(methodRoot);
boolean isArray = returnType.isArray();
if (isArray)
typeName = returnType.getComponentType().getName();
else
typeName = returnType.getName();
String typeNameString = typeName;
int index = typeName.lastIndexOf('.');
if (index != -1 && index + 1 < typeName.length())
typeNameString = typeName.substring(index + 1);
String info = ControlExample.getResourceString("Info_" + typeNameString + (isArray ? "A" : ""));
if (isArray)
typeNameString += "[]";
return ControlExample.getResourceString("Parameter_Info", new Object[] { typeNameString, info });
}
/**
* Recreates the "Example" widgets.
*/
void recreateExampleWidgets() {
disposeExampleWidgets();
createExampleWidgets();
hookExampleWidgetListeners();
setExampleWidgetState();
}
/**
* Sets the foreground color, background color, and font of the "Example" widgets to their default settings.
* Subclasses may extend in order to reset other colors and fonts to default settings as well.
*/
void resetColorsAndFonts() {
Color oldColor = foregroundColor;
foregroundColor = null;
setExampleWidgetForeground();
if (oldColor != null)
oldColor.dispose();
oldColor = backgroundColor;
backgroundColor = null;
setExampleWidgetBackground();
if (oldColor != null)
oldColor.dispose();
Font oldFont = font;
font = null;
setExampleWidgetFont();
setExampleWidgetSize();
if (oldFont != null)
oldFont.dispose();
}
void resetLabels() {
String methodRoot = nameCombo.getText();
returnTypeLabel.setText(parameterInfo(methodRoot));
setButton.setText(setMethodName(methodRoot));
getButton.setText("get" + methodRoot);
setText.setText("");
getText.setText("");
getValue();
setText.setFocus();
}
/**
* Sets the background color of the "Example" widgets' parent.
*/
void setExampleGroupBackgroundColor() {
if (backgroundModeGroup == null)
return;
exampleGroup.setBackground(backgroundModeColorButton.getSelection() ? display.getSystemColor(SWT.COLOR_BLUE)
: null);
}
/**
* Sets the background image of the "Example" widgets' parent.
*/
void setExampleGroupBackgroundImage() {
if (backgroundModeGroup == null)
return;
exampleGroup
.setBackgroundImage(backgroundModeImageButton.getSelection() ? instance.images[ControlExample.ciParentBackground]
: null);
}
/**
* Sets the background mode of the "Example" widgets' parent.
*/
void setExampleGroupBackgroundMode() {
if (backgroundModeGroup == null)
return;
String modeString = backgroundModeCombo.getText();
int mode = SWT.INHERIT_NONE;
if (modeString.equals("SWT.INHERIT_DEFAULT"))
mode = SWT.INHERIT_DEFAULT;
if (modeString.equals("SWT.INHERIT_FORCE"))
mode = SWT.INHERIT_FORCE;
exampleGroup.setBackgroundMode(mode);
}
/**
* Sets the background color of the "Example" widgets.
*/
void setExampleWidgetBackground() {
if (colorAndFontTable == null)
return; // user cannot change color/font on this tab
Control[] controls = getExampleControls();
if (!instance.startup)
for (int i = 0; i < controls.length; i++)
controls[i].setBackground(backgroundColor);
// Set the background color item's image to match the background color of the example widget(s).
Color color = backgroundColor;
if (controls.length == 0)
return;
if (color == null)
color = controls[0].getBackground();
TableItem item = colorAndFontTable.getItem(Tab.BACKGROUND_COLOR);
Image oldImage = item.getImage();
if (oldImage != null)
oldImage.dispose();
item.setImage(colorImage(color));
}
/**
* Sets the background image of the "Example" widgets.
*/
void setExampleWidgetBackgroundImage() {
Control[] controls = getExampleControls();
for (int i = 0; i < controls.length; i++)
controls[i]
.setBackgroundImage(backgroundImageButton.getSelection() ? instance.images[ControlExample.ciBackground]
: null);
}
/**
* Sets the enabled state of the "Example" widgets.
*/
void setExampleWidgetEnabled() {
Control[] controls = getExampleControls();
for (int i = 0; i < controls.length; i++)
controls[i].setEnabled(enabledButton.getSelection());
}
/**
* Sets the font of the "Example" widgets.
*/
void setExampleWidgetFont() {
if (colorAndFontTable == null)
return; // user cannot change color/font on this tab
Control[] controls = getExampleControls();
if (!instance.startup)
for (int i = 0; i < controls.length; i++)
controls[i].setFont(font);
/* Set the font item's image and font to match the font of the example widget(s). */
Font ft = font;
if (controls.length == 0)
return;
if (ft == null)
ft = controls[0].getFont();
TableItem item = colorAndFontTable.getItem(Tab.FONT);
Image oldImage = item.getImage();
if (oldImage != null)
oldImage.dispose();
item.setImage(fontImage(ft));
item.setFont(ft);
colorAndFontTable.layout();
}
/**
* Sets the foreground color of the "Example" widgets.
*/
void setExampleWidgetForeground() {
if (colorAndFontTable == null)
return; // user cannot change color/font on this tab
Control[] controls = getExampleControls();
if (!instance.startup)
for (int i = 0; i < controls.length; i++)
controls[i].setForeground(foregroundColor);
/* Set the foreground color item's image to match the foreground color of the example widget(s). */
Color color = foregroundColor;
if (controls.length == 0)
return;
if (color == null)
color = controls[0].getForeground();
TableItem item = colorAndFontTable.getItem(Tab.FOREGROUND_COLOR);
Image oldImage = item.getImage();
if (oldImage != null)
oldImage.dispose();
item.setImage(colorImage(color));
}
void setExampleWidgetPopupMenu() {
Control[] controls = getExampleControls();
for (int i = 0; i < controls.length; i++) {
final Control control = controls[i];
control.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) {
Menu menu = control.getMenu();
if (menu != null && samplePopup) {
menu.dispose();
menu = null;
}
if (menu == null && popupMenuButton.getSelection()) {
menu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(menu, SWT.PUSH);
item.setText("Sample popup menu item");
specialPopupMenuItems(menu, event);
control.setMenu(menu);
samplePopup = true;
}
}
});
}
}
/**
* Sets the size of the "Example" widgets.
*/
void setExampleWidgetSize() {
int size = SWT.DEFAULT;
if (preferredButton == null)
return;
if (preferredButton.getSelection())
size = SWT.DEFAULT;
if (tooSmallButton.getSelection())
size = Tab.TOO_SMALL_SIZE;
if (smallButton.getSelection())
size = Tab.SMALL_SIZE;
if (largeButton.getSelection())
size = Tab.LARGE_SIZE;
Control[] controls = getExampleControls();
for (int i = 0; i < controls.length; i++) {
GridData gridData = new GridData(size, size);
gridData.grabExcessHorizontalSpace = fillHButton.getSelection();
gridData.grabExcessVerticalSpace = fillVButton.getSelection();
gridData.horizontalAlignment = fillHButton.getSelection() ? SWT.FILL : SWT.LEFT;
gridData.verticalAlignment = fillVButton.getSelection() ? SWT.FILL : SWT.TOP;
controls[i].setLayoutData(gridData);
}
tabFolderPage.layout(controls);
}
/**
* Sets the state of the "Example" widgets. Subclasses reimplement this method to set "Example" widget state that is
* specific to the widget.
*/
void setExampleWidgetState() {
setExampleWidgetBackground();
setExampleWidgetForeground();
setExampleWidgetFont();
if (!instance.startup) {
setExampleWidgetEnabled();
setExampleWidgetVisibility();
setExampleGroupBackgroundMode();
setExampleGroupBackgroundColor();
setExampleGroupBackgroundImage();
setExampleWidgetBackgroundImage();
setExampleWidgetPopupMenu();
setExampleWidgetSize();
}
// TEMPORARY CODE
// Control [] controls = getExampleControls ();
// for (int i=0; i<controls.length; i++) {
// log ("Control=" + controls [i] + ", border width=" + controls [i].getBorderWidth ());
// }
}
/**
* Sets the visibility of the "Example" widgets.
*/
void setExampleWidgetVisibility() {
Control[] controls = getExampleControls();
for (int i = 0; i < controls.length; i++)
controls[i].setVisible(visibleButton.getSelection());
}
String setMethodName(String methodRoot) {
return "set" + methodRoot;
}
void setValue() {
/* The parameter type must be the same as the get method's return type */
String methodRoot = nameCombo.getText();
Class returnType = getReturnType(methodRoot);
String methodName = setMethodName(methodRoot);
String value = setText.getText();
Widget[] widgets = getExampleWidgets();
for (int i = 0; i < widgets.length; i++)
try {
java.lang.reflect.Method method = widgets[i].getClass().getMethod(methodName,
new Class[] { returnType });
String typeName = returnType.getName();
Object[] parameter = null;
if (typeName.equals("int"))
parameter = new Object[] { Integer.valueOf(value) };
else if (typeName.equals("long"))
parameter = new Object[] { new Long(value) };
else if (typeName.equals("char"))
parameter = new Object[] { value.length() == 1 ? new Character(value.charAt(0)) : new Character(
'\0') };
else if (typeName.equals("boolean"))
parameter = new Object[] { new Boolean(value) };
else if (typeName.equals("java.lang.String"))
parameter = new Object[] { value };
else if (typeName.equals("org.eclipse.swt.graphics.Point")) {
String xy[] = split(value, ',');
parameter = new Object[] { new Point(Integer.valueOf(xy[0]).intValue(), Integer.valueOf(xy[1]).intValue()) };
} else if (typeName.equals("[I")) {
String strings[] = split(value, ',');
int[] ints = new int[strings.length];
for (int j = 0; j < strings.length; j++)
ints[j] = Integer.valueOf(strings[j]).intValue();
parameter = new Object[] { ints };
} else if (typeName.equals("[Ljava.lang.String;"))
parameter = new Object[] { split(value, ',') };
else
parameter = parameterForType(typeName, value, widgets[i]);
method.invoke(widgets[i], parameter);
} catch (Exception e) {
getText.setText(e.toString());
}
}
/**
* Splits the given string around matches of the given character. This subset of java.lang.String.split(String
* regex) uses only code that can be run on CLDC platforms.
*/
String[] split(String string, char ch) {
String[] result = new String[0];
int start = 0;
int length = string.length();
while (start < length) {
int end = string.indexOf(ch, start);
if (end == -1)
end = length;
String substr = string.substring(start, end);
String[] newResult = new String[result.length + 1];
System.arraycopy(result, 0, newResult, 0, result.length);
newResult[result.length] = substr;
result = newResult;
start = end + 1;
}
return result;
}
}