Top > OOobbs2 > 51

OOobbs2/51 Edit

  • サマリ: ごみ置き場(最近のごみ)
  • 環境: General
  • 状態: 投稿
  • 投稿者: はにゃ??
  • 投稿日: 2007-07-24 (火) 22:50:53

質問 Edit

回答 Edit

最近作成したごみを置いておきます。

OOo 2.4 メモ Edit

2.4 の新機能メモ

  • 拡張機能
    • 拡張機能パッケージの表示名
    • オンラインアップデート時のパブリッシャー表示
    • リリースノートリンク表示
    • ブラウザでのアップデート
    • 拡張機能用ヘルプ

拡張機能パッケージの表示名 Edit

<display-name>
  <name lang="en">display name</name>
</display-name> 

パブリッシャー表示 Edit

<publisher>
  <name xlink:href="http://.html" lang="en">Publisher</name>
</publisher>

リリースノートリンク表示 Edit

<release-notes>
  <src xlink:href="http://.html" lang="en" />
</release-notes>

ブラウザでのアップデート Edit

update-information 先の update.xml に update-download の替わりに update-website を記述する。

<update-website>
  <src xlink:href="http://.html" lang="en" />
</update-website>

拡張機能ヘルプ Edit

今のところ (2.4) いろいろできないのであまり使えない。

関連 issue

OOo 2.3 メモ Edit

2.3 では

Dialog 作成でツリービューがサポートされる。サービス名は

com.sun.star.awt.tree.TreeControl
com.sun.star.awt.tree.TreeControlModel

以前からツリービューが使われていたが、BasicDialog では 2.2 までは使用できなかった。

extension の identifier サポート

拡張機能マネージャに http://extensions.services.openoffice.org/ へのリンク追加

拡張機能に対してオプション設定が可能に。しかし、Java でハンドラーを作成する必要がある。ハンドラーはサービスとして作成するので Uno コンポーネントであれば Java でなくてもよい。が、・・・。

Developer's Guide に chapter 5 Extensions が追加

  • パッケージの MIME-TYPE
  • description.xml
  • パッケージのオンラインアップデート
  • 拡張機能のオプション設定

パッケージのオンラインアップデートは 2.2 からサポートされているはず

chapter 20 Graphical User Interfaces 追加

アドオンメニュー以外にも、既存のメニュー、ツールバーへの拡張機能からのマージが可能に。

拡張機能パッケージのメモ Edit

ツール -> 拡張機能マネージャーからインストールしたファイルは $(user)/uno_packages/cache/uno_packages 以下に zip ファイルを展開した形で保存される。このとき、tmp ディレクトリの中に展開されるためどのパッケージがどのディレクトリに存在しているかをマクロなどから取得しにくい。

com.sun.star.deployment.PackageManagerFactory からパッケージマネジャーを取得することで拡張機能マネージャーの機能が API から利用できる。

上記 API を利用したインストールされている拡張機能パッケージの情報を見るツール。アドオンメニューから ShowPackageInfo で起動。ファイルを開くダイアログを使って拡張機能パッケージが展開されているディレクトリを開くこともできる。

filemytools_package.zip

拡張機能パッケージインストール時の挙動 Edit

OOoBasic を含む拡張機能パッケージをインストールするときの挙動。

  • 拡張機能でインストールされるライブラリと同じライブラリがすでに OOoBasic ライブラリにある場合

元からあるライブラリが優先される。ライブラリ名が同じでモジュール名が異なる場合でも、元からあるライブラリのものしか表示されない。

同じモジュールがある場合に編集したとしても、元のライブラリのみが変更される。

この挙動は次の拡張機能パッケージアンインストール時の挙動により避けるべき。

OOoBasic のライブラリは拡張機能パッケージからインストールされた場合、$(user)/basic 以下にディレクトリが作成されない。パッケージが展開された中にライブラリ用ディレクトリが存在し、編集などはそこのファイルに適用される。

JavaScript のファイルを拡張機能からインストールした場合は、ツール -> マクロ -> マクロの管理 -> JavaScript からライブラリがなぜか見ることができない。

  • configuration ファイル

configuration 系のファイルは $(user)/uno_packages/cache/registry/ 以下に node ごとにコピーされる形になる。パッケージの元のファイルは移動されない。

拡張機能パッケージアンインストール時の挙動 Edit

  • OOoBasic で元からあるライブラリと同じ名前のライブラリが拡張機能パッケージからインストールされたもの

この場合、拡張機能パッケージを削除すると、元からあったライブラリまで削除されるので注意が必要。

よって、OOoBasic で拡張機能パッケージを作成する際、同じライブラリがある状態で追加と削除、編集を行うのは最初のみ危険。最初に拡張機能パッケージを削除した時点で元のライブラリがなくなるのことになる。

