- Chicago, IL, USA - November 19
- Paris, France - November 20
- Redwood City, CA, USA - November 20
- Istanbul, Turkey - November 21
- Ludwigsburg, Germany - November 21
- Warszawa, Poland - November 22
146 items (146 unread) in 7 feeds
沉寂了一段时间,现在继续SWT Win32 Extension的开发,说实话,最近的进展挺失败的。Black Glossy效果我发现在某些机器上的显示效果非常的卡,我自己的机器却没有任何问题。另外就是我最近在XP下实现了Window Mixer API,用来管理系统声音。Win98,2000,XP都没有问题,结果Vista让我郁闷了,Vista居然取消了Mixer,我哭呀。以下是微软员工给出的答案:
That's because the mixer APIs are virtualized on Windows Vista - you don't get to see the real audio hardware by default, only a virtualized version. We did this because the vast majority of applications that used the mixer APIs were using them to control their own volume, which is quite rude (it says "I own the box, no other sounds on the system matter").
You have two choices. The first is to run your application in XP compatibility mode, in which case you'll be able to access the real audio hardware (please note: you'll see exactly what the hardware provides, which may lead to surprising results).
The other choice is to use the new Vista audio engine APIs. either the IAudioEndpointVolume API which allows you access to the master volume for each of the audio endpoints on the machine. If you really need to access the actual audio controls the IDeviceTopology interface will allow you direct access to the various controls on the audio hardware.
没脾气了,只能专门为Vista实现一套简单的API了。

通过打开Birt透视图,然后Reset至缺省的Layout,我们能够看到基本的一些View和一个主要的报表可视化编辑器。
先来说一下View,Birt主要的View包含7块:
左上角包含3个视图,Palette,Data Explorer和Resource Explorer,Palette里放置了报表常用的可视化组件,直接将这些组件拖到报表设计器的时候,这些组件并没有作特殊的初始化处理,而从Data Explorer里向设计器拖入一个Dataset会自动生成一个Table,拖入一个Cube会生成一个Crosstab,拖入一个Dataset Column会生成一个DataItem。Data Explorer主要是用来管理和显示数据源。Resource Explorer 老版本里是Library Explorer,新版本则变更为了Resource Explorer,用来特别显示Library,CSS文件,其他文件则不进行特殊处理。
左下角有2个视图,包含Navigator视图和Online视图,Navigator视图是用来建立Birt项目用的,如果是Birt Rcp版本,我们则看不到这个视图,这是IDE版本专有的一个视图,在Rcp版本里没有Project这个概念,直接以文件的形式进行管理。Outline是Birt里较为重要的视图,所有的报表部件都会在这个View里显示并会随着报表的变化实时刷新。
右下角包含了Property Editor 和 Problems两个视图, Property Editor 用来编辑每个可视化报表元素的属性,一般比较常用的属性都会在前几个Tab页里,但是有些属性前几个Tab页里都没有,这时候需要选择Advanced这个Tab页,它里面包含了这个元素所有可用的属性,如果连这儿也没有,那么说明该元素不存在你想要的属性。Problems视图则用来显示报表收集到的一些问题,如果报表校验的时候发生错误,会在此处显示出来。
以上的那些视图属于缺省视图,但还有几个视图也比较有用,一个是Error log视图,一个是Example视图。Error log视图主要是开发用的,当你使用Birt进行二次开发的时候,难免会碰到一些bug,当你感觉有问题的时候,不妨打开error log视图,只要Birt捕捉到了异常,一般都会显示在这个视图里。而Example视图里提供了各种各样的视图,可以Open 和 Save, Open的时候会自动帮你在workspace里建立一个项目,以便你浏览该项目文件。Save则是把这个Example保存到本地某个目录。
说完视图,再来看看Birt可视化的报表设计器,这个设计器包含了五个部分:Layout,Master Page,Script,XML Source,Preview。
Layout为设计器的主要部分,只要通过可视化的拖拽,一个报表就会被自动生成出来,当然要想灵活运用报表设计器,就必须对各个组件的属性了如指掌,Birt提供了丰富灵活的属性供用户选择。MasterPage主要用来设置页眉页脚,以及打印显示之类的功能。Script页面,当你在Layout页面里选中一个元素之后,切换到Script页面,就可以对这个元素进行脚本编码,主要用来监听各种事件,使用Javascript,在采用Web显示里,这些脚本会生效。XML Source则是将这张报表背后的XML source显示出来,用户如果觉得自己对Birt很熟,可以直接在这儿手工修改代码。Preview则是预览Birt报表,Birt会启动Tomcat显示Web运行效果。
基本上Birt还是比较强大的,基本的功能一应俱全。可能你会发现缺少一些更高级花哨的功能,比如flash之类的,其实怎么说呢,不是Birt没有,而是开源版的没有,这个功能在Birt商业版里,可以在 [www.actuatechina.com] 下载专业版试用。如同IBM,这是这类公司特有的策略,免费上面做收费。喜欢的话,可以试一下专业版,呵呵,可惜网上找不到破解版。
Eclipse3.4马上就要Release了,相信Eclipse的fans都已经开始翘首以待,望穿秋水了。不过现在的RC版本用得很不爽呀,性能非常差,Eclipse的惯例就是最后一个月的工作基本上就是对性能做优化,以达到最佳使用效果。
随着Plugin的增多,Eclipse采用了特殊的策略,增加了一个子目录dropins,用来放用户新增加的plugin,而原有的plugins目录,则基本用于系统基本功能,2者的区别就是,前者可以任意添加删除,后者则基本上是一个ReadOnly的状态,添加了就不能再作修改了,Eclipse会将每一个添加的plugin记录下来,以后启动就不再检查这些plugin了。
不过对于我来说,我一直都习惯于使用plugins目录,下了一个插件直接解压,就直接覆盖安装到plugins目录了,而且有一些plugin不支持dropins目录,必须在plugins目录下才能正常工作。不过一旦插件安装失败,想再reset就比较麻烦了。Eclipse不会自动恢复到初始安装状态,经过测试,找到了一个解决方案,用原始的eclipse的文件替代2个目录:configuration和p2目录。plugins文件位置记录在configuration\org.eclipse.equinox.simpleconfigurator\bundles.info里,p2目录里则记录了更多的初始化信息。要想Reset Eclipse3.4,这两个目录必须被恢复到初始化状态,然后就可以正常使用了。
就我所知,目前把Java程序编译成本机可执行程序的方法有两种,一种是GCJ,免费的,一种是Excelsior JET,商业的。我已经很久没有碰过GCJ了,因为当初用起来实在是非常麻烦,现在的版本如何,我不太清楚。我自己使用的是Excelsior JET,版本为3.7。有一点要注意的的是,Excelsior JET的后续版本好像已经不支持这个功能了,3.7是我所知的最后一个版本,能支持当前所有的Win32平台和早期的Linux(当前比较流行的Ubuntu不支持,因为内核版本过高,不过企业版Redhat没有问题)。不过我是很久以前从0day当下来的,由于0day仓储只保留一年,故现在已经找不到了,我自己的机器上也没有安装包了(有一次大意之下,把整个Download目录全给删掉了,事后悔之晚矣)。
Excelsior JET无非就是用自己的Runtime来代替JRE,只是比JRE更加灵活,根据Java程序具体的依赖来生成对应的Runtime。其实这个Runtime也挺大的,通常10M左右,不过比起JRE,那要小很多了。SWT Extension上的那个例子只有6M,是因为我用ASPack把所有的DLL文件全部压缩过了,体积小了一半。
就我的感觉,Excelsior JET比GCJ更加灵活,也更好用,毕竟是商业版的东西,它的网站上曾经有例子将Eclipse 3.0编译成本机程序,不过我当初照着例子试了一遍,没有成功。Excelsior JET的编译过程极为耗时,我上大学的时候,当时机器只有128M内存,编译了一天JRE也没有完成,后来找同学借了根256的内存,这才得以完成。
把JAVA代码编译成本机程序的弊端也是有的,那意味着你将无法在线升级,GCJ也许可以,但是Excelsior JET是绝对不行的,这是因为它最后一步要对所有DLL进行链接,如果更换了DLL文件,它会检测出来并报错。
各位看官如果哪位有兴趣,可以自行在网上查找Excelsior JET3.7或其他版本。由于安装包我自己也没有,故无法提供下载,见谅。
The idea is from DotnetMagic, I copied its style, but different implement methods. DotnetMagic uses shell self message circulation, but I use swt event listener. I want to implement the custom style menu for all platforms initially, but it's impossible. It has to use a lot of advanced OS funcitions. If I use pure swt public functions, I can't implement some features. For example, if I click the menu, the window shell will be deactivated, I click window shell's titlebar, swt event manager doesn't send messages to me. I must use WND Message hook to deal these messages. So I have to add the feature into SWT Win32 Extension, but not a independent project.
Some beautiful snapshots:


