SWT Control in One Example : Small Application « SWT JFace Eclipse « Java






SWT Control in One Example

SWT Control in One Example


import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolder2Adapter;
import org.eclipse.swt.custom.CTabFolderEvent;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ArmEvent;
import org.eclipse.swt.events.ControlAdapter;
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.MenuAdapter;
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.PaintListener;
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.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Caret;
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.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
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.Link;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Spinner;
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.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

public class ControlExample {
  private ShellTab shellTab;

  private TabFolder tabFolder;

  Image images[];

  static final int ciClosedFolder = 0, ciOpenFolder = 1, ciTarget = 2;

  static final String[] imageLocations = { "closedFolder.gif",
      "openFolder.gif", "target.gif" };

  boolean startup = true;

  /**
   * Creates an instance of a ControlExample embedded inside the supplied
   * parent Composite.
   * 
   * @param parent
   *            the container of the example
   */
  public ControlExample(Composite parent) {
    initResources();
    tabFolder = new TabFolder(parent, SWT.NONE);
    Tab[] tabs = createTabs();
    for (int i = 0; i < tabs.length; i++) {
      TabItem item = new TabItem(tabFolder, SWT.NONE);
      item.setText(tabs[i].getTabText());
      item.setControl(tabs[i].createTabFolderPage(tabFolder));
      item.setData(tabs[i]);
    }
    startup = false;
  }

  /**
   * Answers the set of example Tabs
   */
  Tab[] createTabs() {
    return new Tab[] { new ButtonTab(this), new CanvasTab(this),
        new ComboTab(this), new CoolBarTab(this), new DialogTab(this),
        new GroupTab(this), new LabelTab(this), new LinkTab(this),
        new ListTab(this), new MenuTab(this), new ProgressBarTab(this),
        new SashTab(this), shellTab = new ShellTab(this),
        new SliderTab(this), new SpinnerTab(this),
        new TabFolderTab(this), new TableTab(this), new TextTab(this),
        new ToolBarTab(this), new TreeTab(this), };
  }

  /**
   * Disposes of all resources associated with a particular instance of the
   * ControlExample.
   */
  public void dispose() {
    /*
     * Destroy any shells that may have been created by the Shells tab. When
     * a shell is disposed, all child shells are also disposed. Therefore it
     * is necessary to check for disposed shells in the shells list to avoid
     * disposing a shell twice.
     */
    if (shellTab != null)
      shellTab.closeAllShells();
    shellTab = null;
    tabFolder = null;
    freeResources();
  }

  /**
   * Frees the resources
   */
  void freeResources() {
    if (images != null) {
      for (int i = 0; i < images.length; ++i) {
        final Image image = images[i];
        if (image != null)
          image.dispose();
      }
      images = null;
    }
  }

  /**
   * 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 + "!";
    }
  }

  /**
   * Loads the resources
   */
  void initResources() {
    final Class clazz = ControlExample.class;
      try {
        if (images == null) {
          images = new Image[imageLocations.length];

          for (int i = 0; i < imageLocations.length; ++i) {
            InputStream sourceStream = clazz
                .getResourceAsStream(imageLocations[i]);
            ImageData source = new ImageData(sourceStream);
            ImageData mask = source.getTransparencyMask();
            images[i] = new Image(null, source, mask);
            try {
              sourceStream.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        }
        return;
      } catch (Throwable t) {
      }
    String error = "Unable to load resources";
    freeResources();
    throw new RuntimeException(error);
  }

  /**
   * Invokes as a standalone program.
   */
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    ControlExample instance = new ControlExample(shell);
    shell.setText(getResourceString("window.title"));
    setShellSize(display, shell);
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    instance.dispose();
  }

  /**
   * Grabs input focus.
   */
  public void setFocus() {
    tabFolder.setFocus();
  }

  /**
   * Sets the size of the shell to it's "packed" size, unless that makes it
   * bigger than the display, in which case set it to 9/10 of display size.
   */
  static void setShellSize(Display display, Shell shell) {
    Rectangle bounds = display.getBounds();
    Point size = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    if (size.x > bounds.width)
      size.x = bounds.width * 9 / 10;
    if (size.y > bounds.height)
      size.y = bounds.height * 9 / 10;
    shell.setSize(size);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class ShellTab extends Tab {
  /* Style widgets added to the "Style" groups, and "Other" group */
  Button noParentButton, parentButton;

  Button noTrimButton, closeButton, titleButton, minButton, maxButton,
      borderButton, resizeButton, onTopButton, toolButton;

  Button createButton, closeAllButton;

  Button modelessButton, primaryModalButton, applicationModalButton,
      systemModalButton;

  Button imageButton;

  Group parentStyleGroup, modalStyleGroup;

  /* Variables used to track the open shells */
  int shellCount = 0;

  Shell[] shells = new Shell[4];

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ShellTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Close all the example shells.
   */
  void closeAllShells() {
    for (int i = 0; i < shellCount; i++) {
      if (shells[i] != null & !shells[i].isDisposed()) {
        shells[i].dispose();
      }
    }
    shellCount = 0;
  }

  /**
   * Handle the Create button selection event.
   * 
   * @param event
   *            org.eclipse.swt.events.SelectionEvent
   */
  public void createButtonSelected(SelectionEvent event) {

    /*
     * Remember the example shells so they can be disposed by the user.
     */
    if (shellCount >= shells.length) {
      Shell[] newShells = new Shell[shells.length + 4];
      System.arraycopy(shells, 0, newShells, 0, shells.length);
      shells = newShells;
    }

    /* Compute the shell style */
    int style = SWT.NONE;
    if (noTrimButton.getSelection())
      style |= SWT.NO_TRIM;
    if (closeButton.getSelection())
      style |= SWT.CLOSE;
    if (titleButton.getSelection())
      style |= SWT.TITLE;
    if (minButton.getSelection())
      style |= SWT.MIN;
    if (maxButton.getSelection())
      style |= SWT.MAX;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (resizeButton.getSelection())
      style |= SWT.RESIZE;
    if (onTopButton.getSelection())
      style |= SWT.ON_TOP;
    if (toolButton.getSelection())
      style |= SWT.TOOL;
    if (modelessButton.getSelection())
      style |= SWT.MODELESS;
    if (primaryModalButton.getSelection())
      style |= SWT.PRIMARY_MODAL;
    if (applicationModalButton.getSelection())
      style |= SWT.APPLICATION_MODAL;
    if (systemModalButton.getSelection())
      style |= SWT.SYSTEM_MODAL;

    /* Create the shell with or without a parent */
    if (noParentButton.getSelection()) {
      shells[shellCount] = new Shell(style);
    } else {
      Shell shell = tabFolderPage.getShell();
      shells[shellCount] = new Shell(shell, style);
    }
    final Shell currentShell = shells[shellCount];
    Button button = new Button(currentShell, SWT.PUSH);
    button.setBounds(20, 20, 120, 30);
    Button closeButton = new Button(currentShell, SWT.PUSH);
    closeButton.setBounds(160, 20, 120, 30);
    closeButton.setText(ControlExample.getResourceString("Close"));
    closeButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        currentShell.dispose();
      }
    });

    /* Set the size, title, and image, and open the shell */
    currentShell.setSize(300, 100);
    currentShell.setText(ControlExample.getResourceString("Title")
        + shellCount);
    if (imageButton.getSelection())
      currentShell.setImage(instance.images[ControlExample.ciTarget]);
    hookListeners(currentShell);
    currentShell.open();
    shellCount++;
  }