パッケージのエクスポート挙動 Edit

パッケージをエクスポートするときには、パッケージが展開されたファイルごと zip 圧縮する形でエクスポートされる。

そのため、Basic ライブラリなどに変更を行った場合には変更が適用されたファイルがエクスポートされることになる。

  • description.xml ファイルは編集が可能。編集後にパッケージマネージャーを開くと適用されている。
  • configuration 系のファイルは拡張機能マネージャーで無効にした後で編集を加え、再度有効にすると編集が有効になる。OOo の再起動は必要。

OOoBasic の拡張機能パッケージ作成 Edit

パッケージマネージャーが変な挙動をするので、OOoBasic で拡張機能を作成するときのお勧めの方法。

  1. OOoBasic のライブラリ管理ページで新しくライブラリを作成する。このとき、あまり使われてなさそうな名前に
  2. 作成したライブラリを編集する前にすぐに拡張機能としてエクスポートする
  3. さっき作成したライブラリを削除する
  4. 代わりに拡張機能をインストールしてライブラリとする
  5. ライブラリを編集、他のライブラリなどからコピー
  6. 配布用などにパッケージ化するには、拡張機能マネージャーからエクスポートする
  7. バージョンごとに保存しておきたいときなども、同様にエクスポート

こうやって作成したパッケージにライセンスファイルなどを追加した際には META-INF/manifest.xml に追記する

オンラインアップデート Edit

2.2 から拡張機能のオンラインアップデートが利用できる。

example.update.xml を pukiwiki に添付して参照ができるが、パッケージを pukiwiki に添付するとなぜかダウンロードに失敗する。pukiwiki 側でもアクセス数が増えているのでアクセスまでは行われているらしい。理由は不明。

BeanShell + OOo メモ Edit

おかしいと思ったら ARGUMENTS がデバッグウィンドウでコードを開いていると見えないバグ。 http://www.openoffice.org/issues/show_bug.cgi?id=70065

閉じていれば問題ないので、別のエディタで編集しつつ OOoBasic から実行したりすれば問題ない。

BeanShell から他のマクロ実行 Edit

要修正

import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.script.provider.XScriptContext;
import com.sun.star.script.provider.XScriptProviderFactory;
import com.sun.star.script.provider.XScriptProvider;
import com.sun.star.script.provider.XScript;

showmsg( String msg ) {
xContext = XSCRIPTCONTEXT.getComponentContext();
xMCF = xContext.getServiceManager();

oMCPF = xContext.getValueByName(
  "/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory");
xMCPF = (XScriptProviderFactory) UnoRuntime.queryInterface(XScriptProviderFactory.class, oMCPF);
oMSP = xMCPF.createScriptProvider("");
xMSP = (XScriptProvider) UnoRuntime.queryInterface(XScriptProvider.class, oMSP);

sScriptUrl = "vnd.sun.star.script:mytools_net.Module1.msgfrombeanshell?language=Basic&location=application";
oScript = xMSP.getScript( sScriptUrl );
xScript = (XScript) UnoRuntime.queryInterface(XScript.class, oScript);
args = new String[1];
args[0] = msg;
Object a;
Object b;
xScript.invoke( args, a,b);
}

importCommands Edit

BeanShell ではクラスパスにある関数をコマンドとして読み込み、使用することができる。 http://www.beanshell.org/manual/commands.html#Adding_BeanShell_Commands

  • ツール -> オプション -> OpenOffice.org -> Java からクラスパス

クラスパスとして $(user)/Script/beanshell を追加する。

vista や XP からだと隠しディレクトリになっているためなぜか表示されないため設定しにくい。設定ファイル $(user)/config/javasettings_xxx_xxx.xml を直接編集で対応。(設定元ファイルの場所が不明。/org.openoffice.Office.Java/Install の AdditionalClasspath にパスを追加してみたが不可。)

もしくは、addClassPath でクラスパスを追加する。

$(user)/Script/beanshell/Library1/Macro1.bsh から同じライブラリの Macro2.bsh をコマンドとして読み込む場合にも結構面倒

addClassPath( "C:/Users/user/AppData/Roaming/OpenOffice.org2/user/Scripts/beanshell/Library2/Macro2.bsh" );
importCommands("/Library1");
  • 拡張機能パッケージなどに入れた場合、環境によってパスが異なる

com.sun.star.util.PathSubstitution サービスなどを利用する。

