| /******************************************************************************* |
| * Copyright (c) 2008, 2013 Oracle. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License 2.0, which accompanies this distribution |
| * and is available at https://www.eclipse.org/legal/epl-2.0/. |
| * |
| * Contributors: |
| * Oracle - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.jpt.common.ui.internal.swt.widgets; |
| |
| import org.eclipse.swt.events.FocusEvent; |
| import org.eclipse.swt.events.FocusListener; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.widgets.Combo; |
| |
| /** |
| * A suite of utility methods related to the user interface. |
| * |
| * @version 2.0 |
| * @since 1.0 |
| */ |
| public final class ComboTools { |
| |
| /** |
| * Tweak the specified combo-box to remove the default value when the |
| * widget receives the focus and to show the default when the widget loses |
| * the focus. The default value must be the first value in the combo-box's |
| * selection list. |
| */ |
| public static void handleDefaultValue(Combo combo) { |
| ComboListener listener = new ComboListener(); |
| combo.addFocusListener(listener); |
| combo.addModifyListener(listener); |
| } |
| |
| /** |
| * This handler is responsible for removing the default value when the combo |
| * has the focus or when the selected item is the default value and to select |
| * it when the combo loses the focus. |
| */ |
| /* CU private */ static class ComboListener |
| implements FocusListener, ModifyListener |
| { |
| public void focusGained(FocusEvent e) { |
| Combo combo = (Combo) e.widget; |
| if (combo.getSelectionIndex() == 0) { |
| // cannot modify the combo while it is notifying its listeners |
| DisplayTools.asyncExec(new SelectText(combo)); |
| } |
| } |
| |
| public void focusLost(FocusEvent e) { |
| // NOP |
| } |
| |
| private class SelectText |
| implements Runnable |
| { |
| private final Combo combo; |
| |
| SelectText(Combo combo) { |
| super(); |
| this.combo = combo; |
| } |
| |
| public void run() { |
| if (this.combo.isDisposed()) { |
| return; |
| } |
| String text = this.combo.getText(); |
| this.combo.setSelection(new Point(0, text.length())); |
| } |
| } |
| |
| public void modifyText(ModifyEvent e) { |
| Combo combo = (Combo) e.widget; |
| if (combo.isFocusControl() && (combo.getSelectionIndex() == 0)) { |
| // cannot modify the combo while it is notifying its listeners |
| DisplayTools.asyncExec(new ModifyText(combo)); |
| } |
| } |
| |
| private class ModifyText |
| implements Runnable |
| { |
| private final Combo combo; |
| |
| ModifyText(Combo combo) { |
| super(); |
| this.combo = combo; |
| } |
| |
| public void run() { |
| if (this.combo.isDisposed()) { |
| return; |
| } |
| String text = this.combo.getText(); |
| if (text.length() == 0) { |
| text = this.combo.getItem(0); |
| this.combo.setText(text); |
| } |
| this.combo.setSelection(new Point(0, text.length())); |
| } |
| } |
| } |
| } |