Java学习

java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已经搬家了,新的地址是 http://www.javaly.cn 如果有对文章有任何疑问或者有任何不懂的地方,欢迎到www.javaly.cn (Java乐园)指出,我会尽力帮助解决。一起进步

 

OpenOffice.org之恋

zhuan:  http://www.blogjava.net/stme/archive/2006/12/05/85497.html
OpenOffice.org之恋(一)

    Blogjava中很少有关于OpenOffice.org的讨论,本人做过这方面的项目现将项目中的经历记录下,方便自己和大家。
    上一个项目是关于OpenOffice.org二次开发的,现在那个项目已经结束了,但是对于OpenOffice.org总是有一种难以割舍,难以忘怀的心情。这可能主要是因为OpenOffice.org是SUN公司开源的,并且它最接近于个人的现实生活吧:),况且它各方面性能不差是我们在政府大力推广正版化之后的良好替代方案,它能够为我们极大的减少软件支出费用,也能够降低大家使用盗版软件所带来的心理上的负担。本人强烈建议软件开发人员使用正版软件,如果不能的话,请使用免费软件替代。试想自己都不能够尊重别人的知识产权,今后我们有何理由向别人提及它、要求它呢!这不就是自己砸自己的脚嘛。
    今后我会抽空慢慢总结在做OpenOffice.org二次开发项目之中遇到的问题与经验教训。
    OpenOffice.org的二次开发,主要是向其添加UNO组件的形式进行的,具体而言就是向其添加UNO组件的压缩包,这个压缩包在OOo调用的时候又分为两种:
    1、OOo直接调用这部分插件代码。
    2、OOo通过其内部的脚本调用插件代码。
由于所属层次与调用机制不同,造成了脚本调用功能完善,但第一次执行效率较另一个低下;而直接调用速度快,但在调用OOo内部的类的时候层次有所限制。具体性能测试后脚本调用并不会滞后多少。综其而言,通过脚本调用插件是我们的首要选择目标。下面我来向大家简要介绍两种UNO包的结构及其异同:
    一:直接调用的包:
          zip--|
               |-jarName.jar
               |
               |-addons.xcu
               |-jarName.xcu

    二:脚本调用的包:
          zip--|
               |-jarName文件夹--|--jarName.jar
               |                |
               |                |--parcel-descriptor.xml
               |
               |-addons.xcu
               |
               |-META-INF--|--manifest.xml

    相同点:
       1、由于OOo现在是SUN公司主导的开源项目,所以遵循SUN公司的打包惯例UNO包使用的也是zip打包压缩算法,这样就极大减少了琐碎小文件对于系统时间空间上地占用。
       2、它们都有设置OOo菜单的xcu文件,它是xml格式的配置文件。
       3、对具体的class文件都要打jar包。
    不同点:
       1、对于jar包,直接调用的需要在jar包中的MATE-INF文件夹中MANIFEST.MF文件中指出主类,而脚本调用的则不需要。
       2、对于zip包,直接调用比脚本调用多了一个xcu配置文件,这是因为它是说明OOo调用那个类开始的;而对于脚本调用,它在自己的zip包中还多加了一层文件夹包括了jar包和一个配置文件,这个名为parcel-descriptor.xml的配置文件详细说明了OOo需要调用的类,以及用于解析脚本所用的dtd文件。
       3、直接调用的处理是从使用OOo之中的XComponentContext对象开始的,而脚本调用则是从OO中脚本调用机制传入的XScriptContext对象启动。XScriptContext对象所属的层次比XComponentContext高,它能够获取当前编辑的文档对象以及XComponentContext。



OpenOffice.org之恋(二)

    这次接着说UNO组件的配置文件,该组件的配置文件是以xcu后缀名结尾的,同其他java中的配置文件一样,它也是xml格式的文件。
    xcu配置文件的作用是对OOo插件的在OOo的菜单栏、工具栏之中指定如何定义用户界面扩展,以及菜单被点击后应该触发哪个类的具体方法的指向。例子如下:
   
 1 <node oor:name="AddonMenu">
 2             <node oor:name="cn.ac.cintcm.openoffice.plugin" oor:op="replace">
 3                 <prop oor:name="Title" oor:type="xs:string">
 4                     <value xml:lang="en-US">CRF report</value>
 5                     <value xml:lang="zh-CN">病例报表</value>
 6                 </prop>
 7                 <prop oor:name="Context" oor:type="xs:string">
 8                     <value>com.sun.star.text.TextDocument</value>
 9                 </prop>
