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.internal.core.model.property.editor; 12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.core.controls.CCombo3; 14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.Property; 15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.table.PropertyTable; 16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.SWT; 18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.FocusAdapter; 19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.FocusEvent; 20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.MouseAdapter; 21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.MouseEvent; 22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.SelectionAdapter; 23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.SelectionEvent; 24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Point; 25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Rectangle; 26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Event; 27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Listener; 28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/** 30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * The {@link PropertyEditor} for selecting single value using {@link CCombo3}. 31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * 32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @author scheglov_ke 33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @coverage core.model.property.editor 34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */ 35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic abstract class AbstractComboPropertyEditor extends TextDisplayPropertyEditor { 36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye //////////////////////////////////////////////////////////////////////////// 37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // 38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // Editing 39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // 40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye //////////////////////////////////////////////////////////////////////////// 41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye private CCombo3 m_combo; 42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye private boolean m_doDropDown; 43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye @Override 45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public boolean activate(final PropertyTable propertyTable, final Property property, Point location) 46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye throws Exception { 47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // create combo 48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye { 49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo = new CCombo3(propertyTable, SWT.NONE); 50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_doDropDown = true; 51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // add items 52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye addItems(property, m_combo); 53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // select item 54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye selectItem(property, m_combo); 55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // add listeners 57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.addFocusListener(new FocusAdapter() { 58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye @Override 59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public void focusLost(FocusEvent e) { 60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye propertyTable.deactivateEditor(true); 61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye }); 63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.addSelectionListener(new SelectionAdapter() { 64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye @Override 65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public void widgetSelected(SelectionEvent e) { 66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye int index = m_combo.getSelectionIndex(); 67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye toProperty(propertyTable, property, index); 68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye }); 70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.addListener(SWT.KeyDown, new Listener() { 71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public void handleEvent(Event event) { 72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye switch (event.keyCode) { 73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye case SWT.ESC : 74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye propertyTable.deactivateEditor(false); 75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye break; 76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye case SWT.DEL : 77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye try { 78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye property.setValue(Property.UNKNOWN_VALUE); 79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye event.doit = false; 80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye selectItem(property, m_combo); 81765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } catch (Throwable e) { 82765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye propertyTable.handleException(e); 83765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye propertyTable.deactivateEditor(false); 84765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 85765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.doDropDown(false); 86765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye break; 87765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 88765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 89765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye }); 90765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.addMouseListener(new MouseAdapter() { 91765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye @Override 92765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public void mouseDoubleClick(MouseEvent e) { 93765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye int index = (m_combo.getSelectionIndex() + 1) % m_combo.getItemCount(); 94765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye toProperty(propertyTable, property, index); 95765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 96765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye }); 97765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // keep editor active 98765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye return true; 99765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 100765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 101765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye @Override 102765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public final void setBounds(Rectangle bounds) { 103765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.setBounds(bounds); 104765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // editor created without bounds, so activate it after first setBounds() 105765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye if (m_doDropDown) { 106765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_doDropDown = false; 107765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.setFocus(); 108765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.doDropDown(true); 109765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.startDrag(); 110765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 111765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 112765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 113765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye @Override 114765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye public final void deactivate(PropertyTable propertyTable, Property property, boolean save) { 115765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye if (m_combo != null) { 116765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo.dispose(); 117765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye m_combo = null; 118765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 119765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 120765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 121765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye //////////////////////////////////////////////////////////////////////////// 122765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // 123765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // Abstract methods 124765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye // 125765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye //////////////////////////////////////////////////////////////////////////// 126765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye /** 127765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Adds items to given {@link CCombo3}. 128765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */ 129765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye protected abstract void addItems(Property property, CCombo3 combo) throws Exception; 130765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 131765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye /** 132765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Selects current item in given {@link CCombo3}. 133765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */ 134765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye protected abstract void selectItem(Property property, CCombo3 combo) throws Exception; 135765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 136765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye /** 137765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Transfers data from widget to {@link Property}. 138765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */ 139765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye protected abstract void toPropertyEx(Property property, CCombo3 combo, int index) 140765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye throws Exception; 141765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye 142765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye /** 143765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Transfers data from widget to {@link Property}. 144765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */ 145765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye private void toProperty(PropertyTable propertyTable, Property property, int index) { 146765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye try { 147765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye toPropertyEx(property, m_combo, index); 148765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } catch (Throwable e) { 149765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye propertyTable.handleException(e); 150765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 151765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye propertyTable.deactivateEditor(false); 152765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye } 153765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye} 154