2016-05-30 26 views
0

Ist es möglich zu bestimmen, wann ein Bookmark einen TextTable enthält? Ich dachte über Objekte XTextRange nach, aber die Dokumentation gibt nichts über das Vergleichen von Bereichen an.Wie überprüft man, ob ein Lesezeichen eine Tabelle enthält?

+0

Fragen Sie nur, ob das Lesezeichen innerhalb * einer TextTabelle liegt? Das wäre leicht zu bestimmen. Ich nehme in meiner Antwort unten an, dass du * contains * meinst, wie es in der Frage heißt, und dass das Lesezeichen sich über eine Reihe von Texten und nicht nur über einen einzelnen Ort erstreckt. –

+0

Nein, ich frage nach einer ** Tabelle ** innerhalb eines ** Lesezeichens **. – soon

Antwort

1

mit dem folgenden Code So starten:

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(); 

Es klingt wie Sie, wie Sie fragen, ob es eine oder mehrere Texttabellen sind, die innerhalb des Bereichs von xTextRange angegeben befinden.

Um dies zu tun, verwende ich normalerweise View Cursor. Es ist langsam, aber ein normaler Textcursor ist nicht in der Lage, verschiedene Textobjekte zu durchlaufen, so dass es fehlschlägt, wenn Texttabellen oder andere Objekte innerhalb des Bereichs liegen.

Hier ist meine Python-Klasse, die Sie vielleicht auf Java anpassen können:

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 

die Klasse mit so etwas wie rangeCompare = RangeCompare(xTextRange.getEnd(), xViewCursor) instanziiert.

Bewegen Sie den View-Cursor an den Anfang von xTextRange. Rufen Sie dann weiter xViewCursor.goRight(1, False) in einer Schleife. Überprüfen Sie jedes Mal, ob sich der Cursor in einer TextTable befindet. Stoppen Sie, wenn rangeCompare.compareVC() > 0.

+0

Vielen Dank für die Antwort, ich werde es überprüfen, sobald ich kann – soon

Verwandte Themen