Project Download: [www.swtui.cn]
JNLP Online Demo: [www.swtui.cn]
If you don't have installed Java Runtime, you can access it via http://www.swtui.cn/downloads/org.eclipse.swt.win32.extension.example.independence_native.zip
Eclipse Plugin Update Site URL: http://www.swtui.cn/update
<extension point="org.eclipse.ui.decorators">
<decorator icon="icons/warning_small.gif" id="cnooc.rcp.decorator.node.warning" label="Data Warning Decorator" lightweight="true" location="BOTTOM_LEFT" state="true">
<enablement>
<and>
<objectClass "com.eplat.cnooc.rcp.node.INode"/>
<objectState name="hasWarning" value="true"/>
</and>
</enablement>
</decorator>
<decorator icon="icons/error_small.gif" id="cnooc.rcp.decorator.node.error" label="Data Error Decorator" lightweight="true" location="BOTTOM_LEFT" state="true">
<enablement>
<and>
<objectClass "com.eplat.cnooc.rcp.node.INode"/>
<objectState name="hasError" value="true"/>
</and>
</enablement>
</decorator>
</extension>
viewer.setLabelProvider(new DecoratingLabelProvider(new ViewLabelProvider(),
Activator.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));

/** *//**
* (non-Javadoc)
*
* @see org.eclipse.ui.IActionFilter#testAttribute(java.lang.Object, java.lang.String,java.lang.String)
*/
public boolean testAttribute(Object target, String name, String value)
{
if (name.equals("hasWarning"))
{
return !getProblems().hasError() && getProblems().hasWarning();
} else if (name.equals("hasError"))
{
return getProblems().hasError();
}
return false;
}

/** *//**
* 校验数据
*
* @return
*/
private boolean verify()
{
//校验数据
//不管是否有error或者warning都需要通知向导树刷新一下节点.
ExplorerView view = (ExplorerView) getSite().getPage().findView(ExplorerView.class.getName());
view.refresh((INode) getEditorInput());
return true;
}
Add Flash Control to SWT Win32 Extension, now you can check out the latest code from CVS and run it.
Project Main Page: [www.swtui.cn]
cvs -d:pserver:anonymous@feeling.cvs.sourceforge.net:/cvsroot/feeling login
Flash Control Listener
Flash Control Hook Interceptor