Skip to content
hanya edited this page Jun 15, 2013 · 1 revision

MRI はどんな言語から実行できます。また、アドオンメニューからも実行できます。

Table of Contents

アドオンメニューからの起動

MRI はアドオンメニューから実行できます。ツール - アドオン - MRI を選択してください。 この項目を選択すると、MRI は com.sun.star.frame.Desktop サービスの com.sun.star.frame.XDesktop インターフェースの getCurrentComponent メソッドの帰り値をターゲットとして起動します。

この場合、MRI は現在のドキュメントをターゲットとして実行されます。OpenOffice.org Basic では次のように書けます。

    oTarget = StarDesktop.getCurrentComponent()
    Mri oTarget

oTarget は ThisComponent 関数の帰り値と同じかもしれません。

アドオンメニューから選択範囲をターゲットとして起動

ツール - アドオン - MRI <- selection を選択すると、 現在のドキュメントで選択されているオブジェクトをターゲットとして MRI が起動します。 OOo Basic では次のように書けます。

 oTarget = StarDesktop.getCurrentComponent().getCurrentSelection()
 Mri oTarget

言語から利用

あなたが利用している言語から 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 メソッドに渡しても正しく動作しません。

 com.sun.star.beans.XIntrospectionAccess inspect( [in] any aObject )

MRI 0.8.0 から css.lanag.XSingleComponentFactory インターフェースの createInstanceWithArgumentsAndContext メソッドによるインスタンス化をサポートしています。inspect メソッドを呼ばなくても MRI のインスタンス作成時にインスペクトできます。ターゲットオブジェクトを引数の配列の最初に与えてください。

OpenOffice.org Basic

OOo Basic 用に MRILib ライブラリが付属しています。MRILib ライブラリにある Mri サブルーチンを利用すると、OOo Basic から次のように簡単に MRI を利用できます。

 Mri ThisComponent

Mri の引数はオプションです。引数を与えずに呼び出したときには OOo Basic のランタイム関数 StarDesktop を利用してデスクトップオブジェクトを引数として MRI を起動します。

 Mri  ' StarDesktop が渡されます。

Mri を最初に呼び出す前に MRILib ライブラリを読み込んでおく必要があります。

 Globalscope.BasicLibraries.LoadLibrary( "MRILib" )

また、Mri サブルーチンを利用せずに一般的に MRI を実行するには次のようにします。

 oMRI = CreateUnoService( "mytools.Mri" )
 oMRI.inspect( MriTargetObject )

または、次のようにします。

 CreateUnoServiceWithArguments( "mytools.Mri", Array( MriTargetObject ) )

プログラムのコントロールは Mri サブルーチンが実行された後に戻ってきます。そのため、ターゲットのオブジェクトをよく調べたいときや一時的に作成されたオブジェクトのときには Basic IDE のデバッガのブレークポイントを利用する必要があります。

MRI に渡したターゲットが開かれているドキュメントの一部の時には Basic のコードが終了した後にもターゲットは生きているため、引き続き MRI で情報を取得できます

BeanShell

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

This code is an example to run MRI from Javascript macro.

 oDoc = XSCRIPTCONTEXT.getDocument();
 
 xContext = XSCRIPTCONTEXT.getComponentContext();
 xMCF = xContext.getServiceManager();
 oMRI = xMCF.createInstanceWithContext("mytools.Mri", xContext);
 xIntrospection = UnoRuntime.queryInterface(XIntrospection, oMRI);
 xIntrospection.inspect(oDoc);

Java

 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

This example shows how to use MRI from Python macro.

    mri(ctx,document)
 
 def mri(ctx, target):
    mri = ctx.ServiceManager.createInstanceWithContext(
        "mytools.Mri",ctx)
    mri.inspect(target)

And you can also use MRI through Python-bridge.

 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

MRI easily can be run from automation.

 Dim aArgs() 
 Set oDoc = oDesktop.loadComponentFromURL("private:factory/scalc","_blank",0,aArgs)
 
 Set oMRI = oSM.createInstance("mytools.Mri") 
 oMRI.inspect(oDoc)

ooRexx

ooRexx (with Vienna BSF4Rexx).

 oDoc = xScriptContext~getDocument
 
 oMRI = xServiceManager~createInstanceWithContext("mytools.Mri", xContext)
 oMRI~XIntrospection~inspect(oDoc)
 
 ::requires UNO.CLS

独自のメニュー項目の作成

MRI のメニュー項目を追加、またはツールバーボタンへ追加したいときには次の URL を使用してください。

   service:mytools.Mri?current

"current" 引数が与えられると MRI はターゲットとして Desktop から CurrentComponent を取得します。 Desktop の CurrentComponent から選択オブジェクトをターゲットとするときは次の URL を使用します。

   service:mytools.Mri?selection
Clone this wiki locally