How to create CustomControl in SWT : Custom Control « SWT JFace Eclipse « Java






How to create CustomControl in SWT

How to create CustomControl in SWT
/*******************************************************************************
 * 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
 *******************************************************************************/
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 CustomControlExample extends ControlExample {

  /**
   * Creates an instance of a CustomControlExample embedded inside the
   * supplied parent Composite.
   * 
   * @param parent
   *            the container of the example
   */
  public CustomControlExample(Composite parent) {
    super(parent);
  }

  /**
   * Answers the set of example Tabs
   */
  Tab[] createTabs() {
    return new Tab[] { new CComboTab(this), new CLabelTab(this),
        new CTabFolderTab(this), new SashFormTab(this),
        new StyledTextTab(this), };
  }

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

/*******************************************************************************
 * 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 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.Demonstrates ControlEditorDemonstrates ControlEditor
2.Demonstrates ControlEditor 2Demonstrates ControlEditor 2