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()); }