javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListView.java
changeset 21 2a9601315dfc
child 35 85266cc22c7f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/ListView.java	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,1858 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Nokia Corporation and/or its subsidiary(-ies).
+ * 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:
+ *     Yu You (Nokia Corp.)- initial API specification 
+ *     Nokia Corporation - S60 implementation
+ *     Nokia Corporation - QT implementation
+ *******************************************************************************/
+package org.eclipse.ercp.swt.mobile;
+
+import java.util.Vector;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.internal.qt.ListUtils;
+import org.eclipse.swt.internal.qt.OS;
+import org.eclipse.swt.internal.qt.PackageProxy;
+import org.eclipse.swt.internal.qt.WidgetState;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Internal_PackageSupport;
+import org.eclipse.swt.widgets.Scrollable;
+import org.eclipse.swt.widgets.TypedListener;
+
+/**
+ * 
+ * A widget that allows the user to select one or more items from a collection
+ * of items that can be displayed in a multi-column way with different styles.
+ * 
+ * <p>
+ * ListView lays out its children items in one or more columns from top to
+ * bottom. If a layout orientation hint is not specified, the implementation
+ * chooses the orientation. If there is only enough screen width for one column,
+ * the list scrolls vertically. If there is room to display multiple columns
+ * within the widget, then the list scrolls horizontally. The list never scrolls
+ * in more than one direction. The layout orientation may be set at runtime by
+ * calling method <code>setLayout(int)</code>.
+ * <p>
+ * The item density hint determines the size and positioning of items in order
+ * to fit more or less within the widget. Applications can query the preferred
+ * sizes of the icons for each density level. Note that the sizes may be diverse
+ * in different platforms. When the given icons do not match the prefered size,
+ * the implementation may adjust icon sizes without throwing any exception.
+ * Applications can change the item density level at runtime by calling method
+ * <code>setLayoutDensity(int)</code>. Some platforms may use context-sensitive
+ * device keys to allow the user to change the ListView's density level at
+ * run-time. For example, by activating "zoom in/out" device keys when the
+ * ListView is focused.
+ * <p>
+ * Applications can query the current layout and density values by calling the
+ * corresponding "get" methods.
+ * 
+ * <dl>
+ * <dt><b>SWT styles: </b></dt>
+ * <dd>SINGLE, MULTI: single or multiple selection</dd>
+ * <dd>VERTICAL, HORIZONTAL: defines the layout orientation</dd>
+ * <dt><b>ListView density levels: </b></dt>
+ * <dd>HIGH, MEDIUM (default), LOW: defines the item density levels that
+ * determine the numbers of visible list items per screen</dd>
+ * <dt><b>Events: </b></dt>
+ * <dd>Selection, DefaultSelection</dd>
+ * </dl>
+ * <p>
+ * Note: If styles not applicable to ListView are specified, they are ignored.
+ * </p>
+ * <p>
+ * Note: ListView is a subclass of Scrollable. Changing the scrollbar values (
+ * <code>ScrollBar.setSelection(int)</code>) will affect the scrolling position
+ * of the ListView control. However, changing the range of scrollbars, such as
+ * <code>setMaximum(int)</code> and <code>setMinimum(int)</code>, will not
+ * affect the ListView at all.
+ * </p>
+ * <p>
+ * IMPORTANT: This class is <em>not</em> intended to be subclassed.
+ * </p>
+ */
+public class ListView extends Scrollable {
+private Vector icons = new Vector();
+private int density;
+private int spacing;
+private boolean ignoreSelectionEvent;
+
+/**
+ * A low density level.
+ * 
+ * <P>
+ * Value <code>1</code> is assigned to <code>LOW</code>.
+ * </P>
+ * 
+ */
+public static final int LOW = 1;
+
+/**
+ * A medium density level.
+ * 
+ * <P>
+ * Value <code>2</code> is assigned to <code>MEDIUM</code>.
+ * </P>
+ * 
+ */
+public static final int MEDIUM = 2;
+
+/**
+ * A high density level.
+ * <P>
+ * Value <code>3</code> is assigned to <code>HIGH</code>.
+ * </P>
+ * </DL>
+ * 
+ */
+public static final int HIGH = 3;
+
+static final class ListViewPackageProxy extends PackageProxy {
+    public void createHandle(int index) {
+        ((ListView)w).createHandle(index);
+    }
+    public void hookEvents() {
+        ((ListView)w).hookEvents();
+    }
+    public void qt_signal_list_itemDoubleClicked(int selectionHandle) {
+        ((ListView)w).qt_signal_list_itemDoubleClicked(selectionHandle);
+    }
+    public void qt_signal_list_itemSelectionChanged() {
+        ((ListView)w).qt_signal_list_itemSelectionChanged();
+    }
+    public void setTraversalFlags(int type, int key, int modifier, int character) {
+        ((ListView)w).setTraversalFlags(type, key, modifier, character);
+    }
+    public Point getPreferredClientAreaSize() {
+        return ((ListView)w).getPreferredClientAreaSize();
+    }
+}
+    
+/**
+ * Constructs a new instance of this class given its parent and a style
+ * value describing its behavior and appearance.
+ * <p>
+ * The style value is either one of the style constants defined in class
+ * <code>SWT</code> which is applicable to instances of this class, or must
+ * be built by <em>bitwise OR</em> 'ing together (that is, using the
+ * <code>int</code> "|" operator) two or more of those <code>SWT</code>
+ * style constants. The class description lists the style constants that are
+ * applicable to the class. Style bits are also inherited from superclasses.
+ * </p>
+ * 
+ * @param parent
+ *            a widget which will be the parent of the new instance (cannot
+ *            be null)
+ * @param style
+ *            the style value of the widget to construct. See <a
+ *            href="#description">Description </a> for details.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the parent</li>
+ *                <li>ERROR_INVALID_SUBCLASS - if this class is not an
+ *                allowed subclass</li>
+ *                </ul>
+ * 
+ * @see SWT#SINGLE
+ * @see SWT#MULTI
+ * @see SWT#HORIZONTAL
+ * @see SWT#VERTICAL
+ */
+public ListView(Composite parent, int style) {
+    super(parent, checkStyle(style), 0, new ListViewPackageProxy(), false);
+}
+
+/**
+ * Constructs a new instance of this class given its parent and a style
+ * value describing its behavior and appearance styles.
+ * <p>
+ * The style value is either one of the style constants defined in class
+ * <code>SWT</code> which is applicable to instances of this class, or must
+ * be built by <em>bitwise OR</em> 'ing together (that is, using the
+ * <code>int</code> "|" operator) two or more of those <code>SWT</code>
+ * style constants. The class description lists the style constants that are
+ * applicable to the class. Style bits are also inherited from superclasses.
+ * </p>
+ * 
+ * <p>
+ * The density style is one of HIGH, MEDIUM and LOW.
+ * </p>
+ * 
+ * @param parent
+ *            a widget which will be the parent of the new instance (cannot
+ *            be null)
+ * @param style
+ *            the style value of the widget to construct. See <a
+ *            href="#description">Description </a> for details.
+ * @param density
+ *            the density style value.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ *                <li>ERROR_INVALID_ARGUMENT - if the density is invalid</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the parent</li>
+ *                <li>ERROR_INVALID_SUBCLASS - if this class is not an
+ *                allowed subclass</li>
+ *                </ul>
+ * 
+ * @see SWT#SINGLE
+ * @see SWT#MULTI
+ * @see SWT#HORIZONTAL
+ * @see SWT#VERTICAL
+ * @see #HIGH
+ * @see #MEDIUM
+ * @see #LOW
+ * @see #getLayoutDensity
+ */
+public ListView(Composite parent, int style, int density) {
+    super(parent, style, 0, new ListViewPackageProxy(), false);
+    if (density != LOW && density != MEDIUM && density != HIGH) {
+        SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+    }
+    this.density = density;
+}
+
+/**
+ * Adds the string item and an optional icon to the end of the receiver's
+ * list.
+ * 
+ * @param item
+ *            the new item text
+ * @param icon
+ *            the icon of the item, or null.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the item is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_ADDED - if the operation fails because
+ *                of an operating system failure</li>
+ *                </ul>
+ * 
+ * @see #add(String,Image, int)
+ */
+public void add(String item, Image icon) {
+    checkWidget();
+    ListUtils.add(topHandle(), item, icon);
+    icons.addElement(icon);
+    resetGeometry(getItemCount() - 1);
+}
+
+/**
+ * Adds the string item and an optional icon to the receiver's list at the
+ * given zero-relative index.
+ * <p>
+ * Note: To add an item at the end of the list, use the result of calling
+ * <code>getItemCount()</code> as the index or use
+ * <code>add(String, Image)</code>.
+ * </p>
+ * 
+ * @param string
+ *            the new item
+ * @param icon
+ *            the icon part of the item, or null.
+ * @param index
+ *            the index for the item
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ *                <li>ERROR_INVALID_RANGE - if the index is not between 0
+ *                and the number of elements in the list (inclusive)</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_ADDED - if the operation fails because
+ *                of an operating system failure</li>
+ *                </ul>
+ * 
+ * @see #add(String, Image)
+ */
+public void add(String item, Image icon, int index) {
+    checkWidget();
+    ListUtils.add(topHandle(), item, icon, index);
+    icons.insertElementAt(icon, index);
+    resetGeometry(index);
+}
+
+/**
+ * Adds the listener to the collection of listeners who will be notified
+ * when the receiver's selection changes. The listener receives the messages
+ * defined in the <code>SelectionListener</code> interface.
+ * <p>
+ * <code>widgetSelected</code> is called when the selection changes.
+ * <code>widgetDefaultSelected</code> is typically called when an item is
+ * double-clicked.
+ * </p>
+ * 
+ * @param listener
+ *            the listener which should be notified
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see SelectionListener
+ * @see #removeSelectionListener
+ * @see org.eclipse.swt.events.SelectionEvent
+ */
+public void addSelectionListener(SelectionListener listener) {
+    checkWidget();
+    if (listener == null) {
+        SWT.error(SWT.ERROR_NULL_ARGUMENT);
+    }
+    TypedListener typedListener = new TypedListener(listener);
+    addListener(SWT.Selection, typedListener);
+    addListener(SWT.DefaultSelection, typedListener);
+}
+
+/**
+ * Deselects the item at the given zero-relative index in the receiver. If
+ * the item at the index was already deselected, it remains deselected.
+ * Indices that are out of range are ignored.
+ * 
+ * @param index
+ *            the index of the item to deselect
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ */
+public void deselect(int index) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.deselect(topHandle(), index);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Deselects the items at the given zero-relative indices in the receiver.
+ * If the items at the given zero-relative indexes in the receiver are
+ * selected, they are deselected. If they were not selected, they remain
+ * deselected. Indices that are out of range and duplicate indices are
+ * ignored.
+ * 
+ * @param indices
+ *            the array of indices for the items to deselect
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the set of indices is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ */
+public void deselect(int[] indices) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.deselect(topHandle(), indices);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Deselects the items at the given zero-relative indices in the receiver.
+ * If the items at the given zero-relative indexes in the receiver were
+ * selected, they are deselected. If they were not selected, they remain
+ * deselected. The range of the indices is inclusive. Indices that are out
+ * of range are ignored.
+ * 
+ * @param start
+ *            the start index of the items to deselect
+ * @param end
+ *            the end index of the items to deselect
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ */
+public void deselect(int start, int end) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.deselect(topHandle(), start, end);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Deselects all selected items in the receiver.
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ */
+public void deselectAll() {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.deselectAll(topHandle());
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Returns the zero-relative index of the item which currently has the focus
+ * in the receiver, or -1 if no item has focus.
+ * 
+ * @return the index of the selected item
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ */
+public int getFocusIndex() {
+    checkWidget();
+    return ListUtils.getFocusIndex(topHandle());
+}
+
+/**
+ * Returns the item icon at the given, zero-relative index in the receiver.
+ * Throws an exception if the index is out of range.
+ * 
+ * @param index
+ *            the index of the item to return
+ * @return the associated icon at the given index. Null means no icon
+ *         defined.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_RANGE - if the index is not between 0
+ *                and the number of elements in the list minus 1 (inclusive)
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_ITEM - if the operation fails because
+ *                of an operating system failure</li>
+ *                </ul>
+ */
+public Image getIcon(int index) {
+    checkWidget();
+    if (index < 0 || index >= icons.size()) {
+        SWT.error(SWT.ERROR_INVALID_RANGE);
+    }
+    return (Image) icons.elementAt(index);
+}
+
+/**
+ * Gets the preferred icon size that matches the density style. The style
+ * must be one of SWT.HIGH, SWT.MEDIUM, or or SWT.LOW.
+ * 
+ * @param style
+ *            the size style. Only SWT.HIGH, SWT.MEDIUM, and SWT.LOW can be
+ *            used.
+ * 
+ * @return Point the best icon size in pixel (width and height). Must be
+ *         positive values.
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_ARGUMENT - if the style value is invalid
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * 
+ */
+public Point getIconSize(int style) {
+    checkWidget();
+    if (style != LOW && style != MEDIUM && style != HIGH) {
+        SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+    }
+    return OS.QAbstractItemView_iconSize(topHandle());
+}
+
+/**
+ * Returns the item at the given, zero-relative index in the receiver.
+ * Throws an exception if the index is out of range.
+ * 
+ * @param index
+ *            the index of the item to return
+ * @return the item at the given index
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_RANGE - if the index is not between 0
+ *                and the number of elements in the list minus 1 (inclusive)
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_ITEM - if the operation fails because
+ *                of an operating system failure</li>
+ *                </ul>
+ */
+public String getItem(int index) {
+    checkWidget();
+    return ListUtils.getItem(topHandle(), index);
+}
+
+/**
+ * Returns the number of items contained in the receiver.
+ * 
+ * @return the number of items
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_COUNT - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public int getItemCount() {
+    checkWidget();
+    return ListUtils.getItemCount(topHandle());
+}
+
+/**
+ * Returns an array of <code>String</code> s which are the items in the
+ * receiver.
+ * <p>
+ * Note: This is not the actual structure used by the receiver to maintain
+ * its list of items, so modifying the array will not affect the receiver.
+ * </p>
+ * 
+ * @return the items in the receiver's list
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_ITEM - if the operation fails because
+ *                of an operating system failure while getting an item</li>
+ *                <li>ERROR_CANNOT_GET_COUNT - if the operation fails
+ *                because of an operating system failure while getting the
+ *                item count</li>
+ *                </ul>
+ */
+public String[] getItems() {
+    checkWidget();
+    return ListUtils.getItems(topHandle());
+}
+
+/**
+ * Returns the value of the layout orientation.
+ * 
+ * 
+ * @return the scrolling orientation value. One of SWT.VERTICAL and
+ *         SWT.HORIZONTAL
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see SWT#HORIZONTAL
+ * @see SWT#VERTICAL
+ */
+public int getLayout() {
+    checkWidget();
+    if (OS.QT_LISTVIEW_FLOW_LEFTTORIGHT == OS.QListView_flow(topHandle())) {
+        // 0 1 2
+        // 3 4 5
+        // 6 7 8
+        return SWT.HORIZONTAL;
+    }
+    else {
+        // 0 3 6
+        // 1 4 7
+        // 2 5 8
+        return SWT.VERTICAL;
+    }
+}
+
+/**
+ * Returns the value of the item density level.
+ * 
+ * @return the density level. One of HIGH, MEDIUM, or LOW.
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see ListView#LOW
+ * @see ListView#MEDIUM
+ * @see ListView#HIGH
+ */
+public int getLayoutDensity() {
+    checkWidget();
+    return density;
+}
+
+/**
+ * Returns an array of <code>String</code> s that are currently selected in
+ * the receiver. An empty array indicates that no items are selected.
+ * <p>
+ * Note: This is not the actual structure used by the receiver to maintain
+ * its selection, so modifying the array will not affect the receiver.
+ * </p>
+ * 
+ * @return an array representing the selection
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_SELECTION - if the operation fails
+ *                because of an operating system failure while getting the
+ *                selection</li>
+ *                <li>ERROR_CANNOT_GET_ITEM - if the operation fails because
+ *                of an operating system failure while getting an item</li>
+ *                </ul>
+ */
+public String[] getSelection() {
+    checkWidget();
+    return ListUtils.getSelection(topHandle());
+}
+
+/**
+ * Returns the number of selected items contained in the receiver.
+ * 
+ * @return the number of selected items
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_COUNT - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public int getSelectionCount() {
+    checkWidget();
+    return ListUtils.getSelectionCount(topHandle());
+}
+
+/**
+ * Returns the zero-relative indices of the items which are currently
+ * selected in the receiver. The array is empty if no items are selected.
+ * <p>
+ * Note: This is not the actual structure used by the receiver to maintain
+ * its selection, so modifying the array will not affect the receiver.
+ * </p>
+ * 
+ * @return the array of indices of the selected items
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_SELECTION - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public int[] getSelectionIndices() {
+    checkWidget();
+    return ListUtils.getSelectionIndices(topHandle());
+}
+
+/**
+ * Returns the zero-relative index of the item which is currently at the top
+ * of the receiver. This index can change when items are scrolled or new
+ * items are added or removed.
+ * 
+ * @return the index of the top item
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li>
+ *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ *                thread that created the receiver</li>
+ *                </ul>
+ */
+public int getTopIndex() {
+    checkWidget();
+    return OS.QAbstractItemView_swt_indexAt(topHandle(), 1, 1);
+}
+
+    /**
+ * Gets the index of an item.
+ * <p>
+ * The list is searched starting at 0 until an item is found that is equal
+ * to the search item. If no item is found, -1 is returned. Indexing is zero
+ * based.
+ * 
+ * @param string
+ *            the search item
+ * @return the index of the item
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ */
+public int indexOf(String string) {
+    return indexOf(string, 0);
+}
+
+/**
+ * Searches the receiver's list starting at the given, zero-relative index
+ * until an item is found that is equal to the argument, and returns the
+ * index of that item. If no item is found or the starting index is out of
+ * range, returns -1.
+ * 
+ * @param string
+ *            the search item
+ * @param start
+ *            the zero-relative index at which to start the search
+ * @return the index of the item
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_CANNOT_GET_COUNT - if the operation fails
+ *                because of an operating system failure while getting the
+ *                item count</li> <li>ERROR_CANNOT_GET_ITEM - if the
+ *                operation fails because of an operating system failure
+ *                while getting an item</li>
+ *                </ul>
+ */
+public int indexOf(String string, int start) {
+    checkWidget();
+    return ListUtils.indexOf(topHandle(), string, start);
+}
+
+/**
+ * Returns <code>true</code> if the item is selected, and <code>false</code>
+ * otherwise. Indices out of range are ignored.
+ * 
+ * @param index
+ *            the index of the item
+ * @return the visibility state of the item at the index
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ */
+public boolean isSelected(int index) {
+    checkWidget();
+    return ListUtils.isSelected(topHandle(), index);
+}
+
+/**
+ * Removes the item from the receiver at the given zero-relative index.
+ * 
+ * @param index
+ *            the index for the item
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_RANGE - if the index is not between 0
+ *                and the number of elements in the list minus 1 (inclusive)
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_REMOVED - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public void remove(int index) {
+    checkWidget();
+    ListUtils.remove(topHandle(), index);
+    icons.removeElementAt(index);
+    resetGeometry();
+}
+
+/**
+ * Removes the items from the receiver which are between the given
+ * zero-relative start and end indices (inclusive).
+ * 
+ * @param start
+ *            the start of the range
+ * @param end
+ *            the end of the range
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_RANGE - if either the start or end are
+ *                not between 0 and the number of elements in the list minus
+ *                1 (inclusive)</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_REMOVED - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public void remove(int start, int end) {
+    checkWidget();
+    ListUtils.remove(topHandle(), start, end);
+    for (int i = end; i >= start; i--) {
+        icons.removeElementAt(i);
+    }
+    resetGeometry();
+}
+
+/**
+ * Searches the receiver's list starting at the first item until an item is
+ * found that is equal to the argument, and removes that item from the list.
+ * 
+ * @param string
+ *            the item to remove
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the string is null</li> <li>
+ *                ERROR_INVALID_ARGUMENT - if the string is not found in the
+ *                list</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_REMOVED - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public void remove(String string) {
+    if (string == null) {
+        SWT.error(SWT.ERROR_NULL_ARGUMENT);
+    }
+    int index = indexOf(string, 0);
+    if (index == -1) {
+        SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+    }
+    remove(index);
+}
+
+/**
+ * Removes the items from the receiver at the given zero-relative indices.
+ * 
+ * @param indices
+ *            the array of indices of the items
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_RANGE - if the index is not between 0
+ *                and the number of elements in the list minus 1 (inclusive)
+ *                </li> <li>ERROR_NULL_ARGUMENT - if the indices array is
+ *                null </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_REMOVED - if the operation fails
+ *                because of an operating system failure</li>
+ *                </ul>
+ */
+public void remove(int[] indices) {
+    checkWidget();
+    int[] sortedIdxs = ListUtils.remove(topHandle(), indices);
+    int prevIndex = -1;
+    for (int i = sortedIdxs.length - 1; i >= 0; i--) {
+        if (prevIndex != sortedIdxs[i]) {
+            icons.removeElementAt(sortedIdxs[i]);
+        }
+        prevIndex = sortedIdxs[i];
+    }
+    resetGeometry();
+}
+
+/**
+ * Removes all of the items from the receiver.
+ * <p>
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ */
+public void removeAll() {
+    checkWidget();
+    ListUtils.removeAll(topHandle());
+    resetGeometry();
+}
+
+/**
+ * Removes the listener from the collection of listeners who will be
+ * notified when the receiver's selection changes.
+ * 
+ * @param listener
+ *            the listener which should no longer be notified
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see SelectionListener
+ * @see #addSelectionListener
+ */
+public void removeSelectionListener(SelectionListener listener) {
+    removeListener(SWT.Selection, listener);
+    removeListener(SWT.DefaultSelection, listener);
+}
+
+/**
+ * Selects the item at the given zero-relative index in the receiver's list.
+ * If the item at the index was already selected, it remains selected.
+ * Indices that are out of range are ignored.
+ * 
+ * @param index
+ *            the index of the item to select
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ */
+public void select(int index) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.select(topHandle(), index, (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Selects the items in the range specified by the given zero-relative
+ * indices in the receiver. The range of indices is inclusive. The current
+ * selection is not cleared before the new items are selected.
+ * <p>
+ * If an item in the given range is not selected, it is selected. If an item
+ * in the given range was already selected, it remains selected. Indices
+ * that are out of range are ignored and no items will be selected if start
+ * is greater than end. If the receiver is single-select and there is more
+ * than one item in the given range, then all indices are ignored.
+ * 
+ * @param start
+ *            the start of the range
+ * @param end
+ *            the end of the range
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see List#setSelection(int,int)
+ */
+public void select(int start, int end) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.select(topHandle(), start, end, (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Selects the items at the given zero-relative indices in the receiver. The
+ * current selection is not cleared before the new items are selected.
+ * <p>
+ * If the item at a given index is not selected, it is selected. If the item
+ * at a given index was already selected, it remains selected. Indices that
+ * are out of range and duplicate indices are ignored. If the receiver is
+ * single-select and multiple indices are specified, then all indices are
+ * ignored.
+ * 
+ * @param indices
+ *            the array of indices for the items to select
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the array of indices is null
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see List#setSelection(int[])
+ */
+public void select(int[] indices) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.select(topHandle(), indices, (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Selects all of the items in the receiver.
+ * <p>
+ * If the receiver is single-select, do nothing.
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ */
+public void selectAll() {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.selectAll(topHandle(), (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Sets the text and icon of the item in the receiver's list at the given
+ * zero-relative index to the string argument. This is equivalent to
+ * <code>remove</code> 'ing the old item at the index, and then
+ * <code>add</code> 'ing the new item at that index.
+ * 
+ * @param index
+ *            the index for the item
+ * @param string
+ *            the new text for the item
+ * @param icon
+ *            the icon image for the item, can be Null.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_RANGE - if the index is not between 0
+ *                and the number of elements in the list minus 1 (inclusive)
+ *                </li> <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_REMOVED - if the remove operation fails
+ *                because of an operating system failure</li> <li>
+ *                ERROR_ITEM_NOT_ADDED - if the add operation fails because
+ *                of an operating system failure</li>
+ *                </ul>
+ */
+public void setItem(int index, String string, Image icon) {
+    checkWidget();
+    if (string == null) {
+        SWT.error(SWT.ERROR_NULL_ARGUMENT);
+    }
+    boolean isSelected = isSelected(index);
+    // Disable redrawing to prevent flickering. Ensure that redrawing is
+    // restored by using the try-finally block.
+    setRedraw(false);
+    try {
+        remove(index);
+        add(string, icon, index);
+        if (isSelected) {
+            select(index);
+        }
+        resetGeometry();
+    } finally {
+        setRedraw(true);
+    }
+}
+
+/**
+ * Sets the receiver's items to be the given array of items and icons.
+ * 
+ * @param items
+ *            the array of items
+ * @param icons
+ *            the array of icons. Can be NULL.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the <code>items</code> array
+ *                is null</li> <li>ERROR_INVALID_RANGE - if number of
+ *                elements in <code>icons</code> does not match the number
+ *                in <code>items</code></li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @exception SWTError
+ *                <ul>
+ *                <li>ERROR_ITEM_NOT_ADDED - if the operation fails because
+ *                of an operating system failure</li>
+ *                </ul>
+ */
+public void setItems(String[] items, Image[] icons) {
+    checkWidget();
+    ListUtils.setItems(topHandle(), items, icons);
+    this.icons.removeAllElements(); 
+    for (int i = 0; i < items.length; i++) {
+        this.icons.addElement((icons == null) ? null : icons[i]);
+    }
+    resetGeometry();
+}
+
+/**
+ * Changes the widget layout orientation, which affects which way the widget
+ * scrolls.
+ * 
+ * @param style
+ *            the orientation style. Only SWT.VERTICAL and SWT.HORIZONTAL
+ *            can be used.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_ARGUMENT - if the style value is invalid
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see SWT#HORIZONTAL
+ * @see SWT#VERTICAL
+ */
+public void setLayout(int layout) {
+    checkWidget();
+    if (layout != SWT.HORIZONTAL && layout != SWT.VERTICAL) {
+        SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+    }
+    
+    // ListView gets the other scrollbar created always when the layout is changed.
+    setStyle(style() & ~SWT.VERTICAL);
+    setStyle(style() & ~SWT.HORIZONTAL);
+    int scrollAreaHandle = Internal_PackageSupport.scrollAreaHandle(this);
+    if (layout == SWT.HORIZONTAL) {
+        // 0 1 2
+        // 3 4 5
+        // 6 7 8
+        setStyle(style() | SWT.V_SCROLL);
+        if (getVerticalBar() == null) {
+            Internal_PackageSupport.setVerticalBar(this, Internal_PackageSupport.createScrollBar(this, SWT.V_SCROLL));
+        }
+        OS.QAbstractScrollArea_setVerticalScrollBarPolicy(scrollAreaHandle, OS.QT_SCROLLBARALWAYSON);
+        OS.QAbstractScrollArea_setHorizontalScrollBarPolicy(scrollAreaHandle, OS.QT_SCROLLBARALWAYSOFF);
+        OS.QListView_setFlow(topHandle(), OS.QT_LISTVIEW_FLOW_LEFTTORIGHT);
+    }
+    else {
+        // 0 3 6
+        // 1 4 7
+        // 2 5 8
+        setStyle(style() | SWT.H_SCROLL);
+        if (getHorizontalBar() == null) {
+            Internal_PackageSupport.setHorizontalBar(this, Internal_PackageSupport.createScrollBar(this, SWT.H_SCROLL));
+        }
+        OS.QAbstractScrollArea_setHorizontalScrollBarPolicy(scrollAreaHandle, OS.QT_SCROLLBARALWAYSON);
+        OS.QAbstractScrollArea_setVerticalScrollBarPolicy(scrollAreaHandle, OS.QT_SCROLLBARALWAYSOFF);
+        OS.QListView_setFlow(topHandle(), OS.QT_LISTVIEW_FLOW_TOPTOBOTTOM);
+    }
+}
+
+/**
+ * Changes the item density level.
+ * 
+ * @param style
+ *            the density level. Only HIGH, MEDIUM, LOW can be used.
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_INVALID_ARGUMENT - if the style value is invalid
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see ListView#LOW
+ * @see ListView#MEDIUM
+ * @see ListView#HIGH
+ */
+public void setLayoutDensity(int style) {
+    checkWidget();
+    if (style != LOW && style != MEDIUM && style != HIGH)
+        SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+    this.density = style;
+    resetGeometry();
+}
+
+/**
+ * Selects the item at the given zero-relative index in the receiver. If the
+ * item at the index was already selected, it remains selected. The current
+ * selected is first cleared, then the new items are selected. Indices that
+ * are out of range are ignored.
+ * 
+ * @param index
+ *            the index of the item to select
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * @see List#deselectAll()
+ * @see List#select(int)
+ */
+public void setSelection(int index) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.setSelection(topHandle(), index);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Selects the items in the range specified by the given zero-relative
+ * indices in the receiver. The range of indices is inclusive. The current
+ * selection is cleared before the new items are selected.
+ * <p>
+ * Indices that are out of range are ignored and no items will be selected
+ * if start is greater than end. If the receiver is single-select and there
+ * is more than one item in the given range, then all indices are ignored.
+ * 
+ * @param start
+ *            the start index of the items to select
+ * @param end
+ *            the end index of the items to select
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see List#deselectAll()
+ * @see List#select(int,int)
+ */
+public void setSelection(int start, int end) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.setSelection(topHandle(), start, end, (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Selects the items at the given zero-relative indices in the receiver. The
+ * current selection is cleared before the new items are selected.
+ * <p>
+ * Indices that are out of range and duplicate indices are ignored. If the
+ * receiver is single-select and multiple indices are specified, then all
+ * indices are ignored.
+ * 
+ * @param indices
+ *            the indices of the items to select
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the array of indices is null
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see List#deselectAll()
+ * @see List#select(int[])
+ */
+public void setSelection(int[] indices) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.setSelection(topHandle(), indices, (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Sets the receiver's selection to be the given array of items. The current
+ * selection is cleared before the new items are selected.
+ * <p>
+ * Items that are not in the receiver are ignored. If the receiver is
+ * single-select and multiple items are specified, then all items are
+ * ignored.
+ * 
+ * @param items
+ *            the array of items
+ * 
+ * @exception IllegalArgumentException
+ *                <ul>
+ *                <li>ERROR_NULL_ARGUMENT - if the array of items is null
+ *                </li>
+ *                </ul>
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ * 
+ * @see List#deselectAll()
+ * @see List#select(int[])
+ * @see List#setSelection(int[])
+ */
+public void setSelection(String[] items) {
+    checkWidget();
+    ignoreSelectionEvent = true;
+    ListUtils.setSelection(topHandle(), items, (SWT.MULTI & getStyle()) != 0);
+    ignoreSelectionEvent = false;
+}
+
+/**
+ * Shows the selection. If the selection is already showing in the receiver,
+ * this method simply returns. Otherwise, the items are scrolled until the
+ * selection is visible. When multiple items are selected, the selection of
+ * which item becomes visible is implementation-dependent.
+ * 
+ * @exception SWTException
+ *                <ul>
+ *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ *                disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ *                called from the thread that created the receiver</li>
+ *                </ul>
+ */
+public void showSelection() {
+    checkWidget();
+    ListUtils.showSelection(topHandle());
+}
+
+void createHandle(int index) {
+    Internal_PackageSupport.createHandle(this, index);
+    int scrollAreaHandle = OS.QListWidget_new();
+    Internal_PackageSupport.setScrollAreaHandle(this, scrollAreaHandle);
+    Internal_PackageSupport.setFrameHandle(this, scrollAreaHandle);
+    Internal_PackageSupport.setHandle(this, OS.QAbstractScrollArea_viewPort(scrollAreaHandle));
+    Internal_PackageSupport.setTopHandle(this, scrollAreaHandle);
+    
+    OS.QListView_setMovement(scrollAreaHandle, OS.QT_LISTVIEW_MOVEMENT_STATIC);
+    OS.QListView_setViewMode(scrollAreaHandle, OS.QT_LISTVIEW_VIEWMODE_ICON);
+    OS.QListView_setResizeMode(scrollAreaHandle, OS.QT_LISTVIEW_RESIZEMODE_ADJUST);
+    OS.QAbstractItemView_setSelectionBehavior(scrollAreaHandle, OS.QT_ABSTRACTITEMVIEW_SELECTIONBEHAVIOR_ITEMS);
+    if ((getStyle() & SWT.MULTI) != 0) {
+        OS.QAbstractItemView_setSelectionMode(scrollAreaHandle, OS.QT_ABSTRACTITEMVIEW_SELECTIONMODE_MULTI);
+    }
+    else {
+        OS.QAbstractItemView_setSelectionMode(scrollAreaHandle, OS.QT_ABSTRACTITEMVIEW_SELECTIONMODE_SINGLE);
+    }
+    if ((getStyle() & SWT.H_SCROLL) != 0) {
+        setLayout(SWT.VERTICAL);
+    }
+    else {
+        setLayout(SWT.HORIZONTAL);
+    }
+    spacing = OS.QListView_spacing(scrollAreaHandle);
+    density = MEDIUM;
+    
+    Internal_PackageSupport.setState(this, Internal_PackageSupport.state(this) | WidgetState.HANDLE);
+}
+
+void hookEvents () {
+    Internal_PackageSupport.hookEvents(this);
+    int handle = topHandle();
+    int signalProxySel = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), 
+            OS.QSIGNAL_LIST_ITEMSELECTION_CHANGED);
+    OS.QObject_connectOrThrow(handle, "itemSelectionChanged()", 
+            signalProxySel, "widgetSignal()", OS.QT_AUTOCONNECTION);
+    int signalProxyDefSel = OS.SignalHandler_new(handle, Internal_PackageSupport.display(this), 
+            OS.QSIGNAL_LIST_ITEM_DOUBLECLICKED);
+    OS.QObject_connectOrThrow(handle, "itemDoubleClicked(QListWidgetItem*)", 
+            signalProxyDefSel, "widgetSignal(QListWidgetItem*)", OS.QT_AUTOCONNECTION);
+}
+
+void qt_signal_list_itemSelectionChanged(){
+    if (!ignoreSelectionEvent) {
+        Internal_PackageSupport.sendEvent(this, SWT.Selection);
+    }
+}
+
+void qt_signal_list_itemDoubleClicked(int selectionHandle){
+    if (!ignoreSelectionEvent) {
+        Internal_PackageSupport.sendEvent(this, SWT.DefaultSelection);
+    }
+}
+
+public void setFont(Font font) {
+    super.setFont(font);
+    resetGeometry();
+}
+
+void setTraversalFlags(int type, int key, int modifier, int character) {
+    Internal_PackageSupport.setTraverseDoIt(this, false);
+    Internal_PackageSupport.setTraverseCancel(this, false);
+    
+    int handle = topHandle();
+    
+    switch (key) {    
+    case OS.QT_KEY_UP: {
+        // ^  ^  ^  ^       ^  ^  ^  ^  
+        // 4  5  6  7       1  5  9  13
+        // 8  9  10 11      2  6  10
+        // 12 13            3  7  11
+        if (getVisualRow(ListUtils.getFocusIndex(handle)) == 0) {
+            Internal_PackageSupport.setTraverseDoIt(this, true);
+            Internal_PackageSupport.setTraverseCancel(this, true);
+        }
+        break;
+    }    
+    case OS.QT_KEY_LEFT: {
+        // <  1  2  3       <  4  8  12
+        // <  5  6  7       <  5  9  13
+        // <  9  10 11      <  6  10
+        // <  13            <  7  11
+        if (getVisualCol(ListUtils.getFocusIndex(handle)) == 0) {
+            Internal_PackageSupport.setTraverseDoIt(this, true);
+            Internal_PackageSupport.setTraverseCancel(this, true);
+        }
+        break;
+    }
+    case OS.QT_KEY_DOWN: {
+        int focusIndex = ListUtils.getFocusIndex(handle);
+        int itemCount = ListUtils.getItemCount(handle);
+        int rowCount = getVisualRowCount();
+        int focusRow = getVisualRow(focusIndex);
+        if (getLayout() == SWT.HORIZONTAL) {
+            // 0  1  2  3
+            // 4  5  6  7
+            // 8  9  v  v
+            // v  v
+            if ((focusRow == rowCount - 1)
+                || ((focusRow == rowCount - 2) 
+                    && (getVisualCol(focusIndex) > getVisualCol(itemCount - 1)))) {
+                Internal_PackageSupport.setTraverseDoIt(this, true);
+                Internal_PackageSupport.setTraverseCancel(this, true);
+            }
+        }
+        else {
+            // 0  4  8  12
+            // 1  5  9  v
+            // 2  6  10
+            // v  v  v
+            if ((focusIndex == itemCount - 1)
+                || (focusRow == rowCount - 1)) {
+                Internal_PackageSupport.setTraverseDoIt(this, true);
+                Internal_PackageSupport.setTraverseCancel(this, true);
+            }
+        }
+        break;
+    }
+    case OS.QT_KEY_RIGHT: {
+        int focusIndex = ListUtils.getFocusIndex(handle);
+        int itemCount = ListUtils.getItemCount(handle);
+        int colCount = getVisualColCount();
+        int focusCol = getVisualCol(focusIndex);
+        if (getLayout() == SWT.HORIZONTAL) {
+            // 0  1  2  >
+            // 4  5  6  > 
+            // 8  9  10 >
+            // 12 >
+            if ((focusIndex == itemCount - 1)
+                || (focusCol == getVisualColCount() - 1)) {
+                Internal_PackageSupport.setTraverseDoIt(this, true);
+                Internal_PackageSupport.setTraverseCancel(this, true);
+            }
+        }
+        else {
+            // 0  4  8  >
+            // 1  5  9  >
+            // 2  6  >
+            // 3  7  >
+            if ((focusCol == colCount - 1)
+                || ((focusCol == colCount - 2) 
+                    && (getVisualRow(focusIndex) > getVisualRow(itemCount - 1)))) {
+                Internal_PackageSupport.setTraverseDoIt(this, true);
+                Internal_PackageSupport.setTraverseCancel(this, true);
+            }
+        }
+        break;
+    }    
+    // All other traverse keys can traverse
+    default: {
+        Internal_PackageSupport.setTraverseDoIt(this, true);
+        Internal_PackageSupport.setTraverseCancel(this, true);
+        break;
+    }
+    }
+}
+
+Point getPreferredClientAreaSize() {
+    int count = getItemCount();
+    if (count > 0) {
+        int x = 0;
+        int y = 0;
+        Point gridSize = OS.QListView_gridSize(topHandle());
+        if (getLayout() == SWT.HORIZONTAL) {
+            x += gridSize.x * count;
+            y += gridSize.y;
+            x += 16;
+        } else {
+            x += gridSize.x;
+            y += gridSize.y * count;
+            y += 16;
+        }
+        
+        return new Point(x, y);
+    } 
+    else {
+        return OS.QWidget_sizeHint(topHandle());
+    }
+}
+
+/*
+ * Style filter
+ */
+private static int checkStyle(int style) {
+    // VERTICAL layout goes with H_SCROLL, HORIZONTAL layout goes with V_SCROLL
+    // Default layout: HORIZONTAL
+    int layoutStyle = Internal_PackageSupport.checkBits (style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0);
+    style &= ~SWT.VERTICAL;
+    style &= ~SWT.HORIZONTAL;
+    if ((layoutStyle & SWT.VERTICAL) != 0) {
+        style |= SWT.H_SCROLL;
+    }
+    else {
+        style |= SWT.V_SCROLL;
+    }
+    return Internal_PackageSupport.checkBits (style, SWT.SINGLE, SWT.MULTI, 0, 0, 0, 0);
+}
+
+/*
+ * Get spacing based on density level
+ */
+private int getSpacing(int density) {
+    switch(density) {
+    case LOW:
+        if (spacing != 0) {
+            return spacing * 2;
+        }
+        else {
+//          Rectangle dispRect = getDisplay().getBounds(); 
+//          return Math.max(dispRect.height,dispRect.width) / 50;
+          return 20;
+        }
+    case HIGH: {
+          return 0;
+        }
+    case MEDIUM:
+    // fall trough
+    default:
+        return spacing;
+    }
+}
+
+/*
+ * Visual column index for index 
+ */
+private int getVisualCol(int index) {
+    if (getLayout() == SWT.HORIZONTAL) {
+        return index % getVisualColCount();
+    }
+    else {
+        return (int)Math.floor(index/ getVisualRowCount());
+    }
+}
+
+/*
+ * Visual row index for index 
+ */
+private int getVisualRow(int index) {
+    if (getLayout() == SWT.HORIZONTAL) {
+        return (int)Math.floor(index / getVisualColCount());
+    }
+    else {
+        return index % getVisualRowCount();
+    }
+}
+
+/*
+ * Count visual columns 
+ */
+private int getVisualColCount() {
+    int handle = topHandle();
+    int res = 1;
+    int count = ListUtils.getItemCount(handle);
+    if (getLayout() == SWT.HORIZONTAL) {
+        int y = OS.QAbstractItemView_visualRect(handle, 0, 0).y;
+        int i = 1;
+        while (i < count) {
+            int yTemp = y;
+            y = OS.QAbstractItemView_visualRect(handle, i, 0).y;
+            if (yTemp != y) {
+                break;
+            }
+            res++;
+            i++;
+        }
+    }
+    else {
+        int rowCount = getVisualRowCount();
+        res = (int)Math.floor(count / rowCount);
+        if (count % rowCount > 0) {
+            res++;
+        }
+    }
+    return res;
+}
+
+/*
+ * Count visual rows 
+ */
+private int getVisualRowCount() {
+    int handle = topHandle();
+    int res = 1;
+    int count = ListUtils.getItemCount(handle);
+    if (getLayout() == SWT.HORIZONTAL) {
+        int colCount = getVisualColCount();
+        res = (int)Math.floor(count / colCount);
+        if (count % colCount > 0) {
+            res++;
+        }
+    }
+    else {
+        int x = OS.QAbstractItemView_visualRect(handle, 0, 0).x;
+        int i = 1;
+        while (i < count) {
+            int xTemp = x;
+            x = OS.QAbstractItemView_visualRect(handle, i, 0).x;
+            if (xTemp != x) {
+                break;
+            }
+            res++;
+            i++;
+        }
+    }
+    return res;
+}
+
+/*
+ * Recalculates the geometry of the list (cell size, icon size, etc.).
+ */
+private void resetGeometry() {
+    resetGeometry(-1);
+}
+
+/*
+ * Recalculates the geometry of the list (cell size, icon size, etc.). Optimized. 
+ */
+private void resetGeometry(int lastAddedItemIndex) {
+    // In this order
+    resetIconSize(lastAddedItemIndex);
+    resetGridSize(lastAddedItemIndex);
+}
+
+/*
+ * Resets the cell size. Optimized if lastAddedItemIndex not -1.
+ */
+private void resetGridSize(int lastAddedItemIndex) {
+    int handle = topHandle();
+    Point size;
+    if (lastAddedItemIndex > -1 ) {
+        size = OS.QListView_gridSize(handle);
+        Point s = OS.QAbstractItemView_sizeHintForIndex(handle, lastAddedItemIndex, 0);
+        size.x = Math.max(size.x, s.x);
+        size.y = Math.max(size.y, s.y);        
+    }
+    else {
+        size = new Point(0, 0);
+        for (int i = 0; i < getItemCount(); i++) {
+            Point s = OS.QAbstractItemView_sizeHintForIndex(handle, i, 0);
+            size.x = Math.max(size.x, s.x);
+            size.y = Math.max(size.y, s.y);
+        }
+    }
+    int extra = getSpacing(density);
+    OS.QListView_setGridSize(handle, size.x + extra, size.y + extra);
+}
+
+/*
+ * Resets the icon size. Optimized if lastAddedItemIndex not -1.
+ */
+private void resetIconSize(int lastAddedItemIndex) {
+    int handle = topHandle();
+    Point size;
+    if (lastAddedItemIndex > -1 && getIcon(lastAddedItemIndex) != null) {
+        size = OS.QAbstractItemView_iconSize(handle);
+        Rectangle iconRect = getIcon(lastAddedItemIndex).getBounds();
+        size.x = Math.max(size.x, iconRect.width);
+        size.y = Math.max(size.y, iconRect.height);        
+    }
+    else {
+        size = new Point(0, 0);
+        for (int i = 0; i < getItemCount(); i++) {
+            Image icon = getIcon(i);
+            if (icon != null) {
+                Rectangle iconRect = icon.getBounds();
+                size.x = Math.max(size.x, iconRect.width);
+                size.y = Math.max(size.y, iconRect.height);
+            }
+        }
+    }
+    OS.QAbstractItemView_setIconSize(handle, size.x, size.y);
+}
+
+private final int topHandle() {
+    return Internal_PackageSupport.topHandle(this);
+}
+
+private final int style() {
+    return Internal_PackageSupport.style(this);
+}
+
+private final void setStyle(int style) {
+    Internal_PackageSupport.setStyle(this, style);
+}
+}