5.29 diagramEditor中的save



public class DiagramEditor extends
GraphicalEditorWithFlyoutPalette
implements IPersistableEditor{


public void doSave(IProgressMonitor monitor) {
// TODO Auto-generated method stub

performSave(monitor, getEditorInput());
getCommandStack().markSaveLocation();
}

@Override
public void doSaveAs() {
// TODO Auto-generated method stub

Shell shell = getSite().getShell();
final IEditorInput input = getEditorInput();

SaveAsDialog dialog = new SaveAsDialog(shell);

IFile original = (input instanceof IFileEditorInput) ? ((IFileEditorInput) input).getFile(): null;
if (original != null){
dialog.setOriginalFile(original);}

dialog.create();
int result = dialog.open(); 返回的是cancel或者ok
if (result == Window.CANCEL) {
return;
}

IPath filePath = dialog.getResult();
IFile file = null;
if (filePath == null) {
return;
} else {
file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
}
if (input.exists()) {

} else {
dialog.setErrorMessage(null);
dialog.setMessage(WARN_FILEEXIST, IMessageProvider.WARNING);
return;
}
if(file.exists()){

}else{
try {
file.create(ResourceURLHelper.getNullInputStream(), true, null);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
DiagramEditorInput newInput = new DiagramEditorInput(file.getLocation());

performSave(getProgressMonitor(),newInput);
}

@Override
public boolean isSaveAsAllowed() {
// TODO Auto-generated method stub
return true;
}
这个才是核心程序!重要!
private void performSave(IProgressMonitor monitor, IEditorInput input) {
if (diagram == null)
return;

diagram.doSaveXML();
Document xmlTree = diagram.getDiagramDoc();

if (xmlTree == null)
return;

IFile file = ResourceUtil.getFile(getEditorInput());

OutputFormat format = OutputFormat.createPrettyPrint();
try {
FileWriter fileWriter;
fileWriter = new FileWriter((String) input.getAdapter(Path.class));

XMLWriter writer = new XMLWriter(fileWriter, format);
writer.write(xmlTree);
writer.close();

if (file != null) {
file.refreshLocal(IResource.DEPTH_ZERO,
new NullProgressMonitor());
}

} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void commandStackChanged(EventObject event) {
// TODO Auto-generated method stub

firePropertyChange(IEditorPart.PROP_DIRTY);
super.commandStackChanged(event);
}

@Override
public boolean isDirty() {
// TODO Auto-generated method stub
return getCommandStack().isDirty();
}
}

这里调用了diagram.doSaveXML(),所以接下来看diagrammodel的dosavexml()方法


public class DiagramModel extends AbstractModel {
这些个都是diagram中包含的元素吗?
private List<Object> children = new ArrayList<Object>();
private List<Object> ports = new ArrayList<Object>();
private List<Object> texts = new ArrayList<Object>();
private List<Object> containers = new ArrayList<Object>();
private List<Object> portOps = new ArrayList<Object>();
private List<Object> refers = new ArrayList<Object>();

private ComponentInstanceModel component; 一直没搞懂这个componentInstanceModel和portInstanceModel是用来干嘛的。
private DiagramHeadingModel diagramHead; 这个model也没搞懂是用来干嘛的。

private String name;
private Document diagramDoc;
private Element rootElement,diagramElement,diagramExElement;

public DiagramModel() {
super();
name="";
initModel();
}
public void initModel(){
setName("Diagram");
setDiagramDoc(DocumentHelper.createDocument());
setRootElement(getDiagramDoc().addElement(ModelType.ELE_ROOT));
setDiagramElement(getRootElement().addElement(ModelType.ELE_DIAGRAM));
setDiagramExElement(getRootElement().addElement(ModelType.ELE_DIAGRAMEX));????
}

@Override
public void doSaveXML() {
// TODO Auto-generated method stub
this.addDiagramAttribute(ModelType.ATR_NAME, name);

getDiagramHead().doSaveXML();
getComponent().doSaveXML();

for(int i=0;i<getPorts().size();i++){
((ElementModel)getPorts().get(i)).doSaveXML();
}

for(int i=0;i<getTexts().size();i++){
((ElementModel)getTexts().get(i)).doSaveXML();
}
}

protected void addDiagramAttribute(String name,String value){
if(getDiagramElement()==null){
return;
}
getDiagramElement().addAttribute(name, value);
}

protected void removeDiagramAttribute(String name){
if(getDiagramElement()==null){
return;
}
Attribute atr = getDiagramElement().attribute(name);
if(atr != null){
getDiagramElement().remove(atr);
}
}

}


1. getDiagramHead().doSaveXML();

public class DiagramHeadingModel extends ElementModel {
public DiagramHeadingModel() {
super(ConstantResourceFactory.LABEL_DIAGRAMHEAD_MODEL,
ConstantResourceFactory.ID_DIAGRAMHEAD_MODEL,
ConstantResourceFactory.SIZE_DIAGRAMHEAD);
// TODO Auto-generated constructor stub
definition="";
myCtype="";
myReturn="";
mySystem="";
diagramType="";
isRetShow=false;
isSysShow=false;
isRunsOnShow=false;
}
public void doSaveXML() {
// TODO Auto-generated method stub
super.doSaveXML();

this.addXMLElementAttribute(ModelType.ATR_DIAGRAM,diagramType);
this.addXMLElementAttribute(ModelType.ATR_DEFINITION,definition);
if(isRunsOnShow()){
this.addXMLElementAttribute(ModelType.ATR_RUNSON,myCtype);
}
else{
this.removeXMLElementAttribute(ModelType.ATR_RUNSON);
}

if(isRetShow()){
this.addXMLElementAttribute(ModelType.ATR_RETURN,myReturn); ?????
}
else{
this.removeXMLElementAttribute(ModelType.ATR_RETURN);
}

if(isSysShow()){
this.addXMLElementAttribute(ModelType.ATR_SYSTEM,mySystem);
}
else{
this.removeXMLElementAttribute(ModelType.ATR_SYSTEM);
}
}
}



因为ComponentInstanceModel继承自portElementModel
所以先看portElementModel的dosaveXML()

public abstract class PortElementModel extends ElementModel
{


    public PortElementModel(String label, String modelID, Dimension size) {
super(label, modelID, size);
// TODO Auto-generated constructor stub
name="";
type="";
}


    public void doSaveXML() {
// TODO Auto-generated method stub
super.doSaveXML();
this.addXMLElementAttribute(ModelType.ELE_NAME, name);
this.addXMLElementAttribute(ModelType.ELE_TYPE, type);
}

}


getComponentInstance.doSaveXML();
{


public ComponentInstanceModel() {
super(ConstantResourceFactory.LABEL_COMPONENTINSTANCE_MODEL,
ConstantResourceFactory.ID_COMPONENTINSTANCE_MODEL,
ConstantResourceFactory.SIZE_PORT_ELEMENT);
// TODO Auto-generated constructor stub
diagramType = "";
}


public void doSaveXML() {
// TODO Auto-generated method stub
super.doSaveXML();

for(int i=0;i<children.size();i++){
((ElementModel)children.get(i)).doSaveXML(); 子元素的dosavexml()
}

if(tail!=null)
tail.doSaveXML();这里的tail是elementmodel,所以调用的是elementmodel.dosavexml()
}

}

 

5.29 diagramEditor中的save,布布扣,bubuko.com

时间: 2025-01-06 19:38:58

5.29 diagramEditor中的save的相关文章

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt

Android中canvas.save()和canvas.restore()的使用

自己定义控件时经常遇到重写View的Ondraw()方法,Ondraw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的. 详细作用例如以下: 1.save():用来保存Canvas的状态,save()方法之后的代码,能够调用Canvas的平移.放缩.旋转.裁剪等操作! 2.restore():用来恢复Canvas之前保存的状态,防止save()方法代码之后对Canvas运行的操作.继续对兴许的绘制会产生影响.通过该方法

面试题29 数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 1 class Solution { 2 public: 3 int MoreThanHalfNum_Solution(vector<int> numbers) { 4 if (numbers.size() == 0) 5 return 0; 6 int result = n

Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用. 开启Session Session实例由SessionFactory开启获得,例如: Configuration config = new Configuration().configure(); SessionFact

django model中的save()方法

Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None) id和pk 如果一个model里没有显示声明哪一个字段(field)是主键(即在某个字段里声明primary_key=True),则django会自动生成一个名为id的AutoFields作为主键.model里的主键都有一个别名叫做pk(primary_key的缩写),无论这个主键是自动生成的还是我们指定的.

hibernate中 saveorupdate(),save(),update(),merge()你是怎么看待的;

接触到mybatis竟然有把hibernate抛弃的想法. 言归正传,贴图为先.hibernate的三种状态位和切换之间对函数的使用: 总结下saveorupdate(),save(),update(),merge()这几个函数: save(),update():都是很好理解的 save()在数据库中生成一条记录,如果数据库中有,会报错说有重复的记录. update()就是更新数据库中的记录: merge()就非常奇葩: 1.如果session中存在相同持久化标识(identifier)的实例,

idea中Cannot Save Settings Module ‘Test’错误

idea中导入的项目后报:Cannot Save Settings Module 'Test' must not contain source root错误 原因:是module的原因idea中导入名称为Test的项目后,打开 File->Project Structure...,点击左侧的Modules,发现除了名称为Test的module,还有一个"main",发现"main"属于"Test"这个项目.当add JARS or dire

慕课网-安卓工程师初养成-2-9 Java中的自动类型转换

来源:http://www.imooc.com/code/1236 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 double 型变量 score2 完成赋值操作,运行结果为: 这种转换称为自动类型转换. 当然自动类型转换是需要满足特定的条件的: 1.  目标类型能与源类型兼容,如 double 型兼容 int 型,但是 char 型不能兼容 int 型 2.  目标类型大于源类型,如 double 类型长度

Python学习-29.Python中列表的一些操作

in关键字: 注意这个是关键字,用来判断元素是否在集合中存在. 1 list = ['a','b','c'] 2 print('a' in list) 3 print('f' in list) 将依次输出 True 和 False +: 1 lista=['a','b'] 2 listb=['c','d'] 3 listc=lista+listb 4 print(listc)# a b c d 相当于字符串的连接,listc是一个新的副本. append方法: 1 list = ['a','b'