10                 <node oor:name="Submenu">
11                     <node oor:name="m1" oor:op="replace">
12                         <prop oor:name="URL" oor:type="xs:string">
13                             <value>cn.ac.cintcm.openoffice.plugin.lemma:LemmaDialog</value>
14                         </prop>
15                         <prop oor:name="ImageIdentifier" oor:type="xs:string">
16                             <value/>
17                         </prop>
18                         <prop oor:name="Title" oor:type="xs:string">
19                             <value/>
20                             <value xml:lang="en-US">TCM lemma search</value>
21                             <value xml:lang="zh-CN">中医词条搜索</value>
22                         </prop>
23                         <prop oor:name="Target" oor:type="xs:string">
24                             <value>_self</value>
25                         </prop>
26                     </node>
27                     <node oor:name="m2" oor:op="replace">
28                         <prop oor:name="URL" oor:type="xs:string">
29                             <value>cn.ac.cintcm.openoffice.plugin.database:DataBase</value>
30                         </prop>
31                         <prop oor:name="ImageIdentifier" oor:type="xs:string">
32                             <value/>
33                         </prop>
34                         <prop oor:name="Title" oor:type="xs:string">
35                             <value/>
36                             <value xml:lang="en-US">DataBase</value>
37                             <value xml:lang="zh-CN">数据库</value>
38                         </prop>
39                         <prop oor:name="Target" oor:type="xs:string">
40                             <value>_self</value>
41                         </prop>
42                     </node>
43                 </node>
44             </node>
45         </node>

    该xml文件为了避免和命名冲突使用了xmlns:oor="http://openoffice.org/2001/registry"、xmlns:xs="http://www.w3.org/2001/XMLSchema"的命名空间。
    Addons.xcu是脚本调用和直接调用都要用到的文件,它的根节点为oor:component-data,在
<node oor:name="AddonUI">节点下可以设置三个不同地点显示的信息的子节点,它们分别是
<node oor:name="OfficeMenuBar">、<node oor:name="OfficeToolBar">、
<node oor:name="OfficeHelp">,从xml文件的易读性我们可以看出这些分别是设置菜单栏、工具栏和帮助信息的。
    用于定义加载项菜单的支持的 org.openoffice.Office.Addons集
    OfficeMenuBar   此集中定义的菜单将成为 OOo 菜单栏中的顶层菜单。
    AddonMenu       此集中定义的菜单将成为弹出式菜单,是位于工具菜单底部的“加载项”菜单项的一部分。
    模板 MenuItem 的属性
    oor:name
  字符串型。配置节点的名称。名称必须以 ASCII 字母字符开始。 该名称在 Office-MenuBar 集中必须是唯一的。因此,必须使用诸如org.openoffice.<developer>.<product>.<addon name> 或com.<company>.<product>.<addon name> 之类的模式以避免产生名称冲突。请记住,您的配置文件将合并到 OOo 配置分支中。您不知道当前安装了哪些 加载项或者安装了多少加载项。因此子菜单的菜单项的节点名称在其子菜单中必须是唯一的。配置集不能保证其条目的顺序,因此您应该使用字符串 + 编号(如 “m1”)这样的模式作为排序条目时使用的名称。
    URL       字符串型。指定用户激活菜单条目时应该分发的命令 URL。如果 MenuItem 是子菜单的
标题,则该属性将被忽略。要定义分隔符,您可以使用特殊的命令 URL ""private:separator。分隔符将忽略所有其他属性。
    Title     字符串型。包含顶层菜单项的标题。 此属性支持本地化:默认字符串(在 StarSuite 无法找到其当前语言的字符串定义时使用)使用不带属性的 value 元素。您可以使用xml:lang 属性为特定语言定义字符串。为属性指定语言/语言环境,例如<value xml:lang="en-US">string</value>。
    Target    字符串型。为命令 URL 指定目标框架。通常,加载项会使用以下某个预设的目标名称:
                    _top   返回调用的框架的顶层框架,它是在向上遍历分层时 isTop() 返回 true 的第一个框架。
                    _parent 返回框架分层中位于次高的框架。
                    _self   返回框架本身,其名称与空白目标框架的名称相同。也就是说,您正在搜索一个已经存在而且合法的框架。
                    _blank  创建新的顶层框架,其父级框架是桌面框架。
    Context    字符串型。服务名称的列表,以逗号分隔,指定加载项菜单功能应在哪个上下文中出现。空的 Context 表示功能应该在所有上下文中出现。StarSuite 应用程序模块使用以下服务名称:
            Writer:com.sun.star.text.TextDocument
            Spreadsheet:com.sun.star.sheet.SpreadsheetDocument
            Presentation:com.sun.star.presentation.PresentationDocument
            Draw:com.sun.star.drawing.DrawingDocument
            Formula:com.sun.star.formula.FormulaProperties
            Chart:com.sun.star.chart.ChartDocument
            Bibliography:com.sun.star.frame.Bibliography
