GEF小技巧之设定GraphicalEditor中图元为选中状态
??????? 我们也许会有这样的需求,类似于Powerdesigner那样,在左边的树上的表格点击鼠标右键,在弹出快捷菜单中点击“Find in Diagram”(在图中查找)的功能,说白了,就是实现鼠标点击某图元的效果。
??????? 因为是在GEF框架中,是先用户修改界面,控制器捕获修改信息,用Command来修改模型,模型的改变才会使控制器来最终改变画面。
??????? 假设我们要选择的GEF模型为TableGefModel,其对应的控制器为TableGefModelEditPart;
??????? 在TableGefModel中添加两个常量属性来标记状态的改变:
?public static final String TABLE_SELECT = "table_select";//?选中标记
?public static final String TABLE_NONE_SELECT = "table_none_select";// 不选中标记
??????? 再添加一个成员方法:
?/**
? * 设置图元是否被选中状态
? * @param selected
? */
?public void setSelected(boolean selected) {
??if(selected) {
???firePropertyListenerChange(TABLE_SELECT, null, null);
??} else {
???firePropertyListenerChange(TABLE_NONE_SELECT, null, null);
??}
?}
?
接着需要修改控制器TableGefModelEditPart中的刷新方法:
?@Override
?public void propertyChange(PropertyChangeEvent evt) {
?????? .... ....
// 选中某一个表格
?? if(evt.getPropertyName().equals(TableGefModel.TABLE_SELECT)) {
//???setSelected(EditPart.SELECTED_PRIMARY);
//???setSelected(EditPart.SELECTED_PRIMARY);
???getFigure().requestFocus();
???getViewer().appendSelection(this);???
???
??// 取消某一个表格的选中状态?
??} else if(evt.getPropertyName().equals(TableGefModel.TABLE_NONE_SELECT)) {
???setSelected(EditPart.SELECTED_NONE);
??}
}
?
当然,我们在选中某图形前,还需要取消该GraphicalEditor中其他图元的选中状态,所以,在选中目标图元之前,需要取消该GraphicalEditor中的集合模型—atabaseDiagramGefModel )中的所有子模型(TableGefModel)的选中状态,参考代码:
DatabaseDiagramGefModel databaseDiagramGefModel = databaseDiagramEditor.getDatabaseDiagramGefModel();?// 获取Editor中的集合模型
????? List<AbstractGefModel> getModelList = databaseDiagramGefModel.getChildren();?// 获取集合模型中的所有子模型
????? for(AbstractGefModel abstractGefModel : getModelList) {
???????//?先设置该模型为不选中状态
?????? ((TableGefModel)abstractGefModel).setSelected(false);
?
?????? //?如果该模型是我们需要选中的模型,则设置为选中状态
?????? if(tableModel.equals(abstractGefModel.getDataObject())){
???????? ((TableGefModel)abstractGefModel).setSelected(true);
?????? }
????? }
?????
?
注意,我们在设置选中状态时,不能用setSelected(EditPart.SELECTED_PRIMARY);
或者setSelected(EditPart.SELECTED_PRIMARY);因为此操作并不会激活控制器对应的状态栏等。至于是什么原因,由于开发时间紧,没仔细研究,以后补充!
?
?
?
?
?
?
?
?
?