GMF默认生成的outline很成问题,只能显示top level的图形,比如在logic例子中,画板中图形元素和outline对应如下:

GMF中定制自己的outline GMF中定制自己的outline

 

可见非top level的图形并没有与之对应的Tree Item显示在outline tree上。

其实用过gef的人都很容易知道原因,因为outline上每一个节点对应的也是一个tree editpart,每个tree editpart复用对应画板图形元素相同的数据模型。因此很显然,GMF生成的outline 和TreeEditPart并不能满足具体应用的需求,用户需要自己订制每个图形元素对应的outline 元素,也就是为每个图形元素实现一个TreeEditPart。

如何定制outlinepage:

在LogicNotationEditor中重载方法getOutlineViewEditPartFactory(),不过要注意的是这个方法在gmf1.0.1之后再加入DiagramEditor中,在gmf1.0.0里面没有这个方法,由于DiagramEditor中的内部类DiagramOutlinePage是友好的,无法继承,所以要想在gmf1.0.0中定制自己的outline就只能重写自己的outline page类了。

GMF中定制自己的outlineGMF中定制自己的outlineprotected EditPartFactory getOutlineViewEditPartFactory() GMF中定制自己的outline{
GMF中定制自己的outlineGMF中定制自己的outline        
return new EditPartFactory() GMF中定制自己的outline{
GMF中定制自己的outline
GMF中定制自己的outlineGMF中定制自己的outline            
public EditPart createEditPart(EditPart context, Object model) GMF中定制自己的outline{
GMF中定制自己的outlineGMF中定制自己的outline                
if (model instanceof Diagram) GMF中定制自己的outline{
GMF中定制自己的outline                    
return new LogicDiagramTreeEditPart(model);
GMF中定制自己的outlineGMF中定制自己的outline                }
 else GMF中定制自己的outline{
GMF中定制自己的outline                    
return this.getRightTreeEditPart(model);
GMF中定制自己的outline                }

GMF中定制自己的outline            }

GMF中定制自己的outlineGMF中定制自己的outline            
private TreeEditPart getRightTreeEditPart(Object view) GMF中定制自己的outline{
GMF中定制自己的outline                
if(view instanceof Node &&
GMF中定制自己的outlineGMF中定制自己的outline                        ((Node) view).getElement() 
instanceof ContainerElement) GMF中定制自己的outline{
GMF中定制自己的outline                    
GMF中定制自己的outline                    
return new LogicContainerTreeEditPart(view);
GMF中定制自己的outline                }

GMF中定制自己的outline                
return new LogicChildTreeEditPart(view);
GMF中定制自己的outline            }

GMF中定制自己的outline        }
;
GMF中定制自己的outline    }

 

LogicDiagramTreeEditPart.java

GMF中定制自己的outlineGMF中定制自己的outlinepublic class LogicDiagramTreeEditPart extends TreeDiagramEditPartGMF中定制自己的outline{
GMF中定制自己的outline
GMF中定制自己的outlineGMF中定制自己的outline    
public LogicDiagramTreeEditPart(Object model) GMF中定制自己的outline{
GMF中定制自己的outline        
super(model);
GMF中定制自己的outline        
// TODO Auto-generated constructor stub
GMF中定制自己的outline
    }

GMF中定制自己的outline
GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected Image getImage() GMF中定制自己的outline{
GMF中定制自己的outline        
return LogicDiagramPlugin.getInstance().getBundledImage("icons/logic.gif");
GMF中定制自己的outline    }

GMF中定制自己的outline
GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected String getText() GMF中定制自己的outline{
GMF中定制自己的outline        
return "Logic Diagram";
GMF中定制自己的outline    }

GMF中定制自己的outline
GMF中定制自己的outline}

LogicContainerTreeEditPart.java

GMF中定制自己的outlineGMF中定制自己的outlinepublic class LogicContainerTreeEditPart extends TreeContainerEditPart GMF中定制自己的outline{
GMF中定制自己的outline
GMF中定制自己的outlineGMF中定制自己的outline    
public LogicContainerTreeEditPart(Object model) GMF中定制自己的outline{
GMF中定制自己的outline        
super(model);
GMF中定制自己的outline        
// TODO Auto-generated constructor stub
GMF中定制自己的outline
    }

GMF中定制自己的outline
GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected List getModelChildren() GMF中定制自己的outline{
GMF中定制自己的outline        List children 
= ((View) this.getModel()).getChildren();
GMF中定制自己的outline        
return children;
GMF中定制自己的outline    }

GMF中定制自己的outline
GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected Image getImage() GMF中定制自己的outline{
GMF中定制自己的outline        String path 
= "icons/logic.gif";
GMF中定制自己的outline        String type 
= getType();
GMF中定制自己的outlineGMF中定制自己的outline        
if("circuit".equalsIgnoreCase(type)) GMF中定制自己的outline{
GMF中定制自己的outline            path 
= "icons/circuit16.gif";
GMF中定制自己的outline        }

GMF中定制自己的outlineGMF中定制自己的outline        
if("FlowContainer".equalsIgnoreCase(type)) GMF中定制自己的outline{
GMF中定制自己的outline            path 
= "icons/logicflow16.gif";
GMF中定制自己的outline        }

GMF中定制自己的outline        
return LogicDiagramPlugin.getInstance().getBundledImage(path);
GMF中定制自己的outline    }

GMF中定制自己的outline
GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected String getText() GMF中定制自己的outline{
GMF中定制自己的outline        
// TODO Auto-generated method stub
GMF中定制自己的outline
        return ((View) this.getModel()).getType();
GMF中定制自己的outline    }

GMF中定制自己的outlineGMF中定制自己的outline    
private String getType() GMF中定制自己的outline{
GMF中定制自己的outline        
return ((View) getModel()).getType();
GMF中定制自己的outline        
GMF中定制自己的outline    }

GMF中定制自己的outline}