加载项的上下文服务名称由绑定到框架的模型的服务名称确定,它与 UI 元素(工具栏、菜单栏等)相关。因此,Writer 模型的服务名称是com.sun.star.text.TextDocument。这表示,上下文名称被绑定到应用程序模块的模型。如果开发者实现具有模型的新桌面组件,可以将其服务名称作为加载项 UI 项的上
下文。
    Submenu   一组MenuItem 条目。可选,用于定义菜单条目的子菜单。



OpenOffice.org之恋(三)


    接上次讲到界面扩展的配置文件,这次说直接调用和脚本调用的配置文件。
之前我说过脚本调用的包的结构为:
脚本调用的包:
          zip--|
                |-jarName文件夹--|--jarName.jar
                |                  |
                |                  |--parcel-descriptor.xml
                |
                |-addons.xcu
                |
                |-META-INF--|--manifest.xml

META-INF文件夹中manifest.xml文件的内容可能为:

<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest>
 
<manifest:file-entry manifest:full-path="Addon.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
<manifest:file-entry manifest:full-path="LemmaDialog/" manifest:media-type="application/vnd.sun.star.basic-library"/>
</manifest:manifest>
    上面两项分别是配置显示扩展所用的Addon.xcu配置文件,和你所要添加的业务组件的zip包内所在的文件夹名,后面的类型说明标明了其类型。
    说到脚本调用,我们就应该了解OOo的脚本调用框架,ScriptingFramework 的目标在于使OOo支持地语言编写的宏可以:
        *执行
        *显示
        *被管理
        *被指定到 OOo 事件、组合键、菜单和工具栏项目
    通过部署满足 com.sun.star.script.provider.LanguageScriptProvider 指定服务定义要求的UNO 组件,来添加新语言支持,即可实现上述目标。ScriptingFramework 通过找出满足服务规范并遵守命名约定  “com.sun.star.script.provider.ScriptProviderFor[Language]” 的可用组件来检测支持的语言。默认情况下,OOo 安装了许多参考 LanguageScriptProvider。下面是OOo现在支持的语言列表:
Java            com.sun.star.script.provider.ScriptProviderForJava
JavaScript      com.sun.star.script.provider.ScriptProviderForJavaScript
BeanShell       com.sun.star.script.provider.ScriptProviderForBeanShell
Basic           com.sun.star.script.provider.ScriptProviderForBasic

所有 BeanShell、JavaScript 与 Java 宏都附带一种类型变量
com.sun.star.script.provider.XScriptContext(可用它来访问 OOo API)。此类型有三
种方法:
        * com.sun.star.frame.XModel getDocument(  )
    返回为其调用宏的文档的 XModel 接口
        * com.sun.star.frame.XDesktop getDesktop(  )
    返回应用程序的 XDesktop 接口,用于访问打开的文档和加载文档
        * com.sun.star.uno.XComponentContext getComponentContext(  )
    返回 XComponentContext 接口,用于创建服务实例
    根据语言的不同,宏以不同的方式访问 XScriptContext 类型:
        *Java:传递到宏方法的第一个参数总是属于类型 XScriptContext
    Xmodel xDocModel = xScriptContext.getDocument();
    因为 Java 是一种编译语言,所以不能直接在 OOo 中将 Java 源代码作为宏来执行。该代码必须
先编译,然后部署在 OOo 安装和文档内。
    以下步骤介绍如何使用 HelloWorld 示例代码创建Java 宏:
  1. 为宏创建一个 LemmaDialog 目录
  2. 使用 LemmaDialog源代码创建一个 LemmaDialog.java 文件
  3. 编译 LemmaDialog.java 文件。下列来自于 OOo安装的 program/classes 目录的 jar 文件必须位于类路径中:ridl.jar、unoil.jar、sandbox.jar、jurt.jar
  4. 创建一个包含 LemmaDialog.class 文件的 LemmaDialog.jar 文件
  5. 为宏创建一个 parcel-descriptor.xml 文件