  /**
   * Creates the "Control" group.
   */
  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(2, true));
    controlGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
        | GridData.VERTICAL_ALIGN_FILL));
    controlGroup.setText(ControlExample.getResourceString("Parameters"));

    /* Create a group for the decoration style controls */
    styleGroup = new Group(controlGroup, SWT.NONE);
    styleGroup.setLayout(new GridLayout());
    styleGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
        1, 3));
    styleGroup.setText(ControlExample
        .getResourceString("Decoration_Styles"));

    /* Create a group for the modal style controls */
    modalStyleGroup = new Group(controlGroup, SWT.NONE);
    modalStyleGroup.setLayout(new GridLayout());
    modalStyleGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    modalStyleGroup.setText(ControlExample
        .getResourceString("Modal_Styles"));

    /* Create a group for the 'other' controls */
    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 a group for the parent style controls */
    parentStyleGroup = new Group(controlGroup, SWT.NONE);
    parentStyleGroup.setLayout(new GridLayout());
    GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
    parentStyleGroup.setLayoutData(gridData);
    parentStyleGroup.setText(ControlExample.getResourceString("Parent"));
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {

    /* Create the parent style buttons */
    noParentButton = new Button(parentStyleGroup, SWT.RADIO);
    noParentButton.setText(ControlExample.getResourceString("No_Parent"));
    parentButton = new Button(parentStyleGroup, SWT.RADIO);
    parentButton.setText(ControlExample.getResourceString("Parent"));

    /* Create the decoration style buttons */
    noTrimButton = new Button(styleGroup, SWT.CHECK);
    noTrimButton.setText("SWT.NO_TRIM");
    closeButton = new Button(styleGroup, SWT.CHECK);
    closeButton.setText("SWT.CLOSE");
    titleButton = new Button(styleGroup, SWT.CHECK);
    titleButton.setText("SWT.TITLE");
    minButton = new Button(styleGroup, SWT.CHECK);
    minButton.setText("SWT.MIN");
    maxButton = new Button(styleGroup, SWT.CHECK);
    maxButton.setText("SWT.MAX");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
    resizeButton = new Button(styleGroup, SWT.CHECK);
    resizeButton.setText("SWT.RESIZE");
    onTopButton = new Button(styleGroup, SWT.CHECK);
    onTopButton.setText("SWT.ON_TOP");
    toolButton = new Button(styleGroup, SWT.CHECK);
    toolButton.setText("SWT.TOOL");

    /* Create the modal style buttons */
    modelessButton = new Button(modalStyleGroup, SWT.RADIO);
    modelessButton.setText("SWT.MODELESS");
    primaryModalButton = new Button(modalStyleGroup, SWT.RADIO);
    primaryModalButton.setText("SWT.PRIMARY_MODAL");
    applicationModalButton = new Button(modalStyleGroup, SWT.RADIO);
    applicationModalButton.setText("SWT.APPLICATION_MODAL");
    systemModalButton = new Button(modalStyleGroup, SWT.RADIO);
    systemModalButton.setText("SWT.SYSTEM_MODAL");

    /* Create the 'other' buttons */
    imageButton = new Button(otherGroup, SWT.CHECK);
    imageButton.setText(ControlExample.getResourceString("Image"));

    /* Create the "create" and "closeAll" buttons */
    createButton = new Button(controlGroup, SWT.NONE);
    GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
    createButton.setLayoutData(gridData);
    createButton.setText(ControlExample.getResourceString("Create_Shell"));
    closeAllButton = new Button(controlGroup, SWT.NONE);
    gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    closeAllButton.setText(ControlExample
        .getResourceString("Close_All_Shells"));
    closeAllButton.setLayoutData(gridData);

    /* Add the listeners */
    createButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        createButtonSelected(e);
      }
    });
    closeAllButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        closeAllShells();
      }
    });
    SelectionListener decorationButtonListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        decorationButtonSelected(event);
      }
    };
    noTrimButton.addSelectionListener(decorationButtonListener);
    closeButton.addSelectionListener(decorationButtonListener);
    titleButton.addSelectionListener(decorationButtonListener);
    minButton.addSelectionListener(decorationButtonListener);
    maxButton.addSelectionListener(decorationButtonListener);
    borderButton.addSelectionListener(decorationButtonListener);
    resizeButton.addSelectionListener(decorationButtonListener);
    applicationModalButton.addSelectionListener(decorationButtonListener);
    systemModalButton.addSelectionListener(decorationButtonListener);

    /* Set the default state */
    noParentButton.setSelection(true);
    modelessButton.setSelection(true);
  }

  /**
   * Handle a decoration button selection event.
   * 
   * @param event
   *            org.eclipse.swt.events.SelectionEvent
   */
  public void decorationButtonSelected(SelectionEvent event) {

    /*
     * Make sure if the modal style is SWT.APPLICATION_MODAL or
     * SWT.SYSTEM_MODAL the style SWT.CLOSE is also selected. This is to
     * make sure the user can close the shell.
     */
    Button widget = (Button) event.widget;
    if (widget == applicationModalButton || widget == systemModalButton) {
      if (widget.getSelection()) {
        closeButton.setSelection(true);
        noTrimButton.setSelection(false);
      }
      return;
    }
    if (widget == closeButton) {
      if (applicationModalButton.getSelection()
          || systemModalButton.getSelection()) {
        closeButton.setSelection(true);
      }
    }
    /*
     * Make sure if the No Trim button is selected then all other decoration
     * buttons are deselected.
     */
    if (widget.getSelection() && widget != noTrimButton) {
      noTrimButton.setSelection(false);
      return;
    }
    if (widget.getSelection() && widget == noTrimButton) {
      if (applicationModalButton.getSelection()
          || systemModalButton.getSelection()) {
        noTrimButton.setSelection(false);
        return;
      }
      closeButton.setSelection(false);
      titleButton.setSelection(false);
      minButton.setSelection(false);
      maxButton.setSelection(false);
      borderButton.setSelection(false);
      resizeButton.setSelection(false);
      return;
    }
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Shell";
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

/**
 * <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 {
  /* Common control buttons */
  Button borderButton, enabledButton, visibleButton;

  Button preferredButton, tooSmallButton, smallButton, largeButton,
      fillButton;

  /* Common groups and composites */
  Composite tabFolderPage;

  Group exampleGroup, controlGroup, listenersGroup, otherGroup, 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;

  /* Right-to-left support */
  static final boolean RTL_SUPPORT_ENABLE = false;

  Group orientationGroup;

  Button rtlButton, ltrButton, defaultOrietationButton;

  /* Controls and resources for the "Colors" group */
  Button foregroundButton, backgroundButton, fontButton;

  Image foregroundImage, backgroundImage;

  Color foregroundColor, backgroundColor;

  Font font;

  /* Event logging variables and controls */
  Text eventConsole;

  boolean logging = false;

  boolean[] eventsFilter;

  /* Set/Get API controls */
  Combo nameCombo;

  Label returnTypeLabel;

  Button getButton, setButton;

  Text setText, getText;

  static final String[] EVENT_NAMES = { "None", "KeyDown", "KeyUp",
      "MouseDown", "MouseUp", "MouseMove", "MouseEnter", "MouseExit",
      "MouseDoubleClick", "Paint", "Move", "Resize", "Dispose",
      "Selection", "DefaultSelection", "FocusIn", "FocusOut", "Expand",
      "Collapse", "Iconify", "Deiconify", "Close", "Show", "Hide",
      "Modify", "Verify", "Activate", "Deactivate", "Help", "DragDetect",
      "Arm", "Traverse", "MouseHover", "HardKeyDown", "HardKeyUp",
      "MenuDetect", "SetData", "MouseWheel", };

  /**
   * 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 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(2, true));
    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();
    createColorGroup();
    if (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);
      }
    }
    if (RTL_SUPPORT_ENABLE) {
      rtlButton.addSelectionListener(selectionListener);
      ltrButton.addSelectionListener(selectionListener);
      defaultOrietationButton.addSelectionListener(selectionListener);
    }
  }

  /**
   * 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 "Control" widget children. Subclasses override this method to
   * augment the standard controls created in the "Style", "Other" and "Size"
   * groups.
   */
  void createControlWidgets() {
  }

  /**
   * Creates the "Colors" 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.NONE);
    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"));
    fontButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
    Button defaultsButton = new Button(colorGroup, SWT.PUSH);
    defaultsButton.setText(ControlExample.getResourceString("Defaults"));

    Shell shell = controlGroup.getShell();
    final ColorDialog foregroundDialog = new ColorDialog(shell);
    final ColorDialog backgroundDialog = new ColorDialog(shell);
    final FontDialog fontDialog = new FontDialog(shell);

    /* Create images to display current colors */
    int imageSize = 12;
    Display display = shell.getDisplay();
    foregroundImage = new Image(display, imageSize, imageSize);
    backgroundImage = new Image(display, imageSize, imageSize);

    /* Add listeners to set the colors and font */
    foregroundButton.setImage(foregroundImage); // sets the size of the
                          // button
    foregroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = foregroundColor;
        if (oldColor == null) {
          Control[] controls = getExampleWidgets();
          if (controls.length > 0)
            oldColor = controls[0].getForeground();
        }
        if (oldColor != null)
          foregroundDialog.setRGB(oldColor.getRGB()); // seed dialog
                                // with current
                                // color
        RGB rgb = foregroundDialog.open();
        if (rgb == null)
          return;
        oldColor = foregroundColor; // save old foreground color to
                      // dispose when done
        foregroundColor = new Color(event.display, rgb);
        setExampleWidgetForeground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    backgroundButton.setImage(backgroundImage); // sets the size of the
                          // button
    backgroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = backgroundColor;
        if (oldColor == null) {
          Control[] controls = getExampleWidgets();
          if (controls.length > 0)
            oldColor = controls[0].getBackground(); // seed dialog
                                // with current
                                // color
        }
        if (oldColor != null)
          backgroundDialog.setRGB(oldColor.getRGB());
        RGB rgb = backgroundDialog.open();
        if (rgb == null)
          return;
        oldColor = backgroundColor; // save old background color to
                      // dispose when done
        backgroundColor = new Color(event.display, rgb);
        setExampleWidgetBackground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    fontButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Font oldFont = font;
        if (oldFont == null) {
          Control[] controls = getExampleWidgets();
          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(event.display, fontData);
        setExampleWidgetFont();
        setExampleWidgetSize();
        if (oldFont != null)
          oldFont.dispose();
      }
    });
    defaultsButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        resetColorsAndFonts();
      }
    });
    shell.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent event) {
        if (foregroundImage != null)
          foregroundImage.dispose();
        if (backgroundImage != null)
          backgroundImage.dispose();
        if (foregroundColor != null)
          foregroundColor.dispose();
        if (backgroundColor != null)
          backgroundColor.dispose();
        if (font != null)
          font.dispose();
        foregroundColor = null;
        backgroundColor = null;
        font = null;
      }
    });
  }

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

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

  /**
   * Create the event console popup menu.
   */
  void createEventConsolePopup() {
    Menu popup = new Menu(eventConsole.getShell(), 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, false));
  }

  /**
   * 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(tabFolderPage.getShell(),
        SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
    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 < EVENT_NAMES.length; i++) {
      TableItem item = new TableItem(table, SWT.NONE);
      item.setText(EVENT_NAMES[i]);
      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[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 < EVENT_NAMES.length; i++) {
          items[i].setChecked(true);
        }
        for (int i = 0; i < customNames.length; i++) {
          items[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 < EVENT_NAMES.length; i++) {
          items[i].setChecked(false);
        }
        for (int i = 0; i < customNames.length; i++) {
          items[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 < EVENT_NAMES.length; i++) {
          eventsFilter[i] = items[i].getChecked();
        }
        for (int i = 0; i < customNames.length; i++) {
          eventsFilter[EVENT_NAMES.length + i] = items[EVENT_NAMES.length
              + i].getChecked();
        }
        dialog.dispose();
      }
    });
    dialog.pack();
    dialog.open();
    while (!dialog.isDisposed()) {
      if (!dialog.getDisplay().readAndDispatch())
        dialog.getDisplay().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, false,
        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[EVENT_NAMES.length + customEventCount];
    for (int i = 0; i < 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;
        }
      }
    });
  }

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

  void createSetGetDialog(int x, int y, String[] methodNames) {
    final Shell dialog = new Shell(eventConsole.getShell(), 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.NONE);
    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 = 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();
  }

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

  String setMethodName(String methodRoot) {
    return "set" + methodRoot;
  }

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

  void getValue() {
    String methodName = "get" + nameCombo.getText();
    getText.setText("");
    Control[] controls = getExampleWidgets();
    for (int i = 0; i < controls.length; i++) {
      try {
        java.lang.reflect.Method method = controls[i].getClass()
            .getMethod(methodName, null);
        Object result = method.invoke(controls[i], null);
        if (result == null) {
          getText.append("null");
        } else if (result.getClass().isArray()) {
          Object[] arrayResult = (Object[]) result;
          for (int j = 0; j < arrayResult.length; j++) {
            getText.append(arrayResult[j].toString() + "\n");
          }
        } else {
          getText.append(result.toString());
        }
      } catch (Exception e) {
        getText.append(e.toString());
      }
      if (i + 1 < controls.length) {
        getText.append("\n\n");
      }
    }
  }

  Class getReturnType(String methodRoot) {
    Class returnType = null;
    String methodName = "get" + methodRoot;
    Control[] controls = getExampleWidgets();
    try {
      java.lang.reflect.Method method = controls[0].getClass().getMethod(
          methodName, null);
      returnType = method.getReturnType();
    } catch (Exception e) {
    }
    return returnType;
  }

  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();
    Control[] controls = getExampleWidgets();
    for (int i = 0; i < controls.length; i++) {
      try {
        java.lang.reflect.Method method = controls[i].getClass()
            .getMethod(methodName, new Class[] { returnType });
        String typeName = returnType.getName();
        Object[] parameter = null;
        if (typeName.equals("int")) {
          parameter = new Object[] { new Integer(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[] = value.split(",");
          parameter = new Object[] { new Point(new Integer(xy[0])
              .intValue(), new Integer(xy[1]).intValue()) };
        } else if (typeName.equals("[Ljava.lang.String;")) {
          parameter = new Object[] { value.split(",") };
        } else {
          parameter = parameterForType(typeName, value, controls[i]);
        }
        method.invoke(controls[i], parameter);
      } catch (Exception e) {
        getText.setText(e.toString());
      }
    }
  }

  Object[] parameterForType(String typeName, String value, Control control) {
    return new Object[] { value };
  }

  void createOrientationGroup() {
    /* Create Orientation group */
    orientationGroup = new Group(controlGroup, SWT.NONE);
    orientationGroup.setLayout(new GridLayout());
    orientationGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    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 "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.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();
    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 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" widget children.
   * 
   * @return an array containing the example widget children
   */
  Control[] getExampleWidgets() {
    return new Control[0];
  }

  /**
   * 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 text for the tab folder item.
   * 
   * @return the text for the tab item
   */
  String getTabText() {
    return "";
  }

  /**
   * Hooks all listeners to all example controls and example control items.
   */
  void hookExampleWidgetListeners() {
    if (logging) {
      Control[] exampleControls = getExampleWidgets();
      for (int i = 0; i < exampleControls.length; i++) {
        hookListeners(exampleControls[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[EVENT_NAMES.length + i])
          hookCustomListener(customNames[i]);
      }
    }
  }

  /**
   * Hooks the custom listener specified by eventName.
   */
  void hookCustomListener(String eventName) {
  }

  /**
   * 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 < EVENT_NAMES.length; i++) {
        if (eventsFilter[i])
          widget.addListener(i, listener);
      }
    }
  }

  /**
   * Logs an untyped event to the event console.
   */
  void log(Event event) {
    String toString = EVENT_NAMES[event.type] + " [" + 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:
    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");
  }

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

  /**
   * Sets the background color of the "Example" widgets.
   */
  void setExampleWidgetBackground() {
    if (backgroundButton == null)
      return; // no background button on this tab
    Control[] controls = getExampleWidgets();
    for (int i = 0; i < controls.length; i++) {
      controls[i].setBackground(backgroundColor);
    }
    // Set the background button's color to match the color just set.
    Color color = backgroundColor;
    if (controls.length == 0)
      return;
    if (color == null)
      color = controls[0].getBackground();
    drawImage(backgroundImage, color);
    backgroundButton.setImage(backgroundImage);
  }

  /**
   * 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 (instance.startup)
      return;
    if (fontButton == null)
      return; // no font button on this tab
    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; // no foreground button on this tab
    Control[] controls = getExampleWidgets();
    for (int i = 0; i < controls.length; i++) {
      controls[i].setForeground(foregroundColor);
    }
    // Set the foreground button's color to match the color just set.
    Color color = foregroundColor;
    if (controls.length == 0)
      return;
    if (color == null)
      color = controls[0].getForeground();
    drawImage(foregroundImage, color);
    foregroundButton.setImage(foregroundImage);
  }

  /**
   * 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);
    }
    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() {
    setExampleWidgetEnabled();
    setExampleWidgetVisibility();
    setExampleWidgetBackground();
    setExampleWidgetForeground();
    setExampleWidgetFont();
    setExampleWidgetSize();
    // TEMPORARY CODE
    // Control [] controls = getExampleWidgets ();
    // 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 = getExampleWidgets();
    for (int i = 0; i < controls.length; i++) {
      controls[i].setVisible(visibleButton.getSelection());
    }
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class TreeTab extends ScrollableTab {
  /* Example widgets and groups that contain them */
  Tree tree1, tree2;

  TreeItem textNode1, imageNode1;

  Group treeGroup, imageTreeGroup, itemGroup;

  /* Style widgets added to the "Style" group */
  Button checkButton, fullSelectionButton;

  /* Other widgets added to the "Other" group */
  Button multipleColumns, headerVisibleButton, linesVisibleButton;

  /* Controls and resources added to the "Colors" group */
  Button itemForegroundButton, itemBackgroundButton, itemFontButton;

  Color itemForegroundColor, itemBackgroundColor;

  Image itemForegroundImage, itemBackgroundImage;

  Font itemFont;

  static String[] columnTitles = {
      ControlExample.getResourceString("TableTitle_0"),
      ControlExample.getResourceString("TableTitle_1"),
      ControlExample.getResourceString("TableTitle_2"),
      ControlExample.getResourceString("TableTitle_3") };

  static String[][] tableData = {
      { ControlExample.getResourceString("TableLine0_0"),
          ControlExample.getResourceString("TableLine0_1"),
          ControlExample.getResourceString("TableLine0_2"),
          ControlExample.getResourceString("TableLine0_3") },
      { ControlExample.getResourceString("TableLine1_0"),
          ControlExample.getResourceString("TableLine1_1"),
          ControlExample.getResourceString("TableLine1_2"),
          ControlExample.getResourceString("TableLine1_3") },
      { ControlExample.getResourceString("TableLine2_0"),
          ControlExample.getResourceString("TableLine2_1"),
          ControlExample.getResourceString("TableLine2_2"),
          ControlExample.getResourceString("TableLine2_3") } };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  TreeTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Colors" group.
   */
  void createColorGroup() {
    super.createColorGroup();

    itemGroup = new Group(colorGroup, SWT.NONE);
    itemGroup.setText(ControlExample.getResourceString("Tree_Item_Colors"));
    GridData data = new GridData();
    data.horizontalSpan = 2;
    itemGroup.setLayoutData(data);
    itemGroup.setLayout(new GridLayout(2, false));
    new Label(itemGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Foreground_Color"));
    itemForegroundButton = new Button(itemGroup, SWT.PUSH);
    new Label(itemGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Background_Color"));
    itemBackgroundButton = new Button(itemGroup, SWT.PUSH);
    itemFontButton = new Button(itemGroup, SWT.PUSH);
    itemFontButton.setText(ControlExample.getResourceString("Font"));
    itemFontButton.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL));

    Shell shell = colorGroup.getShell();
    final ColorDialog foregroundDialog = new ColorDialog(shell);
    final ColorDialog backgroundDialog = new ColorDialog(shell);
    final FontDialog fontDialog = new FontDialog(shell);

    int imageSize = 12;
    Display display = shell.getDisplay();
    itemForegroundImage = new Image(display, imageSize, imageSize);
    itemBackgroundImage = new Image(display, imageSize, imageSize);

    /* Add listeners to set the colors and font */
    itemForegroundButton.setImage(itemForegroundImage);
    itemForegroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = itemForegroundColor;
        if (oldColor == null)
          oldColor = textNode1.getForeground();
        foregroundDialog.setRGB(oldColor.getRGB());
        RGB rgb = foregroundDialog.open();
        if (rgb == null)
          return;
        oldColor = itemForegroundColor;
        itemForegroundColor = new Color(event.display, rgb);
        setItemForeground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    itemBackgroundButton.setImage(itemBackgroundImage);
    itemBackgroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = itemBackgroundColor;
        if (oldColor == null)
          oldColor = textNode1.getBackground();
        backgroundDialog.setRGB(oldColor.getRGB());
        RGB rgb = backgroundDialog.open();
        if (rgb == null)
          return;
        oldColor = itemBackgroundColor;
        itemBackgroundColor = new Color(event.display, rgb);
        setItemBackground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    itemFontButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Font oldFont = itemFont;
        if (oldFont == null)
          oldFont = textNode1.getFont();
        fontDialog.setFontList(oldFont.getFontData());
        FontData fontData = fontDialog.open();
        if (fontData == null)
          return;
        oldFont = itemFont;
        itemFont = new Font(event.display, fontData);
        setItemFont();
        setExampleWidgetSize();
        if (oldFont != null)
          oldFont.dispose();
      }
    });
    shell.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent event) {
        if (itemBackgroundImage != null)
          itemBackgroundImage.dispose();
        if (itemForegroundImage != null)
          itemForegroundImage.dispose();
        if (itemBackgroundColor != null)
          itemBackgroundColor.dispose();
        if (itemForegroundColor != null)
          itemForegroundColor.dispose();
        if (itemFont != null)
          itemFont.dispose();
        itemBackgroundColor = null;
        itemForegroundColor = null;
        itemFont = null;
      }
    });
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    multipleColumns = new Button(otherGroup, SWT.CHECK);
    multipleColumns.setText(ControlExample
        .getResourceString("Multiple_Columns"));
    headerVisibleButton = new Button(otherGroup, SWT.CHECK);
    headerVisibleButton.setText(ControlExample
        .getResourceString("Header_Visible"));
    linesVisibleButton = new Button(otherGroup, SWT.CHECK);
    linesVisibleButton.setText(ControlExample
        .getResourceString("Lines_Visible"));

    /* Add the listeners */
    multipleColumns.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        recreateExampleWidgets();
      }
    });
    headerVisibleButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetHeaderVisible();
      }
    });
    linesVisibleButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetLinesVisible();
      }
    });
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the text tree */
    treeGroup = new Group(exampleGroup, SWT.NONE);
    treeGroup.setLayout(new GridLayout());
    treeGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    treeGroup.setText("Tree");

    /* Create a group for the image tree */
    imageTreeGroup = new Group(exampleGroup, SWT.NONE);
    imageTreeGroup.setLayout(new GridLayout());
    imageTreeGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    imageTreeGroup.setText(ControlExample
        .getResourceString("Tree_With_Images"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {
    /* Compute the widget style */
    int style = getDefaultStyle();
    if (singleButton.getSelection())
      style |= SWT.SINGLE;
    if (multiButton.getSelection())
      style |= SWT.MULTI;
    if (checkButton.getSelection())
      style |= SWT.CHECK;
    if (fullSelectionButton.getSelection())
      style |= SWT.FULL_SELECTION;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the text tree */
    tree1 = new Tree(treeGroup, style);
    if (multipleColumns.getSelection()) {
      for (int i = 0; i < columnTitles.length; i++) {
        TreeColumn treeColumn = new TreeColumn(tree1, SWT.NONE);
        treeColumn.setText(columnTitles[i]);
      }
    }
    for (int i = 0; i < 4; i++) {
      TreeItem item = new TreeItem(tree1, SWT.NONE);
      setItemText(item, i, ControlExample.getResourceString("Node_"
          + (i + 1)));
      if (i < 3) {
        TreeItem subitem = new TreeItem(item, SWT.NONE);
        setItemText(subitem, i, ControlExample
            .getResourceString("Node_" + (i + 1) + "_1"));
      }
    }
    TreeItem treeRoots[] = tree1.getItems();
    TreeItem item = new TreeItem(treeRoots[1], SWT.NONE);
    setItemText(item, 1, ControlExample.getResourceString("Node_2_2"));
    item = new TreeItem(item, SWT.NONE);
    setItemText(item, 1, ControlExample.getResourceString("Node_2_2_1"));
    textNode1 = treeRoots[0];
    packColumns(tree1);

    /* Create the image tree */
    tree2 = new Tree(imageTreeGroup, style);
    Image image = instance.images[ControlExample.ciClosedFolder];
    if (multipleColumns.getSelection()) {
      for (int i = 0; i < columnTitles.length; i++) {
        TreeColumn treeColumn = new TreeColumn(tree2, SWT.NONE);
        treeColumn.setText(columnTitles[i]);
      }
    }
    for (int i = 0; i < 4; i++) {
      item = new TreeItem(tree2, SWT.NONE);
      setItemText(item, i, ControlExample.getResourceString("Node_"
          + (i + 1)));
      item.setImage(image);
      if (i < 3) {
        TreeItem subitem = new TreeItem(item, SWT.NONE);
        setItemText(subitem, i, ControlExample
            .getResourceString("Node_" + (i + 1) + "_1"));
        subitem.setImage(image);
      }
    }
    treeRoots = tree2.getItems();
    item = new TreeItem(treeRoots[1], SWT.NONE);
    setItemText(item, 1, ControlExample.getResourceString("Node_2_2"));
    item.setImage(image);
    item = new TreeItem(item, SWT.NONE);
    setItemText(item, 1, ControlExample.getResourceString("Node_2_2_1"));
    item.setImage(image);
    imageNode1 = treeRoots[0];
    packColumns(tree2);
  }

  void setItemText(TreeItem item, int i, String node) {
    int index = i % 3;
    if (multipleColumns.getSelection()) {
      tableData[index][0] = node;
      item.setText(tableData[index]);
    } else {
      item.setText(node);
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    checkButton = new Button(styleGroup, SWT.CHECK);
    checkButton.setText("SWT.CHECK");
    fullSelectionButton = new Button(styleGroup, SWT.CHECK);
    fullSelectionButton.setText("SWT.FULL_SELECTION");
  }

  /**
   * Gets the "Example" widget children's items, if any.
   * 
   * @return an array containing the example widget children's items
   */
  Item[] getExampleWidgetItems() {
    /*
     * Note: We do not bother collecting the tree items because tree items
     * don't have any events. If events are ever added to TreeItem, then
     * this needs to change.
     */
    Item[] columns1 = tree1.getColumns();
    Item[] columns2 = tree2.getColumns();
    Item[] allItems = new Item[columns1.length + columns2.length];
    System.arraycopy(columns1, 0, allItems, 0, columns1.length);
    System.arraycopy(columns2, 0, allItems, columns1.length,
        columns2.length);
    return allItems;
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { tree1, tree2 };
  }

  /**
   * 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 new String[] { "Selection", "TopItem" };
  }

  Object[] parameterForType(String typeName, String value, Control control) {
    if (typeName.equals("org.eclipse.swt.widgets.TreeItem")) {
      TreeItem item = findItem(value, ((Tree) control).getItems());
      if (item != null)
        return new Object[] { item };
    }
    if (typeName.equals("[Lorg.eclipse.swt.widgets.TreeItem;")) {
      String[] values = value.split(",");
      TreeItem[] items = new TreeItem[values.length];
      for (int i = 0; i < values.length; i++) {
        TreeItem item = findItem(values[i], ((Tree) control).getItems());
        if (item == null)
          break;
        items[i] = item;
      }
      return new Object[] { items };
    }
    return super.parameterForType(typeName, value, control);
  }

  TreeItem findItem(String value, TreeItem[] items) {
    for (int i = 0; i < items.length; i++) {
      TreeItem item = items[i];
      if (item.getText().equals(value))
        return item;
      item = findItem(value, item.getItems());
      if (item != null)
        return item;
    }
    return null;
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Tree";
  }

  void packColumns(Tree tree) {
    if (multipleColumns.getSelection()) {
      int columnCount = tree.getColumnCount();
      for (int i = 0; i < columnCount; i++) {
        TreeColumn treeColumn = tree.getColumn(i);
        treeColumn.pack();
      }
    }
  }

  /**
   * Sets the foreground color, background color, and font of the "Example"
   * widgets to their default settings. Also sets foreground and background
   * color of the Node 1 TreeItems to default settings.
   */
  void resetColorsAndFonts() {
    super.resetColorsAndFonts();
    Color oldColor = itemForegroundColor;
    itemForegroundColor = null;
    setItemForeground();
    if (oldColor != null)
      oldColor.dispose();
    oldColor = itemBackgroundColor;
    itemBackgroundColor = null;
    setItemBackground();
    if (oldColor != null)
      oldColor.dispose();
    Font oldFont = font;
    itemFont = null;
    setItemFont();
    setExampleWidgetSize();
    if (oldFont != null)
      oldFont.dispose();
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    setItemBackground();
    setItemForeground();
    setItemFont();
    setExampleWidgetSize();
    setWidgetHeaderVisible();
    setWidgetLinesVisible();
    checkButton.setSelection((tree1.getStyle() & SWT.CHECK) != 0);
    checkButton.setSelection((tree2.getStyle() & SWT.CHECK) != 0);
    fullSelectionButton
        .setSelection((tree1.getStyle() & SWT.FULL_SELECTION) != 0);
    fullSelectionButton
        .setSelection((tree2.getStyle() & SWT.FULL_SELECTION) != 0);
  }

  /**
   * Sets the background color of the Node 1 TreeItems.
   */
  void setItemBackground() {
    textNode1.setBackground(itemBackgroundColor);
    imageNode1.setBackground(itemBackgroundColor);
    /* Set the background button's color to match the color just set. */
    Color color = itemBackgroundColor;
    if (color == null)
      color = textNode1.getBackground();
    drawImage(itemBackgroundImage, color);
    itemBackgroundButton.setImage(itemBackgroundImage);
  }

  /**
   * Sets the foreground color of the Node 1 TreeItems.
   */
  void setItemForeground() {
    textNode1.setForeground(itemForegroundColor);
    imageNode1.setForeground(itemForegroundColor);
    /* Set the foreground button's color to match the color just set. */
    Color color = itemForegroundColor;
    if (color == null)
      color = textNode1.getForeground();
    drawImage(itemForegroundImage, color);
    itemForegroundButton.setImage(itemForegroundImage);
  }

  /**
   * Sets the font of the Node 1 TreeItems.
   */
  void setItemFont() {
    if (instance.startup)
      return;
    textNode1.setFont(itemFont);
    imageNode1.setFont(itemFont);
  }

  /**
   * Sets the header visible state of the "Example" widgets.
   */
  void setWidgetHeaderVisible() {
    tree1.setHeaderVisible(headerVisibleButton.getSelection());
    tree2.setHeaderVisible(headerVisibleButton.getSelection());
  }

  /**
   * Sets the lines visible state of the "Example" widgets.
   */
  void setWidgetLinesVisible() {
    tree1.setLinesVisible(linesVisibleButton.getSelection());
    tree2.setLinesVisible(linesVisibleButton.getSelection());
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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 ToolBarTab extends Tab {
  /* Example widgets and groups that contain them */
  ToolBar imageToolBar, textToolBar, imageTextToolBar;

  Group imageToolBarGroup, textToolBarGroup, imageTextToolBarGroup;

  /* Style widgets added to the "Style" group */
  Button horizontalButton, verticalButton, flatButton, shadowOutButton,
      wrapButton, rightButton;

  /* Other widgets added to the "Other" group */
  Button comboChildButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ToolBarTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the image tool bar */
    imageToolBarGroup = new Group(exampleGroup, SWT.NONE);
    imageToolBarGroup.setLayout(new GridLayout());
    imageToolBarGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    imageToolBarGroup.setText(ControlExample
        .getResourceString("Image_ToolBar"));

    /* Create a group for the text tool bar */
    textToolBarGroup = new Group(exampleGroup, SWT.NONE);
    textToolBarGroup.setLayout(new GridLayout());
    textToolBarGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    textToolBarGroup.setText(ControlExample
        .getResourceString("Text_ToolBar"));

    /* Create a group for the image and text tool bar */
    imageTextToolBarGroup = new Group(exampleGroup, SWT.NONE);
    imageTextToolBarGroup.setLayout(new GridLayout());
    imageTextToolBarGroup.setLayoutData(new GridData(
        GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    imageTextToolBarGroup.setText(ControlExample
        .getResourceString("ImageText_ToolBar"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (horizontalButton.getSelection())
      style |= SWT.HORIZONTAL;
    if (verticalButton.getSelection())
      style |= SWT.VERTICAL;
    if (flatButton.getSelection())
      style |= SWT.FLAT;
    if (wrapButton.getSelection())
      style |= SWT.WRAP;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (shadowOutButton.getSelection())
      style |= SWT.SHADOW_OUT;
    if (rightButton.getSelection())
      style |= SWT.RIGHT;

    /*
     * Create the example widgets.
     * 
     * A tool bar must consist of all image tool items or all text tool
     * items but not both.
     */

    /* Create the image tool bar */
    imageToolBar = new ToolBar(imageToolBarGroup, style);
    ToolItem item = new ToolItem(imageToolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(imageToolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(imageToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageToolBar, SWT.CHECK);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setToolTipText("SWT.CHECK");
    item = new ToolItem(imageToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageToolBar, SWT.SEPARATOR);
    item.setToolTipText("SWT.SEPARATOR");
    if (comboChildButton.getSelection()) {
      Combo combo = new Combo(imageToolBar, SWT.NONE);
      combo.setItems(new String[] { "250", "500", "750" });
      combo.setText(combo.getItem(0));
      combo.pack();
      item.setWidth(combo.getSize().x);
      item.setControl(combo);
    }
    item = new ToolItem(imageToolBar, SWT.DROP_DOWN);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setToolTipText("SWT.DROP_DOWN");
    item.addSelectionListener(new DropDownSelectionListener());

    /* Create the text tool bar */
    textToolBar = new ToolBar(textToolBarGroup, style);
    item = new ToolItem(textToolBar, SWT.PUSH);
    item.setText(ControlExample.getResourceString("Push"));
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(textToolBar, SWT.PUSH);
    item.setText(ControlExample.getResourceString("Push"));
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(textToolBar, SWT.RADIO);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(textToolBar, SWT.RADIO);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(textToolBar, SWT.CHECK);
    item.setText(ControlExample.getResourceString("Check"));
    item.setToolTipText("SWT.CHECK");
    item = new ToolItem(textToolBar, SWT.RADIO);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(textToolBar, SWT.RADIO);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(textToolBar, SWT.SEPARATOR);
    item.setToolTipText("SWT.SEPARATOR");
    if (comboChildButton.getSelection()) {
      Combo combo = new Combo(textToolBar, SWT.NONE);
      combo.setItems(new String[] { "250", "500", "750" });
      combo.setText(combo.getItem(0));
      combo.pack();
      item.setWidth(combo.getSize().x);
      item.setControl(combo);
    }
    item = new ToolItem(textToolBar, SWT.DROP_DOWN);
    item.setText(ControlExample.getResourceString("Drop_Down"));
    item.setToolTipText("SWT.DROP_DOWN");
    item.addSelectionListener(new DropDownSelectionListener());

    /* Create the image and text tool bar */
    imageTextToolBar = new ToolBar(imageTextToolBarGroup, style);
    item = new ToolItem(imageTextToolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setText(ControlExample.getResourceString("Push"));
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(imageTextToolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setText(ControlExample.getResourceString("Push"));
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(imageTextToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageTextToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageTextToolBar, SWT.CHECK);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setText(ControlExample.getResourceString("Check"));
    item.setToolTipText("SWT.CHECK");
    item = new ToolItem(imageTextToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageTextToolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setText(ControlExample.getResourceString("Radio"));
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(imageTextToolBar, SWT.SEPARATOR);
    item.setToolTipText("SWT.SEPARATOR");
    if (comboChildButton.getSelection()) {
      Combo combo = new Combo(imageTextToolBar, SWT.NONE);
      combo.setItems(new String[] { "250", "500", "750" });
      combo.setText(combo.getItem(0));
      combo.pack();
      item.setWidth(combo.getSize().x);
      item.setControl(combo);
    }
    item = new ToolItem(imageTextToolBar, SWT.DROP_DOWN);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setText(ControlExample.getResourceString("Drop_Down"));
    item.setToolTipText("SWT.DROP_DOWN");
    item.addSelectionListener(new DropDownSelectionListener());

    /*
     * Do not add the selection event for this drop down tool item. Without
     * hooking the event, the drop down widget does nothing special when the
     * drop down area is selected.
     */
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    comboChildButton = new Button(otherGroup, SWT.CHECK);
    comboChildButton.setText(ControlExample
        .getResourceString("Combo_child"));

    /* Add the listeners */
    comboChildButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        recreateExampleWidgets();
      }
    });
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    horizontalButton = new Button(styleGroup, SWT.RADIO);
    horizontalButton.setText("SWT.HORIZONTAL");
    verticalButton = new Button(styleGroup, SWT.RADIO);
    verticalButton.setText("SWT.VERTICAL");
    flatButton = new Button(styleGroup, SWT.CHECK);
    flatButton.setText("SWT.FLAT");
    shadowOutButton = new Button(styleGroup, SWT.CHECK);
    shadowOutButton.setText("SWT.SHADOW_OUT");
    wrapButton = new Button(styleGroup, SWT.CHECK);
    wrapButton.setText("SWT.WRAP");
    rightButton = new Button(styleGroup, SWT.CHECK);
    rightButton.setText("SWT.RIGHT");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
  }

  void disposeExampleWidgets() {
    super.disposeExampleWidgets();
  }

  /**
   * Gets the "Example" widget children's items, if any.
   * 
   * @return an array containing the example widget children's items
   */
  Item[] getExampleWidgetItems() {
    Item[] imageToolBarItems = imageToolBar.getItems();
    Item[] textToolBarItems = textToolBar.getItems();
    Item[] imageTextToolBarItems = imageTextToolBar.getItems();
    Item[] allItems = new Item[imageToolBarItems.length
        + textToolBarItems.length + imageTextToolBarItems.length];
    System.arraycopy(imageToolBarItems, 0, allItems, 0,
        imageToolBarItems.length);
    System.arraycopy(textToolBarItems, 0, allItems,
        imageToolBarItems.length, textToolBarItems.length);
    System.arraycopy(imageTextToolBarItems, 0, allItems,
        imageToolBarItems.length + textToolBarItems.length,
        imageTextToolBarItems.length);
    return allItems;
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { imageToolBar, textToolBar, imageTextToolBar };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "ToolBar";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    horizontalButton
        .setSelection((imageToolBar.getStyle() & SWT.HORIZONTAL) != 0);
    verticalButton
        .setSelection((imageToolBar.getStyle() & SWT.VERTICAL) != 0);
    flatButton.setSelection((imageToolBar.getStyle() & SWT.FLAT) != 0);
    wrapButton.setSelection((imageToolBar.getStyle() & SWT.WRAP) != 0);
    shadowOutButton
        .setSelection((imageToolBar.getStyle() & SWT.SHADOW_OUT) != 0);
    borderButton.setSelection((imageToolBar.getStyle() & SWT.BORDER) != 0);
    rightButton.setSelection((imageToolBar.getStyle() & SWT.RIGHT) != 0);
  }

  /**
   * Listens to widgetSelected() events on SWT.DROP_DOWN type ToolItems and
   * opens/closes a menu when appropriate.
   */
  class DropDownSelectionListener extends SelectionAdapter {
    private Menu menu = null;

    private boolean visible = false;

    public void widgetSelected(SelectionEvent event) {
      // Create the menu if it has not already been created
      if (menu == null) {
        // Lazy create the menu.
        Shell shell = tabFolderPage.getShell();
        menu = new Menu(shell);
        for (int i = 0; i < 9; ++i) {
          final String text = ControlExample
              .getResourceString("DropDownData_" + i);
          if (text.length() != 0) {
            MenuItem menuItem = new MenuItem(menu, SWT.NONE);
            menuItem.setText(text);
            /*
             * Add a menu selection listener so that the menu is
             * hidden when the user selects an item from the drop
             * down menu.
             */
            menuItem.addSelectionListener(new SelectionAdapter() {
              public void widgetSelected(SelectionEvent e) {
                setMenuVisible(false);
              }
            });
          } else {
            new MenuItem(menu, SWT.SEPARATOR);
          }
        }
      }

      /**
       * A selection event will be fired when a drop down tool item is
       * selected in the main area and in the drop down arrow. Examine the
       * event detail to determine where the widget was selected.
       */
      if (event.detail == SWT.ARROW) {
        /*
         * The drop down arrow was selected.
         */
        if (visible) {
          // Hide the menu to give the Arrow the appearance of being a
          // toggle button.
          setMenuVisible(false);
        } else {
          // Position the menu below and vertically aligned with the
          // the drop down tool button.
          final ToolItem toolItem = (ToolItem) event.widget;
          final ToolBar toolBar = toolItem.getParent();

          Rectangle toolItemBounds = toolItem.getBounds();
          Point point = toolBar.toDisplay(new Point(toolItemBounds.x,
              toolItemBounds.y));
          menu.setLocation(point.x, point.y + toolItemBounds.height);
          setMenuVisible(true);
        }
      } else {
        /*
         * Main area of drop down tool item selected. An application
         * would invoke the code to perform the action for the tool
         * item.
         */
      }
    }

    private void setMenuVisible(boolean visible) {
      menu.setVisible(visible);
      this.visible = visible;
    }
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class TextTab extends ScrollableTab {
  /* Example widgets and groups that contain them */
  Text text;

  Group textGroup;

  /* Style widgets added to the "Style" group */
  Button wrapButton, readOnlyButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  TextTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the text widget */
    textGroup = new Group(exampleGroup, SWT.NONE);
    textGroup.setLayout(new GridLayout());
    textGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    textGroup.setText("Text");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (singleButton.getSelection())
      style |= SWT.SINGLE;
    if (multiButton.getSelection())
      style |= SWT.MULTI;
    if (horizontalButton.getSelection())
      style |= SWT.H_SCROLL;
    if (verticalButton.getSelection())
      style |= SWT.V_SCROLL;
    if (wrapButton.getSelection())
      style |= SWT.WRAP;
    if (readOnlyButton.getSelection())
      style |= SWT.READ_ONLY;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    text = new Text(textGroup, style);
    text.setText(ControlExample.getResourceString("Example_string")
        + Text.DELIMITER
        + ControlExample.getResourceString("One_Two_Three"));
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    wrapButton = new Button(styleGroup, SWT.CHECK);
    wrapButton.setText("SWT.WRAP");
    readOnlyButton = new Button(styleGroup, SWT.CHECK);
    readOnlyButton.setText("SWT.READ_ONLY");
  }

  /**
   * Creates the tab folder page.
   * 
   * @param tabFolder
   *            org.eclipse.swt.widgets.TabFolder
   * @return the new page for the tab folder
   */
  Composite createTabFolderPage(TabFolder tabFolder) {
    super.createTabFolderPage(tabFolder);

    /*
     * Add a resize listener to the tabFolderPage so that if the user types
     * into the example widget to change its preferred size, and then
     * resizes the shell, we recalculate the preferred size correctly.
     */
    tabFolderPage.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e) {
        setExampleWidgetSize();
      }
    });

    return tabFolderPage;
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { text };
  }

  /**
   * 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 new String[] { "DoubleClickEnabled", "EchoChar", "Editable",
        "Orientation", "Selection", "Tabs", "Text", "TextLimit",
        "TopIndex" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Text";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    wrapButton.setSelection((text.getStyle() & SWT.WRAP) != 0);
    readOnlyButton.setSelection((text.getStyle() & SWT.READ_ONLY) != 0);
    wrapButton.setEnabled((text.getStyle() & SWT.MULTI) != 0);
    horizontalButton.setEnabled((text.getStyle() & SWT.MULTI) != 0);
    verticalButton.setEnabled((text.getStyle() & SWT.MULTI) != 0);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class TableTab extends ScrollableTab {
  /* Example widgets and groups that contain them */
  Table table1;

  Group tableGroup, itemGroup;

  /* Style widgets added to the "Style" group */
  Button checkButton, fullSelectionButton, hideSelectionButton;

  /* Other widgets added to the "Other" group */
  Button multipleColumns, moveableColumns, headerVisibleButton,
      linesVisibleButton;

  /* Controls and resources added to the "Colors" group */
  Button itemForegroundButton, itemBackgroundButton, itemFontButton;

  Color itemForegroundColor, itemBackgroundColor;

  Image itemForegroundImage, itemBackgroundImage;

  Font itemFont;

  static String[] columnTitles = {
      ControlExample.getResourceString("TableTitle_0"),
      ControlExample.getResourceString("TableTitle_1"),
      ControlExample.getResourceString("TableTitle_2"),
      ControlExample.getResourceString("TableTitle_3") };

  static String[][] tableData = {
      { ControlExample.getResourceString("TableLine0_0"),
          ControlExample.getResourceString("TableLine0_1"),
          ControlExample.getResourceString("TableLine0_2"),
          ControlExample.getResourceString("TableLine0_3") },
      { ControlExample.getResourceString("TableLine1_0"),
          ControlExample.getResourceString("TableLine1_1"),
          ControlExample.getResourceString("TableLine1_2"),
          ControlExample.getResourceString("TableLine1_3") },
      { ControlExample.getResourceString("TableLine2_0"),
          ControlExample.getResourceString("TableLine2_1"),
          ControlExample.getResourceString("TableLine2_2"),
          ControlExample.getResourceString("TableLine2_3") } };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  TableTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Colors" group.
   */
  void createColorGroup() {
    super.createColorGroup();

    itemGroup = new Group(colorGroup, SWT.NONE);
    itemGroup
        .setText(ControlExample.getResourceString("Table_Item_Colors"));
    GridData data = new GridData();
    data.horizontalSpan = 2;
    itemGroup.setLayoutData(data);
    itemGroup.setLayout(new GridLayout(2, false));
    new Label(itemGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Foreground_Color"));
    itemForegroundButton = new Button(itemGroup, SWT.PUSH);
    new Label(itemGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Background_Color"));
    itemBackgroundButton = new Button(itemGroup, SWT.PUSH);
    itemFontButton = new Button(itemGroup, SWT.PUSH);
    itemFontButton.setText(ControlExample.getResourceString("Font"));
    itemFontButton.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL));

    Shell shell = colorGroup.getShell();
    final ColorDialog foregroundDialog = new ColorDialog(shell);
    final ColorDialog backgroundDialog = new ColorDialog(shell);
    final FontDialog fontDialog = new FontDialog(shell);

    int imageSize = 12;
    Display display = shell.getDisplay();
    itemForegroundImage = new Image(display, imageSize, imageSize);
    itemBackgroundImage = new Image(display, imageSize, imageSize);

    /* Add listeners to set the colors and font */
    itemForegroundButton.setImage(itemForegroundImage);
    itemForegroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = itemForegroundColor;
        if (oldColor == null)
          oldColor = table1.getItem(0).getForeground();
        foregroundDialog.setRGB(oldColor.getRGB());
        RGB rgb = foregroundDialog.open();
        if (rgb == null)
          return;
        oldColor = itemForegroundColor;
        itemForegroundColor = new Color(event.display, rgb);
        setItemForeground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    itemBackgroundButton.setImage(itemBackgroundImage);
    itemBackgroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = itemBackgroundColor;
        if (oldColor == null)
          oldColor = table1.getItem(0).getBackground();
        backgroundDialog.setRGB(oldColor.getRGB());
        RGB rgb = backgroundDialog.open();
        if (rgb == null)
          return;
        oldColor = itemBackgroundColor;
        itemBackgroundColor = new Color(event.display, rgb);
        setItemBackground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    itemFontButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Font oldFont = itemFont;
        if (oldFont == null)
          oldFont = table1.getItem(0).getFont();
        fontDialog.setFontList(oldFont.getFontData());
        FontData fontData = fontDialog.open();
        if (fontData == null)
          return;
        oldFont = itemFont;
        itemFont = new Font(event.display, fontData);
        setItemFont();
        setExampleWidgetSize();
        if (oldFont != null)
          oldFont.dispose();
      }
    });
    shell.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent event) {
        if (itemBackgroundImage != null)
          itemBackgroundImage.dispose();
        if (itemForegroundImage != null)
          itemForegroundImage.dispose();
        if (itemBackgroundColor != null)
          itemBackgroundColor.dispose();
        if (itemForegroundColor != null)
          itemForegroundColor.dispose();
        if (itemFont != null)
          itemFont.dispose();
        itemBackgroundColor = null;
        itemForegroundColor = null;
        itemFont = null;
      }
    });
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    headerVisibleButton = new Button(otherGroup, SWT.CHECK);
    headerVisibleButton.setText(ControlExample
        .getResourceString("Header_Visible"));
    multipleColumns = new Button(otherGroup, SWT.CHECK);
    multipleColumns.setText(ControlExample
        .getResourceString("Multiple_Columns"));
    multipleColumns.setSelection(true);
    moveableColumns = new Button(otherGroup, SWT.CHECK);
    moveableColumns.setText(ControlExample
        .getResourceString("Moveable_Columns"));
    moveableColumns.setSelection(false);
    linesVisibleButton = new Button(otherGroup, SWT.CHECK);
    linesVisibleButton.setText(ControlExample
        .getResourceString("Lines_Visible"));

    /* Add the listeners */
    headerVisibleButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetHeaderVisible();
      }
    });
    multipleColumns.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        recreateExampleWidgets();
      }
    });
    moveableColumns.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setColumnsMoveable();
      }
    });
    linesVisibleButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetLinesVisible();
      }
    });
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the table */
    tableGroup = new Group(exampleGroup, SWT.NONE);
    tableGroup.setLayout(new GridLayout());
    tableGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    tableGroup.setText("Table");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {
    /* Compute the widget style */
    int style = getDefaultStyle();
    if (singleButton.getSelection())
      style |= SWT.SINGLE;
    if (multiButton.getSelection())
      style |= SWT.MULTI;
    if (verticalButton.getSelection())
      style |= SWT.V_SCROLL;
    if (horizontalButton.getSelection())
      style |= SWT.H_SCROLL;
    if (checkButton.getSelection())
      style |= SWT.CHECK;
    if (fullSelectionButton.getSelection())
      style |= SWT.FULL_SELECTION;
    if (hideSelectionButton.getSelection())
      style |= SWT.HIDE_SELECTION;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the table widget */
    table1 = new Table(tableGroup, style);

    /* Fill the table with data */
    if (multipleColumns.getSelection()) {
      for (int i = 0; i < columnTitles.length; i++) {
        TableColumn tableColumn = new TableColumn(table1, SWT.NONE);
        tableColumn.setText(columnTitles[i]);
      }
    } else {
      new TableColumn(table1, SWT.NONE);
    }
    setColumnsMoveable();
    for (int i = 0; i < 16; i++) {
      TableItem item = new TableItem(table1, SWT.NONE);
      item.setImage(instance.images[i % 3]);
      setItemText(item, i, ControlExample.getResourceString("Index") + i);
    }
    packColumns();
  }

  void setItemText(TableItem item, int i, String node) {
    int index = i % 3;
    if (multipleColumns.getSelection()) {
      tableData[index][0] = node;
      item.setText(tableData[index]);
    } else {
      item.setText(node);
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    checkButton = new Button(styleGroup, SWT.CHECK);
    checkButton.setText("SWT.CHECK");
    fullSelectionButton = new Button(styleGroup, SWT.CHECK);
    fullSelectionButton.setText("SWT.FULL_SELECTION");
    hideSelectionButton = new Button(styleGroup, SWT.CHECK);
    hideSelectionButton.setText("SWT.HIDE_SELECTION");
  }

  /**
   * Gets the "Example" widget children's items, if any.
   * 
   * @return an array containing the example widget children's items
   */
  Item[] getExampleWidgetItems() {
    Item[] columns = table1.getColumns();
    Item[] items = table1.getItems();
    Item[] allItems = new Item[columns.length + items.length];
    System.arraycopy(columns, 0, allItems, 0, columns.length);
    System.arraycopy(items, 0, allItems, columns.length, items.length);
    return allItems;
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { table1 };
  }

  /**
   * 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 new String[] { "ItemCount", "Selection", "SelectionIndex",
        "TopIndex" };
  }

  String setMethodName(String methodRoot) {
    /*
     * Override to handle special case of int
     * getSelectionIndex()/setSelection(int)
     */
    return (methodRoot.equals("SelectionIndex")) ? "setSelection" : "set"
        + methodRoot;
  }

  Object[] parameterForType(String typeName, String value, Control control) {
    if (value.equals(""))
      return new Object[] { new TableItem[0] }; // bug in Table?
    if (typeName.equals("org.eclipse.swt.widgets.TableItem")) {
      TableItem item = findItem(value, ((Table) control).getItems());
      if (item != null)
        return new Object[] { item };
    }
    if (typeName.equals("[Lorg.eclipse.swt.widgets.TableItem;")) {
      String[] values = value.split(",");
      TableItem[] items = new TableItem[values.length];
      for (int i = 0; i < values.length; i++) {
        items[i] = findItem(values[i], ((Table) control).getItems());
      }
      return new Object[] { items };
    }
    return super.parameterForType(typeName, value, control);
  }

  TableItem findItem(String value, TableItem[] items) {
    for (int i = 0; i < items.length; i++) {
      TableItem item = items[i];
      if (item.getText().equals(value))
        return item;
    }
    return null;
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Table";
  }

  /**
   * Sets the foreground color, background color, and font of the "Example"
   * widgets to their default settings. Also sets foreground and background
   * color of TableItem [0] to default settings.
   */
  void resetColorsAndFonts() {
    super.resetColorsAndFonts();
    Color oldColor = itemForegroundColor;
    itemForegroundColor = null;
    setItemForeground();
    if (oldColor != null)
      oldColor.dispose();
    oldColor = itemBackgroundColor;
    itemBackgroundColor = null;
    setItemBackground();
    if (oldColor != null)
      oldColor.dispose();
    Font oldFont = font;
    itemFont = null;
    setItemFont();
    setExampleWidgetSize();
    if (oldFont != null)
      oldFont.dispose();
  }

  /**
   * Sets the background color of TableItem [0].
   */
  void setItemBackground() {
    table1.getItem(0).setBackground(itemBackgroundColor);
    /* Set the background button's color to match the color just set. */
    Color color = itemBackgroundColor;
    if (color == null)
      color = table1.getItem(0).getBackground();
    drawImage(itemBackgroundImage, color);
    itemBackgroundButton.setImage(itemBackgroundImage);
  }

  /**
   * Sets the foreground color of TableItem [0].
   */
  void setItemForeground() {
    table1.getItem(0).setForeground(itemForegroundColor);
    /* Set the foreground button's color to match the color just set. */
    Color color = itemForegroundColor;
    if (color == null)
      color = table1.getItem(0).getForeground();
    drawImage(itemForegroundImage, color);
    itemForegroundButton.setImage(itemForegroundImage);
  }

  /**
   * Sets the font of TableItem 0.
   */
  void setItemFont() {
    if (instance.startup)
      return;
    table1.getItem(0).setFont(itemFont);
    packColumns();
  }

  /**
   * Sets the font of the "Example" widgets.
   */
  void setExampleWidgetFont() {
    super.setExampleWidgetFont();
    packColumns();
  }

  void packColumns() {
    int columnCount = table1.getColumnCount();
    for (int i = 0; i < columnCount; i++) {
      TableColumn tableColumn = table1.getColumn(i);
      tableColumn.pack();
    }
  }

  /**
   * Sets the moveable columns state of the "Example" widgets.
   */
  void setColumnsMoveable() {
    boolean selection = moveableColumns.getSelection();
    TableColumn[] columns = table1.getColumns();
    for (int i = 0; i < columns.length; i++) {
      columns[i].setMoveable(selection);
    }
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    setItemBackground();
    setItemForeground();
    setItemFont();
    setExampleWidgetSize();
    setWidgetHeaderVisible();
    setWidgetLinesVisible();
    checkButton.setSelection((table1.getStyle() & SWT.CHECK) != 0);
    fullSelectionButton
        .setSelection((table1.getStyle() & SWT.FULL_SELECTION) != 0);
    hideSelectionButton
        .setSelection((table1.getStyle() & SWT.HIDE_SELECTION) != 0);
  }

  /**
   * Sets the header visible state of the "Example" widgets.
   */
  void setWidgetHeaderVisible() {
    table1.setHeaderVisible(headerVisibleButton.getSelection());
  }

  /**
   * Sets the lines visible state of the "Example" widgets.
   */
  void setWidgetLinesVisible() {
    table1.setLinesVisible(linesVisibleButton.getSelection());
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class TabFolderTab extends Tab {
  /* Example widgets and groups that contain them */
  TabFolder tabFolder1;

  Group tabFolderGroup;

  /* Style widgets added to the "Style" group */
  Button topButton, bottomButton;

  static String[] TabItems1 = {
      ControlExample.getResourceString("TabItem1_0"),
      ControlExample.getResourceString("TabItem1_1"),
      ControlExample.getResourceString("TabItem1_2") };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  TabFolderTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the TabFolder */
    tabFolderGroup = new Group(exampleGroup, SWT.NONE);
    tabFolderGroup.setLayout(new GridLayout());
    tabFolderGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    tabFolderGroup.setText("TabFolder");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (topButton.getSelection())
      style |= SWT.TOP;
    if (bottomButton.getSelection())
      style |= SWT.BOTTOM;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    tabFolder1 = new TabFolder(tabFolderGroup, style);
    for (int i = 0; i < TabItems1.length; i++) {
      TabItem item = new TabItem(tabFolder1, SWT.NONE);
      item.setText(TabItems1[i]);
      Text content = new Text(tabFolder1, SWT.WRAP | SWT.MULTI);
      content.setText(ControlExample.getResourceString("TabItem_content")
          + ": " + i);
      item.setControl(content);
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    topButton = new Button(styleGroup, SWT.RADIO);
    topButton.setText("SWT.TOP");
    topButton.setSelection(true);
    bottomButton = new Button(styleGroup, SWT.RADIO);
    bottomButton.setText("SWT.BOTTOM");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if (!((Button) event.widget).getSelection())
          return;
        recreateExampleWidgets();
      }
    };
    topButton.addSelectionListener(selectionListener);
    bottomButton.addSelectionListener(selectionListener);
  }

  /**
   * Gets the "Example" widget children's items, if any.
   * 
   * @return an array containing the example widget children's items
   */
  Item[] getExampleWidgetItems() {
    return tabFolder1.getItems();
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { tabFolder1 };
  }

  /**
   * 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 new String[] { "Selection", "SelectionIndex" };
  }

  String setMethodName(String methodRoot) {
    /*
     * Override to handle special case of int
     * getSelectionIndex()/setSelection(int)
     */
    return (methodRoot.equals("SelectionIndex")) ? "setSelection" : "set"
        + methodRoot;
  }

  Object[] parameterForType(String typeName, String value, Control control) {
    if (value.equals(""))
      return new Object[] { new TabItem[0] };
    if (typeName.equals("org.eclipse.swt.widgets.TabItem")) {
      TabItem item = findItem(value, ((TabFolder) control).getItems());
      if (item != null)
        return new Object[] { item };
    }
    if (typeName.equals("[Lorg.eclipse.swt.widgets.TabItem;")) {
      String[] values = value.split(",");
      TabItem[] items = new TabItem[values.length];
      for (int i = 0; i < values.length; i++) {
        items[i] = findItem(values[i], ((TabFolder) control).getItems());
      }
      return new Object[] { items };
    }
    return super.parameterForType(typeName, value, control);
  }

  TabItem findItem(String value, TabItem[] items) {
    for (int i = 0; i < items.length; i++) {
      TabItem item = items[i];
      if (item.getText().equals(value))
        return item;
    }
    return null;
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "TabFolder";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    topButton.setSelection((tabFolder1.getStyle() & SWT.TOP) != 0);
    bottomButton.setSelection((tabFolder1.getStyle() & SWT.BOTTOM) != 0);
    borderButton.setSelection((tabFolder1.getStyle() & SWT.BORDER) != 0);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class StyledTextTab extends ScrollableTab {
  /* Example widgets and groups that contain them */
  StyledText styledText;

  Group styledTextGroup, styledTextStyleGroup;

  /* Style widgets added to the "Style" group */
  Button wrapButton, readOnlyButton, fullSelectionButton;

  /* Buttons for adding StyleRanges to StyledText */
  Button boldButton, italicButton, redButton, yellowButton, underlineButton,
      strikeoutButton;

  Image boldImage, italicImage, redImage, yellowImage, underlineImage,
      strikeoutImage;

  /* Variables for saving state. */
  StyleRange[] styleRanges;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  StyledTextTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates a bitmap image.
   */
  Image createBitmapImage(Display display, String name) {
    InputStream sourceStream = ControlExample.class
        .getResourceAsStream(name + ".bmp");
    InputStream maskStream = ControlExample.class.getResourceAsStream(name
        + "_mask.bmp");
    ImageData source = new ImageData(sourceStream);
    ImageData mask = new ImageData(maskStream);
    Image result = new Image(display, source, mask);
    try {
      sourceStream.close();
      maskStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return result;
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {
    super.createControlWidgets();

    /* Add a group for modifying the StyledText widget */
    createStyledTextStyleGroup();
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the styled text widget */
    styledTextGroup = new Group(exampleGroup, SWT.NONE);
    styledTextGroup.setLayout(new GridLayout());
    styledTextGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    styledTextGroup.setText("StyledText");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (singleButton.getSelection())
      style |= SWT.SINGLE;
    if (multiButton.getSelection())
      style |= SWT.MULTI;
    if (horizontalButton.getSelection())
      style |= SWT.H_SCROLL;
    if (verticalButton.getSelection())
      style |= SWT.V_SCROLL;
    if (wrapButton.getSelection())
      style |= SWT.WRAP;
    if (readOnlyButton.getSelection())
      style |= SWT.READ_ONLY;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (fullSelectionButton.getSelection())
      style |= SWT.FULL_SELECTION;

    /* Create the example widgets */
    styledText = new StyledText(styledTextGroup, style);
    styledText.setText(ControlExample.getResourceString("Example_string"));
    styledText.append("\n");
    styledText.append(ControlExample.getResourceString("One_Two_Three"));

    if (styleRanges != null) {
      styledText.setStyleRanges(styleRanges);
      styleRanges = null;
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    wrapButton = new Button(styleGroup, SWT.CHECK);
    wrapButton.setText("SWT.WRAP");
    readOnlyButton = new Button(styleGroup, SWT.CHECK);
    readOnlyButton.setText("SWT.READ_ONLY");
    fullSelectionButton = new Button(styleGroup, SWT.CHECK);
    fullSelectionButton.setText("SWT.FULL_SELECTION");
  }

  /**
   * Creates the "StyledText Style" group.
   */
  void createStyledTextStyleGroup() {
    final Display display = controlGroup.getDisplay();
    styledTextStyleGroup = new Group(controlGroup, SWT.NONE);
    styledTextStyleGroup.setText(ControlExample
        .getResourceString("StyledText_Styles"));
    styledTextStyleGroup.setLayout(new GridLayout(7, false));
    GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
    data.horizontalSpan = 2;
    styledTextStyleGroup.setLayoutData(data);

    /* Get images */
    boldImage = createBitmapImage(display, "bold");
    italicImage = createBitmapImage(display, "italic");
    redImage = createBitmapImage(display, "red");
    yellowImage = createBitmapImage(display, "yellow");
    underlineImage = createBitmapImage(display, "underline");
    strikeoutImage = createBitmapImage(display, "strikeout");

    /* Create controls to modify the StyledText */
    Label label = new Label(styledTextStyleGroup, SWT.NONE);
    label.setText(ControlExample
        .getResourceString("StyledText_Style_Instructions"));
    data = new GridData(GridData.FILL_HORIZONTAL);
    data.horizontalSpan = 7;
    label.setLayoutData(data);
    new Label(styledTextStyleGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Bold"));
    boldButton = new Button(styledTextStyleGroup, SWT.PUSH);
    boldButton.setImage(boldImage);
    new Label(styledTextStyleGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Underline"));
    underlineButton = new Button(styledTextStyleGroup, SWT.PUSH);
    underlineButton.setImage(underlineImage);
    new Label(styledTextStyleGroup, SWT.NONE).setLayoutData(new GridData(
        GridData.FILL_HORIZONTAL));
    new Label(styledTextStyleGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Foreground_Style"));
    redButton = new Button(styledTextStyleGroup, SWT.PUSH);
    redButton.setImage(redImage);
    new Label(styledTextStyleGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Italic"));
    italicButton = new Button(styledTextStyleGroup, SWT.PUSH);
    italicButton.setImage(italicImage);
    new Label(styledTextStyleGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Strikeout"));
    strikeoutButton = new Button(styledTextStyleGroup, SWT.PUSH);
    strikeoutButton.setImage(strikeoutImage);
    new Label(styledTextStyleGroup, SWT.NONE).setLayoutData(new GridData(
        GridData.FILL_HORIZONTAL));
    new Label(styledTextStyleGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Background_Style"));
    yellowButton = new Button(styledTextStyleGroup, SWT.PUSH);
    yellowButton.setImage(yellowImage);
    SelectionListener styleListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        Point sel = styledText.getSelectionRange();
        if ((sel == null) || (sel.y == 0))
          return;
        StyleRange style;
        for (int i = sel.x; i < sel.x + sel.y; i++) {
          StyleRange range = styledText.getStyleRangeAtOffset(i);
          if (range != null) {
            style = (StyleRange) range.clone();
            style.start = i;
            style.length = 1;
          } else {
            style = new StyleRange(i, 1, null, null, SWT.NORMAL);
          }
          if (e.widget == boldButton) {
            style.fontStyle ^= SWT.BOLD;
          } else if (e.widget == italicButton) {
            style.fontStyle ^= SWT.ITALIC;
          } else if (e.widget == underlineButton) {
            style.underline = !style.underline;
          } else if (e.widget == strikeoutButton) {
            style.strikeout = !style.strikeout;
          }
          styledText.setStyleRange(style);
        }
        styledText.setSelectionRange(sel.x + sel.y, 0);
      }
    };
    SelectionListener colorListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        Point sel = styledText.getSelectionRange();
        if ((sel == null) || (sel.y == 0))
          return;
        Color fg = null, bg = null;
        if (e.widget == redButton) {
          fg = display.getSystemColor(SWT.COLOR_RED);
        } else if (e.widget == yellowButton) {
          bg = display.getSystemColor(SWT.COLOR_YELLOW);
        }
        StyleRange style;
        for (int i = sel.x; i < sel.x + sel.y; i++) {
          StyleRange range = styledText.getStyleRangeAtOffset(i);
          if (range != null) {
            style = (StyleRange) range.clone();
            style.start = i;
            style.length = 1;
            style.foreground = style.foreground != null ? null : fg;
            style.background = style.background != null ? null : bg;
          } else {
            style = new StyleRange(i, 1, fg, bg, SWT.NORMAL);
          }
          styledText.setStyleRange(style);
        }
        styledText.setSelectionRange(sel.x + sel.y, 0);
      }
    };
    boldButton.addSelectionListener(styleListener);
    italicButton.addSelectionListener(styleListener);
    underlineButton.addSelectionListener(styleListener);
    strikeoutButton.addSelectionListener(styleListener);
    redButton.addSelectionListener(colorListener);
    yellowButton.addSelectionListener(colorListener);
    yellowButton.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent e) {
        boldImage.dispose();
        italicImage.dispose();
        redImage.dispose();
        yellowImage.dispose();
        underlineImage.dispose();
        strikeoutImage.dispose();
      }
    });
  }

  /**
   * Creates the tab folder page.
   * 
   * @param tabFolder
   *            org.eclipse.swt.widgets.TabFolder
   * @return the new page for the tab folder
   */
  Composite createTabFolderPage(TabFolder tabFolder) {
    super.createTabFolderPage(tabFolder);

    /*
     * Add a resize listener to the tabFolderPage so that if the user types
     * into the example widget to change its preferred size, and then
     * resizes the shell, we recalculate the preferred size correctly.
     */
    tabFolderPage.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e) {
        setExampleWidgetSize();
      }
    });

    return tabFolderPage;
  }

  /**
   * Disposes the "Example" widgets.
   */
  void disposeExampleWidgets() {
    /* store the state of the styledText if applicable */
    if (styledText != null) {
      styleRanges = styledText.getStyleRanges();
    }
    super.disposeExampleWidgets();
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { styledText };
  }

  /**
   * 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 new String[] { "CaretOffset", "DoubleClickEnabled", "Editable",
        "HorizontalIndex", "HorizontalPixel", "Orientation",
        "Selection", "Tabs", "Text", "TextLimit", "TopIndex",
        "TopPixel", "WordWrap" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "StyledText";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    wrapButton.setSelection((styledText.getStyle() & SWT.WRAP) != 0);
    readOnlyButton
        .setSelection((styledText.getStyle() & SWT.READ_ONLY) != 0);
    fullSelectionButton
        .setSelection((styledText.getStyle() & SWT.FULL_SELECTION) != 0);
    horizontalButton.setEnabled((styledText.getStyle() & SWT.MULTI) != 0);
    verticalButton.setEnabled((styledText.getStyle() & SWT.MULTI) != 0);
    wrapButton.setEnabled((styledText.getStyle() & SWT.MULTI) != 0);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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 SpinnerTab extends RangeTab {

  /* Example widgets and groups that contain them */
  Spinner spinner1;

  Group spinnerGroup;

  /* Style widgets added to the "Style" group */
  Button readOnlyButton, wrapButton;

  /* Scale widgets added to the "Control" group */
  Scale incrementScale, pageIncrementScale, digitsScale;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  SpinnerTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {
    super.createControlWidgets();
    createIncrementGroup();
    createPageIncrementGroup();
    createDigitsGroup();
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the spinner */
    spinnerGroup = new Group(exampleGroup, SWT.NONE);
    spinnerGroup.setLayout(new GridLayout());
    spinnerGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    spinnerGroup.setText("Spinner");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (readOnlyButton.getSelection())
      style |= SWT.READ_ONLY;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (wrapButton.getSelection())
      style |= SWT.WRAP;

    /* Create the example widgets */
    spinner1 = new Spinner(spinnerGroup, style);
  }

  /**
   * Create a group of widgets to control the maximum attribute of the example
   * widget.
   */
  void createMaximumGroup() {
    super.createMaximumGroup();
    maximumScale.setMaximum(1000);
    maximumScale.setPageIncrement(100);
  }

  /**
   * Create a group of widgets to control the selection attribute of the
   * example widget.
   */
  void createSelectionGroup() {
    super.createSelectionGroup();
    selectionScale.setMaximum(1000);
    selectionScale.setPageIncrement(100);
  }

  /**
   * Create a group of widgets to control the increment attribute of the
   * example widget.
   */
  void createIncrementGroup() {

    /* Create the group */
    Group incrementGroup = new Group(controlGroup, SWT.NONE);
    incrementGroup.setLayout(new GridLayout());
    incrementGroup.setText(ControlExample.getResourceString("Increment"));
    incrementGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create the scale widget */
    incrementScale = new Scale(incrementGroup, SWT.NONE);
    incrementScale.setMaximum(100);
    incrementScale.setSelection(1);
    incrementScale.setPageIncrement(10);
    incrementScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    incrementScale.setLayoutData(data);

    /* Add the listeners */
    incrementScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        setWidgetIncrement();
      }
    });
  }

  /**
   * Create a group of widgets to control the page increment attribute of the
   * example widget.
   */
  void createPageIncrementGroup() {

    /* Create the group */
    Group pageIncrementGroup = new Group(controlGroup, SWT.NONE);
    pageIncrementGroup.setLayout(new GridLayout());
    pageIncrementGroup.setText(ControlExample
        .getResourceString("Page_Increment"));
    pageIncrementGroup
        .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create the scale widget */
    pageIncrementScale = new Scale(pageIncrementGroup, SWT.NONE);
    pageIncrementScale.setMaximum(100);
    pageIncrementScale.setSelection(10);
    pageIncrementScale.setPageIncrement(10);
    pageIncrementScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    pageIncrementScale.setLayoutData(data);

    /* Add the listeners */
    pageIncrementScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetPageIncrement();
      }
    });
  }

  /**
   * Create a group of widgets to control the digits attribute of the example
   * widget.
   */
  void createDigitsGroup() {

    /* Create the group */
    Group digitsGroup = new Group(controlGroup, SWT.NONE);
    digitsGroup.setLayout(new GridLayout());
    digitsGroup.setText(ControlExample.getResourceString("Digits"));
    digitsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create the scale widget */
    digitsScale = new Scale(digitsGroup, SWT.NONE);
    digitsScale.setMaximum(8);
    digitsScale.setSelection(0);
    digitsScale.setPageIncrement(10);
    digitsScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    digitsScale.setLayoutData(data);

    /* Add the listeners */
    digitsScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        setWidgetDigits();
      }
    });
  }

  /**
   * Creates the tab folder page.
   * 
   * @param tabFolder
   *            org.eclipse.swt.widgets.TabFolder
   * @return the new page for the tab folder
   */
  Composite createTabFolderPage(TabFolder tabFolder) {
    super.createTabFolderPage(tabFolder);

    /*
     * Add a resize listener to the tabFolderPage so that if the user types
     * into the example widget to change its preferred size, and then
     * resizes the shell, we recalculate the preferred size correctly.
     */
    tabFolderPage.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e) {
        setExampleWidgetSize();
      }
    });

    return tabFolderPage;
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    orientationButtons = false;
    super.createStyleGroup();

    /* Create the extra widgets */
    readOnlyButton = new Button(styleGroup, SWT.CHECK);
    readOnlyButton.setText("SWT.READ_ONLY");
    wrapButton = new Button(styleGroup, SWT.CHECK);
    wrapButton.setText("SWT.WRAP");
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { spinner1 };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Spinner";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    readOnlyButton.setSelection((spinner1.getStyle() & SWT.READ_ONLY) != 0);
    wrapButton.setSelection((spinner1.getStyle() & SWT.WRAP) != 0);
    setWidgetIncrement();
    setWidgetPageIncrement();
    setWidgetDigits();
  }

  /**
   * Sets the increment of the "Example" widgets.
   */
  void setWidgetIncrement() {
    spinner1.setIncrement(incrementScale.getSelection());
  }

  /**
   * Sets the minimim of the "Example" widgets.
   */
  void setWidgetMaximum() {
    spinner1.setMaximum(maximumScale.getSelection());
  }

  /**
   * Sets the minimim of the "Example" widgets.
   */
  void setWidgetMinimum() {
    spinner1.setMinimum(minimumScale.getSelection());
  }

  /**
   * Sets the page increment of the "Example" widgets.
   */
  void setWidgetPageIncrement() {
    spinner1.setPageIncrement(pageIncrementScale.getSelection());
  }

  /**
   * Sets the digits of the "Example" widgets.
   */
  void setWidgetDigits() {
    spinner1.setDigits(digitsScale.getSelection());
  }

  /**
   * Sets the selection of the "Example" widgets.
   */
  void setWidgetSelection() {
    spinner1.setSelection(selectionScale.getSelection());
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class SliderTab extends RangeTab {
  /* Example widgets and groups that contain them */
  Scale scale1;

  Slider slider1;

  Group sliderGroup, scaleGroup;

  /* Scale widgets added to the "Control" group */
  Scale incrementScale, pageIncrementScale, thumbScale;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  SliderTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {
    super.createControlWidgets();
    createThumbGroup();
    createIncrementGroup();
    createPageIncrementGroup();
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the slider */
    sliderGroup = new Group(exampleGroup, SWT.NONE);
    sliderGroup.setLayout(new GridLayout());
    sliderGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    sliderGroup.setText("Slider");

    /* Create a group for the scale */
    scaleGroup = new Group(exampleGroup, SWT.NONE);
    scaleGroup.setLayout(new GridLayout());
    scaleGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    scaleGroup.setText("Scale");

  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (horizontalButton.getSelection())
      style |= SWT.HORIZONTAL;
    if (verticalButton.getSelection())
      style |= SWT.VERTICAL;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    scale1 = new Scale(scaleGroup, style);
    scale1.setMaximum(100);
    scale1.setSelection(50);
    scale1.setIncrement(5);
    scale1.setPageIncrement(10);
    slider1 = new Slider(sliderGroup, style);
    slider1.setMaximum(100);
    slider1.setSelection(50);
    slider1.setIncrement(5);
    slider1.setPageIncrement(10);
    slider1.setThumb(10);
  }

  /**
   * Create a group of widgets to control the increment attribute of the
   * example widget.
   */
  void createIncrementGroup() {

    /* Create the group */
    Group incrementGroup = new Group(controlGroup, SWT.NONE);
    incrementGroup.setLayout(new GridLayout());
    incrementGroup.setText(ControlExample.getResourceString("Increment"));
    incrementGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create the scale widget */
    incrementScale = new Scale(incrementGroup, SWT.NONE);
    incrementScale.setMaximum(100);
    incrementScale.setSelection(5);
    incrementScale.setPageIncrement(10);
    incrementScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    incrementScale.setLayoutData(data);

    /* Add the listeners */
    incrementScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        setWidgetIncrement();
      }
    });
  }

  /**
   * Create a group of widgets to control the page increment attribute of the
   * example widget.
   */
  void createPageIncrementGroup() {

    /* Create the group */
    Group pageIncrementGroup = new Group(controlGroup, SWT.NONE);
    pageIncrementGroup.setLayout(new GridLayout());
    pageIncrementGroup.setText(ControlExample
        .getResourceString("Page_Increment"));
    pageIncrementGroup
        .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create the scale widget */
    pageIncrementScale = new Scale(pageIncrementGroup, SWT.NONE);
    pageIncrementScale.setMaximum(100);
    pageIncrementScale.setSelection(10);
    pageIncrementScale.setPageIncrement(10);
    pageIncrementScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    pageIncrementScale.setLayoutData(data);

    /* Add the listeners */
    pageIncrementScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetPageIncrement();
      }
    });
  }

  /**
   * Create a group of widgets to control the thumb attribute of the example
   * widget.
   */
  void createThumbGroup() {

    /* Create the group */
    Group thumbGroup = new Group(controlGroup, SWT.NONE);
    thumbGroup.setLayout(new GridLayout());
    thumbGroup.setText(ControlExample.getResourceString("Thumb"));
    thumbGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create the scale widget */
    thumbScale = new Scale(thumbGroup, SWT.NONE);
    thumbScale.setMaximum(100);
    thumbScale.setSelection(10);
    thumbScale.setPageIncrement(10);
    thumbScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    thumbScale.setLayoutData(data);

    /* Add the listeners */
    thumbScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetThumb();
      }
    });
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { scale1, slider1 };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    if (SWT.getPlatform().equals("carbon"))
      return "S/S";
    return "Slider/Scale";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    setWidgetIncrement();
    setWidgetPageIncrement();
    setWidgetThumb();
  }

  /**
   * Sets the increment of the "Example" widgets.
   */
  void setWidgetIncrement() {
    slider1.setIncrement(incrementScale.getSelection());
    scale1.setIncrement(incrementScale.getSelection());
  }

  /**
   * Sets the minimim of the "Example" widgets.
   */
  void setWidgetMaximum() {
    slider1.setMaximum(maximumScale.getSelection());
    scale1.setMaximum(maximumScale.getSelection());
  }

  /**
   * Sets the minimim of the "Example" widgets.
   */
  void setWidgetMinimum() {
    slider1.setMinimum(minimumScale.getSelection());
    scale1.setMinimum(minimumScale.getSelection());
  }

  /**
   * Sets the page increment of the "Example" widgets.
   */
  void setWidgetPageIncrement() {
    slider1.setPageIncrement(pageIncrementScale.getSelection());
    scale1.setPageIncrement(pageIncrementScale.getSelection());
  }

  /**
   * Sets the selection of the "Example" widgets.
   */
  void setWidgetSelection() {
    slider1.setSelection(selectionScale.getSelection());
    scale1.setSelection(selectionScale.getSelection());
  }

  /**
   * Sets the thumb of the "Example" widgets.
   */
  void setWidgetThumb() {
    slider1.setThumb(thumbScale.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
 ******************************************************************************/

abstract class ScrollableTab extends Tab {
  /* Style widgets added to the "Style" group */
  Button singleButton, multiButton, horizontalButton, verticalButton,
      borderButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ScrollableTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    singleButton = new Button(styleGroup, SWT.RADIO);
    singleButton.setText("SWT.SINGLE");
    multiButton = new Button(styleGroup, SWT.RADIO);
    multiButton.setText("SWT.MULTI");
    horizontalButton = new Button(styleGroup, SWT.CHECK);
    horizontalButton.setText("SWT.H_SCROLL");
    horizontalButton.setSelection(true);
    verticalButton = new Button(styleGroup, SWT.CHECK);
    verticalButton.setText("SWT.V_SCROLL");
    verticalButton.setSelection(true);
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    Control[] controls = getExampleWidgets();
    if (controls.length != 0) {
      singleButton
          .setSelection((controls[0].getStyle() & SWT.SINGLE) != 0);
      multiButton.setSelection((controls[0].getStyle() & SWT.MULTI) != 0);
      horizontalButton
          .setSelection((controls[0].getStyle() & SWT.H_SCROLL) != 0);
      verticalButton
          .setSelection((controls[0].getStyle() & SWT.V_SCROLL) != 0);
      borderButton
          .setSelection((controls[0].getStyle() & SWT.BORDER) != 0);
    }
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class SashTab extends Tab {
  /* Example widgets and groups that contain them */
  Sash hSash, vSash;

  Composite sashComp;

  Group sashGroup;

  List list1, list2, list3;

  Text text;

  Button smoothButton;

  static String[] ListData0 = {
      ControlExample.getResourceString("ListData0_0"),
      ControlExample.getResourceString("ListData0_1"),
      ControlExample.getResourceString("ListData0_2"),
      ControlExample.getResourceString("ListData0_3"),
      ControlExample.getResourceString("ListData0_4"),
      ControlExample.getResourceString("ListData0_5"),
      ControlExample.getResourceString("ListData0_6"),
      ControlExample.getResourceString("ListData0_7"),
      ControlExample.getResourceString("ListData0_8") };

  static String[] ListData1 = {
      ControlExample.getResourceString("ListData1_0"),
      ControlExample.getResourceString("ListData1_1"),
      ControlExample.getResourceString("ListData1_2"),
      ControlExample.getResourceString("ListData1_3"),
      ControlExample.getResourceString("ListData1_4"),
      ControlExample.getResourceString("ListData1_5"),
      ControlExample.getResourceString("ListData1_6"),
      ControlExample.getResourceString("ListData1_7"),
      ControlExample.getResourceString("ListData1_8") };

  /* Constants */
  static final int SASH_WIDTH = 3;

  static final int SASH_LIMIT = 20;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  SashTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();
    exampleGroup
        .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    exampleGroup.setLayout(new FillLayout());

    /* Create a group for the sash widgets */
    sashGroup = new Group(exampleGroup, SWT.NONE);
    FillLayout layout = new FillLayout();
    layout.marginHeight = layout.marginWidth = 5;
    sashGroup.setLayout(layout);
    sashGroup.setText("Sash");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {
    /*
     * Create the page. This example does not use layouts.
     */
    sashComp = new Composite(sashGroup, SWT.BORDER);

    /* Create the list and text widgets */
    list1 = new List(sashComp, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
    list1.setItems(ListData0);
    list2 = new List(sashComp, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
    list2.setItems(ListData1);
    text = new Text(sashComp, SWT.MULTI | SWT.BORDER);
    text.setText(ControlExample.getResourceString("Multi_line"));

    /* Create the sashes */
    int style = getDefaultStyle();
    if (smoothButton.getSelection())
      style |= SWT.SMOOTH;
    vSash = new Sash(sashComp, SWT.VERTICAL | style);
    hSash = new Sash(sashComp, SWT.HORIZONTAL | style);

    /* Add the listeners */
    hSash.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Rectangle rect = vSash.getParent().getClientArea();
        event.y = Math.min(Math.max(event.y, SASH_LIMIT), rect.height
            - SASH_LIMIT);
        if (event.detail != SWT.DRAG) {
          hSash
              .setBounds(event.x, event.y, event.width,
                  event.height);
          layout();
        }
      }
    });
    vSash.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Rectangle rect = vSash.getParent().getClientArea();
        event.x = Math.min(Math.max(event.x, SASH_LIMIT), rect.width
            - SASH_LIMIT);
        if (event.detail != SWT.DRAG) {
          vSash
              .setBounds(event.x, event.y, event.width,
                  event.height);
          layout();
        }
      }
    });
    sashComp.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent event) {
        resized();
      }
    });
  }

  /**
   * Creates the "Size" group. The "Size" group contains controls that allow
   * the user to change the size of the example widgets.
   */
  void createSizeGroup() {
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    smoothButton = new Button(styleGroup, SWT.CHECK);
    smoothButton.setText("SWT.SMOOTH");
  }

  void disposeExampleWidgets() {
    sashComp.dispose();
    sashComp = null;
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { hSash, vSash };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Sash";
  }

  /**
   * Layout the list and text widgets according to the new positions of the
   * sashes..events.SelectionEvent
   */
  void layout() {

    Rectangle clientArea = sashComp.getClientArea();
    Rectangle hSashBounds = hSash.getBounds();
    Rectangle vSashBounds = vSash.getBounds();

    list1.setBounds(0, 0, vSashBounds.x, hSashBounds.y);
    list2.setBounds(vSashBounds.x + vSashBounds.width, 0, clientArea.width
        - (vSashBounds.x + vSashBounds.width), hSashBounds.y);
    text.setBounds(0, hSashBounds.y + hSashBounds.height, clientArea.width,
        clientArea.height - (hSashBounds.y + hSashBounds.height));

    /**
     * If the horizontal sash has been moved then the vertical sash is
     * either too long or too short and its size must be adjusted.
     */
    vSashBounds.height = hSashBounds.y;
    vSash.setBounds(vSashBounds);
  }

  /**
   * Sets the size of the "Example" widgets.
   */
  void setExampleWidgetSize() {
    sashGroup.layout(true);
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    smoothButton.setSelection((hSash.getStyle() & SWT.SMOOTH) != 0);
  }

  /**
   * Handle the shell resized event.
   */
  void resized() {

    /* Get the client area for the shell */
    Rectangle clientArea = sashComp.getClientArea();

    /*
     * Make list 1 half the width and half the height of the tab leaving
     * room for the sash. Place list 1 in the top left quadrant of the tab.
     */
    Rectangle list1Bounds = new Rectangle(0, 0,
        (clientArea.width - SASH_WIDTH) / 2,
        (clientArea.height - SASH_WIDTH) / 2);
    list1.setBounds(list1Bounds);

    /*
     * Make list 2 half the width and half the height of the tab leaving
     * room for the sash. Place list 2 in the top right quadrant of the tab.
     */
    list2.setBounds(list1Bounds.width + SASH_WIDTH, 0, clientArea.width
        - (list1Bounds.width + SASH_WIDTH), list1Bounds.height);

    /*
     * Make the text area the full width and half the height of the tab
     * leaving room for the sash. Place the text area in the bottom half of
     * the tab.
     */
    text.setBounds(0, list1Bounds.height + SASH_WIDTH, clientArea.width,
        clientArea.height - (list1Bounds.height + SASH_WIDTH));

    /* Position the sashes */
    vSash.setBounds(list1Bounds.width, 0, SASH_WIDTH, list1Bounds.height);
    hSash.setBounds(0, list1Bounds.height, clientArea.width, SASH_WIDTH);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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 SashFormTab extends Tab {
  /* Example widgets and groups that contain them */
  Group sashFormGroup;

  SashForm form;

  List list1, list2;

  Text text;

  /* Style widgets added to the "Style" group */
  Button horizontalButton, verticalButton, smoothButton;

  static String[] ListData0 = {
      ControlExample.getResourceString("ListData0_0"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_1"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_2"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_3"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_4"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_5"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_6"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData0_7") }; //$NON-NLS-1$

  static String[] ListData1 = {
      ControlExample.getResourceString("ListData1_0"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_1"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_2"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_3"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_4"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_5"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_6"), //$NON-NLS-1$
      ControlExample.getResourceString("ListData1_7") }; //$NON-NLS-1$

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  SashFormTab(ControlExample instance) {
    super(instance);
  }

  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the sashform widget */
    sashFormGroup = new Group(exampleGroup, SWT.NONE);
    sashFormGroup.setLayout(new GridLayout());
    sashFormGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    sashFormGroup.setText("SashForm");
  }

  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (horizontalButton.getSelection())
      style |= SWT.H_SCROLL;
    if (verticalButton.getSelection())
      style |= SWT.V_SCROLL;
    if (smoothButton.getSelection())
      style |= SWT.SMOOTH;

    /* Create the example widgets */
    form = new SashForm(sashFormGroup, style);
    list1 = new List(form, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
    list1.setItems(ListData0);
    list2 = new List(form, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
    list2.setItems(ListData1);
    text = new Text(form, SWT.MULTI | SWT.BORDER);
    text.setText(ControlExample.getResourceString("Multi_line")); //$NON-NLS-1$
    form.setWeights(new int[] { 1, 1, 1 });
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    horizontalButton = new Button(styleGroup, SWT.RADIO);
    horizontalButton.setText("SWT.HORIZONTAL");
    horizontalButton.setSelection(true);
    verticalButton = new Button(styleGroup, SWT.RADIO);
    verticalButton.setText("SWT.VERTICAL");
    verticalButton.setSelection(false);
    smoothButton = new Button(styleGroup, SWT.CHECK);
    smoothButton.setText("SWT.SMOOTH");
    smoothButton.setSelection(false);
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { form };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "SashForm"; //$NON-NLS-1$
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    horizontalButton.setSelection((form.getStyle() & SWT.H_SCROLL) != 0);
    verticalButton.setSelection((form.getStyle() & SWT.V_SCROLL) != 0);
    smoothButton.setSelection((form.getStyle() & SWT.SMOOTH) != 0);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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
 ******************************************************************************/

abstract class RangeTab extends Tab {
  /* Style widgets added to the "Style" group */
  Button horizontalButton, verticalButton;

  boolean orientationButtons = true;

  /* Scale widgets added to the "Control" group */
  Scale minimumScale, selectionScale, maximumScale;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  RangeTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {
    /* Create controls specific to this example */
    createMinimumGroup();
    createMaximumGroup();
    createSelectionGroup();
  }

  /**
   * Create a group of widgets to control the maximum attribute of the example
   * widget.
   */
  void createMaximumGroup() {

    /* Create the group */
    Group maximumGroup = new Group(controlGroup, SWT.NONE);
    maximumGroup.setLayout(new GridLayout());
    maximumGroup.setText(ControlExample.getResourceString("Maximum"));
    maximumGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create a scale widget */
    maximumScale = new Scale(maximumGroup, SWT.NONE);
    maximumScale.setMaximum(100);
    maximumScale.setSelection(100);
    maximumScale.setPageIncrement(10);
    maximumScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    maximumScale.setLayoutData(data);

    /* Add the listeners */
    maximumScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetMaximum();
      }
    });
  }

  /**
   * Create a group of widgets to control the minimum attribute of the example
   * widget.
   */
  void createMinimumGroup() {

    /* Create the group */
    Group minimumGroup = new Group(controlGroup, SWT.NONE);
    minimumGroup.setLayout(new GridLayout());
    minimumGroup.setText(ControlExample.getResourceString("Minimum"));
    minimumGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    /* Create a scale widget */
    minimumScale = new Scale(minimumGroup, SWT.NONE);
    minimumScale.setMaximum(100);
    minimumScale.setSelection(0);
    minimumScale.setPageIncrement(10);
    minimumScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    minimumScale.setLayoutData(data);

    /* Add the listeners */
    minimumScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetMinimum();
      }
    });

  }

  /**
   * Create a group of widgets to control the selection attribute of the
   * example widget.
   */
  void createSelectionGroup() {

    /* Create the group */
    Group selectionGroup = new Group(controlGroup, SWT.NONE);
    selectionGroup.setLayout(new GridLayout());
    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
    selectionGroup.setLayoutData(gridData);
    selectionGroup.setText(ControlExample.getResourceString("Selection"));

    /* Create a scale widget */
    selectionScale = new Scale(selectionGroup, SWT.NONE);
    selectionScale.setMaximum(100);
    selectionScale.setSelection(50);
    selectionScale.setPageIncrement(10);
    selectionScale.setIncrement(5);

    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = 100;
    selectionScale.setLayoutData(data);

    /* Add the listeners */
    selectionScale.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetSelection();
      }
    });

  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    if (orientationButtons) {
      horizontalButton = new Button(styleGroup, SWT.RADIO);
      horizontalButton.setText("SWT.HORIZONTAL");
      verticalButton = new Button(styleGroup, SWT.RADIO);
      verticalButton.setText("SWT.VERTICAL");
    }
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    setWidgetMinimum();
    setWidgetMaximum();
    setWidgetSelection();
    Control[] controls = getExampleWidgets();
    if (controls.length != 0) {
      if (orientationButtons) {
        horizontalButton
            .setSelection((controls[0].getStyle() & SWT.HORIZONTAL) != 0);
        verticalButton
            .setSelection((controls[0].getStyle() & SWT.VERTICAL) != 0);
      }
      borderButton
          .setSelection((controls[0].getStyle() & SWT.BORDER) != 0);
    }
  }

  /**
   * Sets the maximum of the "Example" widgets.
   */
  abstract void setWidgetMaximum();

  /**
   * Sets the minimim of the "Example" widgets.
   */
  abstract void setWidgetMinimum();

  /**
   * Sets the selection of the "Example" widgets.
   */
  abstract void setWidgetSelection();
}

