Eclipseのプラグイン開発で扱うJFaceのCheckboxTreeViewerについて。
CheckboxTreeViewerは、各要素の左端にチェックボックスを表示するツリー。
チェックボックスをクリックするとチェックが付いたり外れたりするが、
デフォルトではラベル部分をクリックしても何も起こらない。
ラベルをクリックした際もチェックが付けられる方が便利なので、それを実装してみる。
import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem;
this.viewer = new CheckboxTreeViewer(pane, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
〜
final Tree tree = viewer.getTree();
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
Point point = new Point(e.x, e.y);
TreeItem item = tree.getItem(point);
if (item == null) {
return;
}
if (item.getBounds().contains(point)) {
boolean checked = !item.getChecked();
item.setChecked(checked);
}
}
});
Treeにマウスリスナーを登録し、クリックされた際にクリックされた要素(TreeItem)を取得し、
さらにその中でラベル部分がクリックされたことを判定してチェックを反転させている。
この辺りの動作はWindowsとLinuxでは異なる。
WindowsではMouseListenerの代わりにSelectionListenerを使っても同様の処理は行えるが、Linuxでは駄目だった。