TreeViewerクラスでツリー構造を扱う。
import org.eclipse.jface.viewers.TreeViewer;
int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL; // int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; TreeViewer viewer = new TreeViewer(parent, style); viewer.setContentProvider(new MyContentProvider()); viewer.setLabelProvider(new MyLabelProvider()); viewer.setInput(root);
スタイルのSINGLE/MULTIは、単一選択/複数選択可能かどうかを指定するもの。
ContentProviderはツリーの(階層)データを提供するクラス。
LabelProviderはノード(要素)にラベルを付けたい場合に指定する。
setInput()でデータそのものを渡す。
これがContentProviderやLabelProviderに渡されるので、それに応じた処理を記述する。
TreeViewerでは、表示されている各ノード(要素)の左側の(開閉を示す)アイコンをクリックすることでツリーが開いたり閉じたりする。
が、デフォルトでは、ノードの文字列をダブルクリックしてもそういった動作は起こらない。
そこで、文字列をダブルクリックした場合にツリーを開閉するコードを書いてみた。
import java.util.List; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection;
TreeViewer viewer = new TreeViewer(parent, style); viewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); if (selection.isEmpty()) { return; } List<?> list = selection.toList(); TreeViewer viewer = (TreeViewer) event.getSource(); for (Object element : list) { if (viewer.getExpandedState(element)) { viewer.collapseToLevel(element, 1); } else { viewer.expandToLevel(element, 1); } } } });
getExpandedState()で該当ノードが開かれているかどうかを判定し、開く場合はexpand、閉じる場合はcollapseを呼び出す。
(ちなみに、全体を開閉するexpandAll/collapseAllというメソッドもある)
もしくは、以下の様に書くことも出来る。
for (Object element : list) { boolean expanded = viewer.getExpandedState(element); viewer.setExpandedState(element, !expanded); }
プログラム内からツリーの要素を選択する方法。[2013-02-10]
import org.eclipse.jface.viewers.StructuredSelection;
TreeViewer viewer = getTreeViewer(); StructuredSelection selection = new StructuredSelection(element); viewer.setSelection(selection, true);