[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[转帖]Table编辑时,Ctrl+A全选的实现

上一篇:[转贴]Java的Byte.decode()方法的小例子
下一篇:[转帖]解决VB6中剪贴板Clipboard编程出现中文乱码的问题

添加日期:2011/4/28 10:53:30 快速返回   返回列表 阅读3574次
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);
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved