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


import org.eclipse.swt.internal.*;

/**
 * This class provides access to a small number of SWT system-wide
 * methods, and in addition defines the public constants provided
 * by SWT.
 * <p>
 * By defining constants like UP and DOWN in a single class, SWT
 * can share common names and concepts at the same time minimizing
 * the number of classes, names and constants for the application
 * programmer.
 * </p><p>
 * Note that some of the constants provided by this class represent
 * optional, appearance related aspects of widgets which are available
 * either only on some window systems, or for a differing set of
 * widgets on each window system. These constants are marked
 * as <em>HINT</em>s. The set of widgets which support a particular
 * <em>HINT</em> may change from release to release, although we typically
 * will not withdraw support for a <em>HINT</em> once it is made available.
 * </p>
 *
 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
 */
 
/* NOTE:
 *   Good javadoc coding style is to put the values of static final 
 *   constants in the comments. This reinforces the fact that
 *   consumers are allowed to rely on the value (and they must
 *   since the values are compiled inline in their code). We
 *   can <em>not</em> change the values of these constants between
 *   releases.
 */
public class SWT {
	
	/* Widget Event Constants */
	
	/**
	 * The null event type (value is 0).
	 * 
	 * @since 3.0
	 */
	public static final int None = 0;
	
	/**
	 * The key down event type (value is 1).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addKeyListener
	 * @see org.eclipse.swt.widgets.Tracker#addKeyListener
	 * @see org.eclipse.swt.events.KeyListener#keyPressed
	 * @see org.eclipse.swt.events.KeyEvent
	 */
	public static final int KeyDown = 1;
	
	/**
	 * The key up event type (value is 2).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addKeyListener
	 * @see org.eclipse.swt.widgets.Tracker#addKeyListener
	 * @see org.eclipse.swt.events.KeyListener#keyReleased
	 * @see org.eclipse.swt.events.KeyEvent
	 */
	public static final int KeyUp = 2;
	
	/**
	 * The mouse down event type (value is 3).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseListener
	 * @see org.eclipse.swt.events.MouseListener#mouseDown
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseDown = 3;
	
	/**
	 * The mouse up event type (value is 4).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseListener
	 * @see org.eclipse.swt.events.MouseListener#mouseUp
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseUp = 4;
	
	/**
	 * The mouse move event type (value is 5).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseMoveListener
	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseMove = 5;
	
	/**
	 * The mouse enter event type (value is 6).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseTrackListener
	 * @see org.eclipse.swt.events.MouseTrackListener#mouseEnter
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseEnter = 6;		
	
	/**
	 * The mouse exit event type (value is 7).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseTrackListener
	 * @see org.eclipse.swt.events.MouseTrackListener#mouseExit
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseExit = 7;
	
	/**
	 * The mouse double click event type (value is 8).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseListener
	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseDoubleClick = 8;	
	
	/**
	 * The paint event type (value is 9).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addPaintListener
	 * @see org.eclipse.swt.events.PaintListener#paintControl
	 * @see org.eclipse.swt.events.PaintEvent
	 */
	public static final int Paint = 9;	
	
	/**
	 * The move event type (value is 10).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addControlListener
	 * @see org.eclipse.swt.widgets.TableColumn#addControlListener
	 * @see org.eclipse.swt.widgets.Tracker#addControlListener
	 * @see org.eclipse.swt.widgets.TreeColumn#addControlListener
	 * @see org.eclipse.swt.events.ControlListener#controlMoved
	 * @see org.eclipse.swt.events.ControlEvent
	 */
	public static final int Move = 10;
	
	/**
	 * The resize event type (value is 11).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addControlListener
	 * @see org.eclipse.swt.widgets.TableColumn#addControlListener
	 * @see org.eclipse.swt.widgets.Tracker#addControlListener
	 * @see org.eclipse.swt.widgets.TreeColumn#addControlListener
	 * @see org.eclipse.swt.events.ControlListener#controlResized
	 * @see org.eclipse.swt.events.ControlEvent
	 */
	public static final int Resize = 11;
	
	/**
	 * The dispose event type (value is 12).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addDisposeListener
	 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed
	 * @see org.eclipse.swt.events.DisposeEvent
	 */
	public static final int Dispose = 12;
	
	/**
	 * The selection event type (value is 13).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Button#addSelectionListener
	 * @see org.eclipse.swt.widgets.Combo#addSelectionListener
	 * @see org.eclipse.swt.widgets.CoolItem#addSelectionListener
	 * @see org.eclipse.swt.widgets.Link#addSelectionListener
	 * @see org.eclipse.swt.widgets.List#addSelectionListener
	 * @see org.eclipse.swt.widgets.MenuItem#addSelectionListener
	 * @see org.eclipse.swt.widgets.Sash#addSelectionListener
	 * @see org.eclipse.swt.widgets.Scale#addSelectionListener
	 * @see org.eclipse.swt.widgets.ScrollBar#addSelectionListener
	 * @see org.eclipse.swt.widgets.Slider#addSelectionListener
	 * @see org.eclipse.swt.widgets.TabFolder#addSelectionListener
	 * @see org.eclipse.swt.widgets.Table#addSelectionListener
	 * @see org.eclipse.swt.widgets.TableColumn#addSelectionListener
	 * @see org.eclipse.swt.widgets.ToolItem#addSelectionListener
	 * @see org.eclipse.swt.widgets.TrayItem#addSelectionListener
	 * @see org.eclipse.swt.widgets.Tree#addSelectionListener
	 * @see org.eclipse.swt.widgets.TreeColumn#addSelectionListener
	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected
	 * @see org.eclipse.swt.events.SelectionEvent
	 */
	public static final int Selection = 13;
	
	/**
	 * The default selection event type (value is 14).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Combo#addSelectionListener
	 * @see org.eclipse.swt.widgets.List#addSelectionListener
	 * @see org.eclipse.swt.widgets.Spinner#addSelectionListener
	 * @see org.eclipse.swt.widgets.Table#addSelectionListener
	 * @see org.eclipse.swt.widgets.Text#addSelectionListener
	 * @see org.eclipse.swt.widgets.TrayItem#addSelectionListener
	 * @see org.eclipse.swt.widgets.Tree#addSelectionListener
	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected
	 * @see org.eclipse.swt.events.SelectionEvent
	 */
	public static final int DefaultSelection = 14;
	
	/**
	 * The focus in event type (value is 15).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addFocusListener
	 * @see org.eclipse.swt.events.FocusListener#focusGained
	 * @see org.eclipse.swt.events.FocusEvent
	 */
	public static final int FocusIn = 15;
	
	/**
	 * The focus out event type (value is 16).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addFocusListener
	 * @see org.eclipse.swt.events.FocusListener#focusLost
	 * @see org.eclipse.swt.events.FocusEvent
	 */
	public static final int FocusOut = 16;
	
	/**
	 * The expand event type (value is 17).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Tree#addTreeListener
	 * @see org.eclipse.swt.events.TreeListener#treeExpanded
	 * @see org.eclipse.swt.events.TreeEvent
	 */
	public static final int Expand = 17;
	
	/**
	 * The collapse event type (value is 18).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Tree#addTreeListener
	 * @see org.eclipse.swt.events.TreeListener#treeCollapsed
	 * @see org.eclipse.swt.events.TreeEvent
	 */
	public static final int Collapse = 18;
	
	/**
	 * The iconify event type (value is 19).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Shell#addShellListener
	 * @see org.eclipse.swt.events.ShellListener#shellIconified
	 * @see org.eclipse.swt.events.ShellEvent
	 */
	public static final int Iconify = 19;
	
	/**
	 * The de-iconify event type (value is 20).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Shell#addShellListener
	 * @see org.eclipse.swt.events.ShellListener#shellDeiconified
	 * @see org.eclipse.swt.events.ShellEvent
	 */
	public static final int Deiconify = 20;
	
	/**
	 * The close event type (value is 21).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Shell#addShellListener
	 * @see org.eclipse.swt.events.ShellListener#shellClosed
	 * @see org.eclipse.swt.events.ShellEvent
	 */
	public static final int Close = 21;
	
	/**
	 * The show event type (value is 22).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Menu#addMenuListener
	 * @see org.eclipse.swt.events.MenuListener#menuShown
	 * @see org.eclipse.swt.events.MenuEvent
	 */
	public static final int Show = 22;
	
	/**
	 * The hide event type (value is 23).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Menu#addMenuListener
	 * @see org.eclipse.swt.events.MenuListener#menuHidden
	 * @see org.eclipse.swt.events.MenuEvent
	 */
	public static final int Hide = 23;
	
	/**
	 * The modify event type (value is 24).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Combo#addModifyListener
	 * @see org.eclipse.swt.widgets.Spinner#addModifyListener
	 * @see org.eclipse.swt.widgets.Text#addModifyListener
	 * @see org.eclipse.swt.events.ModifyListener#modifyText
	 * @see org.eclipse.swt.events.ModifyEvent
	 */
	public static final int Modify = 24;
	
	/**
	 * The verify event type (value is 25).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.custom.CCombo#addVerifyListener
	 * @see org.eclipse.swt.widgets.Combo#addVerifyListener
	 * @see org.eclipse.swt.custom.StyledText#addVerifyListener
	 * @see org.eclipse.swt.widgets.Text#addVerifyListener
	 * @see org.eclipse.swt.events.VerifyListener#verifyText
	 * @see org.eclipse.swt.events.VerifyEvent
	 */
	public static final int Verify = 25;
	
	/**
	 * The activate event type (value is 26).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Shell#addShellListener
	 * @see org.eclipse.swt.events.ShellListener#shellActivated
	 * @see org.eclipse.swt.events.ShellEvent
	 */
	public static final int Activate = 26;
	
	/**
	 * The deactivate event type (value is 27).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Shell#addShellListener
	 * @see org.eclipse.swt.events.ShellListener#shellDeactivated
	 * @see org.eclipse.swt.events.ShellEvent
	 */
	public static final int Deactivate = 27;	
	
	/**
	 * The help event type (value is 28).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addHelpListener
	 * @see org.eclipse.swt.widgets.Menu#addHelpListener
	 * @see org.eclipse.swt.widgets.MenuItem#addHelpListener
	 * @see org.eclipse.swt.events.HelpListener#helpRequested
	 * @see org.eclipse.swt.events.HelpEvent
	 */
	public static final int Help = 28;
	
	/**
	 * The drag detect event type (value is 29).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addDragDetectListener
	 * @see org.eclipse.swt.events.DragDetectListener#dragDetected
	 * @see org.eclipse.swt.events.DragDetectEvent
	 * @see org.eclipse.swt.dnd.DragSource
	 */
	public static final int DragDetect = 29;
	
	/**
	 * The arm event type (value is 30).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#addArmListener
	 * @see org.eclipse.swt.events.ArmListener#widgetArmed
	 * @see org.eclipse.swt.events.ArmEvent
	 */
	public static final int Arm = 30;
	
	/**
	 * The traverse event type (value is 31).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addTraverseListener
	 * @see org.eclipse.swt.events.TraverseListener#keyTraversed
	 * @see org.eclipse.swt.events.TraverseEvent
	 */
	public static final int Traverse = 31;
	
	/**
	 * The mouse hover event type (value is 32).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseTrackListener
	 * @see org.eclipse.swt.events.MouseTrackListener#mouseHover
	 * @see org.eclipse.swt.events.MouseEvent
	 */
	public static final int MouseHover = 32;

	/**
	 * The hardware key down event type (value is 33).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 */
	public static final int HardKeyDown = 33;
	
	/**
	 * The hardware key up event type (value is 34).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 */
	public static final int HardKeyUp = 34;

	/**
	 * The menu detect event type (value is 35).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMenuDetectListener
	 * @see org.eclipse.swt.widgets.TrayItem#addMenuDetectListener
	 * @see org.eclipse.swt.events.MenuDetectListener#menuDetected
	 * @see org.eclipse.swt.events.MenuDetectEvent
	 * 
	 * @since 3.0
	 */
	public static final int MenuDetect = 35;
	
	/**
	 * The set data event type (value is 36).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Table
	 * @see org.eclipse.swt.widgets.Tree
	 * 
	 * @since 3.0
	 */
	public static final int SetData = 36;

	/**
	 * The mouse vertical wheel event type (value is 37).
	 * 
	 * @see org.eclipse.swt.widgets.Control#addMouseWheelListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.6
	 */
	public static final int MouseVerticalWheel = 37;
	
	/**
	 * The mouse horizontal wheel event type (value is 38).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.6
	 */
	public static final int MouseHorizontalWheel = 38;
	
	/**
	 * The mouse wheel event type (value is 37).
	 * This is a synonym for {@link #MouseVerticalWheel} (value is 37).  
	 * Newer applications should use {@link #MouseVerticalWheel} instead 
	 * of {@link #MouseWheel} to make code more understandable.
	 *  
	 * @see org.eclipse.swt.widgets.Control#addMouseWheelListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.1
	 */
	public static final int MouseWheel = MouseVerticalWheel;

	/**
	 * The settings changed event type (value is 39).
	 * <p>
	 * The settings changed event is sent when an operating system
	 * property, such as a system font or color, has been changed.
	 * The event occurs after the property has been changed, but
	 * before any widget is redrawn.  Applications that cache operating
	 * system properties can use this event to update their caches.
	 * A specific property change can be detected by querying the
	 * new value of a property and comparing it with the equivalent
	 * cached value.  The operating system automatically redraws and
	 * lays out all widgets after this event is sent.
	 * </p>
	 * 
	 * @see org.eclipse.swt.widgets.Display#addListener
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.2
	 */
	public static final int Settings = 39;
	
	/**
	 * The erase item event type (value is 40).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.2
	 */
	public static final int EraseItem = 40;
	
	/**
	 * The measure item event type (value is 41).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.2
	 */
	public static final int MeasureItem = 41;
	
	/**
	 * The paint item event type (value is 42).
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.2
	 */
	public static final int PaintItem = 42;	
	
	/**
	 * The IME composition event type (value is 43).  
	 * <p>
	 * The IME composition event is sent to allow
	 * custom text editors to implement in-line
	 * editing of international text. 
	 * </p> 
	 * 
	 * The detail field indicates the action to be taken:
	 * <p><ul>
	 * <li>{@link SWT#COMPOSITION_CHANGED}</li>
	 * <li>{@link SWT#COMPOSITION_OFFSET}</li>
	 * <li>{@link SWT#COMPOSITION_SELECTION}</li>
	 * </ul></p>
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.4
	 */
	public static final int ImeComposition = 43;

	/**
	 * The orientation change event type (value is 44).  
	 * <p>
	 * On some platforms the orientation of text widgets
	 * can be changed by keyboard shortcut.
	 * The application can use the <code>doit</code> field
	 * of the event to stop the change from happening.
	 * </p> 
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @since 3.6
	 */
	public static final int OrientationChange = 44;

	/**
	 * The skin event type (value is 45).
	 * 
	 * <p>
	 * The skin event is sent by the display when a widget needs to
	 * be skinned. 
	 * </p>
	 * 
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * @see org.eclipse.swt.widgets.Widget#reskin(int)
	 * 
	 * @since 3.6
	 */
	public static final int Skin = 45;
	
	/**
	 * The open document event type (value is 46).
	 * 
	 * <p>
	 * This event is sent when SWT receives notification that a document 
	 * should be opened.
	 * </p>
	 *  
     * @see org.eclipse.swt.widgets.Display#addListener
     * @see org.eclipse.swt.widgets.Event
     * 
     * @since 3.6
	 */
	public static final int OpenDocument = 46;
	
	/**
	 * The touch event type (value is 47).
	 * 
	 * <p>
	 * This event is sent when a touch has been performed
	 * on a touch-based input source.
	 * </p>
	 *
     * @see org.eclipse.swt.widgets.Display#addListener
     * @see org.eclipse.swt.widgets.Event
     * 
     * @since 3.7
	 */
	public static final int Touch = 47;

	/**
	 * The gesture event type (value is 48).
	 * 
	 * <p>
	 * This event is sent when a gesture has been performed.
	 * </p>
	 *  
     * @see org.eclipse.swt.widgets.Display#addListener
     * @see org.eclipse.swt.widgets.Event
     * @see SWT#GESTURE_MAGNIFY
     * @see SWT#GESTURE_PAN
     * @see SWT#GESTURE_ROTATE
     * @see SWT#GESTURE_SWIPE
     * 
     * @since 3.7
	 */
	public static final int Gesture = 48;

	/**
	 * The segments event type (value is 49).
	 * 
	 * <p>
	 * This event is sent when text content has been changed.
	 * </p>
	 *  
	 * @see org.eclipse.swt.widgets.Widget#addListener
	 * @see org.eclipse.swt.widgets.Display#addFilter
	 * @see org.eclipse.swt.widgets.Event
	 * 
	 * @see org.eclipse.swt.widgets.Text#addSegmentListener
	 * @see org.eclipse.swt.events.SegmentEvent
     * 
     * @since 3.8
	 */
	public static final int Segments = 49;
	
	/**
	 * The PreEvent event type (value is 50).
	 *
	 * <p>
	 * This event is sent before an event is dispatched.
	 * </p>
	 *
	 * @since 3.103
	 */
	public static final int PreEvent = 50;

	/**
	 * The PostEvent event type (value is 51).
	 *
	 * <p>
	 * This event is sent after an event is dispatched.
	 * </p>
	 *
	 * @since 3.103
	 */
	public static final int PostEvent = 51;

	/**
	 * The Sleep event type (value is 52).
	 *
	 * <p>
	 * This event is sent before Display.sleep goes into an interruptible sleep.
	 * </p>
	 *
	 * @since 3.103
	 */
	public static final int Sleep = 52;

	/**
	 * The Wakeup event type (value is 53).
	 *
	 * <p>
	 * This event is sent after Display.sleep wakes up from an interruptible sleep.
	 * </p>
	 *
	 * @since 3.103
	 */
	public static final int Wakeup = 53;

	/* Event Details */
	
	/**
	 * The IME composition event detail that indicates
	 * a change in the IME composition. The text field
	 * of the event is the new composition text. 
	 * The start and end indicate the offsets where the
	 * composition text should be inserted.
	 * The styles and ranges are stored in the IME 
	 * object (value is 1).
	 * 
	 * @see SWT#ImeComposition
	 * 
	 * @since 3.4
	 */
	public static final int COMPOSITION_CHANGED = 1;
	
	/**
	 * The IME composition event detail that indicates
	 * that the IME needs the offset for a given location.
	 * The x and y fields of the event are used by the 
	 * application to determine the offset.
	 * 
	 * The index field of the event should be set to the 
	 * text offset at that location. The count field should 
	 * be set to indicate whether the location is closer to
	 * the leading edge (0) or the trailing edge (1) (value is 2).
	 * 
	 * @see SWT#ImeComposition
	 * @see org.eclipse.swt.graphics.TextLayout#getOffset(int, int, int[])
	 * 
	 * @since 3.4
	 */
	public static final int COMPOSITION_OFFSET = 2;
	
	/**
	 * The IME composition event detail that indicates
	 * that IME needs the selected text and its start
	 * and end offsets (value is 3).
	 * 
	 * @see SWT#ImeComposition
	 * 
	 * @since 3.4
	 */
	public static final int COMPOSITION_SELECTION = 3;

	/**
	 * Indicates that a user-interface component is being dragged,
	 * for example dragging the thumb of a scroll bar (value is 1).
	 */
	public static final int DRAG = 1;
	
	/**
	 * Event detail field that indicates a user-interface component
	 * state is selected (value is 1&lt;&lt;1).
	 *
	 * @since 3.2
	 */
	public static final int SELECTED = 1 << 1;
	
	/**
	 * Event detail field that indicates a user-interface component
	 * state is focused (value is 1&lt;&lt;2).
	 *
	 * @since 3.2
	 */	
	public static final int FOCUSED = 1 << 2;
	
	/**
	 * Event detail field that indicates a user-interface component
	 * draws the background (value is 1&lt;&lt;3).
	 *
	 * @since 3.2
	 */
	public static final int BACKGROUND = 1 << 3;
	
	/**
	 * Event detail field that indicates a user-interface component
	 * draws the foreground (value is 1&lt;&lt;4).
	 *
	 * @since 3.2
	 */
	public static final int FOREGROUND = 1 << 4;
	
	/**
	 * Event detail field that indicates a user-interface component
	 * state is hot (value is 1&lt;&lt;5).
	 *
	 * @since 3.3
	 */
	public static final int HOT = 1 << 5;
	
	/* This code is intentionally commented */
	//public static final int PRESSED = 1 << 3;
	//public static final int ACTIVE = 1 << 4;
	//public static final int DISABLED = 1 << 5;
	//public static final int HOT = 1 << 6;
	//public static final int DEFAULTED = 1 << 7;

	/**
	 * Traversal event detail field value indicating that no 
	 * traversal action should be taken
	 * (value is 0).
	 */
	public static final int TRAVERSE_NONE = 0;
	
	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that a dialog should be cancelled was
	 * pressed; typically, this is the ESC key
	 * (value is 1&lt;&lt;1).
	 */
	public static final int TRAVERSE_ESCAPE = 1 << 1;

	/**
	 * Traversal event detail field value indicating that the
	 * key which activates the default button in a dialog was
	 * pressed; typically, this is the ENTER key
	 * (value is 1&lt;&lt;2).
	 */
	public static final int TRAVERSE_RETURN = 1 << 2;

	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that focus should be given to the
	 * previous tab group was pressed; typically, this is the
	 * SHIFT-TAB key sequence
	 * (value is 1&lt;&lt;3).
	 */
	public static final int TRAVERSE_TAB_PREVIOUS = 1 << 3;

	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that focus should be given to the
	 * next tab group was pressed; typically, this is the
	 * TAB key
	 * (value is 1&lt;&lt;4).
	 */
	public static final int TRAVERSE_TAB_NEXT = 1 << 4;

	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that focus should be given to the
	 * previous tab item was pressed; typically, this is either
	 * the LEFT-ARROW or UP-ARROW keys
	 * (value is 1&lt;&lt;5).
	 */
	public static final int TRAVERSE_ARROW_PREVIOUS = 1 << 5;

	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that focus should be given to the
	 * previous tab item was pressed; typically, this is either
	 * the RIGHT-ARROW or DOWN-ARROW keys
	 * (value is 1&lt;&lt;6).
	 */
	public static final int TRAVERSE_ARROW_NEXT = 1 << 6;

	/**
	 * Traversal event detail field value indicating that a 
	 * mnemonic key sequence was pressed
	 * (value is 1&lt;&lt;7).
	 */
	public static final int TRAVERSE_MNEMONIC = 1 << 7;

	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that the previous page of a multi-page
	 * window should be shown was pressed; typically, this
	 * is the CTRL-PAGEUP key sequence
	 * (value is 1&lt;&lt;8).
	 */
	public static final int TRAVERSE_PAGE_PREVIOUS = 1 << 8;
	
	/**
	 * Traversal event detail field value indicating that the 
	 * key which designates that the next page of a multi-page
	 * window should be shown was pressed; typically, this
	 * is the CTRL-PAGEDOWN key sequence
	 * (value is 1&lt;&lt;9).
	 */
	public static final int TRAVERSE_PAGE_NEXT = 1 << 9;

	/**
	 * Gesture event detail field value indicating that a continuous
	 * gesture is about to begin.
	 * 
	 * @since 3.7
	 */
	public static final int GESTURE_BEGIN = 1 << 1;

	/**
	 * Gesture event detail field value indicating that a continuous 
	 * gesture has ended.
	 * 
	 * @since 3.7
	 */
	public static final int GESTURE_END = 1 << 2;

	/**
	 * Gesture event detail field value indicating that a 
	 * rotation gesture has happened. Only the rotation field
	 * of the event is valid.
	 * 
	 * @since 3.7
	 */
	public static final int GESTURE_ROTATE = 1 << 3;
	
	/**
	 * Gesture event detail field value indicating that a 
	 * swipe gesture has happened.
	 * 
	 * @since 3.7
	 */
	public static final int GESTURE_SWIPE = 1 << 4;
	
	/**
	 * Gesture event detail field value indicating that a 
	 * magnification gesture has happened.
	 * 
	 * @since 3.7
	 */
	public static final int GESTURE_MAGNIFY = 1 << 5;
	
	/**
	 * Gesture event detail field value indicating that a 
	 * panning (two-finger scroll) gesture has happened.
	 * 
	 * @since 3.7
	 */
	public static final int GESTURE_PAN = 1 << 6;
	
	/**
	 * A constant indicating that a finger touched the device.  
	 * 
	 * @see org.eclipse.swt.widgets.Touch#state
	 * 
	 * @since 3.7
	 */
	public static final int TOUCHSTATE_DOWN = 1 << 0;

	/**
	 * A constant indicating that a finger moved on the device.
	 * 
	 * @see org.eclipse.swt.widgets.Touch#state
	 * 
	 * @since 3.7
	 */
	public static final int TOUCHSTATE_MOVE = 1 << 1;

	/**
	 * A constant indicating that a finger was lifted from the device. 
	 * 
	 * @see org.eclipse.swt.widgets.Touch#state
	 * 
	 * @since 3.7
	 */
	public static final int TOUCHSTATE_UP = 1 << 2;
	
	/**
	 * MenuDetect event detail value indicating that a context menu
	 * was requested by a mouse or other pointing device (value is 0).
	 * 
	 * @since 3.8
	 */
	public static final int MENU_MOUSE = 0;
	
	/**
	 * MenuDetect event detail value indicating that a context menu
	 * was requested by a keyboard or other focus-based device (value is 1).
	 * 
	 * @since 3.8
	 */
	public static final int MENU_KEYBOARD = 1;

	/**
	 * A constant indicating that widgets have changed.
	 * (value is 1&lt;&lt;1).
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code> layout</li>
	 * </ul></p>
	 * 
	 * @see org.eclipse.swt.widgets.Composite#layout(org.eclipse.swt.widgets.Control[], int)
	 * 
	 * @since 3.6
	 */
	public static final int CHANGED = 1 << 1;

	/**
	 * A constant indicating that a given operation should be deferred.
	 * (value is 1&lt;&lt;2).
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code> layout</li>
	 * </ul></p>
	 * 
	 * @see org.eclipse.swt.widgets.Composite#layout(org.eclipse.swt.widgets.Control[], int)
	 * 
	 * @since 3.6
	 */
	public static final int DEFER = 1 << 2;

	/**
	 * A constant known to be zero (0), typically used in operations
	 * which take bit flags to indicate that "no bits are set".
	 */
	public static final int NONE = 0;
	
	/**
	 * A constant known to be zero (0), used in operations which
	 * take pointers to indicate a null argument.
	 */
	public static final int NULL = 0;
	
	/**
	 * Indicates that a default should be used (value is -1).
	 */
	public static final int DEFAULT = -1;

	/**
	 * Indicates that a property is off (value is 0).
	 * 
	 * @since 3.1
	 */
	public static final int OFF = 0;
	
	/**
	 * Indicates that a property is on (value is 1).
	 * 
	 * @since 3.1
	 */
	public static final int ON = 1;

	/**
	 * Indicates low quality (value is 1).
	 * 
	 * @since 3.1
	 */
	public static final int LOW = 1;

	/**
	 * Indicates high quality (value is 2).
	 * 
	 * @since 3.1
	 */
	public static final int HIGH = 2;

	/**
	 * Style constant for menu bar behavior (value is 1&lt;&lt;1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Menu</code></li>
	 * </ul></p>
	 */
	public static final int BAR = 1 << 1;

	/**
	 * Style constant for drop down menu/list behavior (value is 1&lt;&lt;2).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Menu</code></li>
	 * <li><code>ToolItem</code></li>
	 * <li><code>CoolItem</code></li>
	 * <li><code>Combo</code></li>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 */
	public static final int DROP_DOWN = 1 << 2;

	/**
	 * Style constant for pop up menu behavior (value is 1&lt;&lt;3).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Menu</code></li>
	 * </ul></p>
	 */
	public static final int POP_UP = 1 << 3;

	/**
	 * Style constant for line separator behavior (value is 1&lt;&lt;1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Label</code></li>
	 * <li><code>MenuItem</code></li>
	 * <li><code>ToolItem</code></li>
	 * </ul></p>
	 */
	public static final int SEPARATOR = 1 << 1;

    /**
     * Constant representing a flexible space separator in a ToolBar.
	 * <p><b>Used By:</b><ul>
	 * <li><code>ToolItem.setWidth()</code></li>
	 * </ul></p>
	 *
	 * @since 3.7
     */
    public static final int SEPARATOR_FILL = -2;

	/**
	 * Style constant for toggle button behavior (value is 1&lt;&lt;1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * </ul></p>
	 */
	public static final int TOGGLE = 1 << 1;

	/**
	 * Style constant for arrow button behavior (value is 1&lt;&lt;2).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * </ul></p>
	 */
	public static final int ARROW = 1 << 2;

	/**
	 * Style constant for push button behavior (value is 1&lt;&lt;3).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>MenuItem</code></li>
	 * <li><code>ToolItem</code></li>
	 * </ul></p>
	 */
	public static final int PUSH = 1 << 3;

	/**
	 * Style constant for radio button behavior (value is 1&lt;&lt;4).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>MenuItem</code></li>
	 * <li><code>ToolItem</code></li>
	 * </ul></p>
	 */
	public static final int RADIO = 1 << 4;

	/**
	 * Style constant for check box behavior (value is 1&lt;&lt;5).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>MenuItem</code></li>
	 * <li><code>ToolItem</code></li>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * </ul></p>
	 */
	public static final int CHECK = 1 << 5;

	/**
	 * Style constant for cascade behavior (value is 1&lt;&lt;6).
	 * <p><b>Used By:</b><ul>
	 * <li><code>MenuItem</code></li>
	 * </ul></p>
	 */
	public static final int CASCADE = 1 << 6;

	/**
	 * Style constant for multi-selection behavior in lists
	 * and multiple line support on text fields (value is 1&lt;&lt;1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Text</code></li>
	 * <li><code>List</code></li>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * <li><code>FileDialog</code></li>
	 * </ul></p>
	 */
	public static final int MULTI = 1 << 1;

