您的位置:首页 > 其它

【Firefox扩展】简单扩展之3——overlay toolbar

2007-07-31 23:47 330 查看
简单扩展之3——overlay toolbar

这一系列的前两篇blog并没有涉及到图形元素,这篇toolbar的扩展,将会加入skin包,在toolbar上添加一个button,然后在button上显示一个png类型的图片。这样至少能让我们的扩展漂亮点~_~

首先,还是这个xpi扩展包的目录结构:
/chrome
---/extdemo.jar
/install.rdf
/chrome.manifest
extdemo.jar的目录结构如下:
---/content
---/overlay.xul
---/overlay.js
---/skin
---/classic
---/ExtensionDemo.css
---/small.png
---/normal.png

一目了然,目录结构中多的只是一个skin子目录,这个子目录中包含了css样式文件,和两个png图片文件(其实一个就ok了)。当然,如果只是加上这个目录,其他都不变的话,那么他不会正常工作的,需要在chrome.manifest中修改相应的注册信息,还需要在overlay.xul中添加样式引用。

我们逐个介绍,install.rdf还没有什么改变~!我决定了,firefox扩展的一些界面部分的信息搞定了以后,我马上写一个小IDE把模板先把install.rdf格式搞出来~

然后依旧是重要的chrome.manifest,这次我们加入了一些重要的skin包信息。

overlay chrome://browser/content/browser.xul chrome://extdemo/content/overlay.xul
content extdemo jar:chrome/extdemo.jar!/content/



skin extdemo classic/1.0 jar:chrome/extdemo.jar!/skin/classic/

和前面两篇blog一样,他也有必不可少的content包和覆盖browser.xul的说明,不同的是,我们加入了skin包的注册信息,Mozilla的skin是与theme配套的,又据说Mozilla缺省提供了classic和modern,(可是我在chrome目录下只发现了一个classic.jar,并没有什么modern.jar文件)。当我们通过chrome访问skin时,Mozilla会自动根据正在使用的theme加上classic或modern。比如说我们访问chrome://extdemo/skin/extensiondemo.css,其实真正访问的是chrome://extdemo/skin/classic/extensiondemo.css;只不过这个过程被隐藏了,我们什么也看不到。
这里还需要说明一下,我在学写扩展的时候,看的文档主要是MDC和大侠limodou的blog再就是别人写的非常优秀的扩展,可是MDC满篇E文字,对于写扩展介绍的并不是很多很细;limodou的blog又是2005年写的,其中有些文件如contents.rdf是不必在包含在chrome下的三个文件夹中的,所以我的文件夹中没有这些rdf的影子,有兴趣的朋友可以看看web developer扩展和scrapbook扩展,最新版中也是没有的。
好了,回到我们的扩展中来,skin包注册时要比content包多一个classic/1.0的部分,大家注意下就ok了。

接下来是content下的文件,这个扩展实现了工具条上的按钮checked状态的切换,就是说第一次如果这个按钮是按下去的状态(checked状态),那么在按下这个按钮后,这个按钮会变成普通状态(unchecked状态)。
首先我们来看overlay.xul文件:


<?xml version="1.0"?>




<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>


<?xml-stylesheet href="chrome://extdemo/skin/ExtensionDemo.css" type="text/css"?>




<overlay id="ProxyInput-overlay"


xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">




<script type="application/x-javascript" src="SelectChecked.js"/>




<toolbox id="navigator-toolbox">


<toolbar id="checked-toolbar" class="chromeclass-toolbar" collapsed="false" hidden="false" mode="full">


<toolbarbutton id="check-button“ tooltiptext="push it, Please!" checked="true" oncommand="SelectChecked()"/>


</toolbar>


</toolbox>




</overlay>

有几点需要说明:
1.代码中第二行和第三行是对css样式的说明,这里引用了全局样式,之后引用了skin包中的自定义样式;
2.要扩展工具栏,toolbox的这个id是必须的;
3.toolbar是容器,toolbarbutton才是真正的容器中的元素,这个button的id被定义为check-button,注意这个id!他非常重要。之后的tooltiptext是鼠标放在这个按钮上时显示的文字,checked为true表示这个按钮被设置为checked状态,之后响应按钮被按下的处理事件。处理事件被定义在SelectChecked.js文件中,这个js文件的代码如下:


function SelectChecked()




...{


var bIsChecked = document.getElementById('check-button').getAttribute('checked');


if(bIsChecked == "false")




...{


document.getElementById('check-button‘).setAttribute('checked','true');


}


else


{


document.getElementById('check-button').setAttribute('checked','false');

}


}

这里面包含了一些DOM操作,我就不细说了,大概过程就是从DOM树中取得id为check-button的元素的checked属性的状态,然后判断它的值,设置成与当前状态相反的值。
Stop!图片呢?答案在css文件中。

最后我们来看 ExtensionDemo.css 这个文件,代码很简单,如下:


@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");






/**//* Toolbar buttons */




#check-button




{...}{


list-style-image: url("chrome://extdemo/skin/normal.png");


}




toolbar[iconsize="small"] #check-button




{...}{


list-style-image: url("chrome://extdemo/skin/small.png");


}



看到了吧,这里引用了check-button的id,然后把这个id绑定上一个图片,如果你会css,会DOM,那么应该很好理解;如果你不是很了解他们俩,那么你和我一样,说实话,这样的一种映射关心对初学者来说理解很困难,不过只要你有耐心,找一找别人写好的优秀的扩展,你会发现这个关系的,我是这样过来的,想想前两天一头雾水,把他搞定后心情真的很复杂~
总结一下,在一个button上添加一个图片(其实不一定仅是toolbarbutton),是在xul中声明一个id,然后在css文件中引用这个id,与在skin目录下的图片绑定,绑定方法就像这个css写的那样,至于其他的高级css方法,以后学了再说~

打包后,就能看到效果,说实话,工作之前,我根本没听说过XUL、对DOM、CSS也一点概念都没有,学过两个月的python,所以javascript比较容易上手,但是那三种东西就像三座大山一样,让我在接到任务的那两个礼拜压力很大,也许这就叫工作~草TMD!
不过还是要说,坚持过来后,做出了点简单的东西,心情好了些,而且得到像老大这样的牛人的肯定后,会觉得值了,至少自己学了些东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: