/** * */ package com.hangum.tadpole.rdb.core.editors.main.parameter; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Composite; /** * @author nilriri * */ public class KeyEventComboBoxCellEditor extends ComboBoxCellEditor { private TableViewer viewer = null; private String[] items = null; private int column = -1; /** * */ public KeyEventComboBoxCellEditor() { } /** * @param parent * @param items */ public KeyEventComboBoxCellEditor(Composite parent, String[] items) { super(parent, items); } /** * @param items * @param parent */ public KeyEventComboBoxCellEditor(int column, TableViewer viewer, String[] items) { super(viewer.getTable(), items); this.viewer = viewer; this.column = column; this.items = items; } @Override protected void keyReleaseOccured(KeyEvent keyEvent) { super.keyReleaseOccured(keyEvent); ComboBoxCellEditor cbe = (ComboBoxCellEditor)this; CCombo cm = (CCombo)cbe.getControl(); // 아이템 목록이 표시되어 있으면... if ( cm.getListVisible() ) { if (keyEvent.keyCode == SWT.CR || keyEvent.keyCode == SWT.KEYPAD_CR) { // 엔터키을 누른경우 선택값을 반영후 편집상태를 계속유지하도록 한다. Object element = viewer.getElementAt(viewer.getTable().getSelectionIndex()); viewer.editElement(element, column); return; } return; } if (keyEvent.keyCode == SWT.ARROW_UP) { if (-1 < viewer.getTable().getSelectionIndex()) { Object element = viewer.getElementAt(viewer.getTable().getSelectionIndex() - 1); if (element != null){ viewer.editElement(element, column); } else { element = viewer.getElementAt(viewer.getTable().getItemCount() - 1); viewer.editElement(element, column); } } } else if (keyEvent.keyCode == SWT.ARROW_DOWN) { if (viewer.getTable().getItemCount() > viewer.getTable().getSelectionIndex()) { Object element = viewer.getElementAt(viewer.getTable().getSelectionIndex() + 1); if (element != null){ viewer.editElement(element, column); } else { element = viewer.getElementAt(0); viewer.editElement(element, column); } } }else if (keyEvent.keyCode == SWT.ARROW_LEFT) { if (column > 0) { Object element = viewer.getElementAt(viewer.getTable().getSelectionIndex()); viewer.editElement(element, column - 1); // 이동하려는 컬럼이 수정불가능한 cell일 경우 이동하지 않는다. // TODO : viewer에서 column 인덱스를 이용해 수정가능한 컬럼인지 확인하는 방법이 있으면.... // EditingSupport의 canEdit()정보를 이용할 수 없나?? if(!viewer.isCellEditorActive()) viewer.editElement(element, column); } } else if (keyEvent.keyCode == SWT.ARROW_RIGHT) { if (column < viewer.getTable().getColumnCount() - 1){ Object element = viewer.getElementAt(viewer.getTable().getSelectionIndex()); viewer.editElement(element, column + 1); // 이동하려는 컬럼이 수정불가능한 cell일 경우 이동하지 않는다. // TODO : viewer에서 column 인덱스를 이용해 수정가능한 컬럼인지 확인하는 방법이 있으면.... // EditingSupport의 canEdit()정보를 이용할 수 없나?? if(!viewer.isCellEditorActive()) viewer.editElement(element, column); } } } }