这点文档就乱七八糟的放在这里吧。之后总结的时候再去考虑他怎么样的排版以及如何。
关于那些翻译,周末一同做完吧,不然之后这一段时间的心情会很不好受的,不是么。
那么,下面就开始吧。
关于引擎的一些设计方案。或者说,先看看这些能够实现的 level1 的 component 。
Level1 也是最基本的一些 component , 他的作用是为了更高级别的 component 做好充足的准备,因为越是高级,其实是越是复杂的拼装而不是更新的东西的创造。所以好好实现这一个级别的 component 是一件很重要的事情。
下面有这些 lv1 的 component 来实现:
Frame
Dialog
Panel
Combobox
Checkbox
Radiobutton
List
Passwordfield
Textfield
Label
Link
先来看看第一个。Frame
Frame 按照说明,就是相当于 Java SE 中的 Swing 或者 SWT 中的那个 Window 。 同时也是所有这些 component 的最基本的一个 container , 将这些基于 frame 的 component 放置在这个 container 中。那么,对于 html 来说,这个 frame 就是相当于一个 div 了。Html 是一层一层的,就像是小的时候粘纸片一样,或者贴画,先把最下面的粘好,然后一点一点的像上面继续贴啊贴啊,一直到将整个的画完成。同样的, html 先把最基本的 background 做好,然后呢,一点一点的放置上 div 啊, table 啊,然后,再去放一些东西,比如 img ,label , textfield 等等这些component 。
也就是说, frame à <div>
在解析的时候,读入标签 frame , 然后解析成 <div> , 大概就是这样的一个小过程。
写到这里,不得不提到一些关于解析的事情。因为引擎是需要对 guixml 文件进行解析的,所以parse的过程是必不可少的一个很重要的过程。
现在的解析方法想到了这样的一个:
使用xmldom 进行解析,然后将解析到的attribute和value存在表中。
考虑到的表如下:
Hint:
这些表 是引擎中生成用的表,而不是引擎中自带的一个分析表。
首先是一个 component 表。
这张表里面存放的是所有 component 的名称以及他们的类型。
打个比方:
Component名称 |
类型 |
Button1 |
Button |
Text1 |
Textfield |
这样的表。
名称是必不可少的,因为需要通过名称去关联属性表以及其他的一些表,那么这里就有一个问题,就是名称是不可以重复的。这个就需要一个良好的IDE工具来对这个问题进行解释分析,或者抛出一个异常。最后生成的这样表必须是一个干干净净的表。什么时候见到过在 Java 甚至是 JavaScript 中在相同的命名空间中有相同名称时候不报错的,不是么。
那么,类型的话就是包括lv1类型以及lv2类型或者higher的类型。通过分析类型,来对其的 attribute 进行分析。
第二张表就是 attribute 表。
Attribute 表中存储的是一些 component 属性的东西。
比如说,button的value是什么啊,或者textfield有没有小框框等等,这些类型的attribute。
这张表可以这样的解释如下:
Component名称 |
Attribute |
Value |
Button1 |
Value |
确定 |
Text1 |
Text-overflow (IE6+ required) |
Clip |
… |
… |
… |
解释的方法,就是从 component 的名称中查询component表得到component的类型,然后查询attribute表中的attribute,查看是否支持这个属性,如果不支持就忽略掉,然后如果支持的话,把attribute和value写入到style中去就可以了。
其实,就是一个字符串的拼接。比较的麻烦,这个工作量可能有点大吧,如果能够全部拼接出来也就可以了。
Ok,还有一个就是事件相关的一个 event 表。不过现在先暂时不要考虑这个东西吧。先尝试的把这些东西完成就可以了。
回过头来在说说frame。
Frame 既然要像window一样的用,那么他可能就需要做的像window一样。例子如同一个基于浏览器的操作系统,它里面的窗口,如果说排除是flash的成果,那么如果用js去做,就需要一个drag and drop的过程来描述这一切东西。而且需要一个css来定义一个最基本的frame的样式表。这些,就需要好好的看看css了。
另外在说一说css重载的事情。
Css的样式是可以重载的。通过tag 中的style, 如果说有支持的style可以用的话,那么就可以将原先的css样式重载,毕竟css样式是一个静态的样式表,style是一个动态的。
于是,就可以考虑采用这样的方式对component和attribute进行相应的关联,希望这样的方法是有效果的。
那个,继续说。
Frame可以看作是一个窗体,那么也就是说,这个div中可以继续增加div。那么我们就需要考虑第二个lv1 的component。Panel。
Panel的实现和frame可以说是相似的,因为同样是应用div来实现这一个东西,唯一不同的是,按照 JavaSE的解释,panel需要在frame之上,也是就是说,要base on frame 或者说是需要frame 这个container来做其容器的support。这样,窗体就开始有了第一次的层次感:
Frame – panel
这个panel是可有可无的咯。
因为如果没有panel,frame依然是一个container,它可以contain很多component,而panel只是这些component中的一种。因此需要考虑的是,这些panel中panel自己的一些问题了。
Panel根据要求是要有layout的。比如有V,H这两类的分栏,或者是V,H的排版,这两个是最简单的layout,其他的先不考虑。Panel的难点就是在于如何去实现这些layout,以及对其中里面的elements进行定位或者重排。
恩。下一个是dialog。
这个,dialog啊,一开始考虑的时候是用alert()直接用就行了,这样的话就是一个简简单单的那种像notice的那种而不是那种可交互形式的。看看yahoo的mail system,他们用ajax和python实现了这些功能,哇。
那么现在dialog的实现是这样的。
Dialog也是一个div,不过这个div需要另外一点,就是要求在这个dialog弹出的时候lock后面所有的elements,或者说加上一个div,来处理这些。这里,张老师给了我一个exception,就是IE或者firefox不能够很正确的对select标签或者其他的进行很好的div遮蔽。这个问题,我考虑了一阵,看看尝试用标签自己根本的属性行不行,就是通过javasript更改这些标签的enable属性,来尝试达到相同的显示结果。
Dialog还是不拖动了吧。我喜欢AOR那本书上的gallery的那种风格。另外呀,这里还有大量的工作是在完成好多好多的css sheets , 需要完成这些还是要很多的时间来奋斗的。
Div的问题差不多就是这样了,那么下面看看这些容器之上的component。
其实,按照这样的html布局来看,lv1可以继续划分,可以将这些容器类的,比如div,这样的tag放做为lv1的base,那些在container中使用的component作为基于lv1_base 的component。
Definition:
Frame为最底层的lv1 component。