如何检查书签是否包含表格?

时间:2016-05-30 11:56:34

标签: java openoffice-writer uno

是否可以确定Bookmark何时包含TextTable?我考虑过查看XTextRange个对象,但是,文档没有指定任何有关比较范围的内容。

1 个答案:

答案 0 :(得分:1)

首先从以下代码开始:

XBookmarksSupplier xBookmarksSupplier =
    (XBookmarksSupplier)UnoRuntime.queryInterface(
    XBookmarksSupplier.class, xComponent);
    XNameAccess xNamedBookmarks = xBookmarksSupplier.getBookmarks();
Object bookmark = xNamedBookmarks.getByName("TextAndTable");
XTextContent xBookmarkContent = (XTextContent)UnoRuntime.queryInterface(
    XTextContent.class, bookmark);
XTextRange xTextRange = xBookmarkContent.getAnchor();

听起来您正在询问如何确定是否有一个或多个文本表位于xTextRange指定的范围内。

为此,我通常使用View Cursor。它很慢,但普通的文本光标无法遍历不同的文本对象,因此如果该范围内有文本表或其他对象,它将失败。

这是我的Python类,也许你可以适应Java:

def differentPlaces(oCurs1, oCurs2):
    """Test using compareRegion to see if two cursors are in different places.
    If compareRegion fails, such as after a nested table, return False.
    """
    try:
        oText = oCurs1.getText()
        return oText.compareRegionEnds(oCurs1, oCurs2) != 0
    except IllegalArgumentException:
        logger.info("Could not compare region.")
        return False

class RangeCompare:
    """Compare the viewcursor to a text range (a location).
    Can be useful when traversing a cursor over a range.
    The range is expected not to be modified.
    """
    def __init__(self, rangeEnd, viewCursor):
        self.oVC = viewCursor
        self.rangeEnd = rangeEnd
        self.endX = -1
        self.endY = -1

    def getCoords(self):
        if self.endY > -1:
            return
        # remember where we were, because we'll need to use the viewcursor
        originalVC = self.oVC.getText().createTextCursorByRange(self.oVC)

        self.oVC.gotoRange(self.rangeEnd, False)
        self.endX = self.oVC.getPosition().X
        self.endY = self.oVC.getPosition().Y

        self.oVC.gotoRange(originalVC, False)

    def compareVC(self):
        """Compare the viewcursor to the range.
        Assume we are travelling with the viewcursor.
        See if it is up to the end yet or not.
        The comparison is done by checking the physical position of the cursor.
        Returns -1 if the VC location is less than self.rangeEnd, 0 if it is
        the same, and 1 if it is greater.
        Returns -2 if they are on the same line but not in the same spot, and
        it's not certain which location is greater.
        """
        self.getCoords()
        curX = self.oVC.getPosition().X
        curY = self.oVC.getPosition().Y
        if curY < self.endY:
            logger.debug("%d < %d", curY, self.endY)
            return -1
        elif curY > self.endY:
            logger.debug("%d > %d", curY, self.endY)
            return 1
        elif curY == self.endY:
            if curX == self.endX:
                if differentPlaces(self.oVC, self.rangeEnd):
                    # There is probably a word-final diacritic that doesn't
                    # change the position, so we're not to the end yet.
                    logger.debug("Including word-final diacritic.")
                    return -2
                # We're at the end.
                logger.debug(
                    "VC same loc as text range (%d, %d).", curX, curY)
                return 0
            else:
                logger.debug("Probably haven't gone far enough.")
                return -2

使用rangeCompare = RangeCompare(xTextRange.getEnd(), xViewCursor)

等实例化类

将视图光标移动到xTextRange的开头。然后继续调用xViewCursor.goRight(1, False)循环。每次都检查光标是否位于TextTable中。在rangeCompare.compareVC() > 0时停止。