您的位置:首页 > 其它

GEF企业应用开发之--企业应用支持

2011-04-23 12:15 381 查看
1 企业应用支持

1.1 双击支持
实现双击事件,只需在ShipPart中覆写performRequest()方法即可。

[align=left] [/align]
[align=left] @Override[/align]
[align=left] public void performRequest(Request request)[/align]
[align=left] {[/align]
[align=left] if (request.getType() == RequestConstants.REQ_OPEN)[/align]
[align=left] {[/align]
[align=left] //获得所点击的模型信息 [/align]
[align=left] ShipModel shipModel=(ShipModel)getModel();[/align]
[align=left] ShipInfo shipInfo=shipModel.getShipInfo();[/align]
[align=left] ShipInfoDialog sid=new ShipInfoDialog(BerthUtil.getInstances().getShell());[/align]
[align=left] sid.setShipInfo(shipInfo);[/align]
[align=left] sid.open();[/align]
[align=left] }[/align]
}
双击图标,可以实现dialog的打开:





1.2 右键支持
第一步在BerthGraphicalEditor中添加对右键的支持。

[align=left] protected void configureGraphicalViewer() {[/align]
[align=left] ……[/align]
[align=left] ContextMenuProvider provider = new BerthContextMenuProvider(this,viewer, getActionRegistry());[/align]
[align=left] viewer.setContextMenu(provider);[/align]
[align=left] getSite().registerContextMenu("org.jport.gef.editor.contextmenu",provider, viewer);[/align]
[align=left] ……[/align]
}
第二步在BerthGraphicalEditor中创建Action

[align=left]@SuppressWarnings("unchecked")[/align]
[align=left] public void createActions() {[/align]
[align=left] super.createActions();[/align]
[align=left] ActionRegistry registry = getActionRegistry();[/align]
[align=left] IAction action = new RefreshAction(this);[/align]
[align=left] registry.registerAction(action);[/align]
[align=left] getSelectionActions().add(action.getId());[/align]
}
第三步 创建BerthContextMenuProviderAction.java