LogicChildTreeEditPart.java

GMF中定制自己的outlineGMF中定制自己的outlinepublic class LogicChildTreeEditPart extends TreeEditPart GMF中定制自己的outline{
GMF中定制自己的outline
GMF中定制自己的outlineGMF中定制自己的outline    
public LogicChildTreeEditPart(Object model) GMF中定制自己的outline{
GMF中定制自己的outline        
super(model);
GMF中定制自己的outline        
// TODO Auto-generated constructor stub
GMF中定制自己的outline
    }

GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected Image getImage() GMF中定制自己的outline{
GMF中定制自己的outline        String path 
= "icons/logic.gif";
GMF中定制自己的outline        String type 
= getType();
GMF中定制自己的outlineGMF中定制自己的outline        
if("LED".equalsIgnoreCase(type)) GMF中定制自己的outline{
GMF中定制自己的outline            path 
= "icons/ledicon16.gif";
GMF中定制自己的outline        }

GMF中定制自己的outlineGMF中定制自己的outline        
if("AndGate".equalsIgnoreCase(type)) GMF中定制自己的outline{
GMF中定制自己的outline            path 
= "icons/and16.gif";
GMF中定制自己的outline        }

GMF中定制自己的outlineGMF中定制自己的outline        
if("OrGate".equalsIgnoreCase(type)) GMF中定制自己的outline{
GMF中定制自己的outline            path 
= "icons/or16.gif";
GMF中定制自己的outline        }

GMF中定制自己的outlineGMF中定制自己的outline        
if("XorGate".equalsIgnoreCase(type)) GMF中定制自己的outline{
GMF中定制自己的outline            path 
= "icons/xor16.gif";
GMF中定制自己的outline        }

GMF中定制自己的outline        
return LogicDiagramPlugin.getInstance().getBundledImage(path);
GMF中定制自己的outline    }

GMF中定制自己的outline
GMF中定制自己的outline    @Override
GMF中定制自己的outlineGMF中定制自己的outline    
protected String getText() GMF中定制自己的outline{
GMF中定制自己的outline        
// TODO Auto-generated method stub
GMF中定制自己的outline
        return ((View) this.getModel()).getType();
GMF中定制自己的outline    }

GMF中定制自己的outlineGMF中定制自己的outline    
private String getType() GMF中定制自己的outline{
GMF中定制自己的outline        
return ((View) getModel()).getType();
GMF中定制自己的outline        
GMF中定制自己的outline    }

GMF中定制自己的outline}

 

在LogicDiagramPlugin里面加入如下代码,主要用于获取icon image
GMF中定制自己的outlineGMF中定制自己的outline    public static ImageDescriptor getBundledImageDescriptor(String path) GMF中定制自己的outline{
GMF中定制自己的outline        
return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.gmf.examples.runtime.diagram.logic", path);
GMF中定制自己的outline    }

GMF中定制自己的outlineGMF中定制自己的outline    
public Image getBundledImage(String path) GMF中定制自己的outline{
GMF中定制自己的outline        Image image 
= getImageRegistry().get(path);
GMF中定制自己的outlineGMF中定制自己的outline        
if (image == nullGMF中定制自己的outline{
GMF中定制自己的outline            getImageRegistry().put(path, getBundledImageDescriptor(path));
GMF中定制自己的outline            image 
= getImageRegistry().get(path);
GMF中定制自己的outline        }

GMF中定制自己的outline        
return image;
GMF中定制自己的outline    }


经过改进后的logic diagram outline page:

GMF中定制自己的outline 

相关文章:

  • 2022-01-07
  • 2021-12-18
  • 2022-12-23
  • 2022-02-27
  • 2022-12-23
  • 2022-12-23
  • 2021-08-29
  • 2022-02-24
猜你喜欢
  • 2021-11-12
  • 2022-01-01
  • 2021-11-28
  • 2021-10-16
  • 2021-06-06
相关资源
相似解决方案