import com.sun.star.util.XStringSubstitution;
import com.sun.star.util.PathSubstitution;
xContext = XSCRIPTCONTEXT.getComponentContext();
xMCF = xContext.getServiceManager();
oPS = xMCF.createInstanceWithContext("com.sun.star.util.PathSubstitution",xContext);
xSS = (XStringSubstitution) UnoRuntime.queryInterface(XStringSubstitution.class, oPS);
s = xSS.substituteVariables("$(user)/Scripts/beanshell",true);
url = new java.net.URL(s);
addClassPath( url.getPath() );
importCommands("/Library1");

addClassPath は URL でも読み込めるはずだが、file:// から始まる URLソースだとなぜかうまくいかないのでパスにしてから与える。環境によってクラスパスが設定されるので拡張機能パッケージなどに入れて利用できるようになる。

クラスを作成して .java ファイルとして保存すればクラスとして利用できる。.bsh のままだとクラスとして利用できない。

JavaScript + OOo Edit

JavaScript から他のマクロ実行 Edit

要修正

importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.script.provider.XScriptProviderFactory);
importClass(Packages.com.sun.star.script.provider.XScriptProvider);
importClass(Packages.com.sun.star.script.provider.XScript);

xContext = XSCRIPTCONTEXT.getComponentContext();
xMCF = xContext.getServiceManager();

oMCPF = xContext.getValueByName(
  "/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory");
xMCPF = UnoRuntime.queryInterface(XScriptProviderFactory, oMCPF);
oMSP = xMCPF.createScriptProvider("");
xMSP = UnoRuntime.queryInterface(XScriptProvider, oMSP);

sScriptUrl = "vnd.sun.star.script:Standard.Module10.Main?language=Basic&location=application";
oScript = xMSP.getScript( sScriptUrl );
xScript = UnoRuntime.queryInterface(XScript, oScript);
args = new Array();
args[0] = "string";
xScript.invoke( args, Array(), Array());

parcel-description.xml Edit

beanshell、Javascript の parcel-description.xml ファイルの description に説明を書くと、マクロの実行ダイアログで説明表示が出る。

<?xml version="1.0" encoding="UTF-8"?>
<parcel language="Java" xmlns:parcel="scripting.dtd">
    <script language="Java">
        <locale lang="en">
            <displayname value="HelloWorld.Java"/>
            <description>
                Prints "Helo World". 
            </description>
        </locale>
        <functionname value="HelloWorld.printHW"/>
        <logicalname value="HelloWorld.printHW"/>
        <languagedepprops>
            <prop name="classpath" value="HelloWorld.jar"/>
        </languagedepprops>
    </script>
</parcel>

TopTxtDlg Edit

トップレベルにウィンドウを作成して文字列を表示します。

modal なダイアログと違うため OOoBasic などから利用しても開いたままで作業に使えます。

Sub TopTxt( Optional sLocStr As String )
  If IsMissing(sLocStr) Then
    sLocStr = ""
  End If
  Dim oTopTxtFrame As Object, oTopTxtWindow As Object
  Dim oTopTxtToolkit As Object
  oTopTxtToolkit = CreateUnoService("com.sun.star.awt.Toolkit")
  oTopTxtWindow = CrateTopTxtWindow(oTopTxtToolkit,MakeRect(150,150,300,200))
  CreateCtrTopTxtEdit( oTopTxtToolkit, oTopTxtWindow, MakeRect(0,0,300,200)). _
    setText(sLocStr)
  oTopTxtFrame = CreateTopTxtFrame( oTopTxtWindow )
  StarDesktop.getFrames().append(oTopTxtFrame)
End Sub


Function CreateTopTxtFrame( oLocWindow As Object ) As Object
Dim oLocNewFrame As Object
  oLocNewFrame = CreateUnoService("com.sun.star.frame.Frame")
  With oLocNewFrame
    .initialize(oLocWindow)
    .setCreator(StarDesktop)
    .setName("TopTxtDlg")
  End With
  CreateTopTxtFrame = oLocNewFrame
End Function


Function CrateTopTxtWindow( oLocToolkit As Object, _
  aLocRect As com.sun.star.awt.Rectangle ) As Object
Dim oLocWinDesc As Object
  oLocWinDesc = createUnoStruct("com.sun.star.awt.WindowDescriptor")
  With oLocWinDesc
    .Type = com.sun.star.awt.WindowClass.TOP
    .WindowServiceName = "window"
    .ParentIndex = -1
    .Parent = oLocToolkit.getDesktopWindow()
    .Bounds = aLocRect
  End With
  With com.sun.star.awt.WindowAttribute
    oLocWinDesc.WindowAttributes = _
      com.sun.star.awt.VclWindowPeerAttribute.CLIPCHILDREN + _
      .MOVEABLE + .BORDER + .SHOW + .SIZEABLE + .CLOSEABLE
  End With
  CrateTopTxtWindow = oLocToolkit.createWindow(oLocWinDesc)
