GEF实践总结 SelectionTool与SelectionEditPolicy
一. 目标
- 能够选中Column。
- 对Column选择时,能够在首要选中、次要选中、取消选中显示不一样的颜色。
二. 修改GraphicalViewer,设置EditDomain,并指定ActiveTool
会发现目前的效果中,无法点选、圈选图像(Table或Column),没错,因为缺少了SelectionTool或MarqueeTool。
- //
- EditDomain domain = new EditDomain();
- domain.setActiveTool(new SelectionTool());
- graphicalViewer.setEditDomain(domain);
//
EditDomain domain = new EditDomain();
domain.setActiveTool(new SelectionTool());
graphicalViewer.setEditDomain(domain);
EditDomain 类似于GraphicalViewer的执行的上下环境,通过setActiveTool可以设置当前处于Active状态的Tool。
Tool :对鼠标事件、按键等的处理,或代理
SelectionTool :点选
MarqueeTool :圈选
三. 改写Figure
- public TableColumnFigure() {
- super();
- this.setOpaque(true);
- }
public TableColumnFigure() {
super();
this.setOpaque(true);
}
setOpaque :设置背景色不透明
- public void setSelection(boolean primary, boolean selected) {
- if (primary && selected) {
- this.setBackgroundColor(ColorConstants.yellow);
- } else if (selected) {
- this.setBackgroundColor(ColorConstants.lightGray);
- } else {
- this.setBackgroundColor(ColorConstants.white);
- }
- }
public void setSelection(boolean primary, boolean selected) {
if (primary && selected) {
this.setBackgroundColor(ColorConstants.yellow);
} else if (selected) {
this.setBackgroundColor(ColorConstants.lightGray);
} else {
this.setBackgroundColor(ColorConstants.white);
}
}
- 首要选中时背景色为黄色
- 次要选中时背景色为灰色
- 未选中(取消选中)时背景色为白色
四. 给TableColumnEditPart添加SelectionEditPolicy
- public class TableColumnSelectionEditPolicy extends SelectionEditPolicy {
- @Override
- protected void showPrimarySelection() {
- TableColumnFigure figure = (TableColumnFigure) getHostFigure();
- figure.setSelection(true, true);
- }
- @Override
- protected void showSelection() {
- TableColumnFigure figure = (TableColumnFigure) getHostFigure();
- figure.setSelection(false, true);
- }
- @Override
- protected void hideSelection() {
- TableColumnFigure figure = (TableColumnFigure) getHostFigure();
- figure.setSelection(false, false);
- }
- }
public class TableColumnSelectionEditPolicy extends SelectionEditPolicy {
@Override
protected void showPrimarySelection() {
TableColumnFigure figure = (TableColumnFigure) getHostFigure();
figure.setSelection(true, true);
}
@Override
protected void showSelection() {
TableColumnFigure figure = (TableColumnFigure) getHostFigure();
figure.setSelection(false, true);
}
@Override
protected void hideSelection() {
TableColumnFigure figure = (TableColumnFigure) getHostFigure();
figure.setSelection(false, false);
}
}
a) EditPolicy :
b) SelectionEditPolicy :
- showPrimarySelection : 显示首要选中的模型。默认情况下直接使用showSelection方法。
- showSelection :显示选中的模型,非首要选中的模型。
- hideSelection :取消选中
五. 注册SelectionEditPolicy
- @Override
- protected void createEditPolicies() {
- installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new TableColumnSelectionEditPolicy());
- }
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new TableColumnSelectionEditPolicy());
}
六. 启动,查看运行效果
七. 总结
- 通过给GraphicalViewer添加EditDomain,并指定Active的Tool为SelectionTool就可以点选图像了。
- 通过添加SelectionEditPolicy,就可以处理首要选中,非首要选中,未选中(取消选中)的不同效果了。