	/**
	 * Style constant for single selection behavior in lists
	 * and single line support on text fields (value is 1&lt;&lt;2).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Text</code></li>
	 * <li><code>List</code></li>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * </ul></p>
	 */
	public static final int SINGLE = 1 << 2;

	/**
	 * Style constant for read-only behavior (value is 1&lt;&lt;3).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Combo</code></li>
	 * <li><code>Text</code></li>
	 * </ul></p>
	 */
	public static final int READ_ONLY = 1 << 3;

	/**
	 * Style constant for automatic line wrap behavior (value is 1&lt;&lt;6).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>Label</code></li>
	 * <li><code>Text</code></li>
	 * <li><code>ToolBar</code></li>
	 * <li><code>Spinner</code></li>
	 * </ul></p>
	 */
	public static final int WRAP = 1 << 6;

	/**
	 * Style constant for search behavior (value is 1&lt;&lt;7).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Text</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int SEARCH = 1 << 7;

	/**
	 * Style constant for simple (not drop down) behavior (value is 1&lt;&lt;6).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Combo</code></li>
	 * </ul></p>
	 */
	public static final int SIMPLE = 1 << 6;

	/**
	 * Style constant for password behavior (value is 1&lt;&lt;22).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Text</code></li>
	 * </ul></p>
	 * 
	 * @since 3.0
	 */
	public static final int PASSWORD = 1 << 22;
	
	/**
	 * Style constant for shadow in behavior (value is 1&lt;&lt;2).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Label</code></li>
	 * <li><code>Group</code></li>
	 * </ul></p>
	 */
	public static final int SHADOW_IN = 1 << 2;

	/**
	 * Style constant for shadow out behavior (value is 1&lt;&lt;3).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Label</code></li>
	 * <li><code>Group</code></li>
	 * <li><code>ToolBar</code></li>
	 * </ul></p>
	 */
	public static final int SHADOW_OUT = 1 << 3;

	/**
	 * Style constant for shadow etched in behavior (value is 1&lt;&lt;4).
	 * <br>Note that this is a <em>HINT</em>. It is ignored on all platforms except Motif.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Group</code></li>
	 * </ul></p>
	 */
	public static final int SHADOW_ETCHED_IN = 1 << 4;

	/**
	 * Style constant for shadow etched out behavior (value is 1&lt;&lt;6).
	 * <br>Note that this is a <em>HINT</em>. It is ignored on all platforms except Motif.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Group</code></li>
	 * </ul></p>
	 */
	public static final int SHADOW_ETCHED_OUT = 1 << 6;

	/**
	 * Style constant for no shadow behavior (value is 1&lt;&lt;5).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Label</code></li>
	 * <li><code>Group</code></li>
	 * </ul></p>
	 */
	public static final int SHADOW_NONE = 1 << 5;

	/**
	 * Style constant for progress bar behavior (value is 1&lt;&lt;1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>ProgressBar</code></li>
	 * </ul></p>
	 */
	public static final int INDETERMINATE = 1 << 1;
	
	/**
	 * Style constant for tool window behavior (value is 1&lt;&lt;2).
	 * <p>
	 * A tool window is a window intended to be used as a floating toolbar.
	 * It typically has a title bar that is shorter than a normal title bar,
	 * and the window title is typically drawn using a smaller font.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p><p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int TOOL = 1 << 2; 

	/**
	 * Style constant to ensure no trimmings are used (value is 1&lt;&lt;3).
	 * <br>Note that this overrides all other trim styles.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int NO_TRIM = 1 << 3;
	
	/**
	 * Style constant for resize box trim (value is 1&lt;&lt;4).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * <li><code>Tracker</code></li>
	 * </ul></p>
	 */
	public static final int RESIZE = 1 << 4;

	/**
	 * Style constant for title area trim (value is 1&lt;&lt;5).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int TITLE = 1 << 5;

	/**
	 * Style constant for close box trim (value is 1&lt;&lt;6,
	 * since we do not distinguish between CLOSE style and MENU style).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int CLOSE = 1 << 6;

	/**
	 * Style constant for shell menu trim (value is 1&lt;&lt;6,
	 * since we do not distinguish between CLOSE style and MENU style).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int MENU = CLOSE;

	/**
	 * Style constant for minimize box trim (value is 1&lt;&lt;7).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int MIN = 1 << 7;

	/**
	 * Style constant for maximize box trim (value is 1&lt;&lt;10).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Decorations</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int MAX = 1 << 10;

	/**
	 * Style constant for horizontal scrollbar behavior (value is 1&lt;&lt;8).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Scrollable</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int H_SCROLL = 1 << 8;

	/**
	 * Style constant for vertical scrollbar behavior (value is 1&lt;&lt;9).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Scrollable</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int V_SCROLL = 1 << 9;

	/**
	 * Style constant for no scrollbar behavior (value is 1&lt;&lt;4).
	 * <p>
	 * When neither H_SCROLL or V_SCROLL are specified, controls
	 * are free to create the default scroll bars for the control.
	 * Using NO_SCROLL overrides the default and forces the control
	 * to have no scroll bars.
	 * 
	 * <b>Used By:</b><ul>
	 * <li><code>Tree</code></li>
	 * <li><code>Table</code></li>
	 * </ul></p>
	 *
	 * @since 3.4
	 */
	public static final int NO_SCROLL = 1 << 4;
	
	/**
	 * Style constant for bordered behavior (value is 1&lt;&lt;11).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int BORDER = 1 << 11;

	/**
	 * Style constant indicating that the window manager should clip
	 * a widget's children with respect to its viewable area. (value is 1&lt;&lt;12).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int CLIP_CHILDREN = 1 << 12; 

	/**
	 * Style constant indicating that the window manager should clip
	 * a widget's siblings with respect to its viewable area. (value is 1&lt;&lt;13).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int CLIP_SIBLINGS = 1 << 13;

	/**
	 * Style constant for always on top behavior (value is 1&lt;&lt;14).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Shell</code> and subclasses</li>
	 * </ul></p>
	 */
	public static final int ON_TOP = 1 << 14;
	
	/**
	 * Style constant for sheet window behavior (value is 1&lt;&lt;28).
	 * <p>
	 * A sheet window is a window intended to be used as a temporary modal
	 * dialog that is attached to a parent window. It is typically used to
	 * prompt the user before proceeding. The window trim, positioning and
	 * general look of a sheet window is platform specific. For example,
	 * on the Macintosh, at the time this documentation was written, the
	 * window title is not visible.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p><p><b>Used By:</b><ul>
	 * <li><code>Dialog</code> and subclasses</li>
	 * <li><code>Shell</code> and subclasses</li>
	 * </ul></p>
	 * 
	 * @since 3.5
	 */
	public static final int SHEET = 1 << 28;

	/**
	 * Trim style convenience constant for the most common top level shell appearance
	 * (value is CLOSE|TITLE|MIN|MAX|RESIZE).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Shell</code></li>
	 * </ul></p>
	 */
	public static final int SHELL_TRIM = CLOSE | TITLE | MIN | MAX | RESIZE;

	/**
	 * Trim style convenience constant for the most common dialog shell appearance
	 * (value is CLOSE|TITLE|BORDER).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Shell</code></li>
	 * </ul></p>
	 */
	public static final int DIALOG_TRIM = TITLE | CLOSE | BORDER;

	/**
	 * Style constant for modeless behavior (value is 0).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Dialog</code></li>
	 * <li><code>Shell</code></li>
	 * </ul></p>
	 */
	public static final int MODELESS = 0;

	/**
	 * Style constant for primary modal behavior (value is 1&lt;&lt;15).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Dialog</code></li>
	 * <li><code>Shell</code></li>
	 * </ul></p>
	 */
	public static final int PRIMARY_MODAL = 1 << 15;

	/**
	 * Style constant for application modal behavior (value is 1&lt;&lt;16).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Dialog</code></li>
	 * <li><code>Shell</code></li>
	 * </ul></p>
	 */
	public static final int APPLICATION_MODAL = 1 << 16;

	/**
	 * Style constant for system modal behavior (value is 1&lt;&lt;17).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Dialog</code></li>
	 * <li><code>Shell</code></li>
	 * </ul></p>
	 */
	public static final int SYSTEM_MODAL = 1 << 17;

	/**
	 * Style constant for selection hiding behavior when the widget loses focus (value is 1&lt;&lt;15).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Table</code></li>
	 * </ul></p>
	 */
	public static final int HIDE_SELECTION = 1 << 15;

	/**
	 * Style constant for full row selection behavior and 
	 * selection constant indicating that a full line should be 
	 * drawn. (value is 1&lt;&lt;16).
	 * <br>Note that for some widgets this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * <li><code>StyledText</code></li>
	 * <li><code>TextLayout</code></li> 
	 * </ul></p>
	 */
	public static final int FULL_SELECTION = 1 << 16;

	/**
	 * Style constant for flat appearance. (value is 1&lt;&lt;23).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>ToolBar</code></li>
	 * </ul></p>
	 */
	public static final int FLAT = 1 << 23;

	/**
	 * Style constant for smooth appearance. (value is 1&lt;&lt;16).
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>ProgressBar</code></li>
	 * <li><code>Sash</code></li>
	 * </ul></p>
	 */
	public static final int SMOOTH = 1 << 16;

	/**
	 * Style constant for no background behavior (value is 1&lt;&lt;18).
	 * <p>
	 * By default, before a widget paints, the client area is filled with the current background.
	 * When this style is specified, the background is not filled, and the application is responsible
	 * for filling every pixel of the client area.
	 * This style might be used as an alternative to "double-buffering" in order to reduce flicker.
	 * This style does not mean "transparent" - widgets that are obscured will not draw through.
	 * </p><p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * </ul></p>
	 */
	public static final int NO_BACKGROUND = 1 << 18;

	/**
	 * Style constant for no focus from the mouse behavior (value is 1&lt;&lt;19).
	 * <p>
	 * Normally, when the user clicks on a control, focus is assigned to that
	 * control, providing the control has no children.  Some controls, such as
	 * tool bars and sashes, don't normally take focus when the mouse is clicked
	 * or accept focus when assigned from within the program.  This style allows
	 * Composites to implement "no focus" mouse behavior.
	 * 
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * </ul></p>
	 */
	public static final int NO_FOCUS = 1 << 19;

	/**
	 * Style constant for no redraw on resize behavior (value is 1&lt;&lt;20).
	 * <p>
	 * This style stops the entire client area from being invalidated when the size
	 * of the Canvas changes. Specifically, when the size of the Canvas gets smaller,
	 * the SWT.Paint event is not sent. When it gets bigger, an SWT.Paint event is
	 * sent with a GC clipped to only the new areas to be painted. Without this
	 * style, the entire client area will be repainted.
	 * 
	 * <br>Note that this is a <em>HINT</em>.
	 * </p><p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * </ul></p>
	 */
	public static final int NO_REDRAW_RESIZE = 1 << 20;

	/**
	 * Style constant for no paint event merging behavior (value is 1&lt;&lt;21).
	 * 
	 * <br>Note that this is a <em>HINT</em>.
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * </ul></p>
	 */
	public static final int NO_MERGE_PAINTS = 1 << 21;

	/**
	 * Style constant for preventing child radio group behavior (value is 1&lt;&lt;22).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * <li><code>Menu</code></li>
	 * </ul></p>
	 */
	public static final int NO_RADIO_GROUP = 1 << 22;
	
	/**
	 * Style constant for left to right orientation (value is 1&lt;&lt;25).
	 * <p>
	 * When orientation is not explicitly specified, orientation is
	 * inherited.  This means that children will be assigned the
	 * orientation of their parent.  To override this behavior and
	 * force an orientation for a child, explicitly set the orientation
	 * of the child when that child is created.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * <li><code>Menu</code></li>
	 * <li><code>GC</code></li> 
	 * </ul></p>
	 * 
	 * @since 2.1.2
	 */
	public static final int LEFT_TO_RIGHT = 1 << 25;
	
	/**
	 * Style constant for right to left orientation (value is 1&lt;&lt;26).
	 * <p>
	 * When orientation is not explicitly specified, orientation is
	 * inherited.  This means that children will be assigned the
	 * orientation of their parent.  To override this behavior and
	 * force an orientation for a child, explicitly set the orientation
	 * of the child when that child is created.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * <li><code>Menu</code></li>
	 * <li><code>GC</code></li> 
	 * </ul></p>
	 * 
	 * @since 2.1.2
	 */
	public static final int RIGHT_TO_LEFT = 1 << 26;
	
	/**
	 * Style constant to indicate coordinate mirroring (value is 1&lt;&lt;27).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * <li><code>Menu</code></li>
	 * </ul></p>
	 * 
	 * @since 2.1.2
	 */
	public static final int MIRRORED = 1 << 27;
	
	/**
	 * Style constant to allow embedding (value is 1&lt;&lt;24).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * </ul></p>
	 * 
	 * @since 3.0
	 */
	public static final int EMBEDDED = 1 << 24;
	
	/**
	 * Style constant to allow virtual data (value is 1&lt;&lt;28).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * </ul></p>
	 * 
	 * @since 3.0
	 */
	public static final int VIRTUAL = 1 << 28;

	/**
	 * Style constant to indicate double buffering (value is 1&lt;&lt;29).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * </ul></p>
	 * 
	 * @since 3.1
	 */
	public static final int DOUBLE_BUFFERED = 1 << 29;
	
	/**
	 * Style constant for transparent behavior (value is 1&lt;&lt;30).
	 * <p>
	 * By default, before a widget paints, the client area is filled with the current background.
	 * When this style is specified, the background is not filled and widgets that are obscured
	 * will draw through.
	 * </p><p><b>Used By:</b><ul>
	 * <li><code>Composite</code></li>
	 * </ul></p>
	 *
	 * @since 3.4
	 * 
	 * WARNING: THIS API IS UNDER CONSTRUCTION AND SHOULD NOT BE USED
	 */
	public static final int TRANSPARENT = 1 << 30;
	
	/**
	 * Style constant to indicate base text direction (value is 1&lt;&lt;31).
	 * <p>
	 * When the bit is set, text direction mismatches the widget orientation.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * </ul></p>
	 * 
	 * @see org.eclipse.swt.widgets.Control#setTextDirection(int)
	 * @see org.eclipse.swt.widgets.Control#getTextDirection()
	 * 
	 * @since 3.102
	 */
	public static final int FLIP_TEXT_DIRECTION = 1 << 31;

	/**
	 * Style constant for align up behavior (value is 1&lt;&lt;7,
	 * since align UP and align TOP are considered the same).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code> with <code>ARROW</code> style</li>
	 * <li><code>Tracker</code></li>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * </ul></p>
	 */
	public static final int UP = 1 << 7;
	
	/**
	 * Style constant to indicate single underline (value is 0).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int UNDERLINE_SINGLE = 0;

	/**
	 * Style constant to indicate double underline (value is 1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int UNDERLINE_DOUBLE = 1;
	
	/**
	 * Style constant to indicate error underline (value is 2).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int UNDERLINE_ERROR = 2;
	
	/**
	 * Style constant to indicate squiggle underline (value is 3).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int UNDERLINE_SQUIGGLE = 3;
	
	/**
	 * Style constant to indicate link underline (value is 0).
	 * <p>
	 * If the text color or the underline color are not set in the range
	 * the usage of <code>UNDERLINE_LINK</code> will change these colors
	 * to the preferred link color of the platform.<br>
	 * Note that clients that use this style, such as <code>StyledText</code>,
	 * will include code to track the mouse and change the cursor to the hand
	 * cursor when mouse is over the link.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.5
	 */
	public static final int UNDERLINE_LINK = 4;

