2013-07-14 18 views
34

In un'estensione UNO per OpenOffice/LibreOffice Calc (foglio di calcolo), scritto in Java, come è possibile determinare la cella chiamante all'interno dell'implementazione di una UDF (funzione foglio di calcolo)?OOo/LibreOffice UNO/Java: come ottenere chiamando la cella del foglio di calcolo di una funzione di calcolo?

Osservazioni

  • In Excel/VBA questo è possibile tramite Application.Caller
  • La motivazione principale per ottenere il chiamante sta registrando/tracciabilità/debugging, vale a dire, vedere la cella telefonica all'interno di una pila traccia.
  • Dovrebbe essere possibile ottenere queste informazioni, poiché le funzioni incorporate come "ROW()" e "COLUMN()" hanno una certa conoscenza della cella chiamante.
  • Un'applicazione in cui viene utilizzata questa possibilità (per Excel) è Obba, un gestore di oggetti per fogli di calcolo. Qui il "pannello di controllo" fornisce un elenco di eccezioni (Java) inclusa la cella chiamante, , ovvero, la cella fa parte della traccia dello stack. Vedere la seguente schermata:

Obba Control Panel showing exceptions by spreadsheet cell of calling function

Questa è anche una richiesta di funzionalità sul Apache OpenOffice Bugzilla

+5

Provate a chiedere su un canale irc libreoffice, alcuni sviluppatori attivi si siedono lì e immagino sia molto più possibile che otterrete la vostra risposta lì. –

risposta

1

Sembra che si desidera registrare un ascoltatore a un componente foglio di calcolo. Per soddisfare il tuo obiettivo, puoi aggiungere il listener all'oggetto foglio di calcolo stesso o a un altro oggetto nidificato che implementa un'interfaccia che supporta un metodo add. + EventListener().

Qui di seguito è una coppia (emittenti/ascoltatore) che mi viene in mente che si potrebbe utilizzare nel progetto: XDocumentEventBroadcaster/XDocumentEventListener

Il modello di eventi UNO viene qui spiegato: https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model

Qui di seguito sono esempi di come questi ascoltatori sono usati.

//////////////////////////////////////////////////////////////////// 
    // 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) { } 
    }); 

Inoltre, il servizio SheetCellRange supporta l'interfaccia XModifyBroadcaster. Forse potresti ottenere il comportamento desiderato se hai registrato un oggetto XModifyListener su di esso. L'oggetto implementerebbe il metodo 'modificato', che riceve un EventObject quando viene chiamato. Credo che tu possa ottenere chi è il chiamante dalla proprietà source di EventObject. Se la sorgente risulta essere l'intero SheetCellRange, puoi provare a scorrere tutte le celle che desideri vengano monitorate e aggiungere un XModifyListener a ciascuna. Il servizio SheetCell supporta anche l'interfaccia XModifyBroadcaster.

Esempio di utilizzo della XModifyBroadcaster da un CellRange: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

Cheers!

+0

Ho già utilizzato listener di eventi, ma non vedo come posso usarli per ottenere la cella di chiamata. Puoi spiegare come si può fare? –

+0

Metti le mie idee sulla tua domanda su una modifica di risposta. :) –

Problemi correlati