/*******************************************************************************
 * 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 ProgressBarTab extends RangeTab {
  /* Example widgets and groups that contain them */
  ProgressBar progressBar1;

  Group progressBarGroup;

  /* Style widgets added to the "Style" group */
  Button smoothButton;

  Button indeterminateButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ProgressBarTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the progress bar */
    progressBarGroup = new Group(exampleGroup, SWT.NONE);
    progressBarGroup.setLayout(new GridLayout());
    progressBarGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    progressBarGroup.setText("ProgressBar");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (horizontalButton.getSelection())
      style |= SWT.HORIZONTAL;
    if (verticalButton.getSelection())
      style |= SWT.VERTICAL;
    if (smoothButton.getSelection())
      style |= SWT.SMOOTH;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (indeterminateButton.getSelection())
      style |= SWT.INDETERMINATE;

    /* Create the example widgets */
    progressBar1 = new ProgressBar(progressBarGroup, style);
    progressBar1.setMaximum(100);
    progressBar1.setSelection(50);
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    smoothButton = new Button(styleGroup, SWT.CHECK);
    smoothButton.setText("SWT.SMOOTH");
    indeterminateButton = new Button(styleGroup, SWT.CHECK);
    indeterminateButton.setText("SWT.INDETERMINATE");
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { progressBar1 };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "ProgressBar";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    if (indeterminateButton.getSelection()) {
      selectionScale.setEnabled(false);
      minimumScale.setEnabled(false);
      maximumScale.setEnabled(false);
    } else {
      selectionScale.setEnabled(true);
      minimumScale.setEnabled(true);
      maximumScale.setEnabled(true);
    }
    maximumScale.setMaximum(progressBar1.getMaximum());
    smoothButton.setSelection((progressBar1.getStyle() & SWT.SMOOTH) != 0);
    indeterminateButton
        .setSelection((progressBar1.getStyle() & SWT.INDETERMINATE) != 0);
  }

  /**
   * Sets the maximum of the "Example" widgets.
   */
  void setWidgetMaximum() {
    progressBar1.setMaximum(maximumScale.getSelection());
    updateScales();
  }

  /**
   * Sets the minimim of the "Example" widgets.
   */
  void setWidgetMinimum() {
    progressBar1.setMinimum(minimumScale.getSelection());
    updateScales();
  }

  /**
   * Sets the selection of the "Example" widgets.
   */
  void setWidgetSelection() {
    progressBar1.setSelection(selectionScale.getSelection());
    updateScales();
  }

  /**
   * Update the scale widgets to reflect the actual value set on the "Example"
   * widget.
   */
  void updateScales() {
    minimumScale.setSelection(progressBar1.getMinimum());
    selectionScale.setSelection(progressBar1.getSelection());
    maximumScale.setSelection(progressBar1.getMaximum());
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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 MenuTab extends Tab {
  /* Widgets added to the "Menu Style", "MenuItem Style" and "Other" groups */
  Button barButton, dropDownButton, popUpButton, noRadioGroupButton,
      leftToRightButton, rightToLeftButton;

  Button checkButton, cascadeButton, pushButton, radioButton,
      separatorButton;

  Button imagesButton, acceleratorsButton, mnemonicsButton, subMenuButton,
      subSubMenuButton;

  Button createButton, closeAllButton;

  Group menuItemStyleGroup;

  /* Variables used to track the open shells */
  int shellCount = 0;

  Shell[] shells = new Shell[4];

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  MenuTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Close all the example shells.
   */
  void closeAllShells() {
    for (int i = 0; i < shellCount; i++) {
      if (shells[i] != null & !shells[i].isDisposed()) {
        shells[i].dispose();
      }
    }
    shellCount = 0;
  }

  /**
   * Handle the Create button selection event.
   * 
   * @param event
   *            org.eclipse.swt.events.SelectionEvent
   */
  public void createButtonSelected(SelectionEvent event) {

    /*
     * Remember the example shells so they can be disposed by the user.
     */
    if (shellCount >= shells.length) {
      Shell[] newShells = new Shell[shells.length + 4];
      System.arraycopy(shells, 0, newShells, 0, shells.length);
      shells = newShells;
    }

    int orientation = 0;
    if (leftToRightButton.getSelection())
      orientation |= SWT.LEFT_TO_RIGHT;
    if (rightToLeftButton.getSelection())
      orientation |= SWT.RIGHT_TO_LEFT;
    int radioBehavior = 0;
    if (noRadioGroupButton.getSelection())
      radioBehavior |= SWT.NO_RADIO_GROUP;

    /* Create the shell and menu(s) */
    Shell shell = new Shell(SWT.SHELL_TRIM | orientation);
    shells[shellCount] = shell;
    if (barButton.getSelection()) {
      /* Create menu bar. */
      Menu menuBar = new Menu(shell, SWT.BAR | radioBehavior);
      shell.setMenuBar(menuBar);
      hookListeners(menuBar);

      if (dropDownButton.getSelection() && cascadeButton.getSelection()) {
        /* Create cascade button and drop-down menu in menu bar. */
        MenuItem item = new MenuItem(menuBar, SWT.CASCADE);
        item.setText(getMenuItemText("Cascade"));
        if (imagesButton.getSelection())
          item.setImage(instance.images[ControlExample.ciOpenFolder]);
        hookListeners(item);
        Menu dropDownMenu = new Menu(shell, SWT.DROP_DOWN
            | radioBehavior);
        item.setMenu(dropDownMenu);
        hookListeners(dropDownMenu);

        /* Create various menu items, depending on selections. */
        createMenuItems(dropDownMenu, subMenuButton.getSelection(),
            subSubMenuButton.getSelection());
      }
    }

    if (popUpButton.getSelection()) {
      /* Create pop-up menu. */
      Menu popUpMenu = new Menu(shell, SWT.POP_UP | radioBehavior);
      shell.setMenu(popUpMenu);
      hookListeners(popUpMenu);

      /* Create various menu items, depending on selections. */
      createMenuItems(popUpMenu, subMenuButton.getSelection(),
          subSubMenuButton.getSelection());
    }

    /* Set the size, title and open the shell. */
    shell.setSize(300, 100);
    shell.setText(ControlExample.getResourceString("Title") + shellCount);
    shell.addPaintListener(new PaintListener() {
      public void paintControl(PaintEvent e) {
        e.gc.drawString(ControlExample
            .getResourceString("PopupMenuHere"), 20, 20);
      }
    });
    shell.open();
    shellCount++;
  }

  /**
   * Creates the "Control" group.
   */
  void createControlGroup() {
    /*
     * Create the "Control" group. This is the group on the right half of
     * each example tab. For MenuTab, it consists of the Menu style group,
     * the MenuItem style group and the 'other' group.
     */
    controlGroup = new Group(tabFolderPage, SWT.NONE);
    controlGroup.setLayout(new GridLayout(2, true));
    controlGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
        | GridData.VERTICAL_ALIGN_FILL));
    controlGroup.setText(ControlExample.getResourceString("Parameters"));

    /* Create a group for the menu style controls */
    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("Menu_Styles"));

    /* Create a group for the menu item style controls */
    menuItemStyleGroup = new Group(controlGroup, SWT.NONE);
    menuItemStyleGroup.setLayout(new GridLayout());
    menuItemStyleGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    menuItemStyleGroup.setText(ControlExample
        .getResourceString("MenuItem_Styles"));

    /* Create a group for the 'other' controls */
    otherGroup = new Group(controlGroup, SWT.NONE);
    otherGroup.setLayout(new GridLayout());
    otherGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
        | GridData.VERTICAL_ALIGN_FILL));
    otherGroup.setText(ControlExample.getResourceString("Other"));
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {

    /* Create the menu style buttons */
    barButton = new Button(styleGroup, SWT.CHECK);
    barButton.setText("SWT.BAR");
    dropDownButton = new Button(styleGroup, SWT.CHECK);
    dropDownButton.setText("SWT.DROP_DOWN");
    popUpButton = new Button(styleGroup, SWT.CHECK);
    popUpButton.setText("SWT.POP_UP");
    noRadioGroupButton = new Button(styleGroup, SWT.CHECK);
    noRadioGroupButton.setText("SWT.NO_RADIO_GROUP");
    leftToRightButton = new Button(styleGroup, SWT.RADIO);
    leftToRightButton.setText("SWT.LEFT_TO_RIGHT");
    leftToRightButton.setSelection(true);
    rightToLeftButton = new Button(styleGroup, SWT.RADIO);
    rightToLeftButton.setText("SWT.RIGHT_TO_LEFT");

    /* Create the menu item style buttons */
    cascadeButton = new Button(menuItemStyleGroup, SWT.CHECK);
    cascadeButton.setText("SWT.CASCADE");
    checkButton = new Button(menuItemStyleGroup, SWT.CHECK);
    checkButton.setText("SWT.CHECK");
    pushButton = new Button(menuItemStyleGroup, SWT.CHECK);
    pushButton.setText("SWT.PUSH");
    radioButton = new Button(menuItemStyleGroup, SWT.CHECK);
    radioButton.setText("SWT.RADIO");
    separatorButton = new Button(menuItemStyleGroup, SWT.CHECK);
    separatorButton.setText("SWT.SEPARATOR");

    /* Create the 'other' buttons */
    imagesButton = new Button(otherGroup, SWT.CHECK);
    imagesButton.setText(ControlExample.getResourceString("Images"));
    acceleratorsButton = new Button(otherGroup, SWT.CHECK);
    acceleratorsButton.setText(ControlExample
        .getResourceString("Accelerators"));
    mnemonicsButton = new Button(otherGroup, SWT.CHECK);
    mnemonicsButton.setText(ControlExample.getResourceString("Mnemonics"));
    subMenuButton = new Button(otherGroup, SWT.CHECK);
    subMenuButton.setText(ControlExample.getResourceString("SubMenu"));
    subSubMenuButton = new Button(otherGroup, SWT.CHECK);
    subSubMenuButton
        .setText(ControlExample.getResourceString("SubSubMenu"));

    /*
     * Create the "create" and "closeAll" buttons (and a 'filler' label to
     * place them)
     */
    new Label(controlGroup, SWT.NONE);
    createButton = new Button(controlGroup, SWT.NONE);
    createButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
    createButton.setText(ControlExample.getResourceString("Create_Shell"));
    closeAllButton = new Button(controlGroup, SWT.NONE);
    closeAllButton.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_BEGINNING));
    closeAllButton.setText(ControlExample
        .getResourceString("Close_All_Shells"));

    /* Add the listeners */
    createButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        createButtonSelected(e);
      }
    });
    closeAllButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        closeAllShells();
      }
    });
    subMenuButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        subSubMenuButton.setEnabled(subMenuButton.getSelection());
      }
    });

    /* Set the default state */
    barButton.setSelection(true);
    dropDownButton.setSelection(true);
    popUpButton.setSelection(true);
    cascadeButton.setSelection(true);
    checkButton.setSelection(true);
    pushButton.setSelection(true);
    radioButton.setSelection(true);
    separatorButton.setSelection(true);
    subSubMenuButton.setEnabled(subMenuButton.getSelection());
  }

  /* Create various menu items, depending on selections. */
  void createMenuItems(Menu menu, boolean createSubMenu,
      boolean createSubSubMenu) {
    MenuItem item;
    if (pushButton.getSelection()) {
      item = new MenuItem(menu, SWT.PUSH);
      item.setText(getMenuItemText("Push"));
      if (acceleratorsButton.getSelection())
        item.setAccelerator(SWT.MOD1 + SWT.MOD2 + 'P');
      if (imagesButton.getSelection())
        item.setImage(instance.images[ControlExample.ciClosedFolder]);
      hookListeners(item);
    }

    if (separatorButton.getSelection()) {
      new MenuItem(menu, SWT.SEPARATOR);
    }

    if (checkButton.getSelection()) {
      item = new MenuItem(menu, SWT.CHECK);
      item.setText(getMenuItemText("Check"));
      if (acceleratorsButton.getSelection())
        item.setAccelerator(SWT.MOD1 + SWT.MOD2 + 'C');
      if (imagesButton.getSelection())
        item.setImage(instance.images[ControlExample.ciOpenFolder]);
      hookListeners(item);
    }

    if (radioButton.getSelection()) {
      item = new MenuItem(menu, SWT.RADIO);
      item.setText(getMenuItemText("1Radio"));
      if (acceleratorsButton.getSelection())
        item.setAccelerator(SWT.MOD1 + SWT.MOD2 + '1');
      if (imagesButton.getSelection())
        item.setImage(instance.images[ControlExample.ciTarget]);
      item.setSelection(true);
      hookListeners(item);

      item = new MenuItem(menu, SWT.RADIO);
      item.setText(getMenuItemText("2Radio"));
      if (acceleratorsButton.getSelection())
        item.setAccelerator(SWT.MOD1 + SWT.MOD2 + '2');
      if (imagesButton.getSelection())
        item.setImage(instance.images[ControlExample.ciTarget]);
      hookListeners(item);
    }

    if (createSubMenu && cascadeButton.getSelection()) {
      /* Create cascade button and drop-down menu for the sub-menu. */
      item = new MenuItem(menu, SWT.CASCADE);
      item.setText(getMenuItemText("Cascade"));
      if (imagesButton.getSelection())
        item.setImage(instance.images[ControlExample.ciOpenFolder]);
      hookListeners(item);
      Menu subMenu = new Menu(menu.getShell(), SWT.DROP_DOWN);
      item.setMenu(subMenu);
      hookListeners(subMenu);

      createMenuItems(subMenu, createSubSubMenu, false);
    }
  }

  String getMenuItemText(String item) {
    boolean cascade = item.equals("Cascade");
    boolean mnemonic = mnemonicsButton.getSelection();
    boolean accelerator = acceleratorsButton.getSelection();
    char acceleratorKey = item.charAt(0);
    if (mnemonic && accelerator && !cascade) {
      return ControlExample.getResourceString(item + "WithMnemonic")
          + "\tCtrl+Shift+" + acceleratorKey;
    }
    if (accelerator && !cascade) {
      return ControlExample.getResourceString(item) + "\tCtrl+Shift+"
          + acceleratorKey;
    }
    if (mnemonic) {
      return ControlExample.getResourceString(item + "WithMnemonic");
    }
    return ControlExample.getResourceString(item);
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Menu";
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class ListTab extends ScrollableTab {

  /* Example widgets and groups that contain them */
  List list1;

  Group listGroup;

  static String[] ListData1 = {
      ControlExample.getResourceString("ListData1_0"),
      ControlExample.getResourceString("ListData1_1"),
      ControlExample.getResourceString("ListData1_2"),
      ControlExample.getResourceString("ListData1_3"),
      ControlExample.getResourceString("ListData1_4"),
      ControlExample.getResourceString("ListData1_5"),
      ControlExample.getResourceString("ListData1_6"),
      ControlExample.getResourceString("ListData1_7"),
      ControlExample.getResourceString("ListData1_8") };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ListTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the list */
    listGroup = new Group(exampleGroup, SWT.NONE);
    listGroup.setLayout(new GridLayout());
    listGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    listGroup.setText("List");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (singleButton.getSelection())
      style |= SWT.SINGLE;
    if (multiButton.getSelection())
      style |= SWT.MULTI;
    if (horizontalButton.getSelection())
      style |= SWT.H_SCROLL;
    if (verticalButton.getSelection())
      style |= SWT.V_SCROLL;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    list1 = new List(listGroup, style);
    list1.setItems(ListData1);
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { list1 };
  }

  /**
   * 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 new String[] { "Items", "Selection", "TopIndex" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "List";
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class LinkTab extends Tab {
  /* Example widgets and groups that contain them */
  Link link1;

  Group linkGroup;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  LinkTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the list */
    linkGroup = new Group(exampleGroup, SWT.NONE);
    linkGroup.setLayout(new GridLayout());
    linkGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    linkGroup.setText("Link");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    try {
      link1 = new Link(linkGroup, style);
      link1.setText(ControlExample.getResourceString("LinkText"));
    } catch (SWTError e) {
      // temporary code for photon
      Label label = new Label(linkGroup, SWT.CENTER | SWT.WRAP);
      label.setText("Link widget not suported");
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    // temporary code for photon
    if (link1 != null)
      return new Control[] { link1 };
    return new Control[] {};
  }

  /**
   * 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 new String[] { "Text" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Link";
  }

}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class LabelTab extends AlignableTab {
  /* Example widgets and groups that contain them */
  Label label1, label2, label3, label4, label5, label6;

  Group textLabelGroup, imageLabelGroup;

  /* Style widgets added to the "Style" group */
  Button wrapButton, separatorButton, horizontalButton, verticalButton,
      shadowInButton, shadowOutButton, shadowNoneButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  LabelTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the text labels */
    textLabelGroup = new Group(exampleGroup, SWT.NONE);
    GridLayout gridLayout = new GridLayout();
    textLabelGroup.setLayout(gridLayout);
    gridLayout.numColumns = 3;
    textLabelGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    textLabelGroup.setText(ControlExample.getResourceString("Text_Labels"));

    /* Create a group for the image labels */
    imageLabelGroup = new Group(exampleGroup, SWT.SHADOW_NONE);
    gridLayout = new GridLayout();
    imageLabelGroup.setLayout(gridLayout);
    gridLayout.numColumns = 3;
    imageLabelGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    imageLabelGroup.setText(ControlExample
        .getResourceString("Image_Labels"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (wrapButton.getSelection())
      style |= SWT.WRAP;
    if (separatorButton.getSelection())
      style |= SWT.SEPARATOR;
    if (horizontalButton.getSelection())
      style |= SWT.HORIZONTAL;
    if (verticalButton.getSelection())
      style |= SWT.VERTICAL;
    if (shadowInButton.getSelection())
      style |= SWT.SHADOW_IN;
    if (shadowOutButton.getSelection())
      style |= SWT.SHADOW_OUT;
    if (shadowNoneButton.getSelection())
      style |= SWT.SHADOW_NONE;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (leftButton.getSelection())
      style |= SWT.LEFT;
    if (centerButton.getSelection())
      style |= SWT.CENTER;
    if (rightButton.getSelection())
      style |= SWT.RIGHT;

    /* Create the example widgets */
    label1 = new Label(textLabelGroup, style);
    label1.setText(ControlExample.getResourceString("One"));
    label2 = new Label(textLabelGroup, style);
    label2.setText(ControlExample.getResourceString("Two"));
    label3 = new Label(textLabelGroup, style);
    if (wrapButton.getSelection()) {
      label3.setText(ControlExample.getResourceString("Wrap_Text"));
    } else {
      label3.setText(ControlExample.getResourceString("Three"));
    }
    label4 = new Label(imageLabelGroup, style);
    label4.setImage(instance.images[ControlExample.ciClosedFolder]);
    label5 = new Label(imageLabelGroup, style);
    label5.setImage(instance.images[ControlExample.ciOpenFolder]);
    label6 = new Label(imageLabelGroup, style);
    label6.setImage(instance.images[ControlExample.ciTarget]);
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    wrapButton = new Button(styleGroup, SWT.CHECK);
    wrapButton.setText("SWT.WRAP");
    separatorButton = new Button(styleGroup, SWT.CHECK);
    separatorButton.setText("SWT.SEPARATOR");
    horizontalButton = new Button(styleGroup, SWT.RADIO);
    horizontalButton.setText("SWT.HORIZONTAL");
    verticalButton = new Button(styleGroup, SWT.RADIO);
    verticalButton.setText("SWT.VERTICAL");
    Group styleSubGroup = new Group(styleGroup, SWT.NONE);
    styleSubGroup.setLayout(new GridLayout());
    shadowInButton = new Button(styleSubGroup, SWT.RADIO);
    shadowInButton.setText("SWT.SHADOW_IN");
    shadowOutButton = new Button(styleSubGroup, SWT.RADIO);
    shadowOutButton.setText("SWT.SHADOW_OUT");
    shadowNoneButton = new Button(styleSubGroup, SWT.RADIO);
    shadowNoneButton.setText("SWT.SHADOW_NONE");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if ((event.widget.getStyle() & SWT.RADIO) != 0) {
          if (!((Button) event.widget).getSelection())
            return;
        }
        recreateExampleWidgets();
      }
    };
    shadowInButton.addSelectionListener(selectionListener);
    shadowOutButton.addSelectionListener(selectionListener);
    shadowNoneButton.addSelectionListener(selectionListener);
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { label1, label2, label3, label4, label5, label6 };
  }

  /**
   * 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 new String[] { "Text" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Label";
  }

  /**
   * Sets the alignment of the "Example" widgets.
   */
  void setExampleWidgetAlignment() {
    int alignment = 0;
    if (leftButton.getSelection())
      alignment = SWT.LEFT;
    if (centerButton.getSelection())
      alignment = SWT.CENTER;
    if (rightButton.getSelection())
      alignment = SWT.RIGHT;
    label1.setAlignment(alignment);
    label2.setAlignment(alignment);
    label3.setAlignment(alignment);
    label4.setAlignment(alignment);
    label5.setAlignment(alignment);
    label6.setAlignment(alignment);
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    boolean isSeparator = (label1.getStyle() & SWT.SEPARATOR) != 0;
    wrapButton.setSelection(!isSeparator
        && (label1.getStyle() & SWT.WRAP) != 0);
    leftButton.setSelection(!isSeparator
        && (label1.getStyle() & SWT.LEFT) != 0);
    centerButton.setSelection(!isSeparator
        && (label1.getStyle() & SWT.CENTER) != 0);
    rightButton.setSelection(!isSeparator
        && (label1.getStyle() & SWT.RIGHT) != 0);
    shadowInButton.setSelection(isSeparator
        && (label1.getStyle() & SWT.SHADOW_IN) != 0);
    shadowOutButton.setSelection(isSeparator
        && (label1.getStyle() & SWT.SHADOW_OUT) != 0);
    shadowNoneButton.setSelection(isSeparator
        && (label1.getStyle() & SWT.SHADOW_NONE) != 0);
    horizontalButton.setSelection(isSeparator
        && (label1.getStyle() & SWT.HORIZONTAL) != 0);
    verticalButton.setSelection(isSeparator
        && (label1.getStyle() & SWT.VERTICAL) != 0);
    wrapButton.setEnabled(!isSeparator);
    leftButton.setEnabled(!isSeparator);
    centerButton.setEnabled(!isSeparator);
    rightButton.setEnabled(!isSeparator);
    shadowInButton.setEnabled(isSeparator);
    shadowOutButton.setEnabled(isSeparator);
    shadowNoneButton.setEnabled(isSeparator);
    horizontalButton.setEnabled(isSeparator);
    verticalButton.setEnabled(isSeparator);
  }
}

