Ermittlung der aktuellen Seitenvorlage

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

jwinkl
Beiträge: 8
Registriert: Mo, 03.09.2012 11:31

Ermittlung der aktuellen Seitenvorlage

Beitrag von jwinkl »

Hallo,

ich versuche, ein Makro zu erstellen, bei dem ein Textrahmen bei geraden Seiten links, bei ungeraden rechts an den Seitenrand gesetzt werden soll. Dies entspricht - setzt man den Rahmen in OO über das Menü Einfügen->Rahmen - der Wahl "auf geraden Seiten spiegeln" und "Horizontal: innen, relativ zu Seitenrand außen".

Nun gibt's offenbar bei den möglichen Werten von com.sun.star.text.RelOrientation nur PAGE_FRAME_LEFT oder PAGE_FRAME_RIGHT, aber nicht PAGE_FRAME_OUTSIDE. Ich muss also diesen Wert abhängig davon machen, ob die aktuelle Seitenvorlage "Linke Seite" oder "Rechte Seite" ist.

Da ich dazu leider keine Informationen finden kann, bitte ich, mir solche zukommen zu lassen.

Herzlichen Dank im Voraus!
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ermittlung der aktuellen Seitenvorlage

Beitrag von komma4 »

Willkommen im Forum.

Setzt Du den (sichtbaren) Cursor auf die Seite:

Code: Alles auswählen

 oCurrentController = ThisComponent.getCurrentController()
 oViewCursor = oCurrentController.getViewCursor()
 sPageStyleName = oViewCursor.PageStyleName
Hilft Dir das weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
jwinkl
Beiträge: 8
Registriert: Mo, 03.09.2012 11:31

Re: Ermittlung der aktuellen Seitenvorlage

Beitrag von jwinkl »

Ja, danke, das hilft mir zunächst sehr viel weiter.

Ich versuch's jetzt mit der Verzweigung.
jwinkl
Beiträge: 8
Registriert: Mo, 03.09.2012 11:31

Re: Ermittlung der aktuellen Seitenvorlage

Beitrag von jwinkl »

Ja, danke vielmals, es hat alles geklappt. Warum allerdings der Frame immer am Anfang des Absatzes bleibt, auch wenn sich das Zeichen, an dem er verankert ist, durch Texteinfügungen davor in der Zeile verschiebt, ist mir unklar. Eigentlich sollte der Rahmen in der Zeile stehen, in der sich dieses Zeichen befindet. Wenn jemand hier eine Erklärung bzw. Lösung weiß, wäre ich dankbar.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: AW: Ermittlung der aktuellen Seitenvorlage

Beitrag von komma4 »

Zeig' mal Code, dann können wir vielleicht was dazu sagen...
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
jwinkl
Beiträge: 8
Registriert: Mo, 03.09.2012 11:31

Re: Ermittlung der aktuellen Seitenvorlage

Beitrag von jwinkl »

OK, hier ist er. Es ist allerdings mein erster Versuch in OOBasic, und Java kapier' ich schon gar nicht.

Code: Alles auswählen

sub Marginale
    Dim Doc As Object
    Dim TextTables As Object
    Dim Cursor As Object
    Dim Frame As Object
    Dim FrameCursor As Object
    Doc = StarDesktop.CurrentComponent
    oCurrentController = ThisComponent.getCurrentController()
    oViewCursor = oCurrentController.getViewCursor()
    Frame = ThisComponent.createInstance("com.sun.star.text.TextFrame")
    oBorder = Frame.BottomBorder
    With oBorder
      .Color = 0
      .InnerLineWidth = 0
      .OuterLineWidth = 0
      .LineDistance = 0
    End With
    With Frame
      .BottomBorder = oBorder
      .TopBorder = oBorder
      .RightBorder = oBorder
      .LeftBorder = oBorder
    End With
    Frame.Width = 2000
    Frame.Height = 500
    Frame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_CHARACTER
    Frame.TopMargin = 0
    Frame.BottomMargin = 0
    Frame.LeftMargin = 0
    Frame.RightMargin = 0
    Frame.BorderDistance = 0
    Frame.IsFollowingTextFlow = True
    sPageStyleName = oViewCursor.PageStyleName
    if sPageStyleName = "Right Page" then 
      Frame.HoriOrientRelation = com.sun.star.text.RelOrientation.FRAME_RIGHT
      Frame.HoriOrient = com.sun.star.text.HoriOrientation.LEFT
    else 
      Frame.HoriOrientRelation = com.sun.star.text.RelOrientation.FRAME_LEFT
    Frame.HoriOrient = com.sun.star.text.HoriOrientation.RIGHT
    endif  
    Frame.VertOrient = com.sun.star.text.VertOrientation.LINE_BOTTOM
    ThisComponent.Text.insertTextContent(oViewCursor, Frame, False)
    FrameCursor = Frame.CreateTextCursor()
    if sPageStyleName = "Right Page" then 
      FrameCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
    else
      FrameCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.LEFT
    endif
    FrameCursor.charFontName = "Arial"
    FrameCursor.charHeight = 10 
    FrameCursor.String = oViewCursor.String
    oViewCursor.String = ""
end sub
Ziel ist, den markierten Text gewissermaßen als Randbemerkung auf die Seite zu bringen, und zwar in genau der Zeile, in der er (zunächst) im Text steht.
jwinkl
Beiträge: 8
Registriert: Mo, 03.09.2012 11:31

Re: Ermittlung der aktuellen Seitenvorlage

Beitrag von jwinkl »

Ich habe jetzt das Makro soweit fertig, dass es das tut, was ich von ihm erwarte.
Hier der Code:

Code: Alles auswählen

sub Marginale

' Aufgabe: Der markierte Text wird als Randnotiz an den Seitenrand ausgelagert
' und im fließenden Text gelöscht.

    Dim Doc As Object
    Dim TextTables As Object
    Dim Cursor As Object
    Dim Frame As Object
    Dim FrameCursor As Object
    Doc = StarDesktop.CurrentComponent
    oCurrentController = ThisComponent.getCurrentController()
    oViewCursor = oCurrentController.getViewCursor()
    Frame = ThisComponent.createInstance("com.sun.star.text.TextFrame")
    
' Der Rahmen soll ohne Umrandung dargestellt werden
    oBorder = Frame.BottomBorder
    With oBorder
      .Color = 0
      .InnerLineWidth = 0
      .OuterLineWidth = 0
      .LineDistance = 0
    End With
    With Frame
      .BottomBorder = oBorder
      .TopBorder = oBorder
      .RightBorder = oBorder
      .LeftBorder = oBorder
    End With

    With Frame
    
' Rahmen (20x5 mm) wird initialisiert und an der aktuellen Selection verankert 
      .Width = 2000
      .Height = 500
      .AnchorType = com.sun.star.text.TextContentAnchorType.AT_CHARACTER
      .TopMargin = 0
      .BottomMargin = 0
      .LeftMargin = 0
      .RightMargin = 0
      .BorderDistance = 0
      
' Rahmen soll im Falle von Umformatierungen mit verschoben werden
      .IsFollowingTextFlow = True
      
' Auf rechten Seiten soll der Randtext am rechten Seitenrand rechtsbündig,
' auf linken Seiten am linken Seitenrand linksbündig dargestellt werden
      sPageStyleName = oViewCursor.PageStyleName
      if sPageStyleName = "Right Page" then
        sHoriOrientRelation = com.sun.star.text.RelOrientation.FRAME_RIGHT
        sHoriOrient = com.sun.star.text.HoriOrientation.LEFT
        sParaAdjust = com.sun.star.style.ParagraphAdjust.RIGHT  
      else 
        sHoriOrientRelation = com.sun.star.text.RelOrientation.FRAME_LEFT
        sHoriOrient = com.sun.star.text.HoriOrientation.RIGHT
        sParaAdjust = com.sun.star.style.ParagraphAdjust.LEFT  
      endif      
      .HoriOrientRelation = sHoriOrientRelation
      .HoriOrient = sHoriOrient
      
' Bei vertikaler Orientierung relativ zum Ankerzeichen bleibt der Rahmen
' auf Höhe der Zeile des Ankerzeichens  
      .VertOrient = com.sun.star.text.VertOrientation.NONE
      .VertOrientRelation = com.sun.star.text.RelOrientation.CHAR
      .VertOrientPosition = 450
    End With

' Der Rahmen wird jetzt eingefügt     
    ThisComponent.Text.insertTextContent(oViewCursor, Frame, False)

' Dem Rahmentext wird eine als existent vorausgesetzte Absatzvorlage
' "Marginale" zugewiesen; über diese lässt sich dann die genaue Jusiterung
' des Rahmens steuern
    FrameCursor = Frame.CreateTextCursor()
    With FrameCursor
      .paraStyleName = "Marginale"
      
' Der selektierte Text wird in den Rahmen kopiert und im Text selbst gelöscht.
' Dadurch wird automatisch das folgende Zeichen zum Anker. 
      .String = oViewCursor.String
      .paraAdjust = sParaAdjust
    End With
    oViewCursor.String = ""
end sub
Vielen Dank nochmals!
Antworten