	/**
	 * Style constant to indicate solid border (value is 1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int BORDER_SOLID = 1;

	/**
	 * Style constant to indicate dashed border (value is 2).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int BORDER_DASH = 2;
	
	/**
	 * Style constant to indicate dotted border (value is 4).
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextStyle</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int BORDER_DOT = 4;
	
	/**
	 * Style constant for align top behavior (value is 1&lt;&lt;7,
	 * since align UP and align TOP are considered the same).
	 * <p><b>Used By:</b><ul>
	 * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
	 * </ul></p>
	 */
	public static final int TOP = UP;

	/**
	 * Style constant for align down behavior (value is 1&lt;&lt;10,
	 * since align DOWN and align BOTTOM are considered the same).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code> with <code>ARROW</code> style</li>
	 * <li><code>Tracker</code></li>
	 * <li><code>Table</code></li>
	 * <li><code>Tree</code></li>
	 * </ul></p>
	 */
	public static final int DOWN               = 1 << 10;

	/**
	 * Style constant for align bottom behavior (value is 1&lt;&lt;10,
	 * since align DOWN and align BOTTOM are considered the same).
	 * <p><b>Used By:</b><ul>
	 * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
	 * <li><code>TabFolder</code></li>
	 * </ul></p>
	 */
	public static final int BOTTOM             = DOWN;

	/**
	 * Style constant for leading alignment (value is 1&lt;&lt;14).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>Label</code></li>
	 * <li><code>TableColumn</code></li>
	 * <li><code>Tracker</code></li>
	 * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
	 * </ul></p>
	 * 
	 * @since 2.1.2
	 */
	public static final int LEAD               = 1 << 14;
	
	/**
	 * Style constant for align left behavior (value is 1&lt;&lt;14).
	 * This is a synonym for {@link #LEAD} (value is 1&lt;&lt;14).  Newer
	 * applications should use {@link #LEAD} instead of {@link #LEFT} to make code more
	 * understandable on right-to-left platforms.
	 * <p>
	 * This constant can also be used to representing the left keyboard 
	 * location during a key event.
	 * </p>
	 */
	public static final int LEFT               = LEAD;

	/**
	 * Style constant for trailing alignment (value is 1&lt;&lt;17).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>Label</code></li>
	 * <li><code>TableColumn</code></li>
	 * <li><code>Tracker</code></li>
	 * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
	 * </ul></p>
	 * 
	 * @since 2.1.2
	 */
	public static final int TRAIL              = 1 << 17;
		
	/**
	 * Style constant for align right behavior (value is 1&lt;&lt;17).
	 * This is a synonym for {@link #TRAIL} (value is 1&lt;&lt;17).  Newer
	 * applications should use {@link #TRAIL} instead of {@link #RIGHT} to make code more
	 * understandable on right-to-left platforms.
	 * <p>
	 * This constant can also be used to representing the right keyboard 
	 * location during a key event.
	 * </p>
	 */
	public static final int RIGHT              = TRAIL;

	/**
	 * Style constant for align center behavior (value is 1&lt;&lt;24).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Button</code></li>
	 * <li><code>Label</code></li>
	 * <li><code>TableColumn</code></li>
	 * <li><code>FormAttachment</code> in a <code>FormLayout</code></li>
	 * </ul></p>
	 */
	public static final int CENTER = 1 << 24;

	/**
	 * Style constant for horizontal alignment or orientation behavior (value is 1&lt;&lt;8).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Label</code></li>
	 * <li><code>ProgressBar</code></li>
	 * <li><code>Sash</code></li>
	 * <li><code>Scale</code></li>
	 * <li><code>ScrollBar</code></li>
	 * <li><code>Slider</code></li>
	 * <li><code>ToolBar</code></li>
	 * <li><code>FillLayout</code> type</li>
	 * <li><code>RowLayout</code> type</li>
	 * </ul></p>
	 */
	public static final int HORIZONTAL = 1 << 8;

	/**
	 * Style constant for vertical alignment or orientation behavior (value is 1&lt;&lt;9).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Label</code></li>
	 * <li><code>ProgressBar</code></li>
	 * <li><code>Sash</code></li>
	 * <li><code>Scale</code></li>
	 * <li><code>ScrollBar</code></li>
	 * <li><code>Slider</code></li>
	 * <li><code>ToolBar</code></li>
	 * <li><code>CoolBar</code></li>
	 * <li><code>FillLayout</code> type</li>
	 * <li><code>RowLayout</code> type</li>
	 * </ul></p>
	 */
	public static final int VERTICAL = 1 << 9;

	/**
	 * Style constant for date display (value is 1&lt;&lt;5).
	 * <p><b>Used By:</b><ul>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int DATE = 1 << 5;

	/**
	 * Style constant for time display (value is 1&lt;&lt;7).
	 * <p><b>Used By:</b><ul>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int TIME = 1 << 7;
	
	/**
	 * Style constant for calendar display (value is 1&lt;&lt;10).
	 * <p><b>Used By:</b><ul>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int CALENDAR = 1 << 10;

	/**
	 * Style constant for short date/time format (value is 1&lt;&lt;15).
	 * <p>
	 * A short date displays the month and year.
	 * A short time displays hours and minutes.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int SHORT = 1 << 15;

	/**
	 * Style constant for medium date/time format (value is 1&lt;&lt;16).
	 * <p>
	 * A medium date displays the day, month and year.
	 * A medium time displays hours, minutes, and seconds.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int MEDIUM = 1 << 16;

	/**
	 * Style constant for long date/time format (value is 1&lt;&lt;28).
	 * <p>
	 * A long date displays the day, month and year.
	 * A long time displays hours, minutes, and seconds.
	 * The day and month names may be displayed.
	 * <br>Note that this is a <em>HINT</em>.
	 * </p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>DateTime</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int LONG = 1 << 28;

	/**
	 * Style constant specifying that a Browser should use a Mozilla GRE
	 * for rendering its content (value is 1&lt;&lt;15).
	 * <p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>Browser</code></li>
	 * </ul></p>
	 * 
	 * @since 3.3
	 */
	public static final int MOZILLA = 1 << 15;

	/**
	 * Style constant specifying that a Browser should use WebKit
	 * for rendering its content (value is 1&lt;&lt;16).
	 * <p>
	 * <p><b>Used By:</b><ul>
	 * <li><code>Browser</code></li>
	 * </ul></p>
	 * 
	 * @since 3.7
	 */
	public static final int WEBKIT = 1 << 16;

	/**
	 * Style constant for balloon behavior (value is 1&lt;&lt;12).
	 * <p><b>Used By:</b><ul>
	 * <li><code>ToolTip</code></li>
	 * </ul></p>
	 *
	 * @since 3.2
	 */	
	public static final int BALLOON = 1 << 12;
	
	/**
	 * Style constant for vertical alignment or orientation behavior (value is 1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>GridLayout</code> type</li>
	 * </ul></p>
	 */
	public static final int BEGINNING = 1;
	
	/**
	 * Style constant for vertical alignment or orientation behavior (value is 4).
	 * <p><b>Used By:</b><ul>
	 * <li><code>GridLayout</code> type</li>
	 * </ul></p>
	 */
	public static final int FILL = 4;
	
	/**
	 * Input Method Editor style constant for double byte
	 * input behavior (value is 1&lt;&lt;1).
	 */
	public static final int DBCS = 1 << 1;

	/**
	 * Input Method Editor style constant for alpha
	 * input behavior (value is 1&lt;&lt;2).
	 */
	public static final int ALPHA = 1 << 2;

	/**
	 * Input Method Editor style constant for native
	 * input behavior (value is 1&lt;&lt;3).
	 */
	public static final int NATIVE = 1 << 3;

	/**
	 * Input Method Editor style constant for phonetic
	 * input behavior (value is 1&lt;&lt;4).
	 */
	public static final int PHONETIC = 1 << 4;

	/**
	 * Input Method Editor style constant for romanicized
	 * input behavior (value is 1&lt;&lt;5).
	 */
	public static final int ROMAN = 1 << 5;

	/**
	 * ASCII character convenience constant for the backspace character
	 * (value is the <code>char</code> '\b').
	 */
	public static final char BS = '\b';

	/**
	 * ASCII character convenience constant for the carriage return character
	 * (value is the <code>char</code> '\r').
	 */
	public static final char CR = '\r';

	/**
	 * ASCII character convenience constant for the delete character
	 * (value is the <code>char</code> with value 127).
	 */
	public static final char DEL = 0x7F;
 
	/**
	 * ASCII character convenience constant for the escape character
	 * (value is the <code>char</code> with value 27).
	 */
	public static final char ESC = 0x1B;

	/**
	 * ASCII character convenience constant for the line feed character
	 * (value is the <code>char</code> '\n').
	 */
	public static final char LF = '\n';

	/**
	 * ASCII character convenience constant for the tab character
	 * (value is the <code>char</code> '\t').
	 * 
	 * @since 2.1
	 */
	public static final char TAB = '\t';
						
	/**
	 * ASCII character convenience constant for the space character
	 * (value is the <code>char</code> ' ').
	 * 
	 * @since 3.7
	 */
	public static final char SPACE = ' ';
						
	/**
	 * keyboard and/or mouse event mask indicating that the ALT key
	 * was pushed on the keyboard when the event was generated
	 * (value is 1&lt;&lt;16).
	 */
	public static final int ALT = 1 << 16;
					
	/**
	 * Keyboard and/or mouse event mask indicating that the SHIFT key
	 * was pushed on the keyboard when the event was generated
	 * (value is 1&lt;&lt;17).
	 */
	public static final int SHIFT = 1 << 17;
					
	/**
	 * Keyboard and/or mouse event mask indicating that the CTRL key
	 * was pushed on the keyboard when the event was generated
	 * (value is 1&lt;&lt;18).
	 */
	public static final int CTRL = 1 << 18;

	/**
	 * Keyboard and/or mouse event mask indicating that the CTRL key
	 * was pushed on the keyboard when the event was generated. This
	 * is a synonym for CTRL (value is 1&lt;&lt;18).
	 */
	public static final int CONTROL = CTRL;

	/**
	 * Keyboard and/or mouse event mask indicating that the COMMAND key
	 * was pushed on the keyboard when the event was generated
	 * (value is 1&lt;&lt;22).
	 * 
	 * @since 2.1
	 */
	public static final int COMMAND = 1 << 22;
	
	/**
	 * Keyboard and/or mouse event mask indicating all possible
	 * keyboard modifiers.
	 * 
	 * To allow for the future, this mask  is intended to be used in 
	 * place of code that references  each individual keyboard mask. 
	 *  For example, the following expression will determine whether 
	 * any modifier is pressed and will continue to work as new modifier 
	 * masks are added.
	 * 
 	 * <code>(stateMask & SWT.MODIFIER_MASK) != 0</code>.
	 * 
	 * @since 2.1
	 */
	public static final int MODIFIER_MASK;
	
	/**
	 * Keyboard and/or mouse event mask indicating that mouse button one (usually 'left')
	 * was pushed when the event was generated. (value is 1&lt;&lt;19).
	 */
	public static final int BUTTON1 = 1 << 19;

	/**
	 * Keyboard and/or mouse event mask indicating that mouse button two (usually 'middle')
	 * was pushed when the event was generated. (value is 1&lt;&lt;20).
	 */
	public static final int BUTTON2 = 1 << 20;

	/**
	 * Keyboard and/or mouse event mask indicating that mouse button three (usually 'right')
	 * was pushed when the event was generated. (value is 1&lt;&lt;21).
	 */
	public static final int BUTTON3 = 1 << 21;

	/**
	 * Keyboard and/or mouse event mask indicating that mouse button four
	 * was pushed when the event was generated. (value is 1&lt;&lt;23).
	 * 
	 * @since 3.1
	 */
	public static final int BUTTON4 = 1 << 23;

	/**
	 * Keyboard and/or mouse event mask indicating that mouse button five
	 * was pushed when the event was generated. (value is 1&lt;&lt;25).
	 * 
	 * @since 3.1
	 */
	public static final int BUTTON5 = 1 << 25;

	/**
	 * Keyboard and/or mouse event mask indicating all possible
	 * mouse buttons.
	 * 
	 * To allow for the future, this mask  is intended to be used 
	 * in place of code that references each individual button mask.  
	 * For example, the following expression will determine whether
	 * any button is pressed and will continue to work as new button 
	 * masks are added.
	 * 
 	 * <code>(stateMask & SWT.BUTTON_MASK) != 0</code>.
	 * 
	 * @since 2.1
	 */
	public static final int BUTTON_MASK;
	
	/**
	 * Keyboard and/or mouse event mask indicating that the MOD1 key
	 * was pushed on the keyboard when the event was generated.
	 * 
	 * This is the primary keyboard modifier for the platform.
	 * <p>
	 * {@link #CTRL} on most platforms ({@link #COMMAND} on the Mac).
	 * </p>
	 * 
	 * @since 2.1
	 */
	public static final int MOD1;
	
	/**
	 * Keyboard and/or mouse event mask indicating that the MOD2 key
	 * was pushed on the keyboard when the event was generated.
	 * 
	 * This is the secondary keyboard modifier for the platform.
	 * <p>
	 * {@link #SHIFT} on most platforms.
	 * </p>
	 * 
	 * @since 2.1
	 */
	public static final int MOD2;

	/**
	 * Keyboard and/or mouse event mask indicating that the MOD3 key
	 * was pushed on the keyboard when the event was generated.
	 * <p>
	 * {@link #ALT} on most platforms.
	 * </p>
	 * 
	 * @since 2.1
	 */
	public static final int MOD3;

	/**
	 * Keyboard and/or mouse event mask indicating that the MOD4 key
	 * was pushed on the keyboard when the event was generated.
	 * <p>
	 * Undefined on most platforms ({@link #CTRL} on the Mac).
	 * </p>
	 * 
	 * @since 2.1
	 */
	public static final int MOD4;
	
	/**
	 * Constants to indicate line scrolling (value is 1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * </ul></p>
	 * 
	 * @since 3.1
	 */
	public static final int SCROLL_LINE = 1;

	/**
	 * Constants to indicate page scrolling (value is 2).
	 * <p><b>Used By:</b><ul>
	 * <li><code>Control</code></li>
	 * </ul></p>
	 * 
	 * @since 3.1
	 */
	public static final int SCROLL_PAGE = 2;
	
	/**
	 * Accelerator constant used to differentiate a key code from a
	 * unicode character.
	 * 
	 * If this bit is set, then the key stroke
	 * portion of an accelerator represents a key code.  If this bit
	 * is not set, then the key stroke portion of an accelerator is
	 * a unicode character.
	 * 
	 * The following expression is false:
	 * 
	 * <code>((SWT.MOD1 | SWT.MOD2 | 'T') & SWT.KEYCODE_BIT) != 0</code>.
	 * 
	 * The following expression is true:
	 * 
	 * <code>((SWT.MOD3 | SWT.F2) & SWT.KEYCODE_BIT) != 0</code>.
	 * 
	 * (value is (1&lt;&lt;24))
	 * 
	 * @since 2.1
	 */	
	public static final int KEYCODE_BIT = (1 << 24);