其parcel-descriptor.xml文件如下:
 1 <?xml version="1.0" encoding="UTF-8"?> 
 2 <parcel language="Java" xmlns:parcel="scripting.dtd"> 
 3     <script language="Java">
 4        <locale lang="en">
 5             <displayname value="cn.ac.cintcm.oo.plugin.lemma.LemmaDialog.lemmaDialog"/>
 6             <description>
 7                 Prints "Lemma Dialog".
 8             </description>
 9         </locale>
10         <functionname value="cn.ac.cintcm.oo.plugin.lemma.LemmaDialog.lemmaDialog"/>
11     <logicalname value="cn.ac.cintcm.oo.plugin.lemma.LemmaDialog.lemmaDialog"/>
12         <languagedepprops>
13             <prop name="classpath" value="LemmaDialog.jar"/>
14         </languagedepprops>
15     </script>
16 </parcel>
第13行,说明了宏调用的具体业务代码是LemmaDialog.jar包中的类,而且是从第10行 cn.ac.cintcm.oo.plugin.lemma.LemmaDialog.lemmaDialog这个全路径所表示的类中的方法开始中注入XScriptContext这个参数开始的。接下来就可以调用XScriptContext的对象进行一系列的操作了。
    com.sun.star.awt中有很多与awt、swing相类似的组件可以调用,com.sun.star.beans.XPropertySet是对这些组件进行参数设置的接口。
    下次介绍有关于使用Java调用OOo具体类的业务代码,在OOo中调用其sdk的service与我们一般编写java代码有一定的区别,下回大家就可明白这其中的区别了。


OpenOffice.org之恋(四)

    前一段时间在公司一直不能够登陆Blogjava,所以没有时间更新博客。今天周二休息所以就继续我的OpenOffice.org之恋吧!:)
    这次应该说Java调用OOo具体类的业务代码了。
    OOo的技术架构设计是与平台无关的,其构建在操作系统层之上的模块层次除了一部分VCL库以外,都达到了平台无关,平台无关是SUN的一贯作风。这部分代码占到了整个OOo的90%以上,而那部分VCL库平台有关的代码是为了直接调用各个平台之间与GUI有关的图形图像组件的最小公约数。这个就像jdk中的awt/swing一样,他们对各个操作系统都有的GUI组件进行了封装,而对没有的组件进行了本地模拟。swt做的正好与之相反,当然这个已经离题了:)暂不讨论这些。
    OOo安装完成以后,在${OOoPath}/program/classes目录之下会有一些jar包存在,这些主要用于其自定义UNO组件扩展的内部类库。我们会主要使用到如下四个类包: jurt.jar、unoil.jar、ridl.jar 与
juh.jar将其加入到我们项目的classpath之中。接下来我们就可以引用其类苦中的类来自定义我们需要的具体功能了。
        服务管理器
    UNO 引入了服务管理器的概念。服务管理器可以被视为创建服务的“工厂”。现在,只需将服务看
作可用于执行特定任务的 UNO 对象即可。稍后我们将更精确地定义术语“服务”。
例如,可以使用以下服务:
        com.sun.star.frame.Desktop
维护加载的文档:用于加载文档,获得当前文档以及访问所有加载的文档
        com.sun.star.configuration.ConfigurationProvider
生成对 OOo 配置(例如工具 – 选项对话框中的设置)的访问权限
        com.sun.star.sdb.DatabaseContext
维护与 OOo 一起注册的数据库
        com.sun.star.system.SystemShellExecute
在当前平台上执行为应用程序注册的系统命令或文档
        com.sun.star.text.GlobalSettings
管理文本文档的全局视图和打印设置
    这些类是以后我们能够使用到的比较主要的类。服务的功能是其始终存在于组件上下文中。组件上下文包括创建了服务以及服务使用的其他数据的服务管理器。
