为Web Page Editor添加拖动功能

对于可视化的页面编辑来说,控件的全局拖动功能是必不可少的。但很奇怪的是,原生的org.eclipse.jst.pagedesigner插件并没有实现这一功能(这个官方插件简直就是个渣!)。没关系,源代码在手,我们自己搞定它! 拖动功能对应的Command是MoveNodeCommand。原有的拖动只是调换两个元素的位置,不能拖动到画布上的任意空位置。对GEF、Draw2D有过了解的朋友应该对ToolbarLayout、FlowLayout和XYLayout有所印象。前两者都是继承自OrderedLayout,它们会按指定的方向排列显示图形,拖动不同的图形只会改变这个排列顺序。Web page editor中的layout就和这种layout比较相似,所以在原本的环境中,根本没有考虑当一个标签为postion:absolute时的全局拖...阅读全文

GEF:EditPolicy的本质

初学GEF的人经常被EditPolicy各种奇怪的Role和Command弄得晕头转向。现在我们就从代码层来剖析一下EditPolicy到底是个什么玩意儿吧。 1.installEditPolicy()到底做了什么 通常情况下,重写EditPart的时候少不了改写createEditPolicies()函数,它通常具有如下的形式: protected void createEditPolicies() { installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new NodeDirectEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new NodeEditPolicy()); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new NodeGraphicalNodeEditPolicy()); } 顾名思义,installEditPolicy即把一个Edit...阅读全文

深入浅出Web Page Editor

1 简介 Web Page Editor(以下简称WPE)是eclipse开源子项目WTP的一部分。其插件名全称为:org.eclipse.jst.pagedesigner。Java EE开发环境会自带这个插件包。如果没有,也可以到http://download.eclipse.org/webtools/downloads/页面下载。它主要提供一个WYSIWYG的Web开发环境,支持控件拖拽,CSS可视化编辑等等。由于它是开源的,所以一般常常可以用来作为开发Web开发RCP程序的基础。它本身也预留了插件接口,以方便开发人员扩充自定义插件,以供拖放。 目前这个版本1.3.2的Page Editor还残留着严重的排版问题,几乎所有的块级元素都会一股脑儿的顺次排下来,而不去理会它们的CSS属性中是否有positon:absolute。但是这不妨碍我们对它现有的结构...阅读全文

对八进制GEF教程的几点补充

