1baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye/*******************************************************************************
2baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * Copyright (c) 2011 Google, Inc.
3baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * All rights reserved. This program and the accompanying materials
4baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * are made available under the terms of the Eclipse Public License v1.0
5baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * which accompanies this distribution, and is available at
6baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * http://www.eclipse.org/legal/epl-v10.html
7baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye *
8baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * Contributors:
9baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye *    Google, Inc. - initial API and implementation
10baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye *******************************************************************************/
11baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyepackage org.eclipse.wb.core.controls;
12baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
13baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.SWT;
14baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.custom.CCombo;
15baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.events.DisposeEvent;
16baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.events.DisposeListener;
17baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.events.SelectionListener;
18baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.graphics.Color;
19baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.graphics.Image;
20baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.graphics.Point;
21baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.graphics.Rectangle;
22baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.layout.FillLayout;
23baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Button;
24baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Combo;
25baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Composite;
26baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Control;
27baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Display;
28baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Event;
29baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Listener;
30baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Shell;
31baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.Table;
32baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.TableColumn;
33baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.TableItem;
34baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport org.eclipse.swt.widgets.TypedListener;
35baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
36baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyeimport java.util.Locale;
37baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
38baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye/**
39baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * {@link Control} like {@link Combo} or {@link CCombo} that shows {@link Table} with image/text as
40baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * drop-down.
41baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye *
42baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * @author mitin_aa
43baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * @author scheglov_ke
44baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye * @coverage core.control
45baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye */
46baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbyepublic class CTableCombo extends Composite {
47baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected Button m_arrow;
48baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected CImageLabel m_text;
49baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected Shell m_popup;
50baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected Table m_table;
51baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected boolean hasFocus;
52baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
53baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  //
54baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public CTableCombo(Composite parent, int style) {
55baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    super(parent, style = checkStyle(style));
56baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    init(parent, style);
57baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
58baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
59baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  static int checkStyle(int style) {
60baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT;
61baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return style & mask;
62baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
63baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
64baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  private void init(Composite parent, int style) {
65baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_arrow = new Button(this, SWT.ARROW | SWT.DOWN | SWT.NO_FOCUS);
66baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text = new CImageLabel(this, style & ~SWT.BORDER);
67baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
68baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    final Shell shell = getShell();
69baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_popup = new Shell(shell, SWT.NONE);
70baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_table = new Table(m_popup, SWT.FULL_SELECTION);
71baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    new TableColumn(m_table, SWT.NONE);
72baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Listener listener = new Listener() {
73baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      public void handleEvent(Event event) {
74baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (m_popup == event.widget) {
75baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          handlePopupEvent(event);
76baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
77baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
78baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (m_text == event.widget) {
79baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          handleTextEvent(event);
80baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
81baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
82baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (m_table == event.widget) {
83baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          handleTableEvent(event);
84baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
85baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
86baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (m_arrow == event.widget) {
87baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          handleArrowEvent(event);
88baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
89baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
90baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (CTableCombo.this == event.widget) {
91baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          handleComboEvent(event);
92baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
93baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
94baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
95baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    };
96baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    final Listener shellListener = new Listener() {
97baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      public void handleEvent(Event event) {
98baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        switch (event.type) {
99baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.Dispose :
100baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.Move :
101baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.Resize :
102baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (!isDisposed()) {
103baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              dropDown(false);
104baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
105baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            break;
106baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
107baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
108baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    };
109baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    final int[] comboEvents = {SWT.Dispose, SWT.Move, SWT.Resize};
110baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    for (int i = 0; i < comboEvents.length; i++) {
111baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      addListener(comboEvents[i], listener);
112baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      // HACK: hide popup when parent changed
113baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      shell.addListener(comboEvents[i], shellListener);
114baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
115baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    addDisposeListener(new DisposeListener() {
116baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      public void widgetDisposed(DisposeEvent e) {
117baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        for (int i = 0; i < comboEvents.length; i++) {
118baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          shell.removeListener(comboEvents[i], shellListener);
119baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
120baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
121baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    });
122baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int[] popupEvents = {SWT.Close, SWT.Paint, SWT.Deactivate};
123baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    for (int i = 0; i < popupEvents.length; i++) {
124baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_popup.addListener(popupEvents[i], listener);
125baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
126baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int[] textEvents =
127baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        {
128baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.KeyDown,
129baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.KeyUp,
130baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.Modify,
131baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.MouseDown,
132baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.MouseUp,
133baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.MouseDoubleClick,
134baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.Traverse,
135baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.FocusIn,
136baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.FocusOut};
137baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    for (int i = 0; i < textEvents.length; i++) {
138baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_text.addListener(textEvents[i], listener);
139baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
140baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int[] tableEvents =
141baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        {
142baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.MouseUp,
143baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.Selection,
144baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.Traverse,
145baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.KeyDown,
146baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.KeyUp,
147baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.FocusIn,
148baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            SWT.FocusOut};
149baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    for (int i = 0; i < tableEvents.length; i++) {
150baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_table.addListener(tableEvents[i], listener);
151baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
152baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int[] arrowEvents = {SWT.Selection, SWT.FocusIn, SWT.FocusOut};
153baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    for (int i = 0; i < arrowEvents.length; i++) {
154baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_arrow.addListener(arrowEvents[i], listener);
155baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
156baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
157baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
158baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void handleTableEvent(Event event) {
159baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    switch (event.type) {
160baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.FocusIn : {
161baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (hasFocus) {
162baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
163baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
164baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        hasFocus = true;
165baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
166baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
167baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.FocusIn, e);
168baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
169baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
170baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.FocusOut : {
171baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        final int time = event.time;
172baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.display.asyncExec(new Runnable() {
173baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          public void run() {
174baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (CTableCombo.this.isDisposed()) {
175baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              return;
176baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
177baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            Control focusControl = getDisplay().getFocusControl();
178baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (focusControl == m_text || focusControl == m_arrow) {
179baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              return;
180baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
181baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            hasFocus = false;
182baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            Event e = new Event();
183baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            e.time = time;
184baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            notifyListeners(SWT.FocusOut, e);
185baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          }
186baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        });
187baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
188baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
189baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.MouseUp : {
190baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.button != 1) {
191baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
192baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
193baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        dropDown(false);
194baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
195baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
196baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.DefaultSelection, e);
197baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
198baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
199baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Selection : {
200baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        int index = m_table.getSelectionIndex();
201baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (index == -1) {
202baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
203baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
204baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        TableItem item = m_table.getItem(index);
205baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_text.setText(item.getText());
206baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_text.setImage(item.getImage());
207baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        //m_text.selectAll();
208baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_table.setSelection(index);
209baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
210baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
211baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.stateMask = event.stateMask;
212baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.doit = event.doit;
213baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.Selection, e);
214baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.doit = e.doit;
215baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        dropDown(false);
216baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
217baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
218baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Traverse : {
219baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        switch (event.detail) {
220baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_TAB_NEXT :
221baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_RETURN :
222baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_ESCAPE :
223baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_ARROW_PREVIOUS :
224baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_ARROW_NEXT :
225baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            event.doit = false;
226baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            break;
227baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
228baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
229baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
230baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.detail = event.detail;
231baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.doit = event.doit;
232baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.keyCode = event.keyCode;
233baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.Traverse, e);
234baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.doit = e.doit;
235baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
236baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
237baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.KeyUp : {
238baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
239baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
240baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.character = event.character;
241baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.keyCode = event.keyCode;
242baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.stateMask = event.stateMask;
243baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.KeyUp, e);
244baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
245baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
246baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.KeyDown : {
247baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.character == SWT.ESC) {
248baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          // escape key cancels popups
249baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          dropDown(false);
250baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
251baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.character == SWT.CR || event.character == '\t') {
252baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          // Enter and Tab cause default selection
253baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          dropDown(false);
254baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          Event e = new Event();
255baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          e.time = event.time;
256baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          e.stateMask = event.stateMask;
257baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          notifyListeners(SWT.DefaultSelection, e);
258baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
259baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        // At this point the widget may have been disposed.
260baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        // If so, do not continue.
261baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (isDisposed()) {
262baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          break;
263baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
264baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
265baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
266baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.character = event.character;
267baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.keyCode = event.keyCode;
268baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.stateMask = event.stateMask;
269baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.KeyDown, e);
270baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
271baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
272baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
273baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
274baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
275baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void handlePopupEvent(Event event) {
276baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    switch (event.type) {
277baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Paint :
278baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        // draw black rectangle around list
279baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Rectangle listRect = m_table.getBounds();
280baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Color black = getDisplay().getSystemColor(SWT.COLOR_BLACK);
281baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.gc.setForeground(black);
282baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.gc.drawRectangle(0, 0, listRect.width + 1, listRect.height + 1);
283baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
284baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Close :
285baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.doit = false;
286baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        dropDown(false);
287baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
288baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
289baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
290baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
291baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void handleComboEvent(Event event) {
292baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    switch (event.type) {
293baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Dispose :
294baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (m_popup != null && !m_popup.isDisposed()) {
295baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          m_popup.dispose();
296baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
297baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_popup = null;
298baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_text = null;
299baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_arrow = null;
300baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
301baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Move :
302baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        dropDown(false);
303baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
304baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Resize :
305baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        internalLayout();
306baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
307baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
308baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
309baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
310baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void handleArrowEvent(Event event) {
311baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    switch (event.type) {
312baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.FocusIn : {
313baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (hasFocus) {
314baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
315baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
316baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        hasFocus = true;
317baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
318baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
319baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.FocusIn, e);
320baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
321baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
322baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Selection : {
323baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        boolean wasDropped = isDropped();
324baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        dropDown(!wasDropped);
325baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (wasDropped) {
326baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          m_text.forceFocus();
327baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
328baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
329baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
330baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
331baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
332baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
333baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void handleTextEvent(Event event) {
334baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    switch (event.type) {
335baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.FocusIn : {
336baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (hasFocus) {
337baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
338baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
339baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        hasFocus = true;
340baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        //if (getEditable())
341baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
342baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
343baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.FocusIn, e);
344baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
345baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
346baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.FocusOut : {
347baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        final int time = event.time;
348baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.display.asyncExec(new Runnable() {
349baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          public void run() {
350baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (CTableCombo.this.isDisposed()) {
351baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              return;
352baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
353baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            Control focusControl = getDisplay().getFocusControl();
354baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (focusControl == m_table
355baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye                || focusControl == m_arrow
356baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye                || focusControl != null
357baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye                && focusControl.getParent() == CTableCombo.this) {
358baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              return;
359baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
360baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            hasFocus = false;
361baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            Event e = new Event();
362baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            e.time = time;
363baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            notifyListeners(SWT.FocusOut, e);
364baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          }
365baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        });
366baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
367baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
368baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.KeyDown : {
369baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.character == SWT.ESC) { // escape key cancels popup
370baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          dropDown(false);
371baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
372baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.character == SWT.CR) {
373baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          dropDown(false);
374baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          Event e = new Event();
375baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          e.time = event.time;
376baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          e.stateMask = event.stateMask;
377baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          notifyListeners(SWT.DefaultSelection, e);
378baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
379baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        // At this point the widget may have been disposed.
380baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        // If so, do not continue.
381baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (isDisposed()) {
382baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          break;
383baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
384baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.character == '+') {
385baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          dropDown(true);
386baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
387baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (isDropped()) {
388baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          if (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN) {
389baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            int oldIndex = getSelectionIndex();
390baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (event.keyCode == SWT.ARROW_UP) {
391baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              select(Math.max(oldIndex - 1, 0));
392baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            } else {
393baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              select(Math.min(oldIndex + 1, getItemCount() - 1));
394baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
395baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (oldIndex != getSelectionIndex()) {
396baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              Event e = new Event();
397baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              e.time = event.time;
398baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              e.stateMask = event.stateMask;
399baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              notifyListeners(SWT.Selection, e);
400baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
401baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            // At this point the widget may have been disposed.
402baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            // If so, do not continue.
403baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (isDisposed()) {
404baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              break;
405baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
406baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          }
407baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
408baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (Character.isLetter(event.character)) {
409baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          int oldIndex = getSelectionIndex();
410baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          int index = -1;
411baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          for (int i = 0; i < getItemCount(); i++) {
412baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            String item = getItem(i).toUpperCase(Locale.ENGLISH);
413baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (item.length() != 0 && item.charAt(0) == Character.toUpperCase(event.character)) {
414baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              index = i;
415baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              break;
416baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
417baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          }
418baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          if (index != -1) {
419baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            select(Math.max(index, 0));
420baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            if (oldIndex != getSelectionIndex()) {
421baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              Event e = new Event();
422baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              e.time = event.time;
423baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              e.stateMask = event.stateMask;
424baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye              notifyListeners(SWT.Selection, e);
425baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            }
426baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          }
427baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
428baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
429baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
430baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.character = event.character;
431baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.keyCode = event.keyCode;
432baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.stateMask = event.stateMask;
433baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (m_text != null && !m_text.isDisposed()) {
434baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          notifyListeners(SWT.KeyDown, e);
435baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
436baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
437baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
438baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.KeyUp : {
439baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
440baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
441baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.character = event.character;
442baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.keyCode = event.keyCode;
443baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.stateMask = event.stateMask;
444baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.KeyUp, e);
445baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
446baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
447baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Modify : {
448baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_table.deselectAll();
449baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
450baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
451baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.Modify, e);
452baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
453baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
454baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.MouseDown : {
455baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (event.button != 1) {
456baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          return;
457baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
458baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_text.forceFocus();
459baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        boolean dropped = isDropped();
460baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        dropDown(!dropped);
461baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        if (!dropped) {
462baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          m_text.forceFocus();
463baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
464baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
465baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
466baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.MouseDoubleClick : {
467baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.MouseDoubleClick, event);
468baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
469baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
470baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      case SWT.Traverse : {
471baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        switch (event.detail) {
472baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_RETURN :
473baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_ARROW_PREVIOUS :
474baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_ARROW_NEXT :
475baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            // The enter causes default selection and
476baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            // the arrow keys are used to manipulate the list contents so
477baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            // do not use them for traversal.
478baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            event.doit = false;
479baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            break;
480baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_TAB_NEXT :
481baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye          case SWT.TRAVERSE_TAB_PREVIOUS :
482baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            event.doit = true;
483baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            break;
484baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        }
485baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Event e = new Event();
486baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.time = event.time;
487baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.detail = event.detail;
488baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.doit = event.doit;
489baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        e.keyCode = event.keyCode;
490baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        notifyListeners(SWT.Traverse, e);
491baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        event.doit = e.doit;
492baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        break;
493baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
494baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
495baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
496baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
497baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  private void dropDown(boolean drop) {
498baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (drop == isDropped()) {
499baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      return;
500baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
501baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (!drop) {
502baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_popup.setVisible(false);
503baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_text.setFocus();
504baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      return;
505baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
506baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int index = m_table.getSelectionIndex();
507baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (index != -1) {
508baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_table.setTopIndex(index);
509baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_table.setSelection(index);
510baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
511baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_table.pack();
512baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Point point = getParent().toDisplay(getLocation());
513baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Point comboSize = getSize();
514baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    //Rectangle tableRect = m_table.getBounds();
515baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    //int width = Math.max(comboSize.x, tableRect.width + 2);
516baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int width = comboSize.x - 1;
517baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    // only one column
518baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_table.getColumn(0).setWidth(width - 5);
519baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (!(m_popup.getLayout() instanceof FillLayout)) {
520baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_popup.setLayout(new FillLayout());
521baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
522baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int itemCount = m_table.getItemCount();
523baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (itemCount > 20) {
524baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      itemCount = 20;
525baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
526baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int height =
527baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        Math.min(
528baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            m_table.getItemHeight() * itemCount + 5,
529baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye            Display.getCurrent().getClientArea().height - point.y - 20);
530baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_popup.setBounds(point.x, point.y + comboSize.y, width, height);
531baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_popup.layout();
532baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_popup.setVisible(true);
533baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setFocus();
534baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (index != -1) {
535baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_table.setTopIndex(index);
536baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_table.setSelection(index);
537baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
538baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
539baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
540baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  @Override
541baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public Point computeSize(int wHint, int hHint, boolean changed) {
542baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
543baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int width = 0, height = 0;
544baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Point textSize = m_text.computeSize(wHint, SWT.DEFAULT, changed);
545baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Point arrowSize = m_arrow.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
546baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int tableWidth;
547baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    {
548baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      TableColumn column = m_table.getColumn(0);
549baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      column.pack();
550baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      tableWidth = column.getWidth();
551baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
552baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    //
553baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int borderWidth = getBorderWidth();
554baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    height = Math.max(hHint, Math.max(textSize.y, arrowSize.y) + 2 * borderWidth);
555baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    width = Math.max(wHint, Math.max(textSize.x + arrowSize.x, tableWidth) + 2 * borderWidth);
556baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    //
557baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return new Point(width, height);
558baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
559baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
560baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  private void internalLayout() {
561baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (isDropped()) {
562baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      dropDown(false);
563baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
564baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Rectangle rect = getClientArea();
565baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int width = rect.width;
566baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    int height = rect.height;
567baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    Point arrowSize = m_arrow.computeSize(SWT.DEFAULT, height);
568baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setBounds(rect.x, rect.y, width - arrowSize.x, height);
569baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_arrow.setBounds(rect.x + width - arrowSize.x, rect.y, arrowSize.x, arrowSize.y);
570baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
571baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
572baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  private boolean isDropped() {
573baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return m_popup.isVisible();
574baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
575baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
576baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  @Override
577baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public boolean isFocusControl() {
578baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
579baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (m_text.isFocusControl()
580baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        || m_arrow.isFocusControl()
581baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        || m_table.isFocusControl()
582baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        || m_popup.isFocusControl()) {
583baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      return true;
584baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
585baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return super.isFocusControl();
586baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
587baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
588baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public void select(int index) {
589baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
590baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (index == -1) {
591baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_table.deselectAll();
592baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_text.setText(""); //$NON-NLS-1$
593baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_text.setImage(null);
594baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      return;
595baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
596baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (0 <= index && index < m_table.getItemCount()) {
597baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      if (index != getSelectionIndex()) {
598baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        TableItem item = m_table.getItem(index);
599baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_text.setText(item.getText());
600baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_text.setImage(item.getImage());
601baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_table.select(index);
602baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        m_table.showSelection();
603baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
604baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
605baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
606baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
607baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  @Override
608baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public void setEnabled(boolean enabled) {
609baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    super.setEnabled(enabled);
610baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (enabled) {
611baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_text.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
612baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    } else {
613baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      m_text.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
614baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
615baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
616baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
617baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public String getItem(int index) {
618baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
619baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return m_table.getItem(index).getText();
620baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
621baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
622baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public int getSelectionIndex() {
623baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
624baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return m_table.getSelectionIndex();
625baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
626baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
627baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public void removeAll() {
628baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
629baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setText(""); //$NON-NLS-1$
630baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setImage(null);
631baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_table.removeAll();
632baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
633baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
634baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public int indexOf(String string) {
635baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return indexOf(string, 0);
636baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
637baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
638baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public int indexOf(String string, int start) {
639baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
640baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (string == null) {
641baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      return -1;
642baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
643baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    TableItem[] items = m_table.getItems();
644baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    for (int i = start; i < items.length; i++) {
645baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      TableItem item = items[i];
646baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      if (item.getText().equalsIgnoreCase(string)) {
647baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye        return i;
648baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      }
649baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
650baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return -1;
651baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
652baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
653baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public String getText() {
654baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return m_text.getText();
655baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
656baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
657baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public int getItemCount() {
658baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
659baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    return m_table.getItemCount();
660baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
661baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
662baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void setText(String string) {
663baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setText(string);
664baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
665baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
666baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  protected void setImage(Image image) {
667baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    m_text.setImage(image);
668baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
669baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
670baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public void add(String text) {
671baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    add(text, null);
672baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
673baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
674baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public void add(String text, Image image) {
675baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
676baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    TableItem item = new TableItem(m_table, SWT.NONE);
677baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    item.setText(text);
678baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    item.setImage(image);
679baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
680baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye
681baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  public void addSelectionListener(SelectionListener listener) {
682baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    checkWidget();
683baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    if (listener == null) {
684baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye      SWT.error(SWT.ERROR_NULL_ARGUMENT);
685baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    }
686baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    TypedListener typedListener = new TypedListener(listener);
687baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    addListener(SWT.Selection, typedListener);
688baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye    addListener(SWT.DefaultSelection, typedListener);
689baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye  }
690baf49b0e01f0e601d28128d4ba522f2f15244ad5Tor Norbye}
691