*MRI の起動の仕方 [#r9f52847] #contents MRI はどんな言語からも呼び出すことができ、またアドオンメニューからも実行できます。 **言語から利用 [#c236530e] あなたが利用したい言語から MRI を利用したいとき、"mytools.Mri" サービスをインスタンス化してください。そして、そのオブジェクトからターゲットオブジェクトを引数として ''inspect'' メソッドを呼び出してください。 ''inspect'' メソッドは com.sun.star.beans.XIntrospection インターフェースのメンバーであり、利用する言語によってはそのインターフェースをクエリーする必要があります。com.sun.star.beans.Introspection サービスから取得できる普通の inspect メソッドと同様に MRI の inspect メソッドも com.sun.star.beans.XIntrospectionAccess インターフェースを返します。 UNO オブジェクト以外のものを inspect メソッドに渡しても MRI は正しく動作しません。 com.sun.star.beans.XIntrospectionAccess ''inspect''( [in] any aObject ) ***OpenOffice.org Basic [#ee8f0179] OOo Basic 用に MRILib ライブラリが付属しています。MRILib ライブラリにある Mri サブルーチンを利用すると、OOo Basic から次のように簡単に MRI を利用できます。 Mri ThisComponent Mri の引数はオプションです。引数を与えずに呼び出したときには OOo Basic のランタイム関数 StarDesktop を利用してデスクトップオブジェクトを引数として MRI を起動します。 Mri ' Mri を最初に呼び出す前に MRILib ライブラリを読み込んでおく必要があります。 Globalscope.BasicLibraries.LoadLibrary("MRILib") また、Mri サブルーチンを利用せずに一般的に MRI を実行するには次のようにします。 oMRI = CreateUnoService("mytools.Mri") oMRI.inspect(ThisComponent) #xhppara(note){{ プログラムのコントロールは Mri サブルーチンが実行された後に戻ってきます。そのため、ターゲットのオブジェクトをよく調べたいときや一時的に作成されたオブジェクトのときには Basic IDE のデバッガのブレークポイントを利用する必要があります。 }} #xhppara(note){{ MRI に渡したターゲットが開かれているドキュメントの一部の時には Basic のコードが終了した後にもターゲットは生きているため、引き続き MRI で情報を取得できます }} ***BeanShell から利用 [#p8778a33] This is an example of how to use MRI from BeanShell macros. import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.beans.XIntrospection; //import com.sun.star.beans.XIntrospectionAccess; XComponentContext xContext = XSCRIPTCONTEXT.getComponentContext(); XMultiComponentFactory xMCF = xContext.getServiceManager(); try { oMRI = xMCF.createInstanceWithContext( "mytools.Mri", xContext ); } catch (com.sun.star.uno.Exception e) { System.out.println( e.Message ); } XIntrospection xIntrospection = (XIntrospection) UnoRuntime.queryInterface( XIntrospection.class, oMRI ); Object oDoc = XSCRIPTCONTEXT.getDocument(); Object oIAccess= xIntrospection.inspect(oDoc); *** JavaScript から利用 [#uddad561] 下記の例では JavaScript のマクロから MRI を利用します。 importClass(Packages.com.sun.star.uno.UnoRuntime); importClass(Packages.com.sun.star.beans.XIntrospection); oDoc = XSCRIPTCONTEXT.getDocument(); xContext = XSCRIPTCONTEXT.getComponentContext(); xMCF = xContext.getServiceManager(); oMRI = xMCF.createInstanceWithContext("mytools.Mri", xContext); xIntrospection = UnoRuntime.queryInterface(XIntrospection, oMRI); xIntrospection.inspect(oDoc); ***Java から利用 [#kfb08d72] BeanShell と同じようにします。 import com.sun.star.beans.XIntrospection; try { Object oMRI = xMultComponentFactory.createInstanceWithContext( "mytools.Mri", xContext ); XIntrospection xIntrospection = (XIntrospection) UnoRuntime.queryInterface( XIntrospection.class, oMRI); xIntrospection.inspect(oShape); } catch (com.sun.star.uno.Exception e) { System.err.println(); } ***Python [#s55e807d] Python マクロから MRI を利用する方法です。 def Mri_test(): ctx = XSCRIPTCONTEXT.getComponentContext() document = XSCRIPTCONTEXT.getDocument() mri(ctx,document) def mri(ctx, target): mri = ctx.ServiceManager.createInstanceWithContext( "mytools.Mri",ctx) mri.inspect(target) Python-UNO ブリッジからも次のようにして利用できます。 import uno def connect(): try: localctx = uno.getComponentContext() resolver = localctx.ServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver",localctx) ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") except: return None return ctx def mri(ctx, target): mri = ctx.ServiceManager.createInstanceWithContext( "mytools.Mri",ctx) mri.inspect(target) if __name__=="__main__": ctx = connect() if ctx == None: print "Failed to connect." import sys sys.exit() smgr = ctx.ServiceManager desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx) model = desktop.loadComponentFromURL("private:factory/scalc","_default",0,()) mri(ctx,model) ctx.ServiceManager ***VB Script [#dc1cbfb6] MRI は VB Script からも利用できます。 Set oSM = WScript.CreateObject("com.sun.star.ServiceManager") Set oDesktop = oSM.createInstance("com.sun.star.frame.Desktop") Dim aArgs() Set oDoc = oDesktop.loadComponentFromURL("private:factory/scalc","_blank",0,aArgs) Set oMRI = oSM.createInstance("mytools.Mri") oMRI.inspect(oDoc) *** ooRexx [#v2c45e2e] ooRexx (with Vienna BSF4Rexx). /* */ xScriptContext = uno.getScriptContext() xContext = xScriptContext~getComponentContext() xServiceManager = xContext~getServiceManager() oDoc = xScriptContext~getDocument oMRI = xServiceManager~createInstanceWithContext("mytools.Mri", xContext) oMRI~XIntrospection~inspect(oDoc) ::requires UNO.CLS **アドオンメニューからの起動 [#abb51cac] MRI はメニューからも利用できます。MRI をインストールすると、ツール - アドオンメニューに MRI のメニューが追加されます。 "MRI" メニューは現在のドキュメントを OOo Basic で書くと次のようなオブジェクトをターゲットとして実行します。 oDesktop = CreateUnoService("com.sun.star.frame.Desktop") oTarget = oDesktop.getCurrentComponent() Mri oTarget ***Add-Ons メニューから選択範囲と [#y9c080af] メニューからツール - アドオン - "MRI <- selection" を選択すると現在のドキュメントの選択オブジェクトをターゲットオブジェクトとして MRI ウィンドウを開きます。 OOo Basic で記述すると次のようになります。 oDesktop = CreateUnoService( "com.sun.star.frame.Desktop" ) oTarget = oDesktop.CurrentComponent.getCurrentSelection() Mri oTarget ' using Mri subroutine of the MRILib 'or oMri = CreateUnoService("mytools.Mri") oMri.inspect(oTarget) #xhppara(tip){{ このメニューを利用してドキュメント上の選択できるオブジェクトの情報を簡単に取得できます。たとえば Writer ではテキスト、テキストオブジェクトなど、Calc ではセルやセル範囲や図形描写オブジェクトなどです。 }} #xhppara(note){{ 図形描写オブジェクトを選択して選択範囲をターゲットとして MRI を呼び出すと図形描写オブジェクトは com.sun.star.drawing.SvxShapeCollection サービスにまとめられています。そのときには、getByIndex メソッドにより取得したいオブジェクトを取得します。そのほかの選択可能なオブジェクトは同様に振舞います。 }} ***独自のメニュー項目の作成 [#c5e66846] MRI のメニュー項目を追加、またはツールバーボタンへ追加したいときには次の URL を使用してください。 service:mytools.Mri?current "current" 引数が与えられると MRI はターゲットとして Desktop から CurrentComponent を取得します。 Desktop の CurrentComponent から選択オブジェクトをターゲットとするときは次の URL を使用します。 service:mytools.Mri?selection **コマンドラインから起動 [#w9f393d4] ターミナルなどコマンドラインから起動するには次のようにします。 >soffice service:mytools.Mri?none |