/*******************************************************************************
 * 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 GroupTab extends Tab {
  Button titleButton;

  /* Example widgets and groups that contain them */
  Group group1;

  Group groupGroup;

  /* Style widgets added to the "Style" group */
  Button shadowEtchedInButton, shadowEtchedOutButton, shadowInButton,
      shadowOutButton, shadowNoneButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  GroupTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    titleButton = new Button(otherGroup, SWT.CHECK);
    titleButton.setText(ControlExample.getResourceString("Title_Text"));

    /* Add the listeners */
    titleButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setTitleText();
      }
    });
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the Group */
    groupGroup = new Group(exampleGroup, SWT.NONE);
    groupGroup.setLayout(new GridLayout());
    groupGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    groupGroup.setText("Group");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (shadowEtchedInButton.getSelection())
      style |= SWT.SHADOW_ETCHED_IN;
    if (shadowEtchedOutButton.getSelection())
      style |= SWT.SHADOW_ETCHED_OUT;
    if (shadowInButton.getSelection())
      style |= SWT.SHADOW_IN;
    if (shadowOutButton.getSelection())
      style |= SWT.SHADOW_OUT;
    if (shadowNoneButton.getSelection())
      style |= SWT.SHADOW_NONE;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    group1 = new Group(groupGroup, style);
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    shadowEtchedInButton = new Button(styleGroup, SWT.RADIO);
    shadowEtchedInButton.setText("SWT.SHADOW_ETCHED_IN");
    shadowEtchedInButton.setSelection(true);
    shadowEtchedOutButton = new Button(styleGroup, SWT.RADIO);
    shadowEtchedOutButton.setText("SWT.SHADOW_ETCHED_OUT");
    shadowInButton = new Button(styleGroup, SWT.RADIO);
    shadowInButton.setText("SWT.SHADOW_IN");
    shadowOutButton = new Button(styleGroup, SWT.RADIO);
    shadowOutButton.setText("SWT.SHADOW_OUT");
    shadowNoneButton = new Button(styleGroup, SWT.RADIO);
    shadowNoneButton.setText("SWT.SHADOW_NONE");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if (!((Button) event.widget).getSelection())
          return;
        recreateExampleWidgets();
      }
    };
    shadowEtchedInButton.addSelectionListener(selectionListener);
    shadowEtchedOutButton.addSelectionListener(selectionListener);
    shadowInButton.addSelectionListener(selectionListener);
    shadowOutButton.addSelectionListener(selectionListener);
    shadowNoneButton.addSelectionListener(selectionListener);
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { group1 };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Group";
  }

  /**
   * Sets the title text of the "Example" widgets.
   */
  void setTitleText() {
    if (titleButton.getSelection()) {
      group1.setText(ControlExample.getResourceString("Title_Text"));
    } else {
      group1.setText("");
    }
    setExampleWidgetSize();
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    shadowEtchedInButton
        .setSelection((group1.getStyle() & SWT.SHADOW_ETCHED_IN) != 0);
    shadowEtchedOutButton
        .setSelection((group1.getStyle() & SWT.SHADOW_ETCHED_OUT) != 0);
    shadowInButton.setSelection((group1.getStyle() & SWT.SHADOW_IN) != 0);
    shadowOutButton.setSelection((group1.getStyle() & SWT.SHADOW_OUT) != 0);
    shadowNoneButton
        .setSelection((group1.getStyle() & SWT.SHADOW_NONE) != 0);
    borderButton.setSelection((group1.getStyle() & SWT.BORDER) != 0);
    setTitleText();
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class DialogTab extends Tab {
  /* Example widgets and groups that contain them */
  Group dialogStyleGroup, resultGroup;

  Text textWidget;

  /* Style widgets added to the "Style" group */
  Combo dialogCombo;

  Button createButton;

  Button okButton, cancelButton;

  Button yesButton, noButton;

  Button retryButton;

  Button abortButton, ignoreButton;

  Button iconErrorButton, iconInformationButton, iconQuestionButton;

  Button iconWarningButton, iconWorkingButton;

  Button modelessButton, primaryModalButton, applicationModalButton,
      systemModalButton;

  Button saveButton, openButton, multiButton;

  static String[] FilterExtensions = { "*.txt", "*.bat", "*.doc", "*" };

  static String[] FilterNames = {
      ControlExample.getResourceString("FilterName_0"),
      ControlExample.getResourceString("FilterName_1"),
      ControlExample.getResourceString("FilterName_2"),
      ControlExample.getResourceString("FilterName_3") };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  DialogTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Handle a button style selection event.
   * 
   * @param event
   *            the selection event
   */
  void buttonStyleSelected(SelectionEvent event) {
    /*
     * Only certain combinations of button styles are supported for various
     * dialogs. Make sure the control widget reflects only valid
     * combinations.
     */
    boolean ok = okButton.getSelection();
    boolean cancel = cancelButton.getSelection();
    boolean yes = yesButton.getSelection();
    boolean no = noButton.getSelection();
    boolean abort = abortButton.getSelection();
    boolean retry = retryButton.getSelection();
    boolean ignore = ignoreButton.getSelection();

    okButton.setEnabled(!(yes || no || retry || abort || ignore));
    cancelButton.setEnabled(!(abort || ignore || (yes != no)));
    yesButton.setEnabled(!(ok || retry || abort || ignore || (cancel
        && !yes && !no)));
    noButton
        .setEnabled(!(ok || retry || abort || ignore || (cancel && !yes && !no)));
    retryButton.setEnabled(!(ok || yes || no));
    abortButton.setEnabled(!(ok || cancel || yes || no));
    ignoreButton.setEnabled(!(ok || cancel || yes || no));

    createButton
        .setEnabled(!(ok || cancel || yes || no || retry || abort || ignore)
            || ok
            || (ok && cancel)
            || (yes && no)
            || (yes && no && cancel)
            || (retry && cancel)
            || (abort && retry && ignore));

  }

  /**
   * Handle the create button selection event.
   * 
   * @param event
   *            org.eclipse.swt.events.SelectionEvent
   */
  void createButtonSelected(SelectionEvent event) {

    /* Compute the appropriate dialog style */
    int style = getDefaultStyle();
    if (okButton.getEnabled() && okButton.getSelection())
      style |= SWT.OK;
    if (cancelButton.getEnabled() && cancelButton.getSelection())
      style |= SWT.CANCEL;
    if (yesButton.getEnabled() && yesButton.getSelection())
      style |= SWT.YES;
    if (noButton.getEnabled() && noButton.getSelection())
      style |= SWT.NO;
    if (retryButton.getEnabled() && retryButton.getSelection())
      style |= SWT.RETRY;
    if (abortButton.getEnabled() && abortButton.getSelection())
      style |= SWT.ABORT;
    if (ignoreButton.getEnabled() && ignoreButton.getSelection())
      style |= SWT.IGNORE;
    if (iconErrorButton.getEnabled() && iconErrorButton.getSelection())
      style |= SWT.ICON_ERROR;
    if (iconInformationButton.getEnabled()
        && iconInformationButton.getSelection())
      style |= SWT.ICON_INFORMATION;
    if (iconQuestionButton.getEnabled()
        && iconQuestionButton.getSelection())
      style |= SWT.ICON_QUESTION;
    if (iconWarningButton.getEnabled() && iconWarningButton.getSelection())
      style |= SWT.ICON_WARNING;
    if (iconWorkingButton.getEnabled() && iconWorkingButton.getSelection())
      style |= SWT.ICON_WORKING;
    if (primaryModalButton.getEnabled()
        && primaryModalButton.getSelection())
      style |= SWT.PRIMARY_MODAL;
    if (applicationModalButton.getEnabled()
        && applicationModalButton.getSelection())
      style |= SWT.APPLICATION_MODAL;
    if (systemModalButton.getEnabled() && systemModalButton.getSelection())
      style |= SWT.SYSTEM_MODAL;
    if (saveButton.getEnabled() && saveButton.getSelection())
      style |= SWT.SAVE;
    if (openButton.getEnabled() && openButton.getSelection())
      style |= SWT.OPEN;
    if (multiButton.getEnabled() && multiButton.getSelection())
      style |= SWT.MULTI;

    /* Open the appropriate dialog type */
    String name = dialogCombo.getText();
    Shell shell = tabFolderPage.getShell();

    if (name.equals(ControlExample.getResourceString("ColorDialog"))) {
      ColorDialog dialog = new ColorDialog(shell, style);
      dialog.setRGB(new RGB(100, 100, 100));
      dialog.setText(ControlExample.getResourceString("Title"));
      RGB result = dialog.open();
      textWidget.append(ControlExample.getResourceString("ColorDialog")
          + Text.DELIMITER);
      textWidget.append(ControlExample.getResourceString("Result",
          new String[] { "" + result })
          + Text.DELIMITER + Text.DELIMITER);
      return;
    }

    if (name.equals(ControlExample.getResourceString("DirectoryDialog"))) {
      DirectoryDialog dialog = new DirectoryDialog(shell, style);
      dialog.setMessage(ControlExample
          .getResourceString("Example_string"));
      dialog.setText(ControlExample.getResourceString("Title"));
      String result = dialog.open();
      textWidget.append(ControlExample
          .getResourceString("DirectoryDialog")
          + Text.DELIMITER);
      textWidget.append(ControlExample.getResourceString("Result",
          new String[] { "" + result })
          + Text.DELIMITER + Text.DELIMITER);
      return;
    }

    if (name.equals(ControlExample.getResourceString("FileDialog"))) {
      FileDialog dialog = new FileDialog(shell, style);
      dialog.setFileName(ControlExample.getResourceString("readme_txt"));
      dialog.setFilterNames(FilterNames);
      dialog.setFilterExtensions(FilterExtensions);
      dialog.setText(ControlExample.getResourceString("Title"));
      String result = dialog.open();
      textWidget.append(ControlExample.getResourceString("FileDialog")
          + Text.DELIMITER);
      textWidget.append(ControlExample.getResourceString("Result",
          new String[] { "" + result })
          + Text.DELIMITER + Text.DELIMITER);
      return;
    }

    if (name.equals(ControlExample.getResourceString("FontDialog"))) {
      FontDialog dialog = new FontDialog(shell, style);
      dialog.setText(ControlExample.getResourceString("Title"));
      FontData result = dialog.open();
      textWidget.append(ControlExample.getResourceString("FontDialog")
          + Text.DELIMITER);
      textWidget.append(ControlExample.getResourceString("Result",
          new String[] { "" + result })
          + Text.DELIMITER + Text.DELIMITER);
      return;
    }

    if (name.equals(ControlExample.getResourceString("PrintDialog"))) {
      PrintDialog dialog = new PrintDialog(shell, style);
      dialog.setText(ControlExample.getResourceString("Title"));
      PrinterData result = dialog.open();
      textWidget.append(ControlExample.getResourceString("PrintDialog")
          + Text.DELIMITER);
      textWidget.append(ControlExample.getResourceString("Result",
          new String[] { "" + result })
          + Text.DELIMITER + Text.DELIMITER);
      return;
    }

    if (name.equals(ControlExample.getResourceString("MessageBox"))) {
      MessageBox dialog = new MessageBox(shell, style);
      dialog.setMessage(ControlExample
          .getResourceString("Example_string"));
      dialog.setText(ControlExample.getResourceString("Title"));
      int result = dialog.open();
      textWidget.append(ControlExample.getResourceString("MessageBox")
          + Text.DELIMITER);
      /*
       * The resulting integer depends on the original dialog style.
       * Decode the result and display it.
       */
      switch (result) {
      case SWT.OK:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.OK" }));
        break;
      case SWT.YES:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.YES" }));
        break;
      case SWT.NO:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.NO" }));
        break;
      case SWT.CANCEL:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.CANCEL" }));
        break;
      case SWT.ABORT:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.ABORT" }));
        break;
      case SWT.RETRY:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.RETRY" }));
        break;
      case SWT.IGNORE:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "SWT.IGNORE" }));
        break;
      default:
        textWidget.append(ControlExample.getResourceString("Result",
            new String[] { "" + result }));
        break;
      }
      textWidget.append(Text.DELIMITER + Text.DELIMITER);
    }
  }

  /**
   * Creates the "Control" group.
   */
  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 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 a group to hold the dialog style combo box and create dialog
     * button.
     */
    dialogStyleGroup = new Group(controlGroup, SWT.NONE);
    dialogStyleGroup.setLayout(new GridLayout());
    GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
    gridData.horizontalSpan = 2;
    dialogStyleGroup.setLayoutData(gridData);
    dialogStyleGroup.setText(ControlExample
        .getResourceString("Dialog_Type"));
  }

  /**
   * Creates the "Control" widget children.
   */
  void createControlWidgets() {

    /* Create the combo */
    String[] strings = { ControlExample.getResourceString("ColorDialog"),
        ControlExample.getResourceString("DirectoryDialog"),
        ControlExample.getResourceString("FileDialog"),
        ControlExample.getResourceString("FontDialog"),
        ControlExample.getResourceString("PrintDialog"),
        ControlExample.getResourceString("MessageBox"), };
    dialogCombo = new Combo(dialogStyleGroup, SWT.READ_ONLY);
    dialogCombo.setItems(strings);
    dialogCombo.setText(strings[0]);
    dialogCombo.setVisibleItemCount(strings.length);

    /* Create the create dialog button */
    createButton = new Button(dialogStyleGroup, SWT.NONE);
    createButton.setText(ControlExample.getResourceString("Create_Dialog"));
    createButton.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_CENTER));

    /* Create a group for the various dialog button style controls */
    Group buttonStyleGroup = new Group(controlGroup, SWT.NONE);
    buttonStyleGroup.setLayout(new GridLayout());
    buttonStyleGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    buttonStyleGroup.setText(ControlExample
        .getResourceString("Button_Styles"));

    /* Create the button style buttons */
    okButton = new Button(buttonStyleGroup, SWT.CHECK);
    okButton.setText("SWT.OK");
    cancelButton = new Button(buttonStyleGroup, SWT.CHECK);
    cancelButton.setText("SWT.CANCEL");
    yesButton = new Button(buttonStyleGroup, SWT.CHECK);
    yesButton.setText("SWT.YES");
    noButton = new Button(buttonStyleGroup, SWT.CHECK);
    noButton.setText("SWT.NO");
    retryButton = new Button(buttonStyleGroup, SWT.CHECK);
    retryButton.setText("SWT.RETRY");
    abortButton = new Button(buttonStyleGroup, SWT.CHECK);
    abortButton.setText("SWT.ABORT");
    ignoreButton = new Button(buttonStyleGroup, SWT.CHECK);
    ignoreButton.setText("SWT.IGNORE");

    /* Create a group for the icon style controls */
    Group iconStyleGroup = new Group(controlGroup, SWT.NONE);
    iconStyleGroup.setLayout(new GridLayout());
    iconStyleGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    iconStyleGroup.setText(ControlExample.getResourceString("Icon_Styles"));

    /* Create the icon style buttons */
    iconErrorButton = new Button(iconStyleGroup, SWT.RADIO);
    iconErrorButton.setText("SWT.ICON_ERROR");
    iconInformationButton = new Button(iconStyleGroup, SWT.RADIO);
    iconInformationButton.setText("SWT.ICON_INFORMATION");
    iconQuestionButton = new Button(iconStyleGroup, SWT.RADIO);
    iconQuestionButton.setText("SWT.ICON_QUESTION");
    iconWarningButton = new Button(iconStyleGroup, SWT.RADIO);
    iconWarningButton.setText("SWT.ICON_WARNING");
    iconWorkingButton = new Button(iconStyleGroup, SWT.RADIO);
    iconWorkingButton.setText("SWT.ICON_WORKING");

    /* Create a group for the modal style controls */
    Group modalStyleGroup = new Group(controlGroup, SWT.NONE);
    modalStyleGroup.setLayout(new GridLayout());
    modalStyleGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    modalStyleGroup.setText(ControlExample
        .getResourceString("Modal_Styles"));

    /* Create the modal style buttons */
    modelessButton = new Button(modalStyleGroup, SWT.RADIO);
    modelessButton.setText("SWT.MODELESS");
    primaryModalButton = new Button(modalStyleGroup, SWT.RADIO);
    primaryModalButton.setText("SWT.PRIMARY_MODAL");
    applicationModalButton = new Button(modalStyleGroup, SWT.RADIO);
    applicationModalButton.setText("SWT.APPLICATION_MODAL");
    systemModalButton = new Button(modalStyleGroup, SWT.RADIO);
    systemModalButton.setText("SWT.SYSTEM_MODAL");

    /* Create a group for the file dialog style controls */
    Group fileDialogStyleGroup = new Group(controlGroup, SWT.NONE);
    fileDialogStyleGroup.setLayout(new GridLayout());
    fileDialogStyleGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    fileDialogStyleGroup.setText(ControlExample
        .getResourceString("File_Dialog_Styles"));

    /* Create the file dialog style buttons */
    openButton = new Button(fileDialogStyleGroup, SWT.RADIO);
    openButton.setText("SWT.OPEN");
    saveButton = new Button(fileDialogStyleGroup, SWT.RADIO);
    saveButton.setText("SWT.SAVE");
    multiButton = new Button(fileDialogStyleGroup, SWT.CHECK);
    multiButton.setText("SWT.MULTI");

    /* Create the orientation group */
    if (RTL_SUPPORT_ENABLE) {
      createOrientationGroup();
    }

    /* Add the listeners */
    dialogCombo.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        dialogSelected(event);
      }
    });
    createButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        createButtonSelected(event);
      }
    });
    SelectionListener buttonStyleListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        buttonStyleSelected(event);
      }
    };
    okButton.addSelectionListener(buttonStyleListener);
    cancelButton.addSelectionListener(buttonStyleListener);
    yesButton.addSelectionListener(buttonStyleListener);
    noButton.addSelectionListener(buttonStyleListener);
    retryButton.addSelectionListener(buttonStyleListener);
    abortButton.addSelectionListener(buttonStyleListener);
    ignoreButton.addSelectionListener(buttonStyleListener);

    /* Set default values for style buttons */
    okButton.setEnabled(false);
    cancelButton.setEnabled(false);
    yesButton.setEnabled(false);
    noButton.setEnabled(false);
    retryButton.setEnabled(false);
    abortButton.setEnabled(false);
    ignoreButton.setEnabled(false);
    iconErrorButton.setEnabled(false);
    iconInformationButton.setEnabled(false);
    iconQuestionButton.setEnabled(false);
    iconWarningButton.setEnabled(false);
    iconWorkingButton.setEnabled(false);
    saveButton.setEnabled(false);
    openButton.setEnabled(false);
    openButton.setSelection(true);
    multiButton.setEnabled(false);
    iconInformationButton.setSelection(true);
    modelessButton.setSelection(true);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();
    exampleGroup
        .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    /*
     * Create a group for the text widget to display the results returned by
     * the example dialogs.
     */
    resultGroup = new Group(exampleGroup, SWT.NONE);
    resultGroup.setLayout(new GridLayout());
    resultGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
    resultGroup.setText(ControlExample.getResourceString("Dialog_Result"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {
    /*
     * Create a multi lined, scrolled text widget for output.
     */
    textWidget = new Text(resultGroup, SWT.H_SCROLL | SWT.V_SCROLL
        | SWT.BORDER);
    GridData gridData = new GridData(GridData.FILL_BOTH);
    textWidget.setLayoutData(gridData);
  }

  /**
   * The platform dialogs do not have SWT listeners.
   */
  void createListenersGroup() {
  }

  /**
   * Handle a dialog type combo selection event.
   * 
   * @param event
   *            the selection event
   */
  void dialogSelected(SelectionEvent event) {

    /* Enable/Disable the buttons */
    String name = dialogCombo.getText();
    boolean isMessageBox = name.equals(ControlExample
        .getResourceString("MessageBox"));
    boolean isFileDialog = name.equals(ControlExample
        .getResourceString("FileDialog"));
    okButton.setEnabled(isMessageBox);
    cancelButton.setEnabled(isMessageBox);
    yesButton.setEnabled(isMessageBox);
    noButton.setEnabled(isMessageBox);
    retryButton.setEnabled(isMessageBox);
    abortButton.setEnabled(isMessageBox);
    ignoreButton.setEnabled(isMessageBox);
    iconErrorButton.setEnabled(isMessageBox);
    iconInformationButton.setEnabled(isMessageBox);
    iconQuestionButton.setEnabled(isMessageBox);
    iconWarningButton.setEnabled(isMessageBox);
    iconWorkingButton.setEnabled(isMessageBox);
    saveButton.setEnabled(isFileDialog);
    openButton.setEnabled(isFileDialog);
    multiButton.setEnabled(isFileDialog);

    /* Unselect the buttons */
    if (!isMessageBox) {
      okButton.setSelection(false);
      cancelButton.setSelection(false);
      yesButton.setSelection(false);
      noButton.setSelection(false);
      retryButton.setSelection(false);
      abortButton.setSelection(false);
      ignoreButton.setSelection(false);
    }
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[0];
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Dialog";
  }

  /**
   * Recreates the "Example" widgets.
   */
  void recreateExampleWidgets() {
    if (textWidget == null) {
      super.recreateExampleWidgets();
    }
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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 CTabFolderTab extends Tab {
  int lastSelectedTab = 0;

  /* Example widgets and groups that contain them */
  CTabFolder tabFolder1;

  Group tabFolderGroup, itemGroup;

  /* Style widgets added to the "Style" group */
  Button topButton, bottomButton, flatButton, closeButton;

  static String[] CTabItems1 = {
      ControlExample.getResourceString("CTabItem1_0"),
      ControlExample.getResourceString("CTabItem1_1"),
      ControlExample.getResourceString("CTabItem1_2") };

  /* Controls and resources added to the "Fonts" group */
  Button foregroundSelectionButton, backgroundSelectionButton,
      itemFontButton;

  Image foregroundSelectionImage, backgroundSelectionImage;

  Color foregroundSelectionColor, backgroundSelectionColor;

  Font itemFont;

  /* Other widgets added to the "Other" group */
  Button simpleTabButton, singleTabButton, imageButton, showMinButton,
      showMaxButton, unselectedCloseButton, unselectedImageButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  CTabFolderTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Fonts" group.
   */
  void createColorGroup() {
    /* Create the group */
    colorGroup = new Group(controlGroup, SWT.NONE);
    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);

    new Label(colorGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Selection_Foreground_Color"));
    foregroundSelectionButton = new Button(colorGroup, SWT.PUSH);

    new Label(colorGroup, SWT.NONE).setText(ControlExample
        .getResourceString("Selection_Background_Color"));
    backgroundSelectionButton = new Button(colorGroup, SWT.PUSH);

    fontButton = new Button(colorGroup, SWT.PUSH);
    fontButton.setText(ControlExample.getResourceString("Font"));
    fontButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
        false, 2, 1));

    itemFontButton = new Button(colorGroup, SWT.PUSH);
    itemFontButton.setText(ControlExample.getResourceString("Item_Font"));
    itemFontButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
        false, 2, 1));

    Button defaultsButton = new Button(colorGroup, SWT.PUSH);
    defaultsButton.setText(ControlExample.getResourceString("Defaults"));

    Shell shell = controlGroup.getShell();
    final ColorDialog colorDialog = new ColorDialog(shell);
    final FontDialog fontDialog = new FontDialog(shell);

    /* Create images to display current colors */
    int imageSize = 12;
    Display display = shell.getDisplay();
    foregroundImage = new Image(display, imageSize, imageSize);
    backgroundImage = new Image(display, imageSize, imageSize);
    foregroundSelectionImage = new Image(display, imageSize, imageSize);
    backgroundSelectionImage = new Image(display, imageSize, imageSize);

    /* Add listeners to set the colors and font */
    foregroundButton.setImage(foregroundImage); // sets the size of the
                          // button
    foregroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = foregroundColor;
        if (oldColor == null) {
          Control[] controls = getExampleWidgets();
          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(event.display, rgb);
        setExampleWidgetForeground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    backgroundButton.setImage(backgroundImage); // sets the size of the
                          // button
    backgroundButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = backgroundColor;
        if (oldColor == null) {
          Control[] controls = getExampleWidgets();
          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(event.display, rgb);
        setExampleWidgetBackground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    foregroundSelectionButton.setImage(foregroundSelectionImage); // sets
                                    // the
                                    // size
                                    // of
                                    // the
                                    // button
    foregroundSelectionButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = foregroundSelectionColor;
        if (oldColor == null) {
          Control[] controls = getExampleWidgets();
          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 = foregroundSelectionColor; // save old foreground
                            // color to dispose when
                            // done
        foregroundSelectionColor = new Color(event.display, rgb);
        setExampleWidgetForeground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    backgroundSelectionButton.setImage(backgroundSelectionImage); // sets
                                    // the
                                    // size
                                    // of
                                    // the
                                    // button
    backgroundSelectionButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Color oldColor = backgroundSelectionColor;
        if (oldColor == null) {
          Control[] controls = getExampleWidgets();
          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 = backgroundSelectionColor; // save old background
                            // color to dispose when
                            // done
        backgroundSelectionColor = new Color(event.display, rgb);
        setExampleWidgetBackground();
        if (oldColor != null)
          oldColor.dispose();
      }
    });
    fontButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Font oldFont = font;
        if (oldFont == null) {
          Control[] controls = getExampleWidgets();
          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(event.display, fontData);
        setExampleWidgetFont();
        setExampleWidgetSize();
        if (oldFont != null)
          oldFont.dispose();
      }
    });

    /* Add listeners to set the colors and font */
    itemFontButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Font oldFont = itemFont;
        if (oldFont == null)
          oldFont = tabFolder1.getItem(0).getFont();
        fontDialog.setFontList(oldFont.getFontData());
        FontData fontData = fontDialog.open();
        if (fontData == null)
          return;
        oldFont = itemFont;
        itemFont = new Font(event.display, fontData);
        setItemFont();
        setExampleWidgetSize();
        if (oldFont != null)
          oldFont.dispose();
      }
    });

    defaultsButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        resetColorsAndFonts();
      }
    });

    shell.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent event) {
        if (foregroundImage != null)
          foregroundImage.dispose();
        if (backgroundImage != null)
          backgroundImage.dispose();
        if (foregroundColor != null)
          foregroundColor.dispose();
        if (backgroundColor != null)
          backgroundColor.dispose();
        if (font != null)
          font.dispose();
        foregroundColor = null;
        backgroundColor = null;
        font = null;
        if (foregroundSelectionImage != null)
          foregroundSelectionImage.dispose();
        if (backgroundSelectionImage != null)
          backgroundSelectionImage.dispose();
        if (foregroundSelectionColor != null)
          foregroundSelectionColor.dispose();
        if (backgroundSelectionColor != null)
          backgroundSelectionColor.dispose();
        foregroundSelectionColor = null;
        backgroundSelectionColor = null;
        if (itemFont != null)
          itemFont.dispose();
        itemFont = null;
      }
    });
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    simpleTabButton = new Button(otherGroup, SWT.CHECK);
    simpleTabButton.setText(ControlExample
        .getResourceString("Set_Simple_Tabs"));
    simpleTabButton.setSelection(true);
    simpleTabButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setSimpleTabs();
      }
    });

    singleTabButton = new Button(otherGroup, SWT.CHECK);
    singleTabButton.setText(ControlExample
        .getResourceString("Set_Single_Tabs"));
    singleTabButton.setSelection(false);
    singleTabButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setSingleTabs();
      }
    });

    showMinButton = new Button(otherGroup, SWT.CHECK);
    showMinButton.setText(ControlExample
        .getResourceString("Set_Min_Visible"));
    showMinButton.setSelection(false);
    showMinButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setMinimizeVisible();
      }
    });

    showMaxButton = new Button(otherGroup, SWT.CHECK);
    showMaxButton.setText(ControlExample
        .getResourceString("Set_Max_Visible"));
    showMaxButton.setSelection(false);
    showMaxButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setMaximizeVisible();
      }
    });

    imageButton = new Button(otherGroup, SWT.CHECK);
    imageButton.setText(ControlExample.getResourceString("Set_Image"));
    imageButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setImages();
      }
    });

    unselectedImageButton = new Button(otherGroup, SWT.CHECK);
    unselectedImageButton.setText(ControlExample
        .getResourceString("Set_Unselected_Image_Visible"));
    unselectedImageButton.setSelection(true);
    unselectedImageButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setUnselectedImageVisible();
      }
    });
    unselectedCloseButton = new Button(otherGroup, SWT.CHECK);
    unselectedCloseButton.setText(ControlExample
        .getResourceString("Set_Unselected_Close_Visible"));
    unselectedCloseButton.setSelection(true);
    unselectedCloseButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setUnselectedCloseVisible();
      }
    });
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the CTabFolder */
    tabFolderGroup = new Group(exampleGroup, SWT.NONE);
    tabFolderGroup.setLayout(new GridLayout());
    tabFolderGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    tabFolderGroup.setText("CTabFolder");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (topButton.getSelection())
      style |= SWT.TOP;
    if (bottomButton.getSelection())
      style |= SWT.BOTTOM;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (flatButton.getSelection())
      style |= SWT.FLAT;
    if (closeButton.getSelection())
      style |= SWT.CLOSE;

    /* Create the example widgets */
    tabFolder1 = new CTabFolder(tabFolderGroup, style);
    for (int i = 0; i < CTabItems1.length; i++) {
      CTabItem item = new CTabItem(tabFolder1, SWT.NONE);
      item.setText(CTabItems1[i]);
      Text text = new Text(tabFolder1, SWT.READ_ONLY);
      text.setText(ControlExample.getResourceString("CTabItem_content")
          + ": " + i);
      item.setControl(text);
    }
    tabFolder1.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        lastSelectedTab = tabFolder1.getSelectionIndex();
      }
    });
    tabFolder1.setSelection(lastSelectedTab);
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    topButton = new Button(styleGroup, SWT.RADIO);
    topButton.setText("SWT.TOP");
    topButton.setSelection(true);
    bottomButton = new Button(styleGroup, SWT.RADIO);
    bottomButton.setText("SWT.BOTTOM");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
    flatButton = new Button(styleGroup, SWT.CHECK);
    flatButton.setText("SWT.FLAT");
    closeButton = new Button(styleGroup, SWT.CHECK);
    closeButton.setText("SWT.CLOSE");

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if ((event.widget.getStyle() & SWT.RADIO) != 0) {
          if (!((Button) event.widget).getSelection())
            return;
        }
        recreateExampleWidgets();
      }
    };
    topButton.addSelectionListener(selectionListener);
    bottomButton.addSelectionListener(selectionListener);
    borderButton.addSelectionListener(selectionListener);
    flatButton.addSelectionListener(selectionListener);
    closeButton.addSelectionListener(selectionListener);
  }

  /**
   * Gets the list of custom event names.
   * 
   * @return an array containing custom event names
   */
  String[] getCustomEventNames() {
    return new String[] { "CTabFolderEvent" };
  }

  /**
   * Gets the "Example" widget children's items, if any.
   * 
   * @return an array containing the example widget children's items
   */
  Item[] getExampleWidgetItems() {
    return tabFolder1.getItems();
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { tabFolder1 };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "CTabFolder";
  }

  /**
   * Hooks the custom listener specified by eventName.
   */
  void hookCustomListener(final String eventName) {
    if (eventName == "CTabFolderEvent") {
      tabFolder1.addCTabFolder2Listener(new CTabFolder2Adapter() {
        public void close(CTabFolderEvent event) {
          log(eventName, event);
        }
      });
    }
  }

  /**
   * Sets the foreground color, background color, and font of the "Example"
   * widgets to their default settings. Also sets foreground and background
   * color of the Node 1 TreeItems to default settings.
   */
  void resetColorsAndFonts() {
    Color oldColor = foregroundSelectionColor;
    foregroundSelectionColor = null;
    if (oldColor != null)
      oldColor.dispose();
    oldColor = backgroundSelectionColor;
    backgroundSelectionColor = null;
    if (oldColor != null)
      oldColor.dispose();
    Font oldFont = itemFont;
    itemFont = null;
    if (oldFont != null)
      oldFont.dispose();
    super.resetColorsAndFonts();
  }

  void setExampleWidgetForeground() {
    if (foregroundSelectionButton == null || tabFolder1 == null)
      return;
    tabFolder1.setSelectionForeground(foregroundSelectionColor);
    // Set the foreground button's color to match the color just set.
    Color color = foregroundSelectionColor;
    if (color == null)
      color = tabFolder1.getSelectionForeground();
    drawImage(foregroundSelectionImage, color);
    foregroundSelectionButton.setImage(foregroundSelectionImage);
    super.setExampleWidgetForeground();
  }

  void setExampleWidgetBackground() {
    if (backgroundSelectionButton == null || tabFolder1 == null)
      return;
    tabFolder1.setSelectionBackground(backgroundSelectionColor);
    // Set the background button's color to match the color just set.
    Color color = backgroundSelectionColor;
    if (color == null)
      color = tabFolder1.getSelectionBackground();
    drawImage(backgroundSelectionImage, color);
    backgroundSelectionButton.setImage(backgroundSelectionImage);
    super.setExampleWidgetBackground();
  }

  void setExampleWidgetFont() {
    if (instance.startup)
      return;
    if (itemFontButton == null)
      return; // no font button on this tab
    CTabItem[] items = tabFolder1.getItems();
    if (items.length > 0) {
      items[0].setFont(itemFont);
    }
    super.setExampleWidgetFont();
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    setSimpleTabs();
    setSingleTabs();
    setImages();
    setMinimizeVisible();
    setMaximizeVisible();
    setUnselectedCloseVisible();
    setUnselectedImageVisible();
    setExampleWidgetSize();
  }

  /**
   * Sets the shape that the CTabFolder will use to render itself.
   */
  void setSimpleTabs() {
    tabFolder1.setSimple(simpleTabButton.getSelection());
    setExampleWidgetSize();
  }

  /**
   * Sets the number of tabs that the CTabFolder should display.
   */
  void setSingleTabs() {
    tabFolder1.setSingle(singleTabButton.getSelection());
    setExampleWidgetSize();
  }

  /**
   * Sets an image into each item of the "Example" widgets.
   */
  void setImages() {
    boolean setImage = imageButton.getSelection();
    CTabItem items[] = tabFolder1.getItems();
    for (int i = 0; i < items.length; i++) {
      if (setImage) {
        items[i]
            .setImage(instance.images[ControlExample.ciClosedFolder]);
      } else {
        items[i].setImage(null);
      }
    }
    setExampleWidgetSize();
  }

  /**
   * Sets the visibility of the minimize button
   */
  void setMinimizeVisible() {
    tabFolder1.setMinimizeVisible(showMinButton.getSelection());
    setExampleWidgetSize();
  }

  /**
   * Sets the visibility of the maximize button
   */
  void setMaximizeVisible() {
    tabFolder1.setMaximizeVisible(showMaxButton.getSelection());
    setExampleWidgetSize();
  }

  /**
   * Sets the visibility of the close button on unselected tabs
   */
  void setUnselectedCloseVisible() {
    tabFolder1.setUnselectedCloseVisible(unselectedCloseButton
        .getSelection());
    setExampleWidgetSize();
  }

  /**
   * Sets the visibility of the image on unselected tabs
   */
  void setUnselectedImageVisible() {
    tabFolder1.setUnselectedImageVisible(unselectedImageButton
        .getSelection());
    setExampleWidgetSize();
  }

  /**
   * Sets the font of CTabItem 0.
   */
  void setItemFont() {
    if (instance.startup)
      return;
    tabFolder1.getItem(0).setFont(itemFont);
    setExampleWidgetSize();
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2004 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 CoolBarTab extends Tab {
  /* Example widgets and group that contains them */
  CoolBar coolBar;

  CoolItem pushItem, dropDownItem, radioItem, checkItem, textItem;

  Group coolBarGroup;

  /* Style widgets added to the "Style" group */
  Button dropDownButton, flatButton;

  /* Other widgets added to the "Other" group */
  Button lockedButton;

  Point[] sizes;

  int[] wrapIndices;

  int[] order;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  CoolBarTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    lockedButton = new Button(otherGroup, SWT.CHECK);
    lockedButton.setText(ControlExample.getResourceString("Locked"));

    /* Add the listeners */
    lockedButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setWidgetLocked();
      }
    });
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();
    coolBarGroup = new Group(exampleGroup, SWT.NONE);
    coolBarGroup.setLayout(new GridLayout());
    coolBarGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    coolBarGroup.setText("CoolBar");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {
    int style = getDefaultStyle(), itemStyle = 0;

    /* Compute the widget style */
    int toolBarStyle = SWT.FLAT;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (flatButton.getSelection())
      style |= SWT.FLAT;
    if (dropDownButton.getSelection())
      itemStyle |= SWT.DROP_DOWN;

    /*
     * Create the example widgets.
     */
    coolBar = new CoolBar(coolBarGroup, style);

    /* create the push button toolbar */
    ToolBar toolBar = new ToolBar(coolBar, toolBarStyle);
    ToolItem item = new ToolItem(toolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(toolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(toolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(toolBar, SWT.SEPARATOR);
    item = new ToolItem(toolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.PUSH");
    item = new ToolItem(toolBar, SWT.PUSH);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setToolTipText("SWT.PUSH");
    pushItem = new CoolItem(coolBar, itemStyle);
    pushItem.setControl(toolBar);
    Point pushSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    pushSize = pushItem.computeSize(pushSize.x, pushSize.y);
    pushItem.setSize(pushSize);
    pushItem.setMinimumSize(item.getWidth(), pushSize.y);
    pushItem.addSelectionListener(new CoolItemSelectionListener());

    /* create the dropdown toolbar */
    toolBar = new ToolBar(coolBar, toolBarStyle);
    item = new ToolItem(toolBar, SWT.DROP_DOWN);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setToolTipText("SWT.DROP_DOWN");
    item.addSelectionListener(new DropDownSelectionListener());
    item = new ToolItem(toolBar, SWT.DROP_DOWN);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.DROP_DOWN");
    item.addSelectionListener(new DropDownSelectionListener());
    dropDownItem = new CoolItem(coolBar, itemStyle);
    dropDownItem.setControl(toolBar);
    Point dropSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    dropSize = dropDownItem.computeSize(dropSize.x, dropSize.y);
    dropDownItem.setSize(dropSize);
    dropDownItem.setMinimumSize(item.getWidth(), dropSize.y);
    dropDownItem.addSelectionListener(new CoolItemSelectionListener());

    /* create the radio button toolbar */
    toolBar = new ToolBar(coolBar, toolBarStyle);
    item = new ToolItem(toolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(toolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.RADIO");
    item = new ToolItem(toolBar, SWT.RADIO);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.RADIO");
    radioItem = new CoolItem(coolBar, itemStyle);
    radioItem.setControl(toolBar);
    Point radioSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    radioSize = radioItem.computeSize(radioSize.x, radioSize.y);
    radioItem.setSize(radioSize);
    radioItem.setMinimumSize(item.getWidth(), radioSize.y);
    radioItem.addSelectionListener(new CoolItemSelectionListener());

    /* create the check button toolbar */
    toolBar = new ToolBar(coolBar, toolBarStyle);
    item = new ToolItem(toolBar, SWT.CHECK);
    item.setImage(instance.images[ControlExample.ciClosedFolder]);
    item.setToolTipText("SWT.CHECK");
    item = new ToolItem(toolBar, SWT.CHECK);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setToolTipText("SWT.CHECK");
    item = new ToolItem(toolBar, SWT.CHECK);
    item.setImage(instance.images[ControlExample.ciOpenFolder]);
    item.setToolTipText("SWT.CHECK");
    item = new ToolItem(toolBar, SWT.CHECK);
    item.setImage(instance.images[ControlExample.ciTarget]);
    item.setToolTipText("SWT.CHECK");
    checkItem = new CoolItem(coolBar, itemStyle);
    checkItem.setControl(toolBar);
    Point checkSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    checkSize = checkItem.computeSize(checkSize.x, checkSize.y);
    checkItem.setSize(checkSize);
    checkItem.setMinimumSize(item.getWidth(), checkSize.y);
    checkItem.addSelectionListener(new CoolItemSelectionListener());

    /* create the text */
    Text text = new Text(coolBar, SWT.BORDER | SWT.SINGLE);
    textItem = new CoolItem(coolBar, itemStyle);
    textItem.setControl(text);
    Point textSize = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    textSize = textItem.computeSize(textSize.x, textSize.y);
    textItem.setSize(textSize);
    textItem.setMinimumSize(textSize);
    textItem.addSelectionListener(new CoolItemSelectionListener());

    /* if we have saved state, restore it */
    if (order != null) {
      coolBar.setItemLayout(order, wrapIndices, sizes);
      /*
       * special case: because setItemLayout will restore the items to the
       * sizes the user left them at, the preferred size may not be the
       * same as the actual size. Thus we must explicitly set the
       * preferred sizes.
       */
      pushItem.setPreferredSize(pushSize);
      dropDownItem.setPreferredSize(dropSize);
      radioItem.setPreferredSize(radioSize);
      checkItem.setPreferredSize(checkSize);
      textItem.setPreferredSize(textSize);
    } else {
      coolBar.setWrapIndices(new int[] { 1, 3 });
    }

    /* add a listener to resize the group box to match the coolbar */
    coolBar.addListener(SWT.Resize, new Listener() {
      public void handleEvent(Event event) {
        exampleGroup.layout();
      }
    });
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widget */
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
    flatButton = new Button(styleGroup, SWT.CHECK);
    flatButton.setText("SWT.FLAT");
    Group itemGroup = new Group(styleGroup, SWT.NONE);
    itemGroup.setLayout(new GridLayout());
    itemGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
        | GridData.VERTICAL_ALIGN_FILL));
    itemGroup.setText(ControlExample.getResourceString("Item_Styles"));
    dropDownButton = new Button(itemGroup, SWT.CHECK);
    dropDownButton.setText("SWT.DROP_DOWN");
    dropDownButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        recreateExampleWidgets();
      }
    });
  }

  /**
   * Disposes the "Example" widgets.
   */
  void disposeExampleWidgets() {
    /* store the state of the toolbar if applicable */
    if (coolBar != null) {
      sizes = coolBar.getItemSizes();
      wrapIndices = coolBar.getWrapIndices();
      order = coolBar.getItemOrder();
    }
    super.disposeExampleWidgets();
  }

  /**
   * Gets the "Example" widget children's items, if any.
   * 
   * @return an array containing the example widget children's items
   */
  Item[] getExampleWidgetItems() {
    return coolBar.getItems();
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { coolBar };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "CoolBar";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    borderButton.setSelection((coolBar.getStyle() & SWT.BORDER) != 0);
    flatButton.setSelection((coolBar.getStyle() & SWT.FLAT) != 0);
    dropDownButton
        .setSelection((coolBar.getItem(0).getStyle() & SWT.DROP_DOWN) != 0);
    setWidgetLocked();
  }

  /**
   * Sets the header visible state of the "Example" widgets.
   */
  void setWidgetLocked() {
    coolBar.setLocked(lockedButton.getSelection());
  }

  /**
   * Listens to widgetSelected() events on SWT.DROP_DOWN type ToolItems and
   * opens/closes a menu when appropriate.
   */
  class DropDownSelectionListener extends SelectionAdapter {
    private Menu menu = null;

    private boolean visible = false;

    public void widgetSelected(SelectionEvent event) {
      // Create the menu if it has not already been created
      if (menu == null) {
        // Lazy create the menu.
        Shell shell = tabFolderPage.getShell();
        menu = new Menu(shell);
        menu.addMenuListener(new MenuAdapter() {
          public void menuHidden(MenuEvent e) {
            visible = false;
          }
        });
        for (int i = 0; i < 9; ++i) {
          final String text = ControlExample
              .getResourceString("DropDownData_" + i);
          if (text.length() != 0) {
            MenuItem menuItem = new MenuItem(menu, SWT.NONE);
            menuItem.setText(text);
            /*
             * Add a menu selection listener so that the menu is
             * hidden when the user selects an item from the drop
             * down menu.
             */
            menuItem.addSelectionListener(new SelectionAdapter() {
              public void widgetSelected(SelectionEvent e) {
                setMenuVisible(false);
              }
            });
          } else {
            new MenuItem(menu, SWT.SEPARATOR);
          }
        }
      }

      /**
       * A selection event will be fired when a drop down tool item is
       * selected in the main area and in the drop down arrow. Examine the
       * event detail to determine where the widget was selected.
       */
      if (event.detail == SWT.ARROW) {
        /*
         * The drop down arrow was selected.
         */
        if (visible) {
          // Hide the menu to give the Arrow the appearance of being a
          // toggle button.
          setMenuVisible(false);
        } else {
          // Position the menu below and vertically aligned with the
          // the drop down tool button.
          final ToolItem toolItem = (ToolItem) event.widget;
          final ToolBar toolBar = toolItem.getParent();

          Rectangle toolItemBounds = toolItem.getBounds();
          Point point = toolBar.toDisplay(new Point(toolItemBounds.x,
              toolItemBounds.y));
          menu.setLocation(point.x, point.y + toolItemBounds.height);
          setMenuVisible(true);
        }
      } else {
        /*
         * Main area of drop down tool item selected. An application
         * would invoke the code to perform the action for the tool
         * item.
         */
      }
    }

    private void setMenuVisible(boolean visible) {
      menu.setVisible(visible);
      this.visible = visible;
    }
  }

  /**
   * Listens to widgetSelected() events on SWT.DROP_DOWN type CoolItems and
   * opens/closes a menu when appropriate.
   */
  class CoolItemSelectionListener extends SelectionAdapter {
    private Menu menu = null;

    public void widgetSelected(SelectionEvent event) {
      /**
       * A selection event will be fired when the cool item is selected by
       * its gripper or if the drop down arrow (or 'chevron') is selected.
       * Examine the event detail to determine where the widget was
       * selected.
       */
      if (event.detail == SWT.ARROW) {
        /*
         * If the popup menu is already up (i.e. user pressed arrow
         * twice), then dispose it.
         */
        if (menu != null) {
          menu.dispose();
          menu = null;
          return;
        }

        /*
         * Get the cool item and convert its bounds to display
         * coordinates.
         */
        CoolItem coolItem = (CoolItem) event.widget;
        Rectangle itemBounds = coolItem.getBounds();
        itemBounds.width = event.x - itemBounds.x;
        Point pt = coolBar.toDisplay(new Point(itemBounds.x,
            itemBounds.y));
        itemBounds.x = pt.x;
        itemBounds.y = pt.y;

        /* Get the toolbar from the cool item. */
        ToolBar toolBar = (ToolBar) coolItem.getControl();
        ToolItem[] tools = toolBar.getItems();
        int toolCount = tools.length;

        /*
         * Convert the bounds of each tool item to display coordinates,
         * and determine which ones are past the bounds of the cool
         * item.
         */
        int i = 0;
        while (i < toolCount) {
          Rectangle toolBounds = tools[i].getBounds();
          pt = toolBar
              .toDisplay(new Point(toolBounds.x, toolBounds.y));
          toolBounds.x = pt.x;
          toolBounds.y = pt.y;
          Rectangle intersection = itemBounds
              .intersection(toolBounds);
          if (!intersection.equals(toolBounds))
            break;
          i++;
        }

        /*
         * Create a pop-up menu with items for each of the hidden
         * buttons.
         */
        menu = new Menu(coolBar);
        for (int j = i; j < toolCount; j++) {
          ToolItem tool = tools[j];
          Image image = tool.getImage();
          if (image == null) {
            new MenuItem(menu, SWT.SEPARATOR);
          } else {
            if ((tool.getStyle() & SWT.DROP_DOWN) != 0) {
              MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
              menuItem.setImage(image);
              String text = tool.getToolTipText();
              if (text != null)
                menuItem.setText(text);
              Menu m = new Menu(menu);
              menuItem.setMenu(m);
              for (int k = 0; k < 9; ++k) {
                text = ControlExample
                    .getResourceString("DropDownData_" + k);
                if (text.length() != 0) {
                  MenuItem mi = new MenuItem(m, SWT.NONE);
                  mi.setText(text);
                  /*
                   * Application code to perform the action
                   * for the submenu item would go here.
                   */
                } else {
                  new MenuItem(m, SWT.SEPARATOR);
                }
              }
            } else {
              MenuItem menuItem = new MenuItem(menu, SWT.NONE);
              menuItem.setImage(image);
              String text = tool.getToolTipText();
              if (text != null)
                menuItem.setText(text);
            }
            /*
             * Application code to perform the action for the menu
             * item would go here.
             */
          }
        }

        /*
         * Display the pop-up menu at the lower left corner of the arrow
         * button. Dispose the menu when the user is done with it.
         */
        pt = coolBar.toDisplay(new Point(event.x, event.y));
        menu.setLocation(pt.x, pt.y);
        menu.setVisible(true);
        Display display = coolBar.getDisplay();
        while (menu != null && !menu.isDisposed() && menu.isVisible()) {
          if (!display.readAndDispatch())
            display.sleep();
        }
        if (menu != null) {
          menu.dispose();
          menu = null;
        }
      }
    }
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class ComboTab extends Tab {

  /* Example widgets and groups that contain them */
  Combo combo1;

  Group comboGroup;

  /* Style widgets added to the "Style" group */
  Button dropDownButton, readOnlyButton, simpleButton;

  static String[] ListData = {
      ControlExample.getResourceString("ListData0_0"),
      ControlExample.getResourceString("ListData0_1"),
      ControlExample.getResourceString("ListData0_2"),
      ControlExample.getResourceString("ListData0_3"),
      ControlExample.getResourceString("ListData0_4"),
      ControlExample.getResourceString("ListData0_5"),
      ControlExample.getResourceString("ListData0_6"),
      ControlExample.getResourceString("ListData0_7"),
      ControlExample.getResourceString("ListData0_8") };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ComboTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the combo box */
    comboGroup = new Group(exampleGroup, SWT.NONE);
    comboGroup.setLayout(new GridLayout());
    comboGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    comboGroup.setText("Combo");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (dropDownButton.getSelection())
      style |= SWT.DROP_DOWN;
    if (readOnlyButton.getSelection())
      style |= SWT.READ_ONLY;
    if (simpleButton.getSelection())
      style |= SWT.SIMPLE;

    /* Create the example widgets */
    combo1 = new Combo(comboGroup, style);
    combo1.setItems(ListData);
    if (ListData.length >= 3) {
      combo1.setText(ListData[2]);
    }
  }

  /**
   * Creates the tab folder page.
   * 
   * @param tabFolder
   *            org.eclipse.swt.widgets.TabFolder
   * @return the new page for the tab folder
   */
  Composite createTabFolderPage(TabFolder tabFolder) {
    super.createTabFolderPage(tabFolder);

    /*
     * Add a resize listener to the tabFolderPage so that if the user types
     * into the example widget to change its preferred size, and then
     * resizes the shell, we recalculate the preferred size correctly.
     */
    tabFolderPage.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e) {
        setExampleWidgetSize();
      }
    });

    return tabFolderPage;
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    dropDownButton = new Button(styleGroup, SWT.RADIO);
    dropDownButton.setText("SWT.DROP_DOWN");
    simpleButton = new Button(styleGroup, SWT.RADIO);
    simpleButton.setText("SWT.SIMPLE");
    readOnlyButton = new Button(styleGroup, SWT.CHECK);
    readOnlyButton.setText("SWT.READ_ONLY");
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { combo1 };
  }

  /**
   * 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 new String[] { "Items", "Orientation", "Selection", "Text",
        "TextLimit", "VisibleItemCount" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Combo";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    dropDownButton.setSelection((combo1.getStyle() & SWT.DROP_DOWN) != 0);
    simpleButton.setSelection((combo1.getStyle() & SWT.SIMPLE) != 0);
    readOnlyButton.setSelection((combo1.getStyle() & SWT.READ_ONLY) != 0);
    readOnlyButton.setEnabled(!simpleButton.getSelection());
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class CLabelTab extends AlignableTab {
  /* Example widgets and groups that contain them */
  CLabel label1, label2, label3;

  Group textLabelGroup;

  /* Style widgets added to the "Style" group */
  Button shadowInButton, shadowOutButton, shadowNoneButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  CLabelTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the text labels */
    textLabelGroup = new Group(exampleGroup, SWT.NONE);
    GridLayout gridLayout = new GridLayout();
    textLabelGroup.setLayout(gridLayout);
    gridLayout.numColumns = 3;
    textLabelGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    textLabelGroup.setText(ControlExample
        .getResourceString("Custom_Labels"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (shadowInButton.getSelection())
      style |= SWT.SHADOW_IN;
    if (shadowNoneButton.getSelection())
      style |= SWT.SHADOW_NONE;
    if (shadowOutButton.getSelection())
      style |= SWT.SHADOW_OUT;
    if (leftButton.getSelection())
      style |= SWT.LEFT;
    if (centerButton.getSelection())
      style |= SWT.CENTER;
    if (rightButton.getSelection())
      style |= SWT.RIGHT;

    /* Create the example widgets */
    label1 = new CLabel(textLabelGroup, style);
    label1.setText(ControlExample.getResourceString("One"));
    label1.setImage(instance.images[ControlExample.ciClosedFolder]);
    label2 = new CLabel(textLabelGroup, style);
    label2.setImage(instance.images[ControlExample.ciTarget]);
    label3 = new CLabel(textLabelGroup, style);
    label3.setText(ControlExample.getResourceString("Example_string")
        + "\n" + ControlExample.getResourceString("One_Two_Three"));
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    shadowNoneButton = new Button(styleGroup, SWT.RADIO);
    shadowNoneButton.setText("SWT.SHADOW_NONE");
    shadowInButton = new Button(styleGroup, SWT.RADIO);
    shadowInButton.setText("SWT.SHADOW_IN");
    shadowOutButton = new Button(styleGroup, SWT.RADIO);
    shadowOutButton.setText("SWT.SHADOW_OUT");

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if ((event.widget.getStyle() & SWT.RADIO) != 0) {
          if (!((Button) event.widget).getSelection())
            return;
        }
        recreateExampleWidgets();
      }
    };
    shadowInButton.addSelectionListener(selectionListener);
    shadowOutButton.addSelectionListener(selectionListener);
    shadowNoneButton.addSelectionListener(selectionListener);
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { label1, label2, label3 };
  }

  /**
   * 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 new String[] { "Text" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "CLabel";
  }

  /**
   * Sets the alignment of the "Example" widgets.
   */
  void setExampleWidgetAlignment() {
    int alignment = 0;
    if (leftButton.getSelection())
      alignment = SWT.LEFT;
    if (centerButton.getSelection())
      alignment = SWT.CENTER;
    if (rightButton.getSelection())
      alignment = SWT.RIGHT;
    label1.setAlignment(alignment);
    label2.setAlignment(alignment);
    label3.setAlignment(alignment);
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    leftButton.setSelection((label1.getStyle() & SWT.LEFT) != 0);
    centerButton.setSelection((label1.getStyle() & SWT.CENTER) != 0);
    rightButton.setSelection((label1.getStyle() & SWT.RIGHT) != 0);
    shadowInButton.setSelection((label1.getStyle() & SWT.SHADOW_IN) != 0);
    shadowOutButton.setSelection((label1.getStyle() & SWT.SHADOW_OUT) != 0);
    shadowNoneButton
        .setSelection((label1.getStyle() & (SWT.SHADOW_IN | SWT.SHADOW_OUT)) == 0);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/
class CComboTab extends Tab {

  /* Example widgets and groups that contain them */
  CCombo combo1;

  Group comboGroup;

  /* Style widgets added to the "Style" group */
  Button flatButton, readOnlyButton;

  static String[] ListData = {
      ControlExample.getResourceString("ListData1_0"),
      ControlExample.getResourceString("ListData1_1"),
      ControlExample.getResourceString("ListData1_2"),
      ControlExample.getResourceString("ListData1_3"),
      ControlExample.getResourceString("ListData1_4"),
      ControlExample.getResourceString("ListData1_5"),
      ControlExample.getResourceString("ListData1_6"),
      ControlExample.getResourceString("ListData1_7"),
      ControlExample.getResourceString("ListData1_8") };

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  CComboTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the combo box */
    comboGroup = new Group(exampleGroup, SWT.NONE);
    comboGroup.setLayout(new GridLayout());
    comboGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    comboGroup.setText(ControlExample.getResourceString("Custom_Combo"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (flatButton.getSelection())
      style |= SWT.FLAT;
    if (readOnlyButton.getSelection())
      style |= SWT.READ_ONLY;
    if (borderButton.getSelection())
      style |= SWT.BORDER;

    /* Create the example widgets */
    combo1 = new CCombo(comboGroup, style);
    combo1.setItems(ListData);
    if (ListData.length >= 3) {
      combo1.setText(ListData[2]);
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    readOnlyButton = new Button(styleGroup, SWT.CHECK);
    readOnlyButton.setText("SWT.READ_ONLY");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
    flatButton = new Button(styleGroup, SWT.CHECK);
    flatButton.setText("SWT.FLAT");
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { combo1 };
  }

  /**
   * 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 new String[] { "Editable", "Items", "Selection", "Text",
        "TextLimit", "VisibleItemCount" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "CCombo";
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    flatButton.setSelection((combo1.getStyle() & SWT.FLAT) != 0);
    readOnlyButton.setSelection((combo1.getStyle() & SWT.READ_ONLY) != 0);
    borderButton.setSelection((combo1.getStyle() & SWT.BORDER) != 0);
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

class CanvasTab extends Tab {
  static int colors[] = { SWT.COLOR_RED, SWT.COLOR_GREEN, SWT.COLOR_BLUE,
      SWT.COLOR_MAGENTA, SWT.COLOR_YELLOW, SWT.COLOR_CYAN,
      SWT.COLOR_DARK_RED, SWT.COLOR_DARK_GREEN, SWT.COLOR_DARK_BLUE,
      SWT.COLOR_DARK_MAGENTA, SWT.COLOR_DARK_YELLOW, SWT.COLOR_DARK_CYAN };

  /* Example widgets and groups that contain them */
  Canvas canvas;

  Group canvasGroup;

  /* Style widgets added to the "Style" group */
  Button horizontalButton, verticalButton, noBackgroundButton, noFocusButton,
      noMergePaintsButton, noRedrawResizeButton;

  /* Other widgets added to the "Other" group */
  Button caretButton, fillDamageButton;

  int paintCount;

  int cx, cy;

  int maxX, maxY;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  CanvasTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Other" group.
   */
  void createOtherGroup() {
    super.createOtherGroup();

    /* Create display controls specific to this example */
    caretButton = new Button(otherGroup, SWT.CHECK);
    caretButton.setText(ControlExample.getResourceString("Caret"));
    fillDamageButton = new Button(otherGroup, SWT.CHECK);
    fillDamageButton
        .setText(ControlExample.getResourceString("FillDamage"));

    /* Add the listeners */
    caretButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        setCaret();
      }
    });
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for the canvas widget */
    canvasGroup = new Group(exampleGroup, SWT.NONE);
    canvasGroup.setLayout(new GridLayout());
    canvasGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    canvasGroup.setText("Canvas");
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (horizontalButton.getSelection())
      style |= SWT.H_SCROLL;
    if (verticalButton.getSelection())
      style |= SWT.V_SCROLL;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (noBackgroundButton.getSelection())
      style |= SWT.NO_BACKGROUND;
    if (noFocusButton.getSelection())
      style |= SWT.NO_FOCUS;
    if (noMergePaintsButton.getSelection())
      style |= SWT.NO_MERGE_PAINTS;
    if (noRedrawResizeButton.getSelection())
      style |= SWT.NO_REDRAW_RESIZE;

    /* Create the example widgets */
    paintCount = 0;
    cx = 0;
    cy = 0;
    canvas = new Canvas(canvasGroup, style);
    canvas.addPaintListener(new PaintListener() {
      public void paintControl(PaintEvent e) {
        paintCount++;
        GC gc = e.gc;
        if (fillDamageButton.getSelection()) {
          Color color = e.display.getSystemColor(colors[paintCount
              % colors.length]);
          gc.setBackground(color);
          gc.fillRectangle(e.x, e.y, e.width, e.height);
        }
        Point size = canvas.getSize();
        gc.drawArc(cx + 1, cy + 1, size.x - 2, size.y - 2, 0, 360);
        gc.drawRectangle(cx + (size.x - 10) / 2,
            cy + (size.y - 10) / 2, 10, 10);
      }
    });
    canvas.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent event) {
        Point size = canvas.getSize();
        maxX = size.x * 3 / 2;
        maxY = size.y * 3 / 2;
        resizeScrollBars();
      }
    });
    ScrollBar bar = canvas.getHorizontalBar();
    if (bar != null) {
      bar.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent event) {
          scrollHorizontal((ScrollBar) event.widget);
        }
      });
    }
    bar = canvas.getVerticalBar();
    if (bar != null) {
      bar.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent event) {
          scrollVertical((ScrollBar) event.widget);
        }
      });
    }
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    horizontalButton = new Button(styleGroup, SWT.CHECK);
    horizontalButton.setText("SWT.H_SCROLL");
    horizontalButton.setSelection(true);
    verticalButton = new Button(styleGroup, SWT.CHECK);
    verticalButton.setText("SWT.V_SCROLL");
    verticalButton.setSelection(true);
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
    noBackgroundButton = new Button(styleGroup, SWT.CHECK);
    noBackgroundButton.setText("SWT.NO_BACKGROUND");
    noFocusButton = new Button(styleGroup, SWT.CHECK);
    noFocusButton.setText("SWT.NO_FOCUS");
    noMergePaintsButton = new Button(styleGroup, SWT.CHECK);
    noMergePaintsButton.setText("SWT.NO_MERGE_PAINTS");
    noRedrawResizeButton = new Button(styleGroup, SWT.CHECK);
    noRedrawResizeButton.setText("SWT.NO_REDRAW_RESIZE");
  }

  /**
   * Creates the tab folder page.
   * 
   * @param tabFolder
   *            org.eclipse.swt.widgets.TabFolder
   * @return the new page for the tab folder
   */
  Composite createTabFolderPage(TabFolder tabFolder) {
    super.createTabFolderPage(tabFolder);

    /*
     * Add a resize listener to the tabFolderPage so that if the user types
     * into the example widget to change its preferred size, and then
     * resizes the shell, we recalculate the preferred size correctly.
     */
    tabFolderPage.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e) {
        setExampleWidgetSize();
      }
    });

    return tabFolderPage;
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { canvas };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Canvas";
  }

  /**
   * Resizes the maximum and thumb of both scrollbars.
   */
  void resizeScrollBars() {
    Rectangle clientArea = canvas.getClientArea();
    ScrollBar bar = canvas.getHorizontalBar();
    if (bar != null) {
      bar.setMaximum(maxX);
      bar.setThumb(clientArea.width);
      bar.setPageIncrement(clientArea.width);
    }
    bar = canvas.getVerticalBar();
    if (bar != null) {
      bar.setMaximum(maxY);
      bar.setThumb(clientArea.height);
      bar.setPageIncrement(clientArea.height);
    }
  }

  /**
   * Scrolls the canvas horizontally.
   * 
   * @param scrollBar
   */
  void scrollHorizontal(ScrollBar scrollBar) {
    Rectangle bounds = canvas.getClientArea();
    int x = -scrollBar.getSelection();
    if (x + maxX < bounds.width) {
      x = bounds.width - maxX;
    }
    canvas.scroll(x, cy, cx, cy, maxX, maxY, false);
    cx = x;
  }

  /**
   * Scrolls the canvas vertically.
   * 
   * @param scrollBar
   */
  void scrollVertical(ScrollBar scrollBar) {
    Rectangle bounds = canvas.getClientArea();
    int y = -scrollBar.getSelection();
    if (y + maxY < bounds.height) {
      y = bounds.height - maxY;
    }
    canvas.scroll(cx, y, cx, cy, maxX, maxY, false);
    cy = y;
  }

  /**
   * Sets or clears the caret in the "Example" widget.
   */
  void setCaret() {
    Caret oldCaret = canvas.getCaret();
    if (caretButton.getSelection()) {
      Caret newCaret = new Caret(canvas, SWT.NONE);
      Font font = canvas.getFont();
      newCaret.setFont(font);
      GC gc = new GC(canvas);
      gc.setFont(font);
      newCaret.setBounds(1, 1, 1, gc.getFontMetrics().getHeight());
      gc.dispose();
      canvas.setCaret(newCaret);
      canvas.setFocus();
    } else {
      canvas.setCaret(null);
    }
    if (oldCaret != null)
      oldCaret.dispose();
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    horizontalButton.setSelection((canvas.getStyle() & SWT.H_SCROLL) != 0);
    verticalButton.setSelection((canvas.getStyle() & SWT.V_SCROLL) != 0);
    borderButton.setSelection((canvas.getStyle() & SWT.BORDER) != 0);
    noBackgroundButton
        .setSelection((canvas.getStyle() & SWT.NO_BACKGROUND) != 0);
    noFocusButton.setSelection((canvas.getStyle() & SWT.NO_FOCUS) != 0);
    noMergePaintsButton
        .setSelection((canvas.getStyle() & SWT.NO_MERGE_PAINTS) != 0);
    noRedrawResizeButton
        .setSelection((canvas.getStyle() & SWT.NO_REDRAW_RESIZE) != 0);
    setCaret();
  }
}

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: IBM Corporation - initial API and implementation
 ******************************************************************************/

