Seite 1 von 1

Writer - Text/Tasteneingabe & Cursor ohne Dispatcher

Verfasst: Fr 24. Feb 2012, 20:55
von Eric March
Hallo!

Aktuell teste ich LO 3.5. Und offenbar wird im Gegensatz zu 3.4 Dispatchercode wieder ohne Murren ausgeführt (was mir bei meinem Einklebeproblem wenigstens eine kleine Sorge nimmt).

Trotzdem würde ich gerne ohne den Dispatcher auskommen wo immer das geht. Unter Rückgriff auf eine vorige Anfrage und den Recorder entstand dieser Code:

Code: Alles auswählen

Public Sub SpeichernUndPOS1
Dim MeinViewCursor As Object
Dim Dokument As Object
Dim Rahmen As Object
Dim StatusIndikator as Object
  Dim Dokument2 As Object
  Dim DisPatcher As Object
  Dim Argument(1) As New com.sun.star.beans.PropertyValue

 Dokument = ThisComponent
 Rahmen = StarDesktop.GetCurrentFrame()
 StatusIndikator = Rahmen.CreateStatusIndicator()
   Dokument2 = ThisComponent.CurrentController.Frame
   DisPatcher = CreateUnoService("com.sun.star.frame.DispatchHelper")
 
 StatusIndikator.End()
 StatusIndikator.Start("Lesezeichen sichern", 10)
 StatusIndikator.SetValue(10)
 MeinViewCursor = Dokument.GetCurrentController.ViewCursor
 MeinViewCursor.GotoStartOfLine(0,False)
 MeinViewCursor.String=" "
 MeinViewCursor.String=""

   Argument(0).Name = "Count"
   Argument(0).Value = 1
   Argument(1).Name = "Select"
   Argument(1).Value = False
   DisPatcher.ExecuteDispatch(Dokument2, ".uno:GoRight", "", 0, Argument())
   DisPatcher.ExecuteDispatch(Dokument2, ".uno:Escape", "", 0, Array())
   DisPatcher.ExecuteDispatch(Dokument2, ".uno:GoLeft", "", 0, Argument())

 Dokument.Store(1)
 StatusIndikator.End()
 StatusIndikator.Start("", 0)
 StatusIndikator.End()
End Sub
Die Idee dahinter ist auszunutzen, dass LO beim Öffnen an der letzten Speicherposition in ein Dokument wieder einsteigt. Also ändere ich dort wo ich bin etwas und speichere dann. Gerne hätte ich fürs Scrollen den Cursor vorne in der Zeile (also links am Rand).
Mit MeinViewCursor gehe ich nach links an den Zeilenbeginn, füge ein Leerzeichen ein und nehme das zurück (die gewollte Änderung). Die Manipulation per StatusIndikator (nochmals danke für die Hilfe) ist etwas fürs Auge während eines länger dauernden Abspeicherns.

Leider tut MeinViewCursor nicht genau so wie ich will. Es wirkt, als bliebe dort die Shift-Taste gedrückt - Cursorbewgungen oder Mausklicks markieren den Text satt nur den Cursor zu bewegen. Da ESC das auflöst wollte ich ESC tippen lassen. Der Dispatchercode tut das - und doch war es erforderlich extra, wieder per Dispatcher aus u.g. Gründen, den Cursor zu bewegen. ESC allein genügt so wenig wie 1x Cursor-rechts + 1x Cursor-links.

Damit ergeben sich 2 Fragen:
• Kann ich die letztlich abgebildeten Schritte Pos1 - Leerzeichen - Backspace (- Speichern) auf andere Weise verwirklichen, ohne Dispatcher und besonders ohne die Klimmzüge den Cursor wieder zu befreien?
• Für andere Fälle und Gelegenheiten - wie kann ich ohne den Dispatcher mit dem Cursor unfallfrei navigieren (der ViewCursor hat ja offenbar Nebenwirkungen; Versuche das mit dem TextCursor zu entwirren scheiterten; mein Fehler?) und auch Tasten wie ESC, Backspace sowie normale Zeichen quasi tippen zu lassen?

Eric March

Re: Writer - Text/Tasteneingabe & Cursor ohne Dispatcher

Verfasst: Mo 27. Feb 2012, 21:03
von F3K Total
Hallo,
ich habe da folgende Idee, Du setzt an die Stelle wo sich der Cursor befindet beim Ereignis "Dokument sichern" eine Textmarke:

Code: Alles auswählen

sub S_insert_Bookmark
odoc = thiscomponent
oBookMarks = odoc.bookmarks
if oBookMarks.hasByName("last_exit_position") then
oBookmark = oBookMarks.getbyname("last_exit_position")
odoc.text.removeTextContent(oBookMark)
endif
oviewcursor = odoc.currentcontroller.viewcursor
oBookMark = oDoc.createinstance("com.sun.star.text.Bookmark")
oBookMark.Name = "last_exit_position"
oDoc.text.insertTextContent(oviewcursor, oBookMark, true)
end Sub
und springst beim Ereignis "Ansicht wurde erzeugt" wieder dahin:

Code: Alles auswählen

sub S_goto_bookmark
odoc = thiscomponent
oBookMarks = odoc.bookmarks
oBookmark = oBookMarks.getbyname("last_exit_position")
oAnchor = oBookMark.getAnchor
oviewcursor = odoc.currentcontroller.viewcursor
oviewcursor.gotoRange(oAnchor,false)
end sub
Gruß R