我们自定义的类被视为 OOo 进程的客户机,而此时的 OOo 是服务器。该服务器有自己的组件上下文和服务管理器,可从客户机程序进行访问以使用办公软件功能。该客户机程序初始化 UNO,并从 OOo 进程获得组件上下文。在内部,此初始化进程创建一个本地服务管理器,建立与一个正在运行的OOo 进程的管道连接(如有必要,则启动一个新进程)并返回远程组件上下文。
public class HelloWorld {
    
public static void main(String[] args) {
        
try {
            
// get the remote office component context
            com.sun.star.uno.XComponentContext xContext =
                com.sun.star.comp.helper.Bootstrap.bootstrap();
            System.out.println(
"HelloWorld  OOo ");
                
            com.sun.star.lang.XMultiComponentFactory xMCF 
=
                xContext.getServiceManager();
            String available 
= (xMCF != null ? "available" : "not available");
            System.out.println( 
"remote ServiceManager is " + available );         
        }
        
catch (java.lang.Exception e){
            e.printStackTrace();
        }
        
finally {
            System.exit(
0);
        }
    }
}
   com.sun.star.comp.helper.Bootstrap.bootstrap() 方法初始化 UNO,并返回一个正在运行的 OOo 进程的远程组件上下文。而由脚本调用的UNO的方法就不是这样初始化的啦:)
    第一个初始化步骤完成后,您可以使用组件上下文的方法   getServiceManager() 获得OOo 进程的远程服务管理器,这就使您可以通过 API 访问可用的完整办公软件功能。
    在OOo's sdk的doc中描述各个类用的说明语言是c++,而且其使用的名称是service而非class,这个大家注意一下。
    我们的上下文中的对象是一个软件工件,具有您可调用的方法。使用 OOo 完成某些操作时需要对象。但从哪里获得这些对象呢?
    新对象
    通常情况下,新对象或第一次访问所需的对象是由 OOo 中的服务管理器创建的。在如下示例中,远程服务管理器创建远程 Desktop 对象,该对象用于处理 OOo 中的应用程序窗口和已加载的文档:

Object desktop = xRemoteServiceManager.createInstanceWithContext(
         
"com.sun.star.frame.Desktop", xRemoteContext);
    OOo中还有和我们java中的接口类似概念的interface:接口指定共同定义对象的一个方面的属性集和方法集。
    OOo中引入接口和服务的概念是出于以下几个原因:
  1. 接口和服务将规范从实现中分离出来
    接口或服务的规范是抽象的,也就是说,它没有定义支持某项功能的对象如何在内部实现此支持。通过 OOo API 的抽象规范,可以在 API 下分离出实现,并安装其他实现(如果需要)。
  2. 服务名称允许按规范名称而不是类名称创建实例
    在 Java  中,使用 new 运算符来创建类实例。此方法有所限制:获得的类为硬编码。以后您无法在不编辑代码的情况下将其更换为其他类。服务的概念解决了这个问题。OOo 中的中心对象工厂(即全局服务管理器)被请求创建一个对象,此对象不需要被定义内部实现就可以用于特定目的。这是可以实现的,因为通过服务名称可以从工厂定制服务,并且工厂决定返回的服务实现。获得哪种实现没有什么区别,因为您只使用明确定义的服务接口。

  3. 多继承接口使细颗粒状接口便于管理
    如果抽象接口是细颗粒状,即小型且仅描述对象的一个方面而不是多个方面,则可以更好的重复使用。但那样的话,就需要多个此类接口来描述一个有用的对象。一方面,多继承接口允许具有细颗粒状接口;另一方面,又允许通过将接口组织成集合来轻松地管理这些接口。由于在办公软件环境中对象很可能共享多个方面,因此,此细颗粒状可以使接口重复使用,从而获得行为一致的对象。例如,可以使用统一的方式来处理文字,无论处理的是正文、文字框、页眉或页脚文字、脚注、表格单元格还是绘图形状中的文字。不需要为这些不同的文字处理定义单独的接口。

使用接口
    由于必须通过 UNO 对象的接口来访问它们,因此会对某些语言(例如 Java )造成影响。因为在这些语言中,只有编译器所需的对象引用类型正确时才能从中调用方法。在 Java 中,在访问对象实现的接口之前,通常就可以转换对象类型。但使用 UNO 对象时是不同的:必须, UNO环境在需要访问对象支持的接口的方法时获得相应的引用,但编译器对此不知情。只有这时才能安全地转换对象类型。