	/**
	 * Accelerator constant used to extract the key stroke portion of
	 * an accelerator.
	 * 
	 * The key stroke may be a key code or a unicode
	 * value.  If the key stroke is a key code <code>KEYCODE_BIT</code>
	 * will be set.
	 * 
	 * @since 2.1
	 */	
	public static final int KEY_MASK = KEYCODE_BIT + 0xFFFF;
	
	/**
	 * Keyboard event constant representing the UP ARROW key
	 * (value is (1&lt;&lt;24)+1).
	 */
	public static final int ARROW_UP = KEYCODE_BIT + 1;

	/**
	 * Keyboard event constant representing the DOWN ARROW key
	 * (value is (1&lt;&lt;24)+2).
	 */
	public static final int ARROW_DOWN = KEYCODE_BIT + 2;

	/**
	 * Keyboard event constant representing the LEFT ARROW key
	 * (value is (1&lt;&lt;24)+3).
	 */
	public static final int ARROW_LEFT = KEYCODE_BIT + 3;

	/**
	 * Keyboard event constant representing the RIGHT ARROW key
	 * (value is (1&lt;&lt;24)+4).
	 */
	public static final int ARROW_RIGHT = KEYCODE_BIT + 4;

	/**
	 * Keyboard event constant representing the PAGE UP key
	 * (value is (1&lt;&lt;24)+5).
	 */
	public static final int PAGE_UP = KEYCODE_BIT + 5;

	/**
	 * Keyboard event constant representing the PAGE DOWN key
	 * (value is (1&lt;&lt;24)+6).
	 */
	public static final int PAGE_DOWN = KEYCODE_BIT + 6;

	/**
	 * Keyboard event constant representing the HOME key
	 * (value is (1&lt;&lt;24)+7).
	 */
	public static final int HOME = KEYCODE_BIT + 7;

	/**
	 * Keyboard event constant representing the END key
	 * (value is (1&lt;&lt;24)+8).
	 */
	public static final int END = KEYCODE_BIT + 8;

	/**
	 * Keyboard event constant representing the INSERT key
	 * (value is (1&lt;&lt;24)+9).
	 */
	public static final int INSERT = KEYCODE_BIT + 9;

	/**
	 * Keyboard event constant representing the F1 key
	 * (value is (1&lt;&lt;24)+10).
	 */
	public static final int F1 = KEYCODE_BIT + 10;
	
	/**
	 * Keyboard event constant representing the F2 key
	 * (value is (1&lt;&lt;24)+11).
	 */
	public static final int F2 = KEYCODE_BIT + 11;
	
	/**
	 * Keyboard event constant representing the F3 key
	 * (value is (1&lt;&lt;24)+12).
	 */
	public static final int F3 = KEYCODE_BIT + 12;
	
	/**
	 * Keyboard event constant representing the F4 key
	 * (value is (1&lt;&lt;24)+13).
	 */
	public static final int F4 = KEYCODE_BIT + 13;
	
	/**
	 * Keyboard event constant representing the F5 key
	 * (value is (1&lt;&lt;24)+14).
	 */
	public static final int F5 = KEYCODE_BIT + 14;
	
	/**
	 * Keyboard event constant representing the F6 key
	 * (value is (1&lt;&lt;24)+15).
	 */
	public static final int F6 = KEYCODE_BIT + 15;
	
	/**
	 * Keyboard event constant representing the F7 key
	 * (value is (1&lt;&lt;24)+16).
	 */
	public static final int F7 = KEYCODE_BIT + 16;
	
	/**
	 * Keyboard event constant representing the F8 key
	 * (value is (1&lt;&lt;24)+17).
	 */
	public static final int F8 = KEYCODE_BIT + 17;
	
	/**
	 * Keyboard event constant representing the F9 key
	 * (value is (1&lt;&lt;24)+18).
	 */
	public static final int F9 = KEYCODE_BIT + 18;
	
	/**
	 * Keyboard event constant representing the F10 key
	 * (value is (1&lt;&lt;24)+19).
	 */
	public static final int F10 = KEYCODE_BIT + 19;
	
	/**
	 * Keyboard event constant representing the F11 key
	 * (value is (1&lt;&lt;24)+20).
	 */
	public static final int F11 = KEYCODE_BIT + 20;
	
	/**
	 * Keyboard event constant representing the F12 key
	 * (value is (1&lt;&lt;24)+21).
	 */
	public static final int F12 = KEYCODE_BIT + 21;

	/**
	 * Keyboard event constant representing the F13 key
	 * (value is (1&lt;&lt;24)+22).
	 * 
	 * @since 3.0
	 */
	public static final int F13 = KEYCODE_BIT + 22;
	
	/**
	 * Keyboard event constant representing the F14 key
	 * (value is (1&lt;&lt;24)+23).
	 * 
	 * @since 3.0
	 */
	public static final int F14 = KEYCODE_BIT + 23;
	
	/**
	 * Keyboard event constant representing the F15 key
	 * (value is (1&lt;&lt;24)+24).
	 * 
	 * @since 3.0
	 */
	public static final int F15 = KEYCODE_BIT + 24;
	
	/**
	 * Keyboard event constant representing the F16 key
	 * (value is (1&lt;&lt;25)+25).
	 * 
	 * @since 3.6
	 */
	public static final int F16 = KEYCODE_BIT + 25;

	
	/**
	 * Keyboard event constant representing the F17 key
	 * (value is (1&lt;&lt;26)+26).
	 * 
	 * @since 3.6
	 */
	public static final int F17 = KEYCODE_BIT + 26;

	
	/**
	 * Keyboard event constant representing the F18 key
	 * (value is (1&lt;&lt;27)+27).
	 * 
	 * @since 3.6
	 */
	public static final int F18 = KEYCODE_BIT + 27;

	
	/**
	 * Keyboard event constant representing the F19 key
	 * (value is (1&lt;&lt;28)+28).
	 * 
	 * @since 3.6
	 */
	public static final int F19 = KEYCODE_BIT + 28;
	
	/**
	 * Keyboard event constant representing the F20 key
	 * (value is (1&lt;&lt;29)+29).
	 * 
	 * @since 3.6
	 */
	public static final int F20 = KEYCODE_BIT + 29;
	
	/**
	 * Keyboard event constant representing the keypad location.
	 * (value is 1&lt;&lt;1).
	 * 
	 * @since 3.6
	 */
	public static final int KEYPAD = 1 << 1;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad multiply key (value is (1&lt;&lt;24)+42).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_MULTIPLY = KEYCODE_BIT + 42;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad add key (value is (1&lt;&lt;24)+43).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_ADD = KEYCODE_BIT + 43;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad subtract key (value is (1&lt;&lt;24)+45).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_SUBTRACT = KEYCODE_BIT + 45;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad decimal key (value is (1&lt;&lt;24)+46).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_DECIMAL = KEYCODE_BIT + 46;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad divide key (value is (1&lt;&lt;24)+47).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_DIVIDE = KEYCODE_BIT + 47;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad zero key (value is (1&lt;&lt;24)+48).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_0 = KEYCODE_BIT + 48;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad one key (value is (1&lt;&lt;24)+49).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_1 = KEYCODE_BIT + 49;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad two key (value is (1&lt;&lt;24)+50).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_2 = KEYCODE_BIT + 50;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad three key (value is (1&lt;&lt;24)+51).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_3 = KEYCODE_BIT + 51;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad four key (value is (1&lt;&lt;24)+52).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_4 = KEYCODE_BIT + 52;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad five key (value is (1&lt;&lt;24)+53).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_5 = KEYCODE_BIT + 53;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad six key (value is (1&lt;&lt;24)+54).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_6 = KEYCODE_BIT + 54;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad seven key (value is (1&lt;&lt;24)+55).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_7 = KEYCODE_BIT + 55;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad eight key (value is (1&lt;&lt;24)+56).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_8 = KEYCODE_BIT + 56;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad nine key (value is (1&lt;&lt;24)+57).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_9 = KEYCODE_BIT + 57;

	/**
	 * Keyboard event constant representing the numeric key
	 * pad equal key (value is (1&lt;&lt;24)+61).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_EQUAL = KEYCODE_BIT + 61;
	
	/**
	 * Keyboard event constant representing the numeric key
	 * pad enter key (value is (1&lt;&lt;24)+80).
	 * 
	 * @since 3.0
	 */
	public static final int KEYPAD_CR = KEYCODE_BIT + 80;
	
	/**
	 * Keyboard event constant representing the help
	 * key (value is (1&lt;&lt;24)+81).
	 * 
	 * NOTE: The HELP key maps to the key labeled "help",
	 * not "F1". If your keyboard does not have a HELP key,
	 * you will never see this key press.  To listen for
	 * help on a control, use SWT.Help.
	 * 
	 * @since 3.0
	 * 
	 * @see SWT#Help
	 */
	public static final int HELP = KEYCODE_BIT + 81;
	
	/**
	 * Keyboard event constant representing the caps
	 * lock key (value is (1&lt;&lt;24)+82).
	 * 
	 * @since 3.0
	 */
	public static final int CAPS_LOCK = KEYCODE_BIT + 82;
	
	/**
	 * Keyboard event constant representing the num
	 * lock key (value is (1&lt;&lt;24)+83).
	 * 
	 * @since 3.0
	 */
	public static final int NUM_LOCK = KEYCODE_BIT + 83;
	
	/**
	 * Keyboard event constant representing the scroll
	 * lock key (value is (1&lt;&lt;24)+84).
	 * 
	 * @since 3.0
	 */
	public static final int SCROLL_LOCK = KEYCODE_BIT + 84;
	
	/**
	 * Keyboard event constant representing the pause
	 * key (value is (1&lt;&lt;24)+85).
	 * 
	 * @since 3.0
	 */
	public static final int PAUSE = KEYCODE_BIT + 85;
	
	/**
	 * Keyboard event constant representing the break
	 * key (value is (1&lt;&lt;24)+86).
	 * 
	 * @since 3.0
	 */
	public static final int BREAK = KEYCODE_BIT + 86;
	
	/**
	 * Keyboard event constant representing the print screen
	 * key (value is (1&lt;&lt;24)+87).
	 * 
	 * @since 3.0
	 */
	public static final int PRINT_SCREEN = KEYCODE_BIT + 87;
	
	/**
	 * The <code>MessageBox</code> style constant for error icon
	 * behavior (value is 1).
	 */
	public static final int ICON_ERROR = 1;

	/**
	 * The <code>MessageBox</code> style constant for information icon
	 * behavior (value is 1&lt;&lt;1).
	 */
	public static final int ICON_INFORMATION = 1 << 1;

	/**
	 * The <code>MessageBox</code> style constant for question icon
	 * behavior (value is 1&lt;&lt;2).
	 */
	public static final int ICON_QUESTION = 1 << 2;

	/**
	 * The <code>MessageBox</code> style constant for warning icon
	 * behavior (value is 1&lt;&lt;3).
	 */
	public static final int ICON_WARNING = 1 << 3;

	/**
	 * The <code>MessageBox</code> style constant for "working" icon
	 * behavior (value is 1&lt;&lt;4).
	 */
	public static final int ICON_WORKING = 1 << 4;
	
	/**
	 * The style constant for "search" icon. This style constant is 
	 * used with <code>Text</code> in combination with <code>SWT.SEARCH
	 * </code> (value is 1&lt;&lt;9).
	 * <br>Note that this is a <em>HINT</em>. 
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>Text</code></li>
	 * </ul></p>
	 * 
	 * @see #SEARCH
	 * @see #ICON_CANCEL
	 * 
	 * @since 3.5
	 */
	public static final int ICON_SEARCH = 1 << 9;
	
	/**
	 * The style constant for "cancel" icon. This style constant is 
	 * used with <code>Text</code> in combination with <code>SWT.SEARCH
	 * </code> (value is 1&lt;&lt;8).
	 * <br>Note that this is a <em>HINT</em>. 
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>Text</code></li>
	 * </ul></p>
	 * 
	 * @see #SEARCH
	 * @see #ICON_SEARCH
	 * 
	 * @since 3.5
	 */
	public static final int ICON_CANCEL = 1 << 8;
	

	/**
	 * The <code>MessageBox</code> style constant for an OK button;
	 * valid combinations are OK, OK|CANCEL
	 * (value is 1&lt;&lt;5).
	 */
	public static final int OK = 1 << 5;

	/**
	 * The <code>MessageBox</code> style constant for YES button;
	 * valid combinations are YES|NO, YES|NO|CANCEL
	 * (value is 1&lt;&lt;6).
	 */
	public static final int YES = 1 << 6;

	/**
	 * The <code>MessageBox</code> style constant for NO button;
	 * valid combinations are YES|NO, YES|NO|CANCEL
	 * (value is 1&lt;&lt;7).
	 */
	public static final int NO = 1 << 7;

	/**
	 * The <code>MessageBox</code> style constant for a CANCEL button;
	 * valid combinations are OK|CANCEL, YES|NO|CANCEL, RETRY|CANCEL
	 * (value is 1&lt;&lt;8).
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>MessageBox</code></li>
	 * </ul></p>
	 */
	public static final int CANCEL = 1 << 8;

	/**
	 * The <code>MessageBox</code> style constant for an ABORT button;
	 * the only valid combination is ABORT|RETRY|IGNORE
	 * (value is 1&lt;&lt;9).
	 */
	public static final int ABORT = 1 << 9;

	/**
	 * The <code>MessageBox</code> style constant for a RETRY button;
	 *  valid combinations are ABORT|RETRY|IGNORE, RETRY|CANCEL
	 * (value is 1&lt;&lt;10).
	 */
	public static final int RETRY = 1 << 10;

	/**
	 * The <code>MessageBox</code> style constant for an IGNORE button;
	 * the only valid combination is ABORT|RETRY|IGNORE
	 * (value is 1&lt;&lt;11).
	 */
	public static final int	IGNORE = 1 << 11;

	/**
	 * The <code>FileDialog</code> style constant for open file dialog behavior
	 * (value is 1&lt;&lt;12).
	 */
	public static final int OPEN = 1 << 12;

	/**
	 * The <code>FileDialog</code> style constant for save file dialog behavior
	 * (value is 1&lt;&lt;13).
	 */
	public static final int SAVE = 1 << 13;

	/**
	 * The <code>Composite</code> constant to indicate that
	 * an attribute (such as background) is not inherited
	 * by the children (value is 0).
	 *
	 * @since 3.2
	 */
	public static final int INHERIT_NONE = 0;
	
	/**
	 * The <code>Composite</code> constant to indicate that
	 * an attribute (such as background) is inherited by
	 * children who choose this value as their "default"
	 * (value is 1).  For example, a label child will
	 * typically choose to inherit the background color
	 * of a composite while a list or table will not.
	 *
	 * @since 3.2
	 */
	public static final int INHERIT_DEFAULT = 1;
	
