diff options
author | Tor Norbye <tnorbye@google.com> | 2012-03-22 08:43:06 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2012-03-22 08:43:06 -0700 |
commit | 562c581f49027009d6e99ba7b0162c53a051b1c4 (patch) | |
tree | 98a407a56524827aaee16c2fd90208c07db79edf /propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractComboBoxPropertyEditor.java | |
parent | 062f011b9ecb3e13ecdd5f72a1156046e6764a32 (diff) | |
download | eclipse-windowbuilder-562c581f49027009d6e99ba7b0162c53a051b1c4.tar.gz |
Add WindowBuilder propertysheet code. See README.txt for details.
Change-Id: I1274fe2c46805731d89ad75dd10419974a399a06
Diffstat (limited to 'propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractComboBoxPropertyEditor.java')
-rw-r--r-- | propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractComboBoxPropertyEditor.java | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractComboBoxPropertyEditor.java b/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractComboBoxPropertyEditor.java new file mode 100644 index 0000000..f122381 --- /dev/null +++ b/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractComboBoxPropertyEditor.java @@ -0,0 +1,156 @@ +/******************************************************************************* + * Copyright (c) 2011 Google, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Google, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.wb.internal.core.model.property.editor; + +import org.eclipse.wb.core.controls.CCombo3; +import org.eclipse.wb.core.controls.CComboBox; +import org.eclipse.wb.internal.core.model.property.Property; +import org.eclipse.wb.internal.core.model.property.table.PropertyTable; +import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; +import org.eclipse.wb.internal.core.utils.execution.RunnableEx; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusAdapter; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; + +/** + * The {@link PropertyEditor} for selecting single value using {@link CComboBox}. This editor has + * in-line search-feature and is more suitable (vs {@link AbstractComboPropertyEditor}) for + * properties with large lists of value items. + * + * @author sablin_aa + * @author scheglov_ke + * @coverage core.model.property.editor + */ +public abstract class AbstractComboBoxPropertyEditor extends TextDisplayPropertyEditor { + //////////////////////////////////////////////////////////////////////////// + // + // Editing + // + //////////////////////////////////////////////////////////////////////////// + private CComboBox m_combo; + private String m_dropDelayedText; + + @Override + public final boolean activate(final PropertyTable propertyTable, + final Property property, + Point location) throws Exception { + m_combo = new CComboBox(propertyTable, SWT.NONE); + // initialize + addItems(property, m_combo); + selectItem(property, m_combo); + // install listeners + m_combo.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + handleKeyPressed(propertyTable, property, e); + } + }); + m_combo.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + propertyTable.deactivateEditor(true); + } + }); + m_combo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + propertyTable.deactivateEditor(true); + } + }); + m_combo.setFocus(); + // schedule showing drop-down, because we don't have bounds yet + ExecutionUtils.runAsync(new RunnableEx() { + public void run() throws Exception { + m_combo.comboDropDown(true); + if (m_dropDelayedText != null) { + m_combo.setEditText(m_dropDelayedText); + m_combo.setEditSelection(m_dropDelayedText.length(), m_dropDelayedText.length()); + m_dropDelayedText = null; + } + } + }); + // keep editor active + return true; + } + + private void handleKeyPressed(PropertyTable propertyTable, Property property, KeyEvent e) { + if (e.keyCode == SWT.ESC) { + propertyTable.deactivateEditor(false); + } else if (e.keyCode == SWT.ARROW_UP || e.keyCode == SWT.ARROW_DOWN) { + e.doit = false; + propertyTable.deactivateEditor(true); + propertyTable.navigate(e); + } + } + + @Override + public final void deactivate(PropertyTable propertyTable, Property property, boolean save) { + if (save) { + toProperty(propertyTable, property); + } + if (m_combo != null) { + m_combo.dispose(); + m_combo = null; + } + } + + private void toProperty(PropertyTable propertyTable, Property property) { + try { + toPropertyEx(property, m_combo); + } catch (Throwable e) { + propertyTable.handleException(e); + } + } + + @Override + public void setBounds(Rectangle bounds) { + m_combo.setBounds(bounds); + } + + @Override + public void keyDown(PropertyTable propertyTable, Property property, KeyEvent event) + throws Exception { + boolean withAlt = (event.stateMask & SWT.ALT) != 0; + boolean withCtrl = (event.stateMask & SWT.CTRL) != 0; + if (event.character > 0x20 && !(withAlt || withCtrl)) { + propertyTable.activateEditor(property, null); + m_dropDelayedText = "" + event.character; + } + } + + //////////////////////////////////////////////////////////////////////////// + // + // Abstract methods + // + //////////////////////////////////////////////////////////////////////////// + /** + * Adds items to given {@link CComboBox}. + */ + protected abstract void addItems(Property property, CComboBox combo) throws Exception; + + /** + * Selects current item in given {@link CCombo3}. + */ + protected void selectItem(Property property, CComboBox combo) throws Exception { + } + + /** + * Transfers data from widget to {@link Property}. + */ + protected abstract void toPropertyEx(Property property, CComboBox combo) throws Exception; +} |