Java UNO 环境含有用于此目的的 queryInterface() 方法。它看起来似乎非常复杂,但当您了解了 queryInterface() 是与跨进程安全转换 UNO 类型相关的,就会很快习惯它。
1 XToolkit xToolkit = (XToolkit) UnoRuntime.queryInterface(
2                 XToolkit.class, xMultiComponentFactory
3                         .createInstanceWithContext("com.sun.star.awt.Toolkit",
4                                 xScriptContext.getComponentContext()));


  

 


 

OpenOffice.org之恋(五)

    上回说到了如何在OOo之中应用其SDK所带的类库,这次重点说说OOo应用程序的应用环境。桌面环境由桌面对象和辅助对象组成。它通过框架 API 实现其功能。目前,框架 API 包括两个组成部分:组件框架和分发框架。组件框架采用一种特殊的“框架 - 控制器 - 模型”模式来管理OOo 中的可视组件。分发框架处理来自 GUI 的命令请求。


    桌面环境
    com.sun.star.frame.Desktop 服务是 OOo 应用程序框架的核心管理实例。所有 OOo 应用程序窗口都按框架分层组织,框架中包含可视组件。桌面是该分层的最顶层框架。

    通过桌面管理的可视组件包括三种不同的对象:具有文档模型和控制器的成熟办公软件文档、具有控制器但无模型的组件(例如文献目录和数据库浏览器)以及不带启用了 API 的控制器的简单窗口(例如预览窗口)。这些组件类型的相同点是 com.sun.star.lang.XComponent 接口。带有控制器的组件也称作办公软件组件,而简单窗口组件则称作普通组件。

    下面重点说说 OOo 中的“框架 - 控制器 - 模型”模式

    著名的“模型 - 视图 - 控制器 (MVC)”模式有三个应用领域:文档数据(模型)、显示(视图)和交互(控制器)。OOo 中的“框架 - 控制器 - 模型 (FCM)”模式也是一个类似的抽象概念。FCM 模式与 MVC 模式在某些方面是相同的,但它们的目的不同,所以最好分别处理。MVC 模式和 FCM 模式中的模型和控制器是完全不同的。

    OOo 中的 FCM 模式有三个应用领域:文档对象(模型)、与模型的屏幕交互(控制器)以及控制器与窗口之间的联系纽带(框架)。

    *模型包含文档数据,还包含多种更改数据的方法(不必使用控制器对)。在模型中,可以直接访问文本、图形和工作表单元格。

    *控制器掌握着文档的当前视图状态并控制文档的屏幕显示,但是不能控制文档数据。它监视模型的变化,并能够通过复制使一个模型具有多个控制器。

    *框架包含模型控制器,并了解与之一起使用的窗口,但没有窗口功能。
    FCM 的目的是使系统具备三个与可交换窗口系统配套使用的可交换部件:

    框架
    在“框架 - 控制器 - 模型”模式中,框架的主要角色是担任可视组件和窗口系统之间的联系纽带。框架可以包含一个组件,或者一个组件与一个或多个子框架。构造框架时,必须使用容器窗口对框架进行初始化(使用com.sun.star.frame.XFrame:initialize())。这种方法需要具有外围窗口实例的com.sun.star.awt.XWindow 接口,它将成为框架的容器窗口。传送给 initialize() 的窗口实例还必须支持 com.sun.star.awt.XTopWindow 才能成为容器窗口。支持com.sun.star.awt.XTopWindow 并不意味着容器窗口独立于带有标题栏和系统菜单的底层窗口系统。XTopWindow 可在需要时充当窗口,但也可以固定或根据外围应用程序窗口而改变位置。

    将框架添加到桌面框架分层中后,桌面就成为框架的父级框架。因此,需要将桌面的com.sun.star.frame.XFramesSupplier 接口传送给 XFrame 接口中的 setCreator() 方法。在桌面提供的 com.sun.star.frame.XFrames 接口中调用 append() 方法时,内部就会发生这一过程。

    框架中的组件
“桌面环境”一节介绍了可以插入到框架中的三种可视组件。如果组件带有控制器和模型 (例如文档),或者只有控制器(例如文献目录和数据库浏览器),该组件就能实现接口com.sun.star.frame.XController 所表示的 com.sun.star.frame.Controller 功能。

    控制器
