Eclipseのプラグイン開発のGEFの図形の選択方法について。
|
プログラム内から図形を選択するにはSelectionManagerを使う。
SelectionManagerはGraphicalEditor内のGraphicalViewerから取得することが出来る。
モデルにgetName()というメソッドが存在している前提で、その名前に一致する図形を選択状態にする例。
import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.SelectionManager;
public class MyEditor extends GraphicalEditorWithFlyoutPalette {
〜
public void select(String name) {
GraphicalViewer viewer = getGraphicalViewer();
SelectionManager manager = viewer.getSelectionManager();
manager.deselectAll(); //現在の選択を全解除
EditPart found = findEditPart(name);
if (found != null) {
manager.appendSelection(found); //図形を選択
}
}
private EditPart findEditPart(String name) {
GraphicalViewer viewer = getGraphicalViewer();
DiagramEditPart diagramEditPart = (DiagramEditPart)viewer.getContents();
@SuppressWarnings("unchecked")
List<EditPart> list = diagramEditPart.getChildren();
for (EditPart editPart : list) {
MyModel model = (MyModel)editPart.getModel();
if (name.equals(model.getName())) {
return editPart;
}
}
return null;
}
}
なお、図形が選択状態にはなるが、その図形への移動(図形が枠外にある時にその図形が枠内に出てくるようスクロールする)はされない。
スクロールさせる為には、GraphicalViewer#reveal()を呼び出す。[2013-09-11]
public void selectAndReveal(EditPart editPart) {
SelectionManager manager = getSelectionManager();
manager.deselectAll();
manager.appendSelection(editPart);
GraphicalViewer viewer = getGraphicalViewer();
viewer.reveal(editPart);
}
ついでに言うと、SelectionManagerを使わなくてもGraphicalViewerだけで出来た^^;[2013-09-11]
public void selectAndReveal(EditPart editPart) {
GraphicalViewer viewer = getGraphicalViewer();
// viewer.deselectAll();
// viewer.appendSelection(editPart);
viewer.select(editPart);
viewer.reveal(editPart);
}
参考: RichardさんのSelection actions in GEF
DiagramEditPart等のEditPartからも選択&スクロールさせることが出来る。[2013-09-11]
import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import jp.hishidama.eclipse_plugin.toad.model.diagram.DiagramEditPart;
private void selectAndReveal(DiagramEditPart diagram, EditPart editPart) {
EditPartViewer viewer = diagram.getViewer();
// viewer.deselectAll();
// viewer.appendSelection(editPart);
viewer.select(editPart);
viewer.reveal(editPart);
}
図形の全選択を可能にする方法。
//import org.eclipse.gef.internal.GEFMessages; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.actions.RetargetAction;
public class MyActionBarContributor extends ActionBarContributor {
@Override
protected void buildActions() {
〜
// addRetargetAction(new RetargetAction(ActionFactory.SELECT_ALL.getId(), GEFMessages.SelectAllAction_Label));
addRetargetAction(new RetargetAction(ActionFactory.SELECT_ALL.getId(), null));
}
buildActions()でSELECT_ALLを登録すると、Ctrl+Aで全図形を選択することができるようになる。
また、メニューバーの「Edit」→「Select All」も有効になる。
参考: vainoloさんのCan I change this later???
RetargetActionのコンストラクターの第2引数はボタンか何かのラベルらしいが、GEFMessagesはinternalパッケージのクラスなので、使うと警告が出てしまう。
もしくは(SELECT_ALL内で使われている)WorkbenchMessages.Workbench_selectAllでも良さそうだが、internalパッケージなのは同じ。
試しにnullを渡してみたら特にエラーは出なかったので、とりあえずnullにしておく。
動作の実体はSelectAllActionクラスであり、GraphicalEditor#createActions()でインスタンス化されてregistryに登録されている。
SelectAllActionではEditor内のEditPart(図形)を収集している。
EditPartにはisSelectable()というメソッドがあり、これがtrueのEditPartだけが選択対象となる。
つまり、もし選択対象にしたくない図形があるのなら、該当図形のEditPartのisSelectable()がfalseを返すようにすればよい。
RetargetActionを定義する代わりに、GlobalActionKeyを登録する方法でも良いようだ。[2013-12-04]
@Override
protected void buildActions() {
〜
// addRetargetAction(new RetargetAction(ActionFactory.SELECT_ALL.getId(), null));
}
@Override
protected void declareGlobalActionKeys() {
addGlobalActionKey(ActionFactory.SELECT_ALL.getId());
}