2007年5月30日星期三

Eclipse 里面集成Mozilla


(本图片摘自Ajax Toolkit Framework Tools in Eclipse幻灯片, 作者Philippe Ombredanne)

在公司论坛上看见有人又再问有没有新版本的Eclipse,也总有热心的人共享出来,俺对这个东西不太感冒,虽然这个东西被称为RCP的热门首选,但考虑到Java程序的内存占用,俺还是觉得不太适合我们。不过还是翻了一下3.3版本的新功能说明,里面倒是有一点吸引了我(后来发现该说明不是官方的,而是来自“Eclipse在做什么"这篇网上日志):
忘了提Eclipse 3.3的又一大特性了,叫做“Moziila Everywhere”,是指在任何平台上都可以创建一个Browser控件但是使用Mozilla内核(及时该平台上没有安装Firefox)。这是怎 么实现的呢?其实很简单,它要求你必须安装一个xulrunner,后者是Mozilla的全部内核,包括Gecko布局引擎、Javascript解析 引擎、XUL解析引擎和XPCOM,其中每样东西都足够写一本书,有了这些,仅用XUL+Javascript就可以写出一个Firefox来, Eclipse洽是利用了这个特性,用Java连接XPCOM所以创建了一个Mozilla的Browser,但是没有任何行为,包括右键菜单。

这 个Browser控件和缺省的Browser控件是不一样的,我们平时见到的缺省Browser控件,在Windows上用的是IE内核,在MacOSX 上用的是Safari,在Linux上。。。不知道,所以它是最最简单的浏览器,不具备任何可以定制的功能,除了显示一张HTML页面外,没有任何用处。 (你该不会想用Eclipse写一个傲游出来吧)

但是Mozilla内核的浏览器控件就不同了,它意味着如果程序员平时为Firefox 写插件的形式,也可以被应用到RCP应用程序上来,设想一下我们拥有一个RCP+xulrunner的平台吧,RCP接收Java扩展, xulrunner接收xul和javascript扩展,那我们的平台——要么叫Fireclipse,要么叫Eclifox——就所向披靡了。即使不 利用它的可扩展性,单单就是能保证在不同平台上提供对Web应用程序的一致性展现一条,就足够臭美的了,更可以用写Eclipse插件的形式来限定浏览器 的行为。。。。。。唉,刚才是不是说过一个NetBeans in Eclipse啊?把那玩意扔了吧~~
如果现在整个Mozilla能嵌进去,并且能够通过JavaXPCOM交互,那就非常爽了:我们的用户很期望将他们开发的工具集成起来,一直也期望我们这边能够提供一个平台,毕竟现在我们已经有数据管理这一部分了,但我们一直没有一个好的思路,Mozilla XUL/XPCOM是近期考虑的一个方向;另外一些用户又期望将平台搭建到Eclipse平台,毕竟现在这上面的东西已经有非常多了,可以很好地利用一下。

现在既然这两块能够集成到一起,那么我们这边用Mozilla XUL/XPCOM来构建,他们想用Eclipse的就用,不想用的也可以直接用XUL和XPCOM。哈哈。

BTW: 晚上试验了一下,可以将Mozilla(具体说是XUL Runner)嵌入到一个SWT程序中去,成为一个Web Browser, 但还没试验成功如何显示一个XUL界面(也许是我没搞对chrome地址)。

参考:

2007年5月27日星期日

Mozilla XUL IDE?

在学习研究Mozilla XUL的过程中,觉得对于开发人员而言,最大的麻烦就是一切都得手工进行,缺乏一个集成开发环境。也许这是Mozilla XUL技术目前相对SilverLight(WPF/E), Apollo而言最大的一个障碍(微软总结经验说:你得先抓住开发人员的心)。

但我们也不是啥都没有:
  • 如何知道每个XUL element有哪些属性、哪些事件? XUL Element Reference已经有了,不过这只是文档,查起来效率也够差的。 DOM Inspector可以提供一些信息,但还不是一个好的设计工具(对比GTK+ Glade或者Delphi的Object Inspector看看);
  • 如何知道目前有哪些XPCOM组件可用? 每个组件又都有哪些接口?XPCOM Component Viewer(mozilla版本, firefox版本)可以部分解决这个问题,只是目前没法看到接口中每个方法/属性的说明(好像也没有看到一个类似的reference文档);
  • 如何调试程序? JavaScript Debugger和JavaScript Console倒基本可以满足需要;
  • 对于网页内容部分,Web Developer够强了
  • 所见即所得(WYGWYS)的UI设计器?嗯,这块还没有。
前面一段时间Mozilla社区一直在争论XULRunner的发展方向, 是只需要满足Firefox 3的需要呢,还是尽力将其发展成为一个通用的应用程序运行环境?现在似乎大家达成一致了:当然是后者。(其实这个目标是大家都渴望的,争论的中心在于做一个通用的运行环境的话,就得保证XULRunner对多个程序的兼容性,这涉及到向前兼容性、API冻结等等,势必拖累Firefox 3对XPFE的改造。于是有人又担心错过目前这个时机,Firefox的风头又被IE8抢过,那有可能我们什么都没有了)

目标一致了,那就开始努力吧。今天在mozpad上看到了关于Mozilla IDE的计划:
Gather initial requirements for a Mozilla IDE. A future goal might be to form a project for specifying and then developing the IDE. This should probably be based on the work being done by Paul Rouget (Codeeditor), Alex Vincent (Verbosio) and/or Mark Finkle (XULExplorer).
这三个工具都很有特色,如果把它们结合到一起(XUL Explorer现在已经把DOM Inspector和Verkman JavaScript Debugger结合进去了),前景很不错。看来Mozilla IDE离我们不远了。

2007年5月20日星期日

Firefox扩展实例分析: Paste and Go 2(续)

* 命令与事件
mozilla里面的事件处理完全采用了生产 者-消费者(广播-观察)模型,这使得一个事件发生时(一个命令被执行,或者一个控件的某种状态发生改变),响应可以有多个。

比如这个插件里pg2-go-command和pg2-search- command两个命令是否disabled,是由被观察 (observes)的pg2-pastable-broadcaster来决定的,而这个broadcaster的状态改变又是检查cmd_paste 这个内置命令的状态来改变的,这个检查的时机是在地址栏(urlbar)的右键菜单显示或者隐藏时(见content/pasteandgo2.js):

 const CmdBroadcasterId = "pg2-pastable-broadcaster";

this.pgUrlbar = document.getElementById("urlbar");

this.pgUrlbar.addEventListener("popupshowing", pgInstallGo, false);
this.pgUrlbar.addEventListener("popuphiding", this.enableCmds, false);

this.nativePasteCmd = document.getElementById("cmd_paste");
this.cmdBroadcaster = document.getElementById(CmdBroadcasterId);

var isPasteDisabled = pgPrefsObserver.nativePasteCmd.getAttribute('disabled');
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', isPasteDisabled);

enableCmds: function(event) {
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', 'false');
}
* 偏好(preference)
与简单的GUI toolkit不同的是,Mozilla/XUL平台对于偏好(preference)数据考虑比较周全,比如偏好如何存储,如何处理用户设置与系统默认值,扩展如何扩充偏好项目,偏好数据改变(比如直接修改)如何让界面得到相应改变等等。

在Paste and Go 2的代码content/options.xul中, 我们还可以看到另一方面支持: 将一个偏好选项绑定到一个界面控件上,界面初始化时,可自动从偏好数据设置控件的值; 界面控件的值改变时,偏好数据也就变了,不用自己再费很多劲自己写脚本读写数据(想想我们很多时候写程序非常不情愿写个”选项“对话框,这算其中一个主要 原因)。



怎么样,很省事吧?MFC里面的DDX跟这个有点类似,但只能变量与控件值绑定这一步,缺乏将数据持久化 (persistence)功能。

Firefox扩展实例分析: Paste and Go 2

先看一个简单的插件Paste and Go 2,它的功能是:如果剪贴板有一个URL,那么它允许我们只通过一个操作直接转到那个网站去,而不是先在地址栏目粘贴再点击Go按钮; 对于搜索栏也有类似的功能。

它的源代码可以直接通过网页查看: http://www.mozdev.org/source/browse/pasteandgo2/src/

* Overlay
一般而言,XUL overlay文件是个不错的入口,通过它我们可以比较容易知道这个插件扩展了哪些界面元素,然后再根据界面元素去看其对应的代码。

于是我们先看content/pasteandgo2Overlay.xul


这里定义了这个插件的stringbundle, key, command, broadcaster以及firefox特有的toolbarpalette配置。快捷键、命令这些都不是界面控件,但却是一个GUI程序所不可缺少的元素,mozilla/xul把这些功能都拆分了,可以通过overlay来添加和扩展,相当方便。

* 通过脚本动态创建界面元素
但这里没有见到右键点击地址栏时出现的那个Paste and Go菜单项,它是通过脚本content/pasteandgo2.js动态添加的(因为有个添加到"粘贴"后面还是菜单最后的选项):
 function pgInstallMenuItem(e, aID, aLabel, aCommand, aAccesskey) {

item = document.createElement("menuitem");
item.setAttribute("id", aID);
item.setAttribute("label", aLabel);
item.setAttribute("command", aCommand);
item.setAttribute("accesskey", aAccesskey);

if (pgPrefsObserver.pgPlaceAtBottom) { // place at bottom
menu.appendChild(item);
} else { // else place next to paste
var items = menu.childNodes;
for (var i=items.length-1; i >= 0; i--) {
var targetCmd = items[i].getAttribute("cmd");
if(targetCmd == "cmd_paste") { // find out paste
menu.insertBefore(item, items[i+1]);
break;
}
}
}
}

这就是mozilla/xul相当方便的一个地方: 通过脚本可以动态地创建、删除界面元素或者设置它们的属性,并且代码相当简洁直观。

2007年5月18日星期五

Mozilla的可扩展性(开篇?)

本来我是很少买《程序员》杂志的,主要是能力有限,大都看不懂:-(,所以一向只是在书店里站着翻翻,免得买回去占地方。不过第五期上面居然有一篇《Mozilla的架构设计》,Mozilla的中文文章向来比较少,难得有人肯研究这个啊。于是就买了一本,没想到文章看完,发现居然是absurd写的,呵呵,也是,还能有谁。

开始是被firefox的扩展所吸引,加上工作上也需要类似地扩展能力,于是从去年底开始看一些mozilla/xul方面的资料,慢慢地发现了xul, xbl, xpcom的魅力,于是打算系统地学习一下。
  • 春节前后把Creating Applications With Mozilla这本书草草看了一遍,有了大致的了解;
  • 通过limodou的学习笔记将XUL Tutorial看了一遍(英文原文在MDCXUL Planet上都有),好在有他的帖子啊,否则RDF这个东西看英文还真头大;
  • Rapid Application Development with Mozilla 是第二本关于Mozilla开发的书,曾在amazon上获得五颗星的评价(可惜作者过世了,再也没有第二版)。我看了几章,感觉细节讲得比较多,而且很多地方会用类比的方式来讲解为什么要这样设计,不是太适合初学,尤其是英文不太好的朋友很难抓住重点。这本书的PDF版本可以从这里下载到。
absurd是从mozilla的核心代码角度入手来分析的,但我的习惯是从功能应用的角度来入手,可能是跟我的阅读代码的能力比较差有关:-(。而且我目前主要关心的是这个平台怎么就能够方便地扩充功能。我打算近期从一些Firefox扩展入手,来分析一下mozilla/xul的可扩展性。尽量选取一些在扩展性上有代表性的扩展。

先概括地介绍一下mozilla/xul的扩展能力:
  • 通过overlay技术可以对一个已有界面进行重新定义,这也使得对于一个界面可以先写一个框架,再用overlay来逐步细化;
  • 每个窗口的界面元素也有一个DOM结构,完全可以通过脚本来操纵它,修改其属性,甚至动态地创建和删除控件;
  • 可以用XBL来绑定一组XUL元素组成,对行为和风格也可以包装,更方便复用;
  • 可以自己来写xpcom组件(components)来扩展一些功能,尤其是与操作系统或者外部程序交互的地方,这些控件注册后就可以在脚本中使用;甚至可以用javascript来写组件

2007年5月12日星期六

菲利普·K·迪克(Philip K. Dick)

Do Androids Dream of Electric Sheep ?(机器人会梦见电绵羊吗) -> Blade Runner(银翼杀手, 1982)

We Can Remember It for You Wholesale(记忆公司) -> Total Recall (全面回忆/宇宙威龙, 1990)

Second Variety(第二类型) -> Screamers(异型终结, 1995)

Impostor -> Imposter(强殖入侵/冒名顶替, 2002)

Minority Report(少数派报告) -> 少数派报告(2002)

这两天看见说又有两部小说要改编成电影了(有一部好像是叫《遇见未来》,据说是尼古拉斯-凯奇主演),天才啊。据说他之所以能想像力如此丰富,与他嗑药的经历有很大关系。