OOo 中的 控制器介于框架和文档模型之间。这是它的基本作用,它具有 getModel() 和 getFrame() 两个方法。getFrame() 方法提供控制器所附着的框架。getModel() 方法返回一个文档模型,但是,如果组件没有文档模型,它可能返回一个空引用。

    分别从框架、控制器和模型中获取另外两方
    开发人员通常需要使用已加载文档模型的控制器和框架。OOo 文档模型的com.sun.star.frame.XModel 接口通过其 com.sun.star.frame.XController 接口获取可以访问框架的控制器。下图显示了从文档模型中获取控制器和框架以及从控制器或框架中获取文档模型的方法。从框架中获取相应的组件和容器窗口。


 OOo.JPG




 

OpenOffice.org之恋(六)

存储文档
    成功加载办公软件组件之后,返回的接口用于操纵该组件。诸如com.sun.star.text.XTextDocument、com.sun.star.sheet.XSpreadsheetDocument 或com.sun.star.drawing.XDrawPagesSupplier 之类的文档特定接口是通过 queryInterface() 进行检索的。

    如果办公软件组件支持适用于实现 com.sun.star.document.OfficeDocument 服务的每个组件的com.sun.star.frame.XStorable 接口,则可以存储该组件:

void store ( )
void storeAsURL ( [in] string sURL, [in] sequence< com::sun::star::beans::PropertyValue > lArguments )
void storeToURL ( [in] string sURL, [in] sequence< com::sun::star::beans::PropertyValue > lArguments )
boolean hasLocation ()
string getLocation ()
boolean isReadonly ()
    XStorable 提供的文档存储方法有 store()、storeAsURL() 和 storeToURL()。后两个方法使用中间描述符进行调用。

store() 将覆盖现有文件。对使用 private:factory/... URL 从头开始创建的文档调用这个方法将导致异常。其他两个方法 storeAsURL() 和 storeToURL() 都保留原文件不动,不同之处在于存储文档之后。

storeToURL() 方法将当前文档保存到指定位置,而不改变文档的内部状态。storeAsURL 方法将文档的 Modified 属性(可通过文档的 com.sun.star.util.XModifiable 接口访问)设置为假,并使用调用中传送的参数更新文档的内部中间描述符。这样就改变了文档的 URL。

    在保存已编辑文档之前需要对一个 PropertyValue 数组结构体进行内容设置,

PropertyValue[] prop = new PropertyValue[1];
        prop[0] = new PropertyValue();
        prop[0].Name = "Overwrite";
        prop[0].Value = Boolean.TRUE;

事件绑定描述中的 PropertyValue 结构如下:

EventType 字符串型。可能的值为 "StarBasic" 或 "Script"。事件类型 "Script" 用URL 表示位置。事件类型 "StarBasic" 是出于兼容目的而提供的,除 URL外,它还用 Library 和 MacroName 属性来描述宏的地址。

Script  字符串型。适用于 Script 和 StarBasic事件类型。用于描述被绑定宏/脚本例程的位置。URL 属性需要使用命令 URL。StarBasic 将在发生事件时执行此命令。 对于事件类型 StarBasic 而言,URL 使用 macro:协议。对于事件类型Script 而言,可以使用其他协议,特别是 script:协议。macro 协议有两种形式:macro:///<Library>.<Module>.<Method(args)>macro://./<Library>.<Module>.<Method(args)>第一种形式指向全局基本存储器中的一个方法,第二种形式指向嵌套在当前文档中的一个方法。Library>.<Module>.<Method(args)> 表示程序库、模块和方法的名称。目前,args 只能使用字符串参数(用逗号分隔)。如果不存在参数,必须使用空括号,因为括号是方法的组成部分。下面是一个 URL 示例:macro:///MyLib.MyModule.MyMethod(foo,bar)

Library 字符串型,已不再使用。适用于 EventType "StarBasic" 事件类型。可以为其赋予"application" 值或为全局基本存储器赋予空字符串值,为嵌套代码的文档赋予 "document" 值。

MacroName 字符串型,已不再使用。适用于 EventType "StarBasic" 事件类型。将宏
地址描述为 <Library>.<MyModule>.<MyMethod>。

还有些属性,等我整理好了再补充上来:)

posted on 2009-05-15 14:19 找个美女做老婆 阅读(3257) 评论(1)  编辑  收藏

评论

# re: OpenOffice.org之恋 2009-05-27 14:28 1231231

asdasdadasd  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

本blog已经搬到新家了, 新家:www.javaly.cn
 http://www.javaly.cn

常用链接

留言簿(6)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