2006-08-30

将一个branch更新到head

之前把从cvs上checkout出来的代码改了又改,面目全非的,怕出什么问题,就把它当作一个branch提交了。现在想把branch扶正为head。
先将这个branch”replace with”head,然后这个工程就变成head了,然后让它跟cvs上的branch比较(”compare with another branch or version”),然后”override and update” ―― 米有”commit and update”因为不是一样的存储分支。最后得到的就是head的分支却是branch的内容,接下来?commit呗~

2006-08-29

getAdapter

public Object getAdapter(Class key) {
if (IPropertySource.class == key) {
if (getModel() instanceof IPropertySource)
return getModel();
if (getModel() instanceof IAdaptable)
return ((IAdaptable)getModel()).getAdapter(key);
}
if (AccessibleEditPart.class == key)
return getAccessibleEditPart();
return null;
}

这就是为什么model只要继承IPropertySource并写好PropertyDescriptor就可以在属性页显示出model的属性。

2006-08-23

多线程环境下访问同步方法

public class ThreadTest
{
static ThreadTest tt = new ThreadTest();
class Thread1 extends Thread
{
public void run()
{
while(true)
tt.read();
}
}

class Thread2 extends Thread
{
public void run()
{
while(true)
tt.write();
}
}

private int count;

public synchronized void read()
{
System.out.println("read " + count);
try
{
Thread.sleep(3000L);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("read " + count);
}

public synchronized void write()
{
System.out.println("write " + count++);
}

public static void main(String[] args)
{
ThreadTest test = new ThreadTest();
test.new Thread1().start();
test.new Thread2().start();
}
}
“锁”是指对象锁,没有“成员锁”或“函数锁”。访问一般函数(unsynchronized)时不用获取对象锁。访问同步函数时须获取函数所在对象的对象锁,这时其它同步函数、方法皆不可访问,而非同步的成员可以。

让2个div在同一行显示

在css style里这么写就OK了:
div
{
display:inline
}
可能会出现中英文对齐问题,加一个vertical-align:text-bottom就好了

思考

一、传输给controller(EditPart)的model应该是谁?
这里的model目前有2个类别:IDOMNode和ElementBase。IDOMNode是纯DOM结构的一种实现,来自wtp,主要添加了INodeAdapter的接口方便扩展(请理解一下adapter的概念)。提供了所有关于DOM的操作,比如createElement, getChild, removeChild。而ElementBase则是IDOMNode的一个扩展(即继承了INodeAdapter),它拥有一个IDOMNode的成员,以及作为model的PropertySource描述实现(对应model属性的切实描述的定义)和属性变更事件支持(PropertyChangeSupport)。问题是我传给controller的model应该是IDOMNode还是ElementBase呢?我倾向于IDOMNode,它可以更清晰地表明ElementBase只是用来描述属性(这种情况下,属性等数据全存储在IDOMNode里,ElementBase只负责对属性的更改操作及描述这个属性-是list还是文本形式全由自己控制)。但是起初的设计是model面向ElementBase的(IDOMNode是后来加进来的),更改起来会有一定的麻烦。而且如何将IDOMNode的属性变更事件支持添加进来也是个待解决的问题(或许是很简单的设计哲学,不过在搞清楚具体问题领域前似乎很难,adapter能做到的事想像不到尽头的J)。
所以controller所能看到的依然是ElementBase。
二、关于model的初始化。
在上个问题结论的基础上,还有个ElementBase的成员初始化的问题。ElementBase里有个IDOMNode成员,存储node应有属性,它可以是在运行form定义程序的过程中动态产生的(类似工厂),也可以是从form定义程序加载时生成的(类似反序列化)。这两种方式怎么统一起来呢?感觉上应该跟ElementCreationFactory有关系的说~

顺带描述一下DOM Document的产生过程:
首先需要提供一个xml文件(由来请参看FormDesignEditor.getEditorInput()的注释),这个文件会先由StructuredTextEditorXML解读(来自wtp的xml editor),它会生成一个IDOMDocument对象并保存在DocumentTransferer里,然后form图形定义editor会从DocumentTransferer获取这个对象作相应的初始化:
初始化children à生成model的Element(ElementCreationFactory)à生成EditPart(controller,是由rooteditpart根据EditPartFactory生成的)à生成figure

2006-08-17

Adapter

Adapter实际上在eclipse以前的版本里是叫做extension。是用来扩展功能的。因为你实现的类可能是多功能的复合体,但是某个请求者只需要它其中的一种功能或者叫做某一方面,你怎样展示给请求者呢?你可以象下面这样写函数:
Public Object getAdapter(Object key);
这个函数会根据输入的key来返回对应的对象(功能/方面)。比如一个属性视图想从你的类中抽取属性信息,而你的类里刚好有一个PropertyDescriptor的成员,这样,在判断出对方意向后就可以把成员送出去:
If(key == PropertyDescriptor)
Return myPropertyDescriptor;
有个小要点需要注意的是,你需要在getAdapter最后添上
Super.getAdapter();
这么一来保证了实现你想要的能力而不损失父类默认拥有的能力。

2006-08-10

dom相关概念

org.w3c.dom.*
有根元素,文本,属性,标签节点四种,还有个Node 接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。当实现 Node 接口的所有对象公开处理子节点的方法时,不是实现 Node 接口的所有对象都有子节点。例如,Text 节点可能没有子节点,且将子节点添加到这样的节点将导致引发 DOMException。
今天写代码的时候碰到个小问题
IDOMDocument document = getDocument();
document.createElement("myelement");
debug发现这个元素根本添加不到document上去,后来改了下
document.getDocumentElement.appendChild("myelement");
就添加上去了=_=#! , 不知道是它API名字误解了我还是我理解能力有问题....

2006-08-02

添加Jar

添加jar到buildPath和plugin depedencies是不一样的,buildPath就是很简单的构造路径,而后一个就需要声明bundle,也就是plugin.xml文件,在启动/调试eclipse application的时候会将声明的插件先安装上去。如果你只把一个jar添加到 plugin depedencies里eclipse会发现它不能安装这个插件从而导致eclipse application不能启动/调试。

以前一直以为这两种形式是一样滴。。。