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