DocumentEventListener problem

Piet van Oostrum piet at vanoostrum.org
Sun Apr 12 13:53:42 PDT 2015


I am trying to program a Global DocumentEventListener in Python.
Then on a certain event (e.g. File Open), I want to analyse/print the paragraph structure of the document.

I am running LibreOffice on port 2002. I am using the internal Python from LibreOffice, but I run the script externally, from a Terminal.

This is on Mac OS X 10.10, and LO 4.4.2.2.

The listener works and gives output until I start an Enumeration, for example enumerating the paragraphs. After the first element LO hangs completely, and the only way out is to kill it. I have tried also with enumerationg the TextFields in the document and it also hangs.

So I am wondering if I do something illegal or unsupported, or that I have hit a bug.

LO is started with:
/Applications/LibreOffice.app/Contents/MacOS/soffice --accept='socket,host=localhost,port=2002;urp;StarOffice.Servicemanager' --nologo --nodefault

Here is the relevant code. During the processing I disable the listener to prevent some recursive calling, but in fact that doesn't make a difference.

import uno
import unohelper

from com.sun.star.document import XDocumentEventListener
import PYUNO.DemoBase as DemoBase 

listener = None
globalBroadcaster =  None

class MyEventListener(XDocumentEventListener, unohelper.Base):
    # XDocumentEventListener
    def documentEventOccured(self, event):
        globalBroadcaster.removeDocumentEventListener(self)
        print("Event name: {}".format(event.EventName))
        if event.EventName == "OnLoadFinished":
            doc = event.Source
            print("Document: Title: {} Location: {}".format(doc.Title, doc.Location))
            showportions(doc)
        globalBroadcaster.addDocumentEventListener(self)

    # parent-interface XDocumentEventListener
    def disposing(self, event):
        pass

def showportions(doc):
    if doc.supportsService("com.sun.star.text.TextDocument"):
        parenum = doc.Text.createEnumeration()
        while parenum.hasMoreElements():
            para = parenum.nextElement()
            print("get para: {}".format(para.String))

and in main (after setting up the connection):

    global globalBroadcaster
    context = XSCRIPTCONTEXT.getComponentContext()
    globalBroadcaster = context.getValueByName(
        '/singletons/com.sun.star.frame.theGlobalEventBroadcaster')
    listener = MyEventListener()
    globalBroadcaster.addDocumentEventListener(listener)

And here is the output when I open a Writer document:

Event name: OnPrepareViewClosing
Event name: OnPrepareUnload
Event name: OnViewClosed
Event name: OnUnload
Event name: OnUnfocus
Event name: OnFocus
Event name: OnLoadFinished
Document: Title: Letter.odt Location: file:///Users/piet/TEST/LibreOffice/Letter.odt
get para: To:

The first paragraph gets printed, then it hangs.
-- 
Piet van Oostrum <piet at vanoostrum.org>
WWW: http://pietvanoostrum.com/
PGP key: [8DAE142BE17999C4]


More information about the LibreOffice mailing list