-
Notifications
You must be signed in to change notification settings - Fork 7
RunMRI_ja
MRI はどんな言語から実行できます。また、アドオンメニューからも実行できます。
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 のインスタンス作成時にインスペクトできます。ターゲットオブジェクトを引数の配列の最初に与えてください。
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 で情報を取得できます
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);
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);
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(); }
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
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 (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