	/**
	 * The <code>Composite</code> constant to indicate that
	 * an attribute (such as background) is inherited by
	 * all children.
	 *
	 * @since 3.2
	 */
	public static final int INHERIT_FORCE = 2;
	
	/**
	 * Default color white (value is 1).
	 */
	public static final int COLOR_WHITE = 1;

	/**
	 * Default color black (value is 2).
	 */
	public static final int COLOR_BLACK = 2;

	/**
	 * Default color red (value is 3).
	 */
	public static final int COLOR_RED = 3;

	/**
	 * Default color dark red (value is 4).
	 */
	public static final int COLOR_DARK_RED = 4;

	/**
	 * Default color green (value is 5).
	 */
	public static final int COLOR_GREEN = 5;

	/**
	 * Default color dark green (value is 6).
	 */
	public static final int COLOR_DARK_GREEN = 6;

	/**
	 * Default color yellow (value is 7).
	 */
	public static final int COLOR_YELLOW = 7;

	/**
	 * Default color dark yellow (value is 8).
	 */
	public static final int COLOR_DARK_YELLOW = 8;

	/**
	 * Default color blue (value is 9).
	 */
	public static final int COLOR_BLUE = 9;

	/**
	 * Default color dark blue (value is 10).
	 */
	public static final int COLOR_DARK_BLUE = 10;

	/**
	 * Default color magenta (value is 11).
	 */
	public static final int COLOR_MAGENTA = 11;

	/**
	 * Default color dark magenta (value is 12).
	 */
	public static final int COLOR_DARK_MAGENTA = 12;

	/**
	 * Default color cyan (value is 13).
	 */
	public static final int COLOR_CYAN = 13;

	/**
	 * Default color dark cyan (value is 14).
	 */
	public static final int COLOR_DARK_CYAN = 14;

	/**
	 * Default color gray (value is 15).
	 */
	public static final int COLOR_GRAY = 15;

	/**
	 * Default color dark gray (value is 16).
	 */
	public static final int COLOR_DARK_GRAY = 16;
	
	/*
	 * System Colors
	 *
	 * Dealing with system colors is an area where there are
	 * many platform differences.  On some platforms, system
	 * colors can change dynamically while the program is
	 * running.  On other platforms, system colors can be
	 * changed for all instances of a particular widget.
	 * Therefore, the only truly portable method to obtain
	 * a widget color query is to query the color from an
	 * instance of the widget.
	 *
	 *	It is expected that the list of supported colors
	 * will grow over time.
	 */
	
	/**
	 * System color used to paint dark shadow areas (value is 17).
	 */
	public static final int COLOR_WIDGET_DARK_SHADOW = 17;

	/**
	 * System color used to paint normal shadow areas (value is 18).
	 */
	public static final int COLOR_WIDGET_NORMAL_SHADOW = 18;

	/**
	 * System color used to paint light shadow areas (value is 19).
	 */
	public static final int COLOR_WIDGET_LIGHT_SHADOW = 19;

	/**
	 * System color used to paint highlight shadow areas (value is 20).
	 */
	public static final int COLOR_WIDGET_HIGHLIGHT_SHADOW = 20;

	/**
	 * System color used to paint foreground areas (value is 21).
	 */
	public static final int COLOR_WIDGET_FOREGROUND = 21;

	/**
	 * System color used to paint background areas (value is 22).
	 */
	public static final int COLOR_WIDGET_BACKGROUND = 22;

	/**
	 * System color used to paint border areas (value is 23).
	 */
	public static final int COLOR_WIDGET_BORDER = 23;

	/**
	 * System color used to paint list foreground areas (value is 24).
	 */
	public static final int COLOR_LIST_FOREGROUND = 24;

	/**
	 * System color used to paint list background areas (value is 25).
	 */
	public static final int COLOR_LIST_BACKGROUND = 25;

	/**
	 * System color used to paint list selection background areas (value is 26).
	 */
	public static final int COLOR_LIST_SELECTION = 26;

	/**
	 * System color used to paint list selected text (value is 27).
	 */
	public static final int COLOR_LIST_SELECTION_TEXT = 27;

	/**
	 * System color used to paint tooltip text (value is 28).
	 */
	public static final int COLOR_INFO_FOREGROUND = 28;

	/**
	 * System color used to paint tooltip background areas (value is 29).
	 */
	public static final int COLOR_INFO_BACKGROUND = 29;
	
	/**
	 * System color used to paint title text (value is 30).
	 */
	public static final int COLOR_TITLE_FOREGROUND = 30;

	/**
	 * System color used to paint title background areas (value is 31).
	 */
	public static final int COLOR_TITLE_BACKGROUND = 31;

	/**
	 * System color used to paint title background gradient (value is 32).
	 */
	public static final int COLOR_TITLE_BACKGROUND_GRADIENT = 32;
	
	/**
	 * System color used to paint inactive title text (value is 33).
	 */
	public static final int COLOR_TITLE_INACTIVE_FOREGROUND = 33;

	/**
	 * System color used to paint inactive title background areas (value is 34).
	 */
	public static final int COLOR_TITLE_INACTIVE_BACKGROUND = 34;

	/**
	 * System color used to paint inactive title background gradient (value is 35).
	 */
	public static final int COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = 35;

	/**
	 * System color used to paint link text (value is 36).
	 * 
	 * @since 3.102
	 */
	public static final int COLOR_LINK_FOREGROUND = 36;
	
	/**
	 * Draw constant indicating whether the drawing operation
	 * should fill the background (value is 1&lt;&lt;0).
	 */
	public static final int DRAW_TRANSPARENT = 1 << 0;

	/**
	 * Draw constant indicating whether the string drawing operation
	 * should handle line-delimiters (value is 1&lt;&lt;1).
	 */
	public static final int DRAW_DELIMITER = 1 << 1;

	/**
	 * Draw constant indicating whether the string drawing operation
	 * should expand TAB characters (value is 1&lt;&lt;2).
	 */
	public static final int DRAW_TAB = 1 << 2;

	/**
	 * Draw constant indicating whether the string drawing operation
	 * should handle mnemonics (value is 1&lt;&lt;3).
	 */
	public static final int DRAW_MNEMONIC = 1 << 3;	

	
	/**
	 * Selection constant indicating that a line delimiter should be 
	 * drawn (value is 1&lt;&lt;17).
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextLayout</code></li>
	 * </ul></p>
	 *
	 * @see #FULL_SELECTION
	 * @see #LAST_LINE_SELECTION
	 * 
	 * @since 3.3
	 */
	public static final int DELIMITER_SELECTION = 1 << 17;
	
	/**
	 * Selection constant indicating that the last line is selected
	 * to the end and should be drawn using either a line delimiter 
	 * or full line selection (value is 1&lt;&lt;20).
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>TextLayout</code></li>
	 * </ul></p>
	 * 
	 * @see #DELIMITER_SELECTION
	 * @see #FULL_SELECTION
	 * 
	 * @since 3.3
	 */
	public static final int LAST_LINE_SELECTION = 1 << 20;
	
	/** 
	 * SWT error constant indicating that no error number was specified
	 * (value is 1).
	 */
	public static final int ERROR_UNSPECIFIED = 1;
	
	/** 
	 * SWT error constant indicating that no more handles for an
	 * operating system resource are available
	 * (value is 2).
	 */
	public static final int ERROR_NO_HANDLES = 2;
	
	/** 
	 * SWT error constant indicating that no more callback resources are available
	 * (value is 3).
	 */
	public static final int ERROR_NO_MORE_CALLBACKS = 3;
	
	/** 
	 * SWT error constant indicating that a null argument was passed in
	 * (value is 4). 
	 */
	public static final int ERROR_NULL_ARGUMENT = 4;
	
	/** 
	 * SWT error constant indicating that an invalid argument was passed in
	 * (value is 5).
	 */
	public static final int ERROR_INVALID_ARGUMENT = 5;
	
	/** 
	 * SWT error constant indicating that a value was found to be
	 * outside the allowable range
	 * (value is 6).
	 */
	public static final int ERROR_INVALID_RANGE = 6;
	
	/** 
	 * SWT error constant indicating that a value which can not be 
	 * zero was found to be
	 * (value is 7).
	 */
	public static final int ERROR_CANNOT_BE_ZERO = 7;
	
	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to provide the value of an item
	 * (value is 8).
	 */
	public static final int ERROR_CANNOT_GET_ITEM = 8;
	
	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to provide the selection
	 * (value is 9).
	 */
	public static final int ERROR_CANNOT_GET_SELECTION = 9;

	/** 
	 * SWT error constant indicating that the matrix is not invertible
	 * (value is 10).
	 * 
	 * @since 3.1
	 */
	public static final int ERROR_CANNOT_INVERT_MATRIX = 10;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to provide the height of an item
	 * (value is 11).
	 */
	public static final int ERROR_CANNOT_GET_ITEM_HEIGHT = 11;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to provide the text of a widget
	 * (value is 12).
	 */
	public static final int ERROR_CANNOT_GET_TEXT = 12;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to set the text of a widget
	 * (value is 13).
	 */
	public static final int ERROR_CANNOT_SET_TEXT = 13;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to add an item
	 * (value is 14).
	 */
	public static final int ERROR_ITEM_NOT_ADDED = 14;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to remove an item
	 * (value is 15).
	 */
	public static final int ERROR_ITEM_NOT_REMOVED = 15;

	/** 
	 * SWT error constant indicating that the graphics library
	 * is not available
	 * (value is 16).
	 */
	public static final int ERROR_NO_GRAPHICS_LIBRARY = 16;

	/** 
	 * SWT error constant indicating that a particular feature has
	 * not been implemented on this platform
	 * (value is 20).
	 */
	public static final int ERROR_NOT_IMPLEMENTED = 20;

	/** 
	 * SWT error constant indicating that a menu which needed
	 * to have the drop down style had some other style instead
	 * (value is 21).
	 */
	public static final int ERROR_MENU_NOT_DROP_DOWN = 21;

	/** 
	 * SWT error constant indicating that an attempt was made to
	 * invoke an SWT operation which can only be executed by the
	 * user-interface thread from some other thread
	 * (value is 22).
	 */
	public static final int ERROR_THREAD_INVALID_ACCESS = 22;

	/** 
	 * SWT error constant indicating that an attempt was made to
	 * invoke an SWT operation using a widget which had already
	 * been disposed
	 * (value is 24). 
	 */
	public static final int ERROR_WIDGET_DISPOSED = 24;

	/** 
	 * SWT error constant indicating that a menu item which needed
	 * to have the cascade style had some other style instead
	 * (value is 27).
	 */
	public static final int ERROR_MENUITEM_NOT_CASCADE = 27;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to set the selection of a widget
	 * (value is 28).
	 */
	public static final int ERROR_CANNOT_SET_SELECTION = 28;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to set the menu
	 * (value is 29).
	 */
	public static final int ERROR_CANNOT_SET_MENU = 29;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to set the enabled state
	 * (value is 30).
	 */
	public static final int ERROR_CANNOT_SET_ENABLED = 30;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to provide enabled/disabled state information
	 * (value is 31).
	 */
	public static final int ERROR_CANNOT_GET_ENABLED = 31;

	/** 
	 * SWT error constant indicating that a provided widget can
	 * not be used as a parent in the current operation
	 * (value is 32).
	 */
	public static final int ERROR_INVALID_PARENT = 32;
	
	/** 
	 * SWT error constant indicating that a menu which needed
	 * to have the menu bar style had some other style instead
	 * (value is 33).
	 */
	public static final int ERROR_MENU_NOT_BAR = 33;

	/** 
	 * SWT error constant indicating that the underlying operating
	 * system was unable to provide count information
	 * (value is 36).
	 */
	public static final int ERROR_CANNOT_GET_COUNT = 36;

	/** 
	 * SWT error constant indicating that a menu which needed
	 * to have the pop up menu style had some other style instead
	 * (value is 37).
	 */
	public static final int ERROR_MENU_NOT_POP_UP = 37;

	/** 
	 * SWT error constant indicating that a graphics operation
	 * was attempted with an image of an unsupported depth
	 * (value is 38).
	 */
	public static final int ERROR_UNSUPPORTED_DEPTH = 38;

	/** 
	 * SWT error constant indicating that an input/output operation
	 * failed during the execution of an SWT operation
	 * (value is 39).
	 */
	public static final int ERROR_IO = 39;

	/** 
	 * SWT error constant indicating that a graphics operation
	 * was attempted with an image having an invalid format
	 * (value is 40).
	 */
	public static final int ERROR_INVALID_IMAGE = 40;

	/** 
	 * SWT error constant indicating that a graphics operation
	 * was attempted with an image having a valid but unsupported
	 * format
	 * (value is 42).
	 */
	public static final int ERROR_UNSUPPORTED_FORMAT = 42;

	/** 
	 * SWT error constant indicating that an attempt was made
	 * to subclass an SWT widget class without implementing the
	 * <code>checkSubclass()</code> method
	 * (value is 43).
	 * 
	 * For additional information see the comment in 
	 * <code>Widget.checkSubclass()</code>.
	 *
	 * @see org.eclipse.swt.widgets.Widget#checkSubclass
	 */
	public static final int ERROR_INVALID_SUBCLASS = 43;

	/** 
	 * SWT error constant indicating that an attempt was made to
	 * invoke an SWT operation using a graphics object which had
	 * already been disposed
	 * (value is 44).
	 */
	public static final int ERROR_GRAPHIC_DISPOSED = 44;
	
	/** 
	 * SWT error constant indicating that an attempt was made to
	 * invoke an SWT operation using a device which had already
	 * been disposed
	 * (value is 45). 
	 */
	public static final int ERROR_DEVICE_DISPOSED = 45;
	
	/** 
	 * SWT error constant indicating that an exception happened
	 * when executing a runnable
	 * (value is 46).
	 */
	public static final int ERROR_FAILED_EXEC = 46;
	
	/** 
	 * SWT error constant indicating that an unsatisfied link
	 * error occurred while attempting to load a library
	 * (value is 47).
	 * 
	 * @since 3.1
	 */
	public static final int ERROR_FAILED_LOAD_LIBRARY = 47;

	/** 
	 * SWT error constant indicating that a font is not valid
	 * (value is 48).
	 * 
	 * @since 3.1
	 */
	public static final int ERROR_INVALID_FONT = 48;

	/** 
	 * SWT error constant indicating that an attempt was made to
	 * use an BrowserFunction object which had already been disposed
	 * (value is 49).
	 * 
	 * @since 3.5
	 */
	public static final int ERROR_FUNCTION_DISPOSED = 49;

	/** 
	 * SWT error constant indicating that an exception happened
	 * when evaluating a javascript expression
	 * (value is 50).
	 * 
	 * @since 3.5
	 */
	public static final int ERROR_FAILED_EVALUATE = 50;

	/** 
	 * SWT error constant indicating that an invalid value was returned
	 * (value is 51).
	 * 
	 * @since 3.5
	 */
	public static final int ERROR_INVALID_RETURN_VALUE = 51;

	/**
	 * Constant indicating that an image or operation is of type bitmap  (value is 0).
	 */	
	public static final int BITMAP = 0;

	/**
	 * Constant indicating that an image or operation is of type icon  (value is 1).
	 */	
	public static final int ICON = 1;

