blob: 6b1b07933679ea8c21479ade22b0a47c0983fdd0 [file] [log] [blame]
package org.eclipse.swt.examples.controlexample;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved
*/
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.events.*;
import java.util.ResourceBundle;
/**
* <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", "Display" and "Size" group. Subclasses
* can override these defaults to augment a group or stop
* a group from being created.
*/
abstract class Tab {
/* Common control buttons */
Button borderButton, enabledButton, visibleButton;
Button preferredButton, tooSmallButton, smallButton, largeButton, fillButton;
/* Common groups and composites */
Composite tabFolderPage;
Group exampleGroup, controlGroup, displayGroup, sizeGroup, styleGroup, colorGroup;
/* Controlling instance */
final ControlExample instance;
/* Sizing constants for the "Size" group */
static final int TOO_SMALL_SIZE = 10;
static final int SMALL_SIZE = 50;
static final int LARGE_SIZE = 100;
/* Common controls for the "Colors" group */
Button backgroundButton, foregroundButton, fontButton;
Color backgroundColor, foregroundColor;
Font font;
/**
* Creates the Tab within a given instance of ControlExample.
*/
Tab(ControlExample instance) {
this.instance = instance;
}
/**
* 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
* left half of each example tab. It consists of the
* style group, the display group and the size group.
*/
controlGroup = new Group (tabFolderPage, SWT.NONE);
GridLayout gridLayout= new GridLayout ();
controlGroup.setLayout (gridLayout);
gridLayout.numColumns = 2;
gridLayout.makeColumnsEqualWidth = true;
controlGroup.setLayoutData (new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
controlGroup.setText (ControlExample.getResourceString("Parameters"));
/* Create individual groups inside the "Control" group */
createStyleGroup ();
createDisplayGroup ();
createSizeGroup ();
createColorGroup ();
/*
* 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 curreont 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);
}
}
}
/**
* Creates the "Control" widget children.
* Subclasses override this method to augment
* the standard controls created in the "Style",
* "Display" and "Size" groups.
*/
void createControlWidgets () {
}
/**
* Creates the "Color" group. This is typically
* a child of the "Control" group. Subclasses override
* this method to customize and set system colors.
*/
void createColorGroup () {
/* Create the group */
colorGroup = new Group(controlGroup, SWT.NULL);
colorGroup.setLayout (new GridLayout (2, false));
colorGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
colorGroup.setText (ControlExample.getResourceString ("Colors"));
new Label (colorGroup, SWT.NONE).setText (ControlExample.getResourceString ("Foreground_Color"));
foregroundButton = new Button (colorGroup, SWT.PUSH);
new Label (colorGroup, SWT.NONE).setText (ControlExample.getResourceString ("Background_Color"));
backgroundButton = new Button (colorGroup, SWT.PUSH);
fontButton = new Button (colorGroup, SWT.PUSH);
fontButton.setText(ControlExample.getResourceString("Font"));
Shell shell = backgroundButton.getShell ();
final ColorDialog backgroundDialog = new ColorDialog (shell);
final ColorDialog foregroundDialog = new ColorDialog (shell);
final FontDialog fontDialog = new FontDialog (shell);
/* Create images to display current colors */
int imageSize = 12;
Display display = shell.getDisplay ();
final Image backgroundImage = new Image (display, imageSize, imageSize);
final Image foregroundImage = new Image (display, imageSize, imageSize);
/* Add listeners to set the colors and font */
backgroundButton.setImage(backgroundImage);
backgroundButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
RGB rgb = backgroundDialog.open();
if (rgb == null) return;
Color oldColor = backgroundColor;
backgroundColor = new Color (backgroundButton.getDisplay(), rgb);
setExampleWidgetBackground ();
if (oldColor != null) oldColor.dispose ();
}
});
foregroundButton.setImage(foregroundImage);
foregroundButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
RGB rgb = foregroundDialog.open();
if (rgb == null) return;
Color oldColor = foregroundColor;
foregroundColor = new Color (foregroundButton.getDisplay(), rgb);
setExampleWidgetForeground ();
if (oldColor != null) oldColor.dispose ();
}
});
fontButton.addSelectionListener(new SelectionAdapter () {
public void widgetSelected (SelectionEvent e) {
FontData fontData = fontDialog.open ();
if (fontData == null) return;
Font oldFont = font;
font = new Font (fontButton.getDisplay(), fontData);
setExampleWidgetFont ();
if (oldFont != null) oldFont.dispose ();
}
});
backgroundButton.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
if (backgroundImage != null) backgroundImage.dispose();
if (foregroundImage != null) foregroundImage.dispose();
if (backgroundColor != null) backgroundColor.dispose();
if (foregroundColor != null) foregroundColor.dispose();
if (font != null) font.dispose();
backgroundColor = null;
foregroundColor = null;
font = null;
}
});
}
/**
* Creates the "Display" group. This is typically
* a child of the "Control" group.
*/
void createDisplayGroup () {
/* Create the group */
displayGroup = new Group (controlGroup, SWT.NONE);
displayGroup.setLayout (new GridLayout ());
displayGroup.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
displayGroup.setText (ControlExample.getResourceString("State"));
/* Create the controls */
enabledButton = new Button(displayGroup, SWT.CHECK);
enabledButton.setText(ControlExample.getResourceString("Enabled"));
visibleButton = new Button(displayGroup, SWT.CHECK);
visibleButton.setText(ControlExample.getResourceString("Visible"));
/* Add the listeners */
enabledButton.addSelectionListener (new SelectionAdapter () {
public void widgetSelected (SelectionEvent event) {
setExampleWidgetEnabled ();
}
});
visibleButton.addSelectionListener (new SelectionAdapter () {
public void widgetSelected (SelectionEvent event) {
setExampleWidgetVisibility ();
}
});
/* Set the default state */
enabledButton.setSelection(true);
visibleButton.setSelection(true);
}
/**
* Creates the "Example" group. The "Example" group
* is typically the left hand column in the tab.
*/
void createExampleGroup () {
exampleGroup = new Group (tabFolderPage, SWT.NONE);
GridLayout gridLayout = new GridLayout ();
exampleGroup.setLayout (gridLayout);
exampleGroup.setLayoutData (new GridData (GridData.FILL_BOTH));
}
/**
* Creates the "Example" widget children of the "Example" group.
* Subclasses override this method to create the particular
* example control.
*/
void createExampleWidgets () {
/* Do nothing */
}
/**
* 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 (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
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 (TOO_SMALL_SIZE + " X " + TOO_SMALL_SIZE);
smallButton = new Button(sizeGroup, SWT.RADIO);
smallButton.setText (SMALL_SIZE + " X " + SMALL_SIZE);
largeButton = new Button (sizeGroup, SWT.RADIO);
largeButton.setText (LARGE_SIZE + " X " + LARGE_SIZE);
fillButton = new Button (sizeGroup, SWT.RADIO);
fillButton.setText (ControlExample.getResourceString("Fill"));
/* Add the listeners */
SelectionAdapter selectionListener = new SelectionAdapter () {
public void widgetSelected (SelectionEvent event) {
if (!((Button) event.widget).getSelection ()) return;
setExampleWidgetSize ();
};
};
preferredButton.addSelectionListener(selectionListener);
tooSmallButton.addSelectionListener(selectionListener);
smallButton.addSelectionListener(selectionListener);
largeButton.addSelectionListener(selectionListener);
fillButton.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 (GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
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) {
/*
* Create a two column page.
*/
tabFolderPage = new Composite (tabFolder, SWT.NULL);
GridLayout gridLayout = new GridLayout ();
tabFolderPage.setLayout (gridLayout);
gridLayout.numColumns = 2;
/* Create the "Example" and "Control" columns */
createExampleGroup ();
createControlGroup ();
/* Create the widgets in the two columns */
createExampleWidgets ();
createControlWidgets ();
setExampleWidgetState ();
return tabFolderPage;
}
/**
* Disposes the "Example" widgets.
*/
void disposeExampleWidgets () {
Control [] controls = getExampleWidgets ();
for (int i=0; i<controls.length; i++) {
controls [i].dispose ();
}
}
void drawImage (Image image, Color color) {
GC gc = new GC(image);
gc.setBackground(color);
Rectangle bounds = image.getBounds();
gc.fillRectangle(0, 0, bounds.width, bounds.height);
gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
gc.dispose();
}
/**
* Gets the "Example" widget children.
*
* @return an array of example widget children
*/
Control [] getExampleWidgets () {
return new Control [0];
}
/**
* Gets the text for the tab folder item.
*
* @return the text for the tab item
*/
String getTabText () {
return "";
}
/**
* Recreates the "Example" widgets.
*/
void recreateExampleWidgets () {
disposeExampleWidgets ();
createExampleWidgets ();
setExampleWidgetState ();
}
/**
* Sets the background color of the "Example" widgets.
*/
void setExampleWidgetBackground () {
if (backgroundButton == null) return;
Control [] controls = getExampleWidgets ();
Color color = backgroundColor;
if (color == null) color = controls [0].getBackground ();
Image image = backgroundButton.getImage ();
drawImage (image, color);
backgroundButton.setImage (image);
if (backgroundColor == null) return;
for (int i = 0; i < controls.length; i++) {
Control control = controls[i];
control.setBackground (backgroundColor);
}
}
/**
* Sets the enabled state of the "Example" widgets.
*/
void setExampleWidgetEnabled () {
Control [] controls = getExampleWidgets ();
for (int i=0; i<controls.length; i++) {
controls [i].setEnabled (enabledButton.getSelection ());
}
}
/**
* Sets the font of the "Example" widgets.
*/
void setExampleWidgetFont () {
if (font == null) return;
Control [] controls = getExampleWidgets ();
for (int i = 0; i < controls.length; i++) {
Control control = controls[i];
control.setFont(font);
}
}
/**
* Sets the foreground color of the "Example" widgets.
*/
void setExampleWidgetForeground () {
if (foregroundButton == null) return;
Control [] controls = getExampleWidgets ();
Color color = foregroundColor;
if (color == null) color = controls [0].getForeground ();
Image image = foregroundButton.getImage ();
drawImage (image, color);
foregroundButton.setImage (image);
if (foregroundColor == null) return;
for (int i = 0; i < controls.length; i++) {
Control control = controls[i];
control.setForeground (foregroundColor);
}
}
/**
* 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 = TOO_SMALL_SIZE;
if (smallButton.getSelection()) size = SMALL_SIZE;
if (largeButton.getSelection()) size = LARGE_SIZE;
Control [] controls = getExampleWidgets ();
for (int i=0; i<controls.length; i++) {
GridData gridData;
if (fillButton.getSelection()) {
gridData = new GridData (GridData.FILL_BOTH);
} else {
gridData = new GridData ();
gridData.widthHint = size;
gridData.heightHint = size;
}
controls [i].setLayoutData (gridData);
}
/*
* Force the entire widget tree to layout,
* even when the child sizes may not have
* changed.
*/
int seenCount = 0;
Composite [] seen = new Composite [4];
for (int i=0; i<controls.length; i++) {
Control control = controls [i];
while (control != exampleGroup) {
Composite parent = control.getParent ();
int index = 0;
while (index < seenCount) {
if (seen [index] == parent) break;
index++;
}
if (index == seenCount) parent.layout ();
if (seenCount == seen.length) {
Composite [] newSeen = new Composite [seen.length + 4];
System.arraycopy (seen, 0, newSeen, 0, seen.length);
seen = newSeen;
}
seen [seenCount++] = parent;
control = control.getParent ();
}
}
}
/**
* Sets the state of the "Example" widgets. Subclasses
* reimplement this method to set "Example" widget state
* that is specific to the widget.
*/
void setExampleWidgetState () {
setExampleWidgetEnabled ();
setExampleWidgetVisibility ();
setExampleWidgetSize ();
setExampleWidgetBackground ();
setExampleWidgetForeground ();
setExampleWidgetFont ();
}
/**
* Sets the visibility of the "Example" widgets.
*/
void setExampleWidgetVisibility () {
Control [] controls = getExampleWidgets ();
for (int i=0; i<controls.length; i++) {
controls [i].setVisible (visibleButton.getSelection ());
}
}
}