34

Java で書かれた OpenOffice/LibreOffice Calc (スプレッドシート) の UNO 拡張では、UDF (スプレッドシート関数) の実装内の呼び出しセルをどのように判断できますか?

備考

  • Excel/VBA では、これはApplication.Caller
  • 呼び出し元を取得する主な動機は、ログ/トレース/デバッグです。つまり、呼び出しセルをスタック トレースの一部として表示します。
  • "ROW()" や "COLUMN()" などの組み込み関数は、呼び出し元のセルをある程度認識しているため、この情報を取得できるはずです。
  • この可能性が使用されるアプリケーション (Excel 用) は、スプレッドシートのオブジェクト ハンドラーであるObbaです。ここで、「コントロール パネル」は、呼び出しセルを含む (Java) 例外のリストを提供します。つまり、セルはスタック トレースの一部です。次のスクリーンショットを参照してください。

呼び出し関数のスプレッドシート セルごとの例外を示す Obba コントロール パネル

これは、 Apache OpenOffice Bugzillaの機能要求でもあります。

4

1 に答える 1

1

表計算コンポーネントにリスナーを登録したいようです。目的を達成するために、リスナーをスプレッドシート オブジェクト自体に追加するか、add.+EventListener() メソッドをサポートするインターフェイスを実装するネストされた別のオブジェクトに追加することができます。

以下は、プロジェクトで使用できると思われるペア (ブロードキャスター/リスナー) です: XDocumentEventBroadcaster / XDocumentEventListener

UNO イベント モデルについては、https ://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model で説明しています。

以下は、これらのリスナーの使用例です。

    //////////////////////////////////////////////////////////////////// 
    // Add document window listeners. 
    //////////////////////////////////////////////////////////////////// 

    System.out.println("WriterDoc: Add window listeners."); 

    // Example of adding a document displose listener so the application 
    // can know if the user manually exits the Writer window. 

    document.addEventListener(new XEventListener() { 
        public void disposing(EventObject e) { 
            System.out.println( 
                    "WriterDoc (Event Listener): The document window is closing."); 
        } 
    }); 

    // Example of adding a window listener so the application can know 
    // when the document becomes initially visible (in the case of this 
    // implementation, we will manually set it visible below after we 
    // finish building it). 

    window.addWindowListener(new XWindowListener() { 
        public void windowShown(com.sun.star.lang.EventObject e) { 
            System.out.println( 
                    "WriterDoc (Window listener): The document window has become visible."); 
        } 
        public void windowHidden(com.sun.star.lang.EventObject e) { } 
        public void disposing(com.sun.star.lang.EventObject e) { } 
        public void windowResized(com.sun.star.awt.WindowEvent e) { } 
        public void windowMoved(com.sun.star.awt.WindowEvent e) { } 
    }); 

また、サービス SheetCellRange はインターフェース XModifyBroadcaster をサポートしています。XModifyListener オブジェクトを登録すると、目的の動作が得られる可能性があります。オブジェクトは、呼び出されたときに EventObject を受け取る「変更された」メソッドを実装します。EventObject の source プロパティから呼び出し元を取得できると思います。ソースが SheetCellRange 全体であることが判明した場合は、監視したいすべてのセルをループして、それぞれに XModifyListener を追加することができます。SheetCell サービスは、XModifyBroadcaster インターフェイスもサポートしています。

CellRange からの XModifyBroadcaster の使用例: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

乾杯!

于 2014-04-09T22:53:18.813 に答える