/**
 * <code>ButtonTab</code> is the class that demonstrates SWT buttons.
 */
class ButtonTab extends AlignableTab {

  /* Example widgets and groups that contain them */
  Button button1, button2, button3, button4, button5, button6;

  Group textButtonGroup, imageButtonGroup;

  /* Alignment widgets added to the "Control" group */
  Button upButton, downButton;

  /* Style widgets added to the "Style" group */
  Button pushButton, checkButton, radioButton, toggleButton, arrowButton,
      flatButton;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  ButtonTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Control" group.
   */
  void createControlGroup() {
    super.createControlGroup();

    /* Create the controls */
    upButton = new Button(alignmentGroup, SWT.RADIO);
    upButton.setText(ControlExample.getResourceString("Up"));
    downButton = new Button(alignmentGroup, SWT.RADIO);
    downButton.setText(ControlExample.getResourceString("Down"));

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if (!((Button) event.widget).getSelection())
          return;
        setExampleWidgetAlignment();
      }
    };
    upButton.addSelectionListener(selectionListener);
    downButton.addSelectionListener(selectionListener);
  }

  /**
   * Creates the "Example" group.
   */
  void createExampleGroup() {
    super.createExampleGroup();

    /* Create a group for text buttons */
    textButtonGroup = new Group(exampleGroup, SWT.NONE);
    GridLayout gridLayout = new GridLayout();
    textButtonGroup.setLayout(gridLayout);
    gridLayout.numColumns = 3;
    textButtonGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    textButtonGroup.setText(ControlExample
        .getResourceString("Text_Buttons"));

    /* Create a group for the image buttons */
    imageButtonGroup = new Group(exampleGroup, SWT.NONE);
    gridLayout = new GridLayout();
    imageButtonGroup.setLayout(gridLayout);
    gridLayout.numColumns = 3;
    imageButtonGroup
        .setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
            | GridData.HORIZONTAL_ALIGN_FILL
            | GridData.VERTICAL_ALIGN_FILL));
    imageButtonGroup.setText(ControlExample
        .getResourceString("Image_Buttons"));
  }

  /**
   * Creates the "Example" widgets.
   */
  void createExampleWidgets() {

    /* Compute the widget style */
    int style = getDefaultStyle();
    if (pushButton.getSelection())
      style |= SWT.PUSH;
    if (checkButton.getSelection())
      style |= SWT.CHECK;
    if (radioButton.getSelection())
      style |= SWT.RADIO;
    if (toggleButton.getSelection())
      style |= SWT.TOGGLE;
    if (flatButton.getSelection())
      style |= SWT.FLAT;
    if (borderButton.getSelection())
      style |= SWT.BORDER;
    if (leftButton.getSelection())
      style |= SWT.LEFT;
    if (rightButton.getSelection())
      style |= SWT.RIGHT;
    if (arrowButton.getSelection()) {
      style |= SWT.ARROW;
      if (upButton.getSelection())
        style |= SWT.UP;
      if (downButton.getSelection())
        style |= SWT.DOWN;
    } else {
      if (centerButton.getSelection())
        style |= SWT.CENTER;
    }

    /* Create the example widgets */
    button1 = new Button(textButtonGroup, style);
    button1.setText(ControlExample.getResourceString("One"));
    button2 = new Button(textButtonGroup, style);
    button2.setText(ControlExample.getResourceString("Two"));
    button3 = new Button(textButtonGroup, style);
    button3.setText(ControlExample.getResourceString("Three"));
    button4 = new Button(imageButtonGroup, style);
    button4.setImage(instance.images[ControlExample.ciClosedFolder]);
    button5 = new Button(imageButtonGroup, style);
    button5.setImage(instance.images[ControlExample.ciOpenFolder]);
    button6 = new Button(imageButtonGroup, style);
    button6.setImage(instance.images[ControlExample.ciTarget]);
  }

  /**
   * Creates the "Style" group.
   */
  void createStyleGroup() {
    super.createStyleGroup();

    /* Create the extra widgets */
    pushButton = new Button(styleGroup, SWT.RADIO);
    pushButton.setText("SWT.PUSH");
    checkButton = new Button(styleGroup, SWT.RADIO);
    checkButton.setText("SWT.CHECK");
    radioButton = new Button(styleGroup, SWT.RADIO);
    radioButton.setText("SWT.RADIO");
    toggleButton = new Button(styleGroup, SWT.RADIO);
    toggleButton.setText("SWT.TOGGLE");
    arrowButton = new Button(styleGroup, SWT.RADIO);
    arrowButton.setText("SWT.ARROW");
    flatButton = new Button(styleGroup, SWT.CHECK);
    flatButton.setText("SWT.FLAT");
    borderButton = new Button(styleGroup, SWT.CHECK);
    borderButton.setText("SWT.BORDER");
  }

  /**
   * Gets the "Example" widget children.
   */
  Control[] getExampleWidgets() {
    return new Control[] { button1, button2, button3, button4, button5,
        button6 };
  }

  /**
   * 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 new String[] { "Selection", "Text" };
  }

  /**
   * Gets the text for the tab folder item.
   */
  String getTabText() {
    return "Button";
  }

  /**
   * Sets the alignment of the "Example" widgets.
   */
  void setExampleWidgetAlignment() {
    int alignment = 0;
    if (leftButton.getSelection())
      alignment = SWT.LEFT;
    if (centerButton.getSelection())
      alignment = SWT.CENTER;
    if (rightButton.getSelection())
      alignment = SWT.RIGHT;
    if (upButton.getSelection())
      alignment = SWT.UP;
    if (downButton.getSelection())
      alignment = SWT.DOWN;
    button1.setAlignment(alignment);
    button2.setAlignment(alignment);
    button3.setAlignment(alignment);
    button4.setAlignment(alignment);
    button5.setAlignment(alignment);
    button6.setAlignment(alignment);
  }

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    if (arrowButton.getSelection()) {
      upButton.setEnabled(true);
      centerButton.setEnabled(false);
      downButton.setEnabled(true);
    } else {
      upButton.setEnabled(false);
      centerButton.setEnabled(true);
      downButton.setEnabled(false);
    }
    upButton.setSelection((button1.getStyle() & SWT.UP) != 0);
    downButton.setSelection((button1.getStyle() & SWT.DOWN) != 0);
    pushButton.setSelection((button1.getStyle() & SWT.PUSH) != 0);
    checkButton.setSelection((button1.getStyle() & SWT.CHECK) != 0);
    radioButton.setSelection((button1.getStyle() & SWT.RADIO) != 0);
    toggleButton.setSelection((button1.getStyle() & SWT.TOGGLE) != 0);
    arrowButton.setSelection((button1.getStyle() & SWT.ARROW) != 0);
    flatButton.setSelection((button1.getStyle() & SWT.FLAT) != 0);
    borderButton.setSelection((button1.getStyle() & SWT.BORDER) != 0);
  }
}

