1765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/*******************************************************************************
2765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Copyright (c) 2011 Google, Inc.
3765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * All rights reserved. This program and the accompanying materials
4765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * are made available under the terms of the Eclipse Public License v1.0
5765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * which accompanies this distribution, and is available at
6765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * http://www.eclipse.org/legal/epl-v10.html
7765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
8765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Contributors:
9765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *    Google, Inc. - initial API and implementation
10765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *******************************************************************************/
11765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepackage org.eclipse.wb.core.controls;
12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.draw2d.IColorConstants;
14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.table.PropertyTable;
15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.utils.binding.editors.controls.DefaultControlActionsManager;
16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.SWT;
18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.SelectionListener;
19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Image;
20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Point;
21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Rectangle;
22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.layout.FillLayout;
23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Button;
24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Composite;
25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Event;
26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Listener;
27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Shell;
28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Table;
29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.TableColumn;
30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.TableItem;
31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.TypedListener;
32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Widget;
33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/**
35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Combo control for {@link PropertyTable} and combo property editors.
36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @author scheglov_ke
38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @coverage core.control
39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */
40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic class CCombo3 extends Composite {
41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final long m_createTime = System.currentTimeMillis();
42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final CImageLabel m_text;
43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Button m_arrow;
44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Shell m_popup;
45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Table m_table;
46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private boolean m_fullDropdownTableSize = false;
47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Constructor
51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public CCombo3(Composite parent, int style) {
54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    super(parent, style);
55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    addEvents(this, m_comboListener, new int[]{SWT.Dispose, SWT.Move, SWT.Resize});
56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // create label
57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    {
58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_text = new CImageLabel(this, SWT.NONE);
59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      new DefaultControlActionsManager(m_text);
60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      addEvents(m_text, m_textListener, new int[]{
61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.KeyDown,
62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.KeyUp,
63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.MouseDown,
64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.MouseUp,
65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.MouseMove,
66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.MouseDoubleClick,
67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.Traverse,
68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.FocusIn,
69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          SWT.FocusOut});
70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // create arrow
72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    {
73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_arrow = new Button(this, SWT.ARROW | SWT.DOWN);
74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      addEvents(m_arrow, m_arrowListener, new int[]{SWT.Selection, SWT.FocusIn, SWT.FocusOut});
75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // create popup Shell
77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    {
78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      Shell shell = getShell();
79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_popup = new Shell(shell, SWT.NONE);
80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_popup.setLayout(new FillLayout());
81765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
82765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // create table for items
83765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    {
84765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_table = new Table(m_popup, SWT.FULL_SELECTION);
85765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      addEvents(m_table, m_tableListener, new int[]{SWT.Selection, SWT.FocusIn, SWT.FocusOut});
86765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      //
87765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      new TableColumn(m_table, SWT.NONE);
88765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
89765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // Focus tracking filter
90765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    {
91765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      final Listener filter = new Listener() {
92765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        private boolean hasFocus;
93765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
94765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        public void handleEvent(Event event) {
95765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          boolean old_hasFocus = hasFocus;
96765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          hasFocus =
97765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              m_text.isFocusControl()
98765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                  || m_arrow.isFocusControl()
99765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                  || m_popup.isFocusControl()
100765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                  || m_table.isFocusControl();
101765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // configure colors
102765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (hasFocus) {
103765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_text.setBackground(IColorConstants.listSelection);
104765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_text.setForeground(IColorConstants.listSelectionText);
105765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          } else {
106765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_text.setBackground(IColorConstants.listBackground);
107765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_text.setForeground(IColorConstants.listForeground);
108765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
109765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // send FocusOut event
110765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (old_hasFocus && !hasFocus) {
111765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            Event e = new Event();
112765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            e.widget = CCombo3.this;
113765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            e.time = event.time;
114765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            notifyListeners(SWT.FocusOut, e);
115765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
116765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
117765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      };
118765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      getDisplay().addFilter(SWT.FocusIn, filter);
119765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      addListener(SWT.Dispose, new Listener() {
120765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        public void handleEvent(Event event) {
121765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          getDisplay().removeFilter(SWT.FocusIn, filter);
122765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
123765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      });
124765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
125765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
126765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
127765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
128765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
129765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Events handling
130765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
131765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
132765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Listener m_comboListener = new Listener() {
133765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public void handleEvent(Event event) {
134765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      switch (event.type) {
135765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.Dispose :
136765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (!m_popup.isDisposed()) {
137765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_popup.dispose();
138765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
139765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
140765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.Move :
141765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          doDropDown(false);
142765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
143765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.Resize :
144765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          doResize();
145765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
146765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
147765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
148765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
149765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Listener m_textListener = new Listener() {
150765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public void handleEvent(final Event event) {
151765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      switch (event.type) {
152765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.MouseDown :
153765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (System.currentTimeMillis() - m_createTime < 400) {
154765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            // send "logical" double click for case when we just activated combo
155765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            // and almost right away click second time (but first time on editor)
156765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            event.detail = -1;
157765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            notifyListeners(SWT.MouseDoubleClick, event);
158765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            // when we use "auto drop on editor activation" option, this click is
159765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            // is "logically" second one, so it should close combo
160765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            if (!isDisposed()) {
161765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              doDropDown(false);
162765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            }
163765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          } else {
164765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_text.setCapture(true);
165765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            doDropDown(!isDropped());
166765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
167765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
168765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.MouseUp : {
169765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          m_text.setCapture(false);
170765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          TableItem item = getItemUnderCursor(event);
171765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (item != null) {
172765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            doDropDown(false);
173765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            sendSelectionEvent(event);
174765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
175765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
176765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
177765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.MouseDoubleClick :
178765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // prevent resending MouseDoubleClick that we sent on fast MouseDown
179765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (event.detail != -1) {
180765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            notifyListeners(SWT.MouseDoubleClick, event);
181765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
182765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
183765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.MouseMove : {
184765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          TableItem item = getItemUnderCursor(event);
185765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (item != null) {
186765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_table.setSelection(new TableItem[]{item});
187765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
188765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
189765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
190765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.KeyDown : {
191765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // check for keyboard navigation and selection
192765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          {
193765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            int selectionIndex = m_table.getSelectionIndex();
194765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            if (event.keyCode == SWT.ARROW_UP) {
195765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              selectionIndex--;
196765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              if (selectionIndex < 0) {
197765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                selectionIndex = m_table.getItemCount() - 1;
198765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              }
199765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              m_table.setSelection(selectionIndex);
200765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              return;
201765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            } else if (event.keyCode == SWT.ARROW_DOWN) {
202765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              m_table.setSelection((selectionIndex + 1) % m_table.getItemCount());
203765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              return;
204765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            } else if (event.character == SWT.CR || event.character == ' ') {
205765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              sendSelectionEvent(event);
206765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              return;
207765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            }
208765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
209765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // be default just resend event
210765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          resendKeyEvent(event);
211765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
212765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
213765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.KeyUp :
214765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          resendKeyEvent(event);
215765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
216765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
217765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
218765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
219765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    private TableItem getItemUnderCursor(Event event) {
220765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      Point displayLocation = m_text.toDisplay(new Point(event.x, event.y));
221765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      Point tableLocation = m_table.toControl(displayLocation);
222765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return m_table.getItem(tableLocation);
223765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
224765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
225765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Listener m_arrowListener = new Listener() {
226765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public void handleEvent(Event event) {
227765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      switch (event.type) {
228765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      /*case SWT.FocusIn : {
229765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye       resendFocusEvent(event);
230765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye       break;
231765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye       }*/
232765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.Selection : {
233765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          doDropDown(!isDropped());
234765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
235765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
236765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
237765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
238765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
239765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private final Listener m_tableListener = new Listener() {
240765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public void handleEvent(Event event) {
241765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      switch (event.type) {
242765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        case SWT.Selection : {
243765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          doDropDown(false);
244765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // show selected item in text
245765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          {
246765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            int index = m_table.getSelectionIndex();
247765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            select(index);
248765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
249765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // send selection event
250765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          sendSelectionEvent(event);
251765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          break;
252765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
253765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
254765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
255765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
256765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
257765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
258765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
259765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Events utils
260765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
261765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
262765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
263765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Sends selection event.
264765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
265765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private void sendSelectionEvent(Event event) {
266765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Event e = new Event();
267765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    e.time = event.time;
268765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    e.stateMask = event.stateMask;
269765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    notifyListeners(SWT.Selection, e);
270765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
271765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
272765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
273765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Resends KeyDown/KeyUp events.
274765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
275765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private void resendKeyEvent(Event event) {
276765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Event e = new Event();
277765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    e.time = event.time;
278765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    e.character = event.character;
279765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    e.keyCode = event.keyCode;
280765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    e.stateMask = event.stateMask;
281765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    notifyListeners(event.type, e);
282765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
283765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
284765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
285765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Adds given listener as handler for events in given widget.
286765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
287765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private void addEvents(Widget widget, Listener listener, int[] events) {
288765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    for (int i = 0; i < events.length; i++) {
289765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      widget.addListener(events[i], listener);
290765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
291765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
292765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
293765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
294765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Adds the listener to receive events.
295765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
296765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void addSelectionListener(SelectionListener listener) {
297765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    checkWidget();
298765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (listener == null) {
299765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      SWT.error(SWT.ERROR_NULL_ARGUMENT);
300765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
301765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    TypedListener typedListener = new TypedListener(listener);
302765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    addListener(SWT.Selection, typedListener);
303765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    addListener(SWT.DefaultSelection, typedListener);
304765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
305765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
306765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
307765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
308765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Activity
309765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
310765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
311765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
312765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Sets drop state of combo.
313765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
314765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void doDropDown(boolean drop) {
315765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // check, may be we already in this drop state
316765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (drop == isDropped()) {
317765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return;
318765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
319765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // close combo
320765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (!drop) {
321765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_popup.setVisible(false);
322765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_text.setFocus();
323765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return;
324765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
325765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // open combo
326765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    {
327765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      // prepare popup location
328765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      Point comboSize = getSize();
329765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      Point popupLocation;
330765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      {
331765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        //popupLocation = getParent().toDisplay(getLocation());
332765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        popupLocation = toDisplay(new Point(0, 0));
333765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        popupLocation.y += comboSize.y;
334765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
335765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      // calculate and set popup location
336765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      {
337765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        TableColumn tableColumn = m_table.getColumn(0);
338765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // pack everything
339765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        tableColumn.pack();
340765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        m_table.pack();
341765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        m_popup.pack();
342765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // calculate bounds
343765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Rectangle tableBounds = m_table.getBounds();
344765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        tableBounds.height = Math.min(tableBounds.height, m_table.getItemHeight() * 20); // max 20 items without scrolling
345765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        m_table.setBounds(tableBounds);
346765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // calculate size
347765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        int remainingDisplayHeight = getDisplay().getClientArea().height - popupLocation.y - 10;
348765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        int preferredHeight = Math.min(tableBounds.height, remainingDisplayHeight);
349765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        int remainingDisplayWidth = getDisplay().getClientArea().width - popupLocation.x - 5;
350765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        int preferredWidth =
351765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            isFullDropdownTableWidth()
352765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                ? Math.min(tableBounds.width, remainingDisplayWidth)
353765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                : comboSize.x;
354765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // set popup bounds calculated as computeTrim basing on combo width and table height paying attention on remaining display space
355765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Rectangle popupBounds =
356765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            m_popup.computeTrim(popupLocation.x, popupLocation.y, preferredWidth, preferredHeight);
357765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        m_popup.setBounds(popupBounds);
358765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // adjust column size
359765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        tableColumn.setWidth(m_table.getClientArea().width);
360765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
361765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_popup.setVisible(true);
362765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      // scroll to selection if needed
363765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_table.showSelection();
364765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
365765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
366765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
367765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
368765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Initiates "press-hold-drag" sequence.
369765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
370765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void startDrag() {
371765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_text.setCapture(true);
372765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
373765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
374765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
375765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
376765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Access
377765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
378765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
379765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void setFullDropdownTableWidth(boolean freeTableSize) {
380765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_fullDropdownTableSize = freeTableSize;
381765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
382765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
383765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public boolean isFullDropdownTableWidth() {
384765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_fullDropdownTableSize;
385765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
386765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
387765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public boolean isDropped() {
388765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_popup.isVisible();
389765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
390765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
391765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void setQuickSearch(boolean value) {
392765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // TODO
393765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
394765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
395765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
396765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
397765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Access: items
398765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
399765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
400765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
401765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Removes all items.
402765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
403765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void removeAll() {
404765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    TableItem[] items = m_table.getItems();
405765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    for (int index = 0; index < items.length; index++) {
406765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      TableItem item = items[index];
407765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      item.dispose();
408765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
409765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
410765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
411765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
412765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Adds new item with given text.
413765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
414765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void add(String text) {
415765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    add(text, null);
416765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
417765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
418765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
419765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Adds new item with given text and image.
420765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
421765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void add(String text, Image image) {
422765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    checkWidget();
423765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    TableItem item = new TableItem(m_table, SWT.NONE);
424765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    item.setText(text);
425765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    item.setImage(image);
426765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
427765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
428765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
429765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return an item at given index
430765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
431765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public String getItem(int index) {
432765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    checkWidget();
433765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_table.getItem(index).getText();
434765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
435765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
436765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
437765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the number of items
438765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
439765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public int getItemCount() {
440765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    checkWidget();
441765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_table.getItemCount();
442765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
443765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
444765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
445765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the index of the selected item
446765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
447765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public int getSelectionIndex() {
448765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    checkWidget();
449765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_table.getSelectionIndex();
450765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
451765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
452765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
453765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Selects an item with given index.
454765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
455765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void select(int index) {
456765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    checkWidget();
457765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (index == -1) {
458765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_table.deselectAll();
459765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_text.setText(null);
460765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_text.setImage(null);
461765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return;
462765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    } else {
463765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      TableItem item = m_table.getItem(index);
464765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_text.setText(item.getText());
465765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_text.setImage(item.getImage());
466765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_table.select(index);
467765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
468765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
469765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
470765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
471765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
472765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Access: text and image
473765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
474765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
475765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
476765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Selects item with given text.
477765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
478765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void setText(String text) {
479765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // try to find item with given text
480765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    TableItem[] items = m_table.getItems();
481765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    for (int index = 0; index < items.length; index++) {
482765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      TableItem item = items[index];
483765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      if (item.getText().equals(text)) {
484765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        select(index);
485765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        return;
486765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
487765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
488765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // not found, remove selection
489765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    select(-1);
490765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
491765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
492765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
493765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
494765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Resize support
495765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // TODO: computeSize
496765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
497765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
498765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected void doResize() {
499765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Rectangle clientArea = getClientArea();
500765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    int areaWidth = clientArea.width;
501765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    int areaHeight = clientArea.height;
502765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // compute sizes of controls
503765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Point buttonSize = m_arrow.computeSize(areaHeight, areaHeight);
504765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Point textSize = m_text.computeSize(areaWidth - buttonSize.x, areaHeight);
505765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // set controls location/size
506765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_arrow.setLocation(areaWidth - buttonSize.x, 0);
507765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_arrow.setSize(buttonSize);
508765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_text.setSize(areaWidth - buttonSize.x, Math.max(textSize.y, areaHeight));
509765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
510765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye}
511