现在中文的GEF教程写的比较好的算是“八进制”的(http://bjzhanghao.cnblogs.com/),它系统的阐述了GEF的架构。我在这里补充几个其教程中没有提到的问题: 1 More about the author.getPaletteRoot是怎么启作用的: practiceEditor中并没有setPaletteRoot,那么真正的设置那一步是什么时候呢?请看practiceEditor构造函数中的setEditDomain,这个函数除了指定Viewer的editDomain外,还会设置此editDomain的paletteRoot,此过程会顺带设置此editDomain对应的vierw的paletteRoot,也就是说,我们在不清楚初始化函数的调用顺序的时候,Editor构造函数中的那一句setEditDomain(new DefaultEditDomain(this))还是不要乱改位子。 2.viewer的两种setC...阅读全文

使用DLL中的资源

我很早的时候写过一篇MFC中CDialog与其对话框资源的绑定,但这几天在MFC DLL上做了一些工作后发现当时的理解实在肤浅。说不定过了几年再回头看看目前这篇文章,又觉得本文也是鬼话连篇了吧,哈哈。 使用DLL中的资源面临的一个主要问题是,DLL和EXE中都有资源集,但是程序在运行态到底会去哪个资源集中找常常令我们疑惑。 考虑如下的经典情况: 在新建MFC DLL工程时选中Regular DLL using shared MFC DLL选项,新建一个与MFC自身DLL共享的DLL。在新DLL中新建一个ID名为IDD_DLLDIALOG的对话框资源。在这个DLL中导出一个ShowDialog()函数,内容如下: extern "C" void Show Dialog() { CDialog dlg(IDD_DLLDIALOG); dlg.Do...阅读全文

ZPT教程之二:熟练使用TAL/TALES

原作者 : ThankCreate 原文链接: http://www.thankcreate.com/tech/220 转贴请注明出处,支持原创,感激不尽。 1. TAL与TALES总述 在前续教程中我已经提到,ZPT的三大核心是TAL,TALES和METAL。而前两者在实际应用中往往是一起使用的。在此就合并作一个教程来讲了。 TAL语句一般以tal为前缀。目前笔者使用的ZPT版本中,TAL标准为1.4。其实其语法一共也就以下几种: define,attribute,condition,content,replace,repeat,on-error,omit-tag TALES用起来则相对更灵活,它实际上就是定义了一套表达式的表示方法。 在后面的教程中,我们将以TAL为纲,再灵活穿插TALES的相关知识。 2. TAL分类详解 1.1 define Define语句的主要作用是定义变量并赋值...阅读全文

ZPT教程之一:Hello world!

写在前面的话: 由于项目的关系,最近要去学习一些Zope的模板式编程方法ZPT。可能因为Zope这一套体系还是应用比较少的缘故吧,网上鲜有相关学习资料,连非官方的英文资料都只找到一个ZPT  basics开头的四篇系列文章,更别说中文的了。Zope的官网上资料确实比较全,但是给零Zope基础的人来看,似乎也不太轻松。没办法,总得有一个第一个吃螃蟹的不是,体会到了没有入门资料可找的苦处,我觉得更有必要贡献一份中文入门教程,如果真能帮助到也需要研究ZPT的人,那我就不胜荣幸了。 在此我得首先鸣谢ZPT basics系列文章的作者Harish Kamath,我就是看它的文章入门的,本系列教程中有一些示例还是直接从它的文章中移植过来。那么,下面就进入正题...阅读全文

Effective c++ 札记2

1.=号运算符 1.1 尽量把=号运算符的返回值设定为一个当前对象的引用 1.2 要特别注意住在operator=中考虑处理自我赋值这一特例 1.3 复制时要复制所有成员,应特别注意当继承存在时的情况 2.资源管理 2.1   auto_ptr和shared_ptr的析构函数中只针对delete进行操作,而不是delete[],所以不要这样写 std::auto_ptr<std::string>  aps(new  std::string[10]) 2.2  为了解决上面的问题。可以使用 vector。或者,使用boost库中的boost::scoped_array、boost::shared_array 2.3  delete时注意是否要用delete[] ,这在有typedef时会是一个很隐蔽的陷阱 2.4  观察以下语句 processWidget(std::trl::shared ptr<Widget> (new  Widge...阅读全文

Effective c++ 札记1

1.空类? 当我们没有手动声明新的构造函数时,编译器会声明以下几个: 默认构造 拷贝构造 =号运算符 析构 惟有当这些函数被需要(被调用) ,它们才会被编译器创建出来。(这个以前还真不知道) 2.阻止上面的暗处的声明的方法 方法一:将其设为private(这样外部就无法访问),并且不写其定义(这样内部或友元也无法访问) 方法二:继承一个Uncopyable类 3.析构函数中的异常 c++类中的析构函数允许抛出异常,但这样做是极不受推荐的 如果有两个同类型的异常同时存在(这种情况在当类成员包含容器时会经常出现),那么程序若不是结束执行就很可能会导致不明确的行为 原则: 任何时候,析构函数都不要抛出异常,也尽量不要把可以抛出异常的...阅读全文

Linux札记: 3.根切换chroot与shell scripts初体验

今天本来是想新建一个initrd的镜像目录,通过chroot切换根到我的新initrd后,能够执行一些基本的命令。 这就需要我们把原属于/bin中的可执行命令(如ls mkdir等)拷到自己新建的bin文件夹中去,而且其依赖文件通过ldd命令找去后,也要拷到相应的位置。问题是每一个可执行命令都对应着好几个依赖项,如果纯手工去敲ldd再一个个cp的话,得敲到猴年马月去。 于是下午我就现学现用了一把,用shell scripts实现了一个自动的部署。 代码如下: #!bin/bash # used to put the lib in the right place # Date: 2010/2/28 4:00PM # Made by Xie Chuang cmd=$1 cmddir=`which $cmd` if [ ! -d .`dirname $cmddir` ];then mkdir .`dirname $c...阅读全文