/*******************************************************************************
 * 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>AlignableTab</code> is the abstract superclass of example controls
 * that can be aligned.
 */
abstract class AlignableTab extends Tab {

  /* Alignment Controls */
  Button leftButton, rightButton, centerButton;

  /* Alignment Group */
  Group alignmentGroup;

  /**
   * Creates the Tab within a given instance of ControlExample.
   */
  AlignableTab(ControlExample instance) {
    super(instance);
  }

  /**
   * Creates the "Control" group.
   */
  void createControlGroup() {
    super.createControlGroup();

    /* Create the group */
    alignmentGroup = new Group(controlGroup, SWT.NONE);
    alignmentGroup.setLayout(new GridLayout());
    alignmentGroup.setLayoutData(new GridData(
        GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
    alignmentGroup.setText(ControlExample.getResourceString("Alignment"));

    /* Create the controls */
    leftButton = new Button(alignmentGroup, SWT.RADIO);
    leftButton.setText(ControlExample.getResourceString("Left"));
    centerButton = new Button(alignmentGroup, SWT.RADIO);
    centerButton.setText(ControlExample.getResourceString("Center"));
    rightButton = new Button(alignmentGroup, SWT.RADIO);
    rightButton.setText(ControlExample.getResourceString("Right"));

    /* Add the listeners */
    SelectionListener selectionListener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        if (!((Button) event.widget).getSelection())
          return;
        setExampleWidgetAlignment();
      }
    };
    leftButton.addSelectionListener(selectionListener);
    centerButton.addSelectionListener(selectionListener);
    rightButton.addSelectionListener(selectionListener);
  }

  /**
   * Sets the alignment of the "Example" widgets.
   */
  abstract void setExampleWidgetAlignment();

  /**
   * Sets the state of the "Example" widgets.
   */
  void setExampleWidgetState() {
    super.setExampleWidgetState();
    Control[] controls = getExampleWidgets();
    if (controls.length != 0) {
      leftButton.setSelection((controls[0].getStyle() & SWT.LEFT) != 0);
      centerButton
          .setSelection((controls[0].getStyle() & SWT.CENTER) != 0);
      rightButton.setSelection((controls[0].getStyle() & SWT.RIGHT) != 0);
    }
  }
}


           
       








Related examples in the same category

1.SWT Text Editor
2.Small application:you library
3.FTP client
4.This application has save,load, sorting, and searching functions common to basic address booksThis application has save,load, sorting, and searching functions common to basic address books
5.Another Address Book Demo in SWTAnother Address Book Demo in SWT
6.SWT Shapes
7.Widget Test 2Widget Test 2