1       企业应用支持

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

 
    @Override
    public void performRequest(Request request)
    {
       if (request.getType() == RequestConstants.REQ_OPEN)
       {
           //获得所点击的模型信息                     
           ShipModel shipModel=(ShipModel)getModel();
           ShipInfo shipInfo=shipModel.getShipInfo();
           ShipInfoDialog sid=new ShipInfoDialog(BerthUtil.getInstances().getShell());
           sid.setShipInfo(shipInfo);
           sid.open();
       }
    }

双击图标,可以实现dialog的打开:
 

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

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

    protected void configureGraphicalViewer() {
         ……
       ContextMenuProvider provider = new BerthContextMenuProvider(this,viewer, getActionRegistry());
       viewer.setContextMenu(provider);
     getSite().registerContextMenu("org.jport.gef.editor.contextmenu",provider, viewer);
       ……
    }

第二步在BerthGraphicalEditor中创建Action

@SuppressWarnings("unchecked")
    public void createActions() {
       super.createActions();
       ActionRegistry registry = getActionRegistry();
       IAction    action = new RefreshAction(this);
       registry.registerAction(action);
       getSelectionActions().add(action.getId());
    }

第三步 创建BerthContextMenuProviderAction.java

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

Ok,试试看吧
 

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

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

    // TODO Auto-generated method stub
       try {
           // invoke save service
           ShipInfo shipInfo=shipModel.getShipInfo();
           shipInfo.setShipName(shipNameT.getText());
           shipModel.setShipInfo(shipInfo);
           MessageDialogInfo.openInformation("提示信息", "位信息保存成功!");
       } catch (Exception e) {
           MessageDialogInfo.openError("错误提示", "保存位信息出错,请重试");
       }
    }

在ShipModle中的setShipInfo中,触发监听事件:

public void setShipInfo(ShipInfo shipInfo) {
       this.shipInfo = shipInfo;
       getListeners().firePropertyChange(PROPERTY_UPDATEMODEL, null, shipInfo);
    }

在ShipPart中实现监听,

    public void propertyChange(PropertyChangeEvent evt) {
……
        if (evt.getPropertyName().equals(ShipModel.PROPERTY_UPDATEMODEL)) refreshVisuals();
    }
    protected void refreshVisuals(){
       ShipFigure figure = (ShipFigure)getFigure();
       ShipModel model = (ShipModel)getModel();
       figure.setShipName(model.getShipInfo().getShipName());
       figure.setLayout(model.getLayout());
    }

Ok,when update the ship name in the tabbed and click the save button ,you can see this:
 

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

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

 @Override 
    public void run() {  
        super.run();  
          ShipPart shipPart = (ShipPart) getSelectedObjects().get(0);
          DiagramModel parent=(DiagramModel)shipPart.getParent().getModel();
          ShipModel shipModel=(ShipModel)shipPart.getModel();
         //just for fun
          shipModel.setBgType(shipModel.getBgType()+1);
          parent.removeChild(shipModel);
         parent.addChild(shipModel);
    }  

Now you will see this:
 

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

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

public class Navigate extends ViewPart {
    ……
    public void createPartControl(Composite parent) {
       ……
viewer.addDoubleClickListener(new TreeDoubleClick(viewer));
    }

 
 

package org.jport.gef.berth.action;
public class TreeDoubleClick implements IDoubleClickListener {
   
……
    public void doubleClick(DoubleClickEvent event)
    {
     IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
         String companyName = (String) (selection.getFirstElement());
       
    try
    {
//             //input 自动根据输入的不同来判断该Editor是否打开
           input=new BerthEditorInput(companyName);
           window.getActivePage().openEditor(input, BerthGraphicalEditor.ID);
                  }
       catch (WorkbenchException e) {
           // TODO Auto-generated catch block
       }
       }
}

在打开Editot时,对于同一个公司名,始终保持打开且仅打开一个editor,这是由editorInput的name属性决定的,因为在editor中实现了:
 

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