http://plaza.rakuten.co.jp/plugin/diary/200610250000/
テーブル編集エディターからレコードを削除する際に、 すべての行を選択したい・・・と思ったので、実装してみました。
一番簡単な方法は、TableViewerのTableに対して、KeyListenerを追加することで可能ですが
(参考) table.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.stateMask == SWT.CTRL && e.keyCode == 97) { // 全ての行を選択する table.selectAll(); } } }); これでは、テーブル編集エディターがActiveになっている場合でも、Where条件入力部分に カーソルがある場合、イベントを拾ってくれません。
その為、Eclipseの既存のメニューに動的に割り当てる方法にチャンレジしてみました。
今回追加するのは以下の2つ
<Eclipseのメニューにある「編集(E)」→「すべて選択」に"すべての行を選択する機能"を割り当てる> <Eclipseのメニューにある「編集(E)」→「削除」に"選択している行を削除するする機能"を割り当てる>
実装方法
1.TableViewerにSelectionChangedListenerを追加します。 Tableの選択/非選択の変更を拾い、「削除」の活性をOn/Offするために使用します。 行を選択している場合のみ、活性をONにして、選択していないときは、活性をOFFにします。(EnableのTrue/Falseのこと) viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent e) { selectionChangeHandler(e); } }); : void selectionChangeHandler(SelectionChangedEvent event) { StructuredSelection selection = (StructuredSelection) event.getSelection(); if (selection.isEmpty()) { deleteAction.setEnabled(false); } else { deleteAction.setEnabled(true); } }
2.Eclipseのメニューに自作のActionを割り当てる(上書きする)
void setGlobalAction(IActionBars bars) { bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAllAction); bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction); }
3.エディターの切り替え(Active)時に適切なActionを割り当てる
エディタは複数起動するため、ActiveEditorのAction(インスタンス)を渡す必要がある。
public void setFocus() { setGlobalAction(getEditorSite().getActionBars()); }
※他に方法がありそうですが・・・ 4.「すべて選択」を実行した時や「検索」ボタンを押下した場合に、SelectionChangeListenerにイベントを通知する
プログラムから table.selectAll(); などを実行しても、SelectionChangeListenerにイベントが通知されないようです。 その為、自力でイベント通知します。 viewer.getTable().notifyListeners(SWT.Selection, null);
|