MRI の起動の仕方 Edit

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

言語から利用 Edit

あなたが利用したい言語から 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 Edit

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)

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

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

BeanShell から利用 Edit

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 から利用 Edit

下記の例では 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 から利用 Edit

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 Edit

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 Edit

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 Edit

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

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

MRI はメニューからも利用できます。MRI をインストールすると、ツール - アドオンメニューに MRI のメニューが追加されます。

"MRI" メニューは現在のドキュメントを OOo Basic で書くと次のようなオブジェクトをターゲットとして実行します。

oDesktop = CreateUnoService("com.sun.star.frame.Desktop")
oTarget = oDesktop.getCurrentComponent()
Mri oTarget

Add-Ons メニューから選択範囲と Edit

メニューからツール - アドオン - "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)

このメニューを利用してドキュメント上の選択できるオブジェクトの情報を簡単に取得できます。たとえば Writer ではテキスト、テキストオブジェクトなど、Calc ではセルやセル範囲や図形描写オブジェクトなどです。

図形描写オブジェクトを選択して選択範囲をターゲットとして MRI を呼び出すと図形描写オブジェクトは com.sun.star.drawing.SvxShapeCollection サービスにまとめられています。そのときには、getByIndex メソッドにより取得したいオブジェクトを取得します。そのほかの選択可能なオブジェクトは同様に振舞います。

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

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

service:mytools.Mri?current

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

service:mytools.Mri?selection

コマンドラインから起動 Edit

ターミナルなどコマンドラインから起動するには次のようにします。

>soffice service:mytools.Mri?none

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