[align=left]public void buildContextMenu(IMenuManager menu) {[/align]
[align=left] // Add standard action groups to the menu[/align]
[align=left] GEFActionConstants.addStandardActionGroups(menu);[/align]
[align=left] if (part instanceof BerthGraphicalEditor) {[/align]
[align=left] EditPart focusEditPart = getViewer().getFocusEditPart();[/align]
[align=left] //判断不同的模型,为不同的模型添加不同的menu[/align]
[align=left] if (focusEditPart instanceof ShipPart) {[/align]
[align=left] addShipModelPopuMenu(menu);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]private void addShipModelPopuMenu(IMenuManager menu) {[/align]
[align=left] //you can new an action here,but is inefficient,for everytime you click right click will create an new class[/align]
[align=left] menu.add(getAction("moveUp"));[/align]
}
Ok,试试看吧





1.3 图形更新
图形的更新分为两部分:
1、更新模型属性,使图形显示与模型同步。本文通过Tabbed修改模型的属性来触发图形的改变。

[align=left] // TODO Auto-generated method stub[/align]
[align=left] try {[/align]
[align=left] // invoke save service[/align]
[align=left] ShipInfo shipInfo=shipModel.getShipInfo();[/align]
[align=left] shipInfo.setShipName(shipNameT.getText());[/align]
[align=left] shipModel.setShipInfo(shipInfo);[/align]
[align=left] MessageDialogInfo.openInformation("提示信息", "位信息保存成功!");[/align]
[align=left] } catch (Exception e) {[/align]
[align=left] MessageDialogInfo.openError("错误提示", "保存位信息出错,请重试");[/align]
[align=left] }[/align]
[align=left] }[/align]
在ShipModle中的setShipInfo中,触发监听事件:

[align=left]public void setShipInfo(ShipInfo shipInfo) {[/align]
[align=left] this.shipInfo = shipInfo;[/align]
[align=left] getListeners().firePropertyChange(PROPERTY_UPDATEMODEL, null, shipInfo);[/align]
[align=left] }[/align]
在ShipPart中实现监听,

[align=left] public void propertyChange(PropertyChangeEvent evt) {[/align]
[align=left]……[/align]
[align=left] if (evt.getPropertyName().equals(ShipModel.PROPERTY_UPDATEMODEL)) refreshVisuals();[/align]
[align=left] } [/align]
[align=left] protected void refreshVisuals(){ [/align]
[align=left] ShipFigure figure = (ShipFigure)getFigure();[/align]
[align=left] ShipModel model = (ShipModel)getModel();[/align]
[align=left] figure.setShipName(model.getShipInfo().getShipName());[/align]
[align=left] figure.setLayout(model.getLayout());[/align]
[align=left] }[/align]
Ok,when update the ship name in the tabbed and click the save button ,you can see this:





2. 更新图形显示。由于图形是在图形显示时就绘制好的,不能在绘制完成后再重绘。如不能改变图形的“渐变背景”,注意如果背景是通过setBackgroundColor()方式设置的背景,可以像类似的属性更新的方式改变图形的背景。GEF没有提供图形的刷新方式,可以通过removeChild()和addChild()来实现。
本文同右键功能来实现图形的实现图形的刷新。
在RefreshAction的run方法做模型的刷新处理,其实质就是removeChild后再addChild;

[align=left] @Override [/align]
[align=left] public void run() { [/align]
[align=left] super.run(); [/align]
[align=left] ShipPart shipPart = (ShipPart) getSelectedObjects().get(0); [/align]
[align=left] DiagramModel parent=(DiagramModel)shipPart.getParent().getModel();[/align]
[align=left] ShipModel shipModel=(ShipModel)shipPart.getModel();[/align]
[align=left] //just for fun[/align]
[align=left] shipModel.setBgType(shipModel.getBgType()+1);[/align]
[align=left] parent.removeChild(shipModel);[/align]
[align=left] parent.addChild(shipModel);[/align]
}
Now you will see this:





右键点击双击时,即可看到背景颜色的改变。
1.4 Open editor
1、对导航列表添加双击事件

[align=left]public class Navigate extends ViewPart {[/align]
[align=left] ……[/align]
[align=left] public void createPartControl(Composite parent) {[/align]
[align=left] ……[/align]
[align=left]viewer.addDoubleClickListener(new TreeDoubleClick(viewer));[/align]
}
[align=left]package org.jport.gef.berth.action;[/align]
[align=left]public class TreeDoubleClick implements IDoubleClickListener {[/align]
[align=left] [/align]
[align=left]……[/align]
[align=left] public void doubleClick(DoubleClickEvent event)[/align]
[align=left] {[/align]
[align=left] IStructuredSelection selection = (IStructuredSelection) tv.getSelection();[/align]
[align=left] String companyName = (String) (selection.getFirstElement());[/align]
[align=left] [/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left]// //input 自动根据输入的不同来判断该Editor是否打开[/align]
[align=left] input=new BerthEditorInput(companyName);[/align]
[align=left] window.getActivePage().openEditor(input, BerthGraphicalEditor.ID);[/align]
[align=left] }[/align]
[align=left] catch (WorkbenchException e) {[/align]
[align=left] // TODO Auto-generated catch block[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
在打开Editot时,对于同一个公司名,始终保持打开且仅打开一个editor,这是由editorInput的name属性决定的,因为在editor中实现了:

[align=left] @Override[/align]
[align=left] public boolean exists() {[/align]
[align=left] return (this.name != null);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public boolean equals(Object o) {[/align]
[align=left] if (!(o instanceof BerthEditorInput))[/align]
[align=left] return false;[/align]
[align=left] return ((BerthEditorInput)o).getName().equals(getName());[/align]
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息