	/**
	 * The <code>Image</code> constructor argument indicating that
	 * the new image should be a copy of the image provided as
	 * an argument  (value is 0).
	 */	
	public static final int IMAGE_COPY = 0;

	/**
	 * The <code>Image</code> constructor argument indicating that
	 * the new image should have the appearance of a "disabled"
	 * (using the platform's rules for how this should look)
	 * copy of the image provided as an argument  (value is 1).
	 */	
	public static final int IMAGE_DISABLE = 1;
	
	/**
	 * The <code>Image</code> constructor argument indicating that
	 * the new image should have the appearance of a "gray scaled"
	 * copy of the image provided as an argument  (value is 2).
	 */	
	public static final int IMAGE_GRAY = 2;
	
	/**
	 * Constant to indicate an error state (value is 1).
	 * <p><b>Used By:</b><ul>
	 * <li><code>ProgressBar</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int ERROR = 1;
	
	/**
	 * Constant to a indicate a paused state (value is 4).
	 * <p><b>Used By:</b><ul>
	 * <li><code>ProgressBar</code></li>
	 * </ul></p>
	 * 
	 * @since 3.4
	 */
	public static final int PAUSED = 1 << 2;
	
	/**
	 * The font style constant indicating a normal weight, non-italic font
	 * (value is 0). This constant is also used with <code>ProgressBar</code>
	 * to indicate a normal state.
	 * <p><b>Used By:</b><ul>
	 * <li><code>ProgressBar</code></li>
	 * </ul></p>
	 */
	public static final int NORMAL = 0;
	
	/**
	 * The font style constant indicating a bold weight font
	 * (value is 1&lt;&lt;0).
	 */
	public static final int BOLD = 1 << 0;
	
	/**
	 * The font style constant indicating an italic font
	 * (value is 1&lt;&lt;1).
	 */
	public static final int ITALIC = 1 << 1;
		
	/**
	 * System arrow cursor  (value is 0).
	 */
	public static final int CURSOR_ARROW = 0;
		
	/**
	 * System wait cursor  (value is 1).
	 */
	public static final int CURSOR_WAIT = 1;
		
	/**
	 * System cross hair cursor  (value is 2).
	 */
	public static final int CURSOR_CROSS = 2;
		
	/**
	 * System app startup cursor  (value is 3).
	 */
	public static final int CURSOR_APPSTARTING = 3;
		
	/**
	 * System help cursor  (value is 4).
	 */
	public static final int CURSOR_HELP = 4;
		
	/**
	 * System resize all directions cursor (value is 5).
	 */
	public static final int CURSOR_SIZEALL = 5;
		
	/**
	 * System resize north-east-south-west cursor  (value is 6).
	 */
	public static final int CURSOR_SIZENESW = 6;
		
	/**
	 * System resize north-south cursor  (value is 7).
	 */
	public static final int CURSOR_SIZENS = 7;
		
	/**
	 * System resize north-west-south-east cursor  (value is 8).
	 */
	public static final int CURSOR_SIZENWSE = 8;
		
	/**
	 * System resize west-east cursor  (value is 9).
	 */
	public static final int CURSOR_SIZEWE = 9;
		
	/**
	 * System resize north cursor  (value is 10).
	 */
	public static final int CURSOR_SIZEN = 10;
		
	/**
	 * System resize south cursor  (value is 11).
	 */
	public static final int CURSOR_SIZES = 11;
		
	/**
	 * System resize east cursor  (value is 12).
	 */
	public static final int CURSOR_SIZEE = 12;
		
	/**
	 * System resize west cursor  (value is 13).
	 */
	public static final int CURSOR_SIZEW = 13;
		
	/**
	 * System resize north-east cursor (value is 14).
	 */
	public static final int CURSOR_SIZENE = 14;
		
	/**
	 * System resize south-east cursor (value is 15).
	 */
	public static final int CURSOR_SIZESE = 15;
		
	/**
	 * System resize south-west cursor (value is 16).
	 */
	public static final int CURSOR_SIZESW = 16;
		
	/**
	 * System resize north-west cursor (value is 17).
	 */
	public static final int CURSOR_SIZENW = 17;
		
	/**
	 * System up arrow cursor  (value is 18).
	 */
	public static final int CURSOR_UPARROW = 18;
		
	/**
	 * System i-beam cursor (value is 19).
	 */
	public static final int CURSOR_IBEAM = 19;
		
	/**
	 * System "not allowed" cursor (value is 20).
	 */
	public static final int CURSOR_NO = 20;
		
	/**
	 * System hand cursor (value is 21).
	 */
	public static final int CURSOR_HAND = 21;
		
	/**
	 * Line drawing style for flat end caps (value is 1).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineCap(int)
	 * @see org.eclipse.swt.graphics.GC#getLineCap()
	 * 
	 * @since 3.1
	 */
	public static final int CAP_FLAT = 1;

	/**
	 * Line drawing style for rounded end caps (value is 2).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineCap(int)
	 * @see org.eclipse.swt.graphics.GC#getLineCap()
	 * 
	 * @since 3.1
	 */
	public static final int CAP_ROUND = 2;

	/**
	 * Line drawing style for square end caps (value is 3).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineCap(int)
	 * @see org.eclipse.swt.graphics.GC#getLineCap()
	 * 
	 * @since 3.1
	 */
	public static final int CAP_SQUARE = 3;

	/**
	 * Line drawing style for miter joins (value is 1).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineJoin(int)
	 * @see org.eclipse.swt.graphics.GC#getLineJoin()
	 * 
	 * @since 3.1
	 */
	public static final int JOIN_MITER = 1;

	/**
	 * Line drawing  style for rounded joins (value is 2).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineJoin(int)
	 * @see org.eclipse.swt.graphics.GC#getLineJoin()
	 * 
	 * @since 3.1
	 */
	public static final int JOIN_ROUND = 2;

	/**
	 * Line drawing style for bevel joins (value is 3).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineJoin(int)
	 * @see org.eclipse.swt.graphics.GC#getLineJoin()
	 * 
	 * @since 3.1
	 */
	public static final int JOIN_BEVEL = 3;

	/**
	 * Line drawing style for solid lines  (value is 1).
	 */
	public static final int LINE_SOLID = 1;
		
	/**
	 * Line drawing style for dashed lines (value is 2).
	 */
	public static final int LINE_DASH = 2;
		
	/**
	 * Line drawing style for dotted lines (value is 3).
	 */
	public static final int LINE_DOT = 3;
		
	/**
	 * Line drawing style for alternating dash-dot lines (value is 4).
	 */
	public static final int LINE_DASHDOT = 4;
		
	/**
	 * Line drawing style for dash-dot-dot lines (value is 5).
	 */
	public static final int LINE_DASHDOTDOT = 5;

	/**
	 * Line drawing style for custom dashed lines (value is 6).
	 * 
	 * @see org.eclipse.swt.graphics.GC#setLineDash(int[])
	 * @see org.eclipse.swt.graphics.GC#getLineDash()
	 * 
	 * @since 3.1
	 */
	public static final int LINE_CUSTOM = 6;
	
	/**
	 * Path constant that represents a "move to" operation (value is 1).
	 * 
	 * @since 3.1
	 */
	public static final int PATH_MOVE_TO = 1;

	/**
	 * Path constant that represents a "line to" operation (value is 2).
	 * 
	 * @since 3.1
	 */
	public static final int PATH_LINE_TO = 2;

	/**
	 * Path constant that represents a "quadratic curve to" operation (value is 3).
	 * 
	 * @since 3.1
	 */
	public static final int PATH_QUAD_TO = 3;

	/**
	 * Path constant that represents a "cubic curve to" operation (value is 4).
	 * 
	 * @since 3.1
	 */
	public static final int PATH_CUBIC_TO = 4;

	/**
	 * Path constant that represents a "close" operation (value is 5).
	 * 
	 * @since 3.1
	 */
	public static final int PATH_CLOSE = 5;

	/**
	 * Even odd rule for filling operations (value is 1).
	 * 
	 * @since 3.1
	 */
	public static final int FILL_EVEN_ODD = 1;

	/**
	 * Winding rule for filling operations (value is 2).
	 * 
	 * @since 3.1
	 */
	public static final int FILL_WINDING = 2;

	/**
	 * Image format constant indicating an unknown image type (value is -1).
	 */
	public static final int IMAGE_UNDEFINED = -1;

	/**
	 * Image format constant indicating a Windows BMP format image (value is 0).
	 */
	public static final int IMAGE_BMP = 0;

	/**
	 * Image format constant indicating a run-length encoded 
	 * Windows BMP format image (value is 1).
	 */
	public static final int IMAGE_BMP_RLE = 1;

	/**
	 * Image format constant indicating a GIF format image (value is 2).
	 */
	public static final int IMAGE_GIF = 2;

	/**
	 * Image format constant indicating a ICO format image (value is 3).
	 */
	public static final int IMAGE_ICO = 3;

	/**
	 * Image format constant indicating a JPEG format image (value is 4).
	 */
	public static final int IMAGE_JPEG = 4;

	/**
	 * Image format constant indicating a PNG format image (value is 5).
	 */
	public static final int IMAGE_PNG = 5;

	/**
	 * Image format constant indicating a TIFF format image (value is 6).
	 */
	public static final int IMAGE_TIFF = 6;

	/**
	 * Image format constant indicating an OS/2 BMP format image (value is 7).
	 */
	public static final int IMAGE_OS2_BMP = 7;

	/**
	 * GIF image disposal method constants indicating that the
	 * disposal method is unspecified (value is 0).
	 */
	public static final int DM_UNSPECIFIED = 0x0;

	/**
	 * GIF image disposal method constants indicating that the
	 * disposal method is to do nothing; that is, to leave the 
	 * previous image in place (value is 1).
	 */
	public static final int DM_FILL_NONE = 0x1;

	/**
	 * GIF image disposal method constants indicating that the
	 * the previous images should be covered with the background
	 * color before displaying the next image (value is 2).
	 */
	public static final int DM_FILL_BACKGROUND = 0x2;

	/**
	 * GIF image disposal method constants indicating that the
	 * disposal method is to restore the previous picture
	 * (value is 3).
	 */
	public static final int DM_FILL_PREVIOUS = 0x3;
	
	/**
	 * Image transparency constant indicating that the image
	 * contains no transparency information (value is 0).
	 */
	public static final int TRANSPARENCY_NONE = 0x0;
	
	/**
	 * Image transparency constant indicating that the image
	 * contains alpha transparency information (value is 1&lt;&lt;0).
	 */
	public static final int TRANSPARENCY_ALPHA = 1 << 0;
	
	/**
	 * Image transparency constant indicating that the image
	 * contains a transparency mask (value is 1&lt;&lt;1).
	 */
	public static final int TRANSPARENCY_MASK = 1 << 1;
	
	/**
	 * Image transparency constant indicating that the image
	 * contains a transparent pixel (value is 1&lt;&lt;2).
	 */
	public static final int TRANSPARENCY_PIXEL = 1 << 2;

	/**
	 * The character movement type (value is 1&lt;&lt;0).
	 * This constant is used to move a text offset over a character.
	 * 
	 * @see org.eclipse.swt.graphics.TextLayout#getNextOffset(int, int)
	 * @see org.eclipse.swt.graphics.TextLayout#getPreviousOffset(int, int)
	 * 
	 * @since 3.0
	 */	
	public static final int MOVEMENT_CHAR = 1 << 0;

	/**
	 * The cluster movement type (value is 1&lt;&lt;1).
	 * This constant is used to move a text offset over a cluster.
	 * A cluster groups one or more characters. A cluster is 
	 * undivisible, this means that a caret offset can not be placed in the
	 * middle of a cluster.  
	 * 
	 * @see org.eclipse.swt.graphics.TextLayout#getNextOffset(int, int)
	 * @see org.eclipse.swt.graphics.TextLayout#getPreviousOffset(int, int)
	 * 
	 * @since 3.0
	 */
	public static final int MOVEMENT_CLUSTER = 1 << 1;

	/**
	 * The word movement type (value is 1&lt;&lt;2).
	 * This constant is used to move a text offset over a word.
	 * The behavior of this constant depends on the platform and on the 
	 * direction of the movement. For example, on Windows the stop is 
	 * always at the start of the word. On GTK and Mac the stop is at the end 
	 * of the word if the direction is next and at the start of the word if the 
	 * direction is previous.
	 * 
	 * @see org.eclipse.swt.graphics.TextLayout#getNextOffset(int, int)
	 * @see org.eclipse.swt.graphics.TextLayout#getPreviousOffset(int, int)
	 * 
	 * @since 3.0
	 */	
	public static final int MOVEMENT_WORD = 1 << 2;

	/**
	 * The word end movement type (value is 1&lt;&lt;3).
	 * This constant is used to move a text offset to the next or previous
	 * word end. The behavior of this constant does not depend on the platform.  
	 * 
	 * 
	 * @see org.eclipse.swt.graphics.TextLayout#getNextOffset(int, int)
	 * @see org.eclipse.swt.graphics.TextLayout#getPreviousOffset(int, int)
	 * 
	 * @since 3.3
	 */	
	public static final int MOVEMENT_WORD_END = 1 << 3;

	/**
	 * The word start movement type (value is 1&lt;&lt;4).
	 * This constant is used to move a text offset to the next or previous
	 * word start. The behavior of this constant does not depend on the platform.  
	 * 
	 * @see org.eclipse.swt.graphics.TextLayout#getNextOffset(int, int)
	 * @see org.eclipse.swt.graphics.TextLayout#getPreviousOffset(int, int)
	 * 
	 * @since 3.3
	 */	
	public static final int MOVEMENT_WORD_START = 1 << 4;

	/**
	 * A constant indicating that a given operation should be performed on
	 * all widgets (value is 1&lt;&lt;0).
	 * 
	 * <p><b>Used By:</b><ul>
	 * <li><code>Composite</code> layout</li>
	 * </ul></p>
	 * 
	 * @see org.eclipse.swt.widgets.Composite#layout(org.eclipse.swt.widgets.Control[], int)
	 * 
	 * @since 3.6
	 */
	public static final int ALL = 1 << 0;
	
	/**
	 * ID for the About menu item (value is -1).
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#setID(int)
	 * @see org.eclipse.swt.widgets.MenuItem#getID()
	 * 
	 * @since 3.7
	 */
	public static final int ID_ABOUT = -1;

	/**
	 * ID for the Preferences menu item (value is -2).
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#setID(int)
	 * @see org.eclipse.swt.widgets.MenuItem#getID()
	 * 
	 * @since 3.7
	 */
	public static final int ID_PREFERENCES = -2;

	/**
	 * ID for the Hide menu item (value is -3).
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#setID(int)
	 * @see org.eclipse.swt.widgets.MenuItem#getID()
	 * 
	 * @since 3.7
	 */
	public static final int ID_HIDE = -3;

	/**
	 * ID for the Hide Others menu item (value is -4).
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#setID(int)
	 * @see org.eclipse.swt.widgets.MenuItem#getID()
	 * 
	 * @since 3.7
	 */
	public static final int ID_HIDE_OTHERS = -4;
	