End Function


Function CreateCtrTopTxtEdit( oLocToolkit As Object, oLocWindow As Object, _
  aLocPosSize As com.sun.star.awt.Rectangle )
Dim oLocCtr As Object, oLocCtrModel As Object
  oLocCtr = createUnoService("com.sun.star.awt.UnoControlEdit" )
  oLocCtrModel = createUnoService("com.sun.star.awt.UnoControlEditModel" )
  oLocCtrModel.setPropertyValues( array("MultiLine","VScroll"), array(true,true) )
  With oLocCtr
    .setModel(oLocCtrModel)
    .createPeer( oLocToolkit, oLocWindow )
    .setPosSize( aLocPosSize.X, aLocPosSize.Y, _
        aLocPosSize.Width, aLocPosSize.Height, _
        com.sun.star.awt.PosSize.POSSIZE )
  End With
  CreateCtrTopTxtEdit() = oLocCtr
End Function


Function MakeRect( nX As Long, nY As Long, _
  nWidth As Long, nHeight As Long ) As com.sun.star.awt.Rectangle
Dim oLocRect
  oLocRect = createUnoStruct("com.sun.star.awt.Rectangle")
  With oLocRect
    .X = nX
    .Y = nY
    .Width = nWidth
    .Height = nHeight
  End With
  MakeRect() = oLocRect
End Function

mytools_js Edit

OOoBasic では正規表現による検索、置換が使えないため JavaScript を利用して置換させるためのライブラリ。

JavaScript のスクリプトを呼び出すための Basic 関数と、JavaScript のスクリプトのライブラリ。

OOo の JavaScript を利用したスクリプトは Java で実装された JavaScript エンジンを利用しているため Java Runtime (JRE) が無いと動かないはず。

たとえば、置換用。

OOo Basic 関数

Function jsreg_replace( _
  pattern As String, flag As String, replacement As String, subject As String ) As String
  oMSPF = GetDefaultContext.getValueByName( _
 "/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory")
  oMSP = oMSPF.createScriptProvider("")
  sScriptUrl = _
 "vnd.sun.star.script:mytools_js.jsreg_replace.js?language=JavaScript&location=user:uno_packages/mytools_js.oxt"
  oScript = oMSP.getScript(sScriptUrl)
  jsreg_replace() = oScript.invoke( array( pattern, flag, replacement, subject ),array(),array())
End Function

から簡単な Javascript スクリプトを呼び出す

var result = "";

if ( ARGUMENTS.length >= 4 ) {

  pattern = String(ARGUMENTS[0]);
  flag = String(ARGUMENTS[1]);
  replacement = String(ARGUMENTS[2]);
  subject = String(ARGUMENTS[3]);

  re = new RegExp( pattern, flag );
  result = subject.replace( re, replacement );
}

result;

簡単に例を書くと

sString = jsreg_replace("a.","i","AA","abc") 'return AAc

二番目の引数は正規表現用のフラッグ、i で大文字小文字を無視、g ですべて置換。m で複数行に対して置換 (^などが各行の行頭に一致するようになる)。

filemytools_js.oxt

JavaScript の manifest info は

<manifest:file-entry manifest:full-path="mytools_js/" 
 manifest:media-type="application/vnd.sun.star.framework-script"/>

PyUNO Edit

OOo から Python スクリプトをマクロとして外部から接続せずに使用すると、実行するマクロのファイルと同じディレクトリに import したいファイルがあってもできない。

動的に sys.path にパスを追加してやると import できるようになる。

以下は HellorWorldPython をいじったもの。環境に応じた user/Scripts/python ディレクトリを sys.path に追加した後で import できるようになっている。

import sys
import unohelper

def HelloWorldPython( ):
    
    ctx = XSCRIPTCONTEXT.getComponentContext()
    smgr = ctx.ServiceManager
    ps = smgr.createInstanceWithContext( 
    	"com.sun.star.util.PathSubstitution", ctx )
    user_url = ps.substituteVariables( "$(user)/Scripts/python", True )
    user_path = unohelper.fileUrlToSystemPath( user_url )
    if user_path not in sys.path:
    	sys.path.append( user_path )
    
    model = XSCRIPTCONTEXT.getDocument()
    text = model.Text
    tRange = text.End
    
    for p in sys.path:
    	tRange.String = p + "\n"
    	tRange = text.End
    
    tRange = text.End
    import another
    tRange.String = another.Another()
    
    return None

another.py

def Another():
    return "another"

感想,コメント,メモ Edit



Attach file: filemytools_js.oxt 853 download [Information] filemytools_package.zip 629 download [Information]

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes