Archiv des LibreOffice- und OpenOffice.org-Wiki

[ÜberSicht] [TitelIndex] [WortIndex] [SeiteFinden

Motivation

In einer Forums-Diskussion wurde mir bewusst, dass hierarchische TextDokument-Vorlagen nicht automatisch über alle Hierarchiestufen aktualisiert werden, wenn auf einer bestimmten Stufe Änderungen erfolgen. Deshalb habe ich mal versucht, diese Einschränkung per Makro zu überwinden.

Hinweis: Mir ist natürlich klar, dass das Standardverhalten von OpenOffice.org in Bezug auf die Vererbung innerhalb hierarchischer DokumentVorlagen durchaus gute Gründe hat. Gleichwohl kann das Makro nützlich sein für einen User, der "weiß was er will" und die Konsequenzen seines Tuns überblickt.

Hinweise zu dem Makro

Situation

Erstellt man in OpenOffice.org eine Textdokumentvorlage und integriert diese in die Vorlagenverwaltung (VorlagenKatalog) kann man anschließend diese Vorlage als Grundlage einer neuen Vorlage nutzen. Die neue Vorlage basiert dann praktisch auf der ersteren Vorlage.

Dadurch lassen sich komplette Hierarchieketten (auch verzweigt) von DokumentVorlagen erzeugen. Beispiel: Dokumentvorlage_ADokumentvorlage_BDokumentvorlage_CDokumentvorlage_D.

Gibt es in Dokumentvorlage_A nun Änderungen, werden diese auch in die anderen Vorlagen übernommen, was aber nicht automatisch geschieht. Zur Übernahme ist es nötig, die Vorlagen im Bearbeitungsmodus, beginnend von der höchsten Ebene, nacheinander zu öffnen und die Aktualisierungsnachfrage zu bejahen und anschließend zu Speichern.

Gibt es nun ein Dokument, das auf Dokumentvorlage_D basiert, so werden beim Öffnen des Dokuments zwar - auf Nachfrage - Änderungen in der Dokumentvorlage_D übernommen, aber nicht automatisch Änderungen in der Dokumentvorlage_A. Letztere können nur manuell - wie gerade beschrieben - übernommen werden.

Ansatz

Um diese automatische Übernahme aller Änderungen in der Hierarchiekette möglich zu machen, habe ich das untenstehende Makro geschrieben, welches Folgendes tut:

Letzter Punkt ist der Grund, weshalb das Makro nicht in der Dokumentbibliothek sein kann. Sonst könnte man nämlich das ganze Makro in die "Urvorlage" integrieren und beim Erstellen weiterer Vorlagen würde das Makro vererbt und auch die Autostarteigenschaften würden vererbt. Das wäre zwar sehr elegant, geht aber leider nicht, es sei denn, das Makro würde auf das automatische Neuladen des Dokuments verzichten und nur eine Meldung an den Nutzer ausgeben "Bitte laden Sie das Dokument neu". Das fand ich aber nicht so elegant.

Nachteile sind derzeitig noch:

Hinweise

In der Zeile:

wurzel = "C:\Programme\SO7_jms\user\template\jms1.stw"

muss die gewünschte "Urvorlage" angegeben werden und diese muss auch existieren und in die Hirarchie eingebunden sein. Ist diese Angabe nicht korrekt, wird (falls möglich) alles an Vorlagen aktualisiert bis rauf zur Standardvorlage, falls die Hierarchie bis dorthin "lückenlos" ist.

Das Makro muß aus einer der OpenOffice.org-Bibliotheken heraus gestartet werden, als Dokumentmakro läuft es nicht, weil ja das Dokument neu geladen wird wärend das Makro arbeitet.

Ansonsten funktioniert das Makro im Prinzip wie es soll, sollte aber letztlich mehr als Denk-Ansatz zur Lösung des geschilderten Problems denn als "Arbeits"makro verstanden werden.

Makrocode

Besondere Lizenzbedingungen für Programmcode

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

Sub Vorlagen_aktualisieren()
If StarDesktop.CurrentComponent.isModified() Then
meldg = "Sollen die Änderungen gespeichert werden," & CHR(13) _
        & "bevor mit der Aktualisierung der Vorlagen begonnen wird? (Empfohlen)"
x = msgbox (meldg, 52, "Dokument wurde bereits geändert")
End If
If x = 6 Then StarDesktop.CurrentComponent.Store()

wurzel = "C:\Programme\SO7_jms\user\template\jms1.stw"

If FileExists(StarDesktop.CurrentComponent.getDocumentInfo().TemplateFileName) Then
   Dim laden
   laden = StarDesktop.CurrentComponent.CurrentController.Frame
   Dim alle_vorlagen(0) as String
   alle_vorlagen(0) = StarDesktop.CurrentComponent.getDocumentInfo().TemplateFileName
   Dim myFileProp(1) As New com.sun.star.beans.PropertyValue
   oDesktop = createUnoService("com.sun.star.frame.Desktop")
   myFileProp(0).Name = "AsTemplate"
   myFileProp(0).Value = false
   myFileProp(1).name = "Hidden"
   myFileProp(1).value = True
   sSourceFile = StarDesktop.CurrentComponent.getDocumentInfo().TemplateFileName
   weiter = 0
   i = 0
   Do
      oDocument = oDesktop.loadComponentFromURL( sSourceFile, "_blank", 0, myFileProp() )
      If FileExists(oDocument.getDocumentInfo().TemplateFileName)  _
         AND oDocument.getDocumentInfo().TemplateFileName <> ConvertToURL(wurzel) Then
            weiter = 1
            sSourceFile = oDocument.getDocumentInfo().TemplateFileName
            i = i + 1
            REDIM Preserve alle_vorlagen(i) as String
            alle_vorlagen(i) = oDocument.getDocumentInfo().TemplateFileName
         Else
            weiter = 0
      End If
      oDocument.Close(true)
   Loop While weiter = 1
   If UBound(alle_vorlagen()) = 0 Then Exit Sub
   myFileProp(1).Name = "UpdateDocMode"
   myFileProp(1).Value = 3
   For i = UBound(alle_vorlagen()) To 0 Step -1
      oDocument = oDesktop.loadComponentFromURL( alle_vorlagen(i), "_blank", 0, myFileProp() )
      oDocument.Store()
      oDocument.Close(true)
      meldg = meldg & ConvertFromURL(alle_vorlagen(i)) & CHR(13)
   next i
   meldg = meldg & CHR(13) & CHR(13) & "UM DIE AKTUALISIERUNGEN WIRKSAM ZU MACHEN" _
           & CHR(13) & "WIRD DAS DOKUMENT JETZT NEU GELADEN"
   Msgbox (meldg, 64, "Folgende Vorlagen wurden aktualisiert:")
   dim dispatcher as object
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   dispatcher.executeDispatch(laden, ".uno:Reload", "", 0, Array())
end If
End Sub

Jörg Schmidt (20.08.2005)

Siehe auch


KategorieMakro


LizenzBedingungen | AnbieterKennzeichnung | DatenschutzErklärung | Stand: 2013-04-28