	/**
	 * ID for the Show All menu item (value is -5).
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#setID(int)
	 * @see org.eclipse.swt.widgets.MenuItem#getID()
	 * 
	 * @since 3.7
	 */
	public static final int ID_SHOW_ALL = -5;
	
	/**
	 * ID for the Quit menu item (value is -6).
	 * 
	 * @see org.eclipse.swt.widgets.MenuItem#setID(int)
	 * @see org.eclipse.swt.widgets.MenuItem#getID()
	 * 
	 * @since 3.7
	 */
	public static final int ID_QUIT = -6;

	/**
	 * Key value for setting and getting the skin class of a widget. 
	 * 
	 * @see org.eclipse.swt.widgets.Widget#getData(String)
	 * @see org.eclipse.swt.widgets.Widget#setData(String, Object)
	 * 
	 * @since 3.6
	 */
	public static final String SKIN_CLASS = "org.eclipse.swt.skin.class"; //$NON-NLS-1$

	/**
	 * Key value for setting and getting the skin id of a widget.
	 * 
	 * @see org.eclipse.swt.widgets.Widget#getData(String)
	 * @see org.eclipse.swt.widgets.Widget#setData(String, Object)
	 * 
	 * @since 3.6
	 */
	public static final String SKIN_ID = "org.eclipse.swt.skin.id"; //$NON-NLS-1$
	
	/**
	 * The <code>Scrollable</code> constant to indicate that
	 * the receiver is using overlay scrollbars. (value is 1)
	 *
	 * @since 3.8
	 */
	public static final int SCROLLBAR_OVERLAY = 1 << 1;
	 	

/**
 * Returns a boolean indicating whether this SWT implementation can
 * be loaded.  Examples of criteria that may be used to determine this
 * include the OS and architecture of the JRE that is being used.
 *
 * @return <code>true</code> if this SWT implementation can be loaded
 * and <code>false</code> otherwise
 *
 * @since 3.8
 */
public static boolean isLoadable () {
	return Platform.isLoadable ();
}

/**
 * Answers a concise, human readable description of the error code.
 *
 * @param code the SWT error code.
 * @return a description of the error code.
 *
 * @see SWT
 */
static String findErrorText (int code) {
	switch (code) {
		case ERROR_UNSPECIFIED:            return "Unspecified error"; //$NON-NLS-1$
		case ERROR_NO_HANDLES:			   return "No more handles"; //$NON-NLS-1$
		case ERROR_NO_MORE_CALLBACKS:      return "No more callbacks"; //$NON-NLS-1$
		case ERROR_NULL_ARGUMENT:          return "Argument cannot be null"; //$NON-NLS-1$
		case ERROR_INVALID_ARGUMENT:       return "Argument not valid"; //$NON-NLS-1$
		case ERROR_INVALID_RETURN_VALUE:   return "Return value not valid"; //$NON-NLS-1$
		case ERROR_INVALID_RANGE:          return "Index out of bounds"; //$NON-NLS-1$
		case ERROR_CANNOT_BE_ZERO:         return "Argument cannot be zero"; //$NON-NLS-1$
		case ERROR_CANNOT_GET_ITEM:        return "Cannot get item"; //$NON-NLS-1$
		case ERROR_CANNOT_GET_SELECTION:   return "Cannot get selection"; //$NON-NLS-1$
		case ERROR_CANNOT_GET_ITEM_HEIGHT: return "Cannot get item height"; //$NON-NLS-1$
		case ERROR_CANNOT_GET_TEXT:        return "Cannot get text"; //$NON-NLS-1$
		case ERROR_CANNOT_SET_TEXT:        return "Cannot set text"; //$NON-NLS-1$
		case ERROR_ITEM_NOT_ADDED:         return "Item not added"; //$NON-NLS-1$
		case ERROR_ITEM_NOT_REMOVED:       return "Item not removed"; //$NON-NLS-1$
		case ERROR_NOT_IMPLEMENTED:        return "Not implemented"; //$NON-NLS-1$
		case ERROR_MENU_NOT_DROP_DOWN:     return "Menu must be a drop down"; //$NON-NLS-1$
		case ERROR_THREAD_INVALID_ACCESS:  return "Invalid thread access"; //$NON-NLS-1$
		case ERROR_WIDGET_DISPOSED:        return "Widget is disposed"; //$NON-NLS-1$
		case ERROR_MENUITEM_NOT_CASCADE:   return "Menu item is not a CASCADE"; //$NON-NLS-1$
		case ERROR_CANNOT_SET_SELECTION:   return "Cannot set selection";  //$NON-NLS-1$
		case ERROR_CANNOT_SET_MENU:        return "Cannot set menu";  //$NON-NLS-1$
		case ERROR_CANNOT_SET_ENABLED:     return "Cannot set the enabled state";  //$NON-NLS-1$
		case ERROR_CANNOT_GET_ENABLED:     return "Cannot get the enabled state";  //$NON-NLS-1$
		case ERROR_INVALID_PARENT:         return "Widget has the wrong parent";  //$NON-NLS-1$
		case ERROR_MENU_NOT_BAR:           return "Menu is not a BAR";  //$NON-NLS-1$
		case ERROR_CANNOT_GET_COUNT:       return "Cannot get count"; //$NON-NLS-1$
		case ERROR_MENU_NOT_POP_UP:        return "Menu is not a POP_UP"; //$NON-NLS-1$
		case ERROR_UNSUPPORTED_DEPTH:      return "Unsupported color depth"; //$NON-NLS-1$
		case ERROR_IO:                     return "i/o error"; //$NON-NLS-1$
		case ERROR_INVALID_IMAGE:          return "Invalid image"; //$NON-NLS-1$
		case ERROR_UNSUPPORTED_FORMAT:     return "Unsupported or unrecognized format"; //$NON-NLS-1$
		case ERROR_INVALID_SUBCLASS:       return "Subclassing not allowed"; //$NON-NLS-1$
		case ERROR_GRAPHIC_DISPOSED:       return "Graphic is disposed"; //$NON-NLS-1$
		case ERROR_DEVICE_DISPOSED:        return "Device is disposed"; //$NON-NLS-1$
		case ERROR_FUNCTION_DISPOSED:      return "BrowserFunction is disposed"; //$NON-NLS-1$
		case ERROR_FAILED_EXEC:            return "Failed to execute runnable"; //$NON-NLS-1$
		case ERROR_FAILED_EVALUATE:        return "Failed to evaluate javascript expression"; //$NON-NLS-1$
		case ERROR_FAILED_LOAD_LIBRARY:    return "Unable to load library"; //$NON-NLS-1$
		case ERROR_CANNOT_INVERT_MATRIX:    return "Cannot invert matrix"; //$NON-NLS-1$
		case ERROR_NO_GRAPHICS_LIBRARY:    return "Unable to load graphics library"; //$NON-NLS-1$
		case ERROR_INVALID_FONT:    		return "Font not valid"; //$NON-NLS-1$
	}
	return "Unknown error"; //$NON-NLS-1$
}

/**
 * Returns the NLS'ed message for the given argument.
 * 
 * @param key the key to look up
 * @return the message for the given key
 * 
 * @exception IllegalArgumentException <ul>
 *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
 * </ul>
 */
public static String getMessage(String key) {
	return Compatibility.getMessage(key);
}

/**
 * Returns the NLS'ed message for the given arguments.
 * 
 * @param key the key to look up
 * @param args the parameters to insert into the message
 * @return the message for the given parameterized key
 * 
 * @exception IllegalArgumentException <ul>
 *    <li>ERROR_NULL_ARGUMENT - if the key or args are null</li>
 * </ul>
 * 
 * @since 3.8
 */
public static String getMessage(String key, Object[] args) {
	return Compatibility.getMessage(key, args);
}

/**
 * Returns the SWT platform name.
 * Examples: "win32", "motif", "gtk", "photon", "carbon", "cocoa", "wpf"
 *
 * @return the SWT platform name
 */
public static String getPlatform () {
	return Platform.PLATFORM;
}

/**
 * Returns the SWT version number as an integer.
 * Example: "SWT051" == 51
 *
 * @return the SWT version number
 */
public static int getVersion () {
	return Library.SWT_VERSION;
}

/**
 * Throws an appropriate exception based on the passed in error code.
 *
 * @param code the SWT error code
 */
public static void error (int code) {
	error (code, null);
}

/**
 * Throws an appropriate exception based on the passed in error code.
 * The <code>throwable</code> argument should be either null, or the
 * throwable which caused SWT to throw an exception.
 * <p>
 * In SWT, errors are reported by throwing one of three exceptions:
 * <dl>
 * <dd>java.lang.IllegalArgumentException</dd>
 * <dt>thrown whenever one of the API methods is invoked with an illegal argument</dt>
 * <dd>org.eclipse.swt.SWTException (extends java.lang.RuntimeException)</dd>
 * <dt>thrown whenever a recoverable error happens internally in SWT</dt>
 * <dd>org.eclipse.swt.SWTError (extends java.lang.Error)</dd>
 * <dt>thrown whenever a <b>non-recoverable</b> error happens internally in SWT</dt>
 * </dl>
 * This method provides the logic which maps between error codes
 * and one of the above exceptions.
 * </p>
 *
 * @param code the SWT error code.
 * @param throwable the exception which caused the error to occur.
 *
 * @see SWTError
 * @see SWTException
 * @see IllegalArgumentException
 */
public static void error (int code, Throwable throwable) {
	error (code, throwable, null);
}

/**
 * Throws an appropriate exception based on the passed in error code.
 * The <code>throwable</code> argument should be either null, or the
 * throwable which caused SWT to throw an exception.
 * <p>
 * In SWT, errors are reported by throwing one of three exceptions:
 * <dl>
 * <dd>java.lang.IllegalArgumentException</dd>
 * <dt>thrown whenever one of the API methods is invoked with an illegal argument</dt>
 * <dd>org.eclipse.swt.SWTException (extends java.lang.RuntimeException)</dd>
 * <dt>thrown whenever a recoverable error happens internally in SWT</dt>
 * <dd>org.eclipse.swt.SWTError (extends java.lang.Error)</dd>
 * <dt>thrown whenever a <b>non-recoverable</b> error happens internally in SWT</dt>
 * </dl>
 * This method provides the logic which maps between error codes
 * and one of the above exceptions.
 * </p>
 *
 * @param code the SWT error code.
 * @param throwable the exception which caused the error to occur.
 * @param detail more information about error.
 *
 * @see SWTError
 * @see SWTException
 * @see IllegalArgumentException
 * 
 * @since 3.0
 */
public static void error (int code, Throwable throwable, String detail) {

	/*
	* This code prevents the creation of "chains" of SWTErrors and
	* SWTExceptions which in turn contain other SWTErrors and 
	* SWTExceptions as their throwable. This can occur when low level
	* code throws an exception past a point where a higher layer is
	* being "safe" and catching all exceptions. (Note that, this is
	* _a_bad_thing_ which we always try to avoid.)
	*
	* On the theory that the low level code is closest to the
	* original problem, we simply re-throw the original exception here.
	* 
	* NOTE: Exceptions thrown in syncExec and asyncExec must be
	* wrapped.
	*/
	if (code != SWT.ERROR_FAILED_EXEC) {
		if (throwable instanceof SWTError) throw (SWTError) throwable;
		if (throwable instanceof SWTException) throw (SWTException) throwable;
	}

	String message = findErrorText (code);
	if (detail != null) message += detail;
	switch (code) {
		
		/* Illegal Arguments (non-fatal) */
		case ERROR_NULL_ARGUMENT: 
		case ERROR_CANNOT_BE_ZERO:
		case ERROR_INVALID_ARGUMENT:
		case ERROR_MENU_NOT_BAR:
		case ERROR_MENU_NOT_DROP_DOWN:
		case ERROR_MENU_NOT_POP_UP:
		case ERROR_MENUITEM_NOT_CASCADE:
		case ERROR_INVALID_PARENT: 		
		case ERROR_INVALID_RANGE: {
			throw new IllegalArgumentException (message);
		}
		
		/* SWT Exceptions (non-fatal) */
		case ERROR_INVALID_SUBCLASS:
		case ERROR_THREAD_INVALID_ACCESS:
		case ERROR_WIDGET_DISPOSED:
		case ERROR_GRAPHIC_DISPOSED:
		case ERROR_DEVICE_DISPOSED:
		case ERROR_FUNCTION_DISPOSED:
		case ERROR_INVALID_IMAGE:
		case ERROR_UNSUPPORTED_DEPTH:
		case ERROR_UNSUPPORTED_FORMAT:
		case ERROR_FAILED_EXEC:
		case ERROR_FAILED_EVALUATE:
		case ERROR_CANNOT_INVERT_MATRIX:
		case ERROR_NO_GRAPHICS_LIBRARY:
		case ERROR_INVALID_RETURN_VALUE:
		case ERROR_IO: {
			SWTException exception = new SWTException (code, message);
			exception.throwable = throwable;
			throw exception;
		}
		
		/* Operation System Errors (fatal, may occur only on some platforms) */
		case ERROR_CANNOT_GET_COUNT:
		case ERROR_CANNOT_GET_ENABLED:
		case ERROR_CANNOT_GET_ITEM:
		case ERROR_CANNOT_GET_ITEM_HEIGHT:
		case ERROR_CANNOT_GET_SELECTION:
		case ERROR_CANNOT_GET_TEXT:
		case ERROR_CANNOT_SET_ENABLED:
		case ERROR_CANNOT_SET_MENU:
		case ERROR_CANNOT_SET_SELECTION:
		case ERROR_CANNOT_SET_TEXT:
		case ERROR_ITEM_NOT_ADDED:
		case ERROR_ITEM_NOT_REMOVED:
		case ERROR_NO_HANDLES:
		//FALL THROUGH
		
		/* SWT Errors (fatal, may occur only on some platforms) */
		case ERROR_FAILED_LOAD_LIBRARY:
		case ERROR_NO_MORE_CALLBACKS:
		case ERROR_NOT_IMPLEMENTED:
		case ERROR_UNSPECIFIED: {
			SWTError error = new SWTError (code, message);
			error.throwable = throwable;
			throw error;
		}
	}
	
	/* Unknown/Undefined Error */
	SWTError error = new SWTError (code, message);
	error.throwable = throwable;
	throw error;
}

static {
	/*
	* These values represent bit masks that may need to
	* expand in the future.  Therefore they are not initialized
	* in the declaration to stop the compiler from inlining.
	*/
	BUTTON_MASK = BUTTON1 | BUTTON2 | BUTTON3 | BUTTON4 | BUTTON5;
	MODIFIER_MASK = ALT | SHIFT | CTRL | COMMAND;
	
	/*
	* These values can be different on different platforms.
	* Therefore they are not initialized in the declaration
	* to stop the compiler from inlining.
	*/
	String platform = getPlatform ();
	if ("carbon".equals (platform) || "cocoa".equals (platform)) { //$NON-NLS-1$ //$NON-NLS-2$
		MOD1 = COMMAND;
		MOD2 = SHIFT;
		MOD3 = ALT;
		MOD4 = CONTROL;
	} else {
		MOD1 = CONTROL;
		MOD2 = SHIFT;
		MOD3 = ALT;
		MOD4 = 0;
	}
}
}
