Arbeitsmenü für LibreOffice

LibreOffice und OpenOffice: Schnellstartmenü für häufig genutzte Dokumente

Sie müs­sen häu­fig bestimm­te Doku­men­te öff­nen und bear­bei­ten? Dann rich­ten Sie sich in Libre­Of­fice oder Open­Of­fice per Makro ein eige­nes Menü für den schnel­len Zugriff ein.

Es hängt von der per­sön­li­chen Arbeits­wei­se ab: Wer sei­ne Doku­men­te in Ord­nern und Unter­ord­nern orga­ni­siert hat, ver­wen­det in der Regel den Datei-Mana­ger des Betriebs­sys­tems, um die gewünsch­ten Datei­en anzu­steu­ern und zu öff­nen. Auf die zuletzt geöff­ne­ten Datei­en bie­ten Libre­Of­fice oder Open­Of­fice über den Menü­punkt „Datei -> Zuletzt benutz­te Doku­men­te“ oder das Start­mo­dul einen schnel­len Zugriff. Die­ser hat jedoch einen Nach­teil. Län­ger nicht ver­wen­de­te Datei­en ver­schwin­den nach eini­ger Zeit aus dem Menü, wenn Sie zwi­schen­durch ande­re Datei­en öff­nen. Zudem lässt sich die Rei­hen­fol­ge nicht ändern.

Bes­ser ist daher ein Arbeits­me­nü, über das Sie Datei­en öff­nen, an denen Sie gera­de täg­lich arbei­ten oder die Sie häu­fi­ger öff­nen und ändern müs­sen. Für die­se Lösung benö­ti­gen Sie Makros, die ich Ihnen in die­sem Arti­kel vor­stel­le.

Update Janu­ar 2023: In der neu­en Ver­si­on 2.4 wur­den eini­ge Feh­ler beho­ben. Auch unter Linux wer­den die Menü­ein­trä­ge nun kor­rekt ange­legt. Außer­dem las­sen sich die Makros jetzt als Erwei­te­rung für Libre­Of­fice oder Open­Of­fice instal­lie­ren.

Neu ist eine Funk­ti­on, über die sich die ers­te Datei aus der Lis­te der gespei­cher­ten Datei­en auto­ma­tisch beim Start von LibreOffice/OpenOffice öff­nen lässt.

Down­load zu die­sem Arti­kel:
Arbeits­me­nü 2.4:
Arbeits­me­nü als Erwei­te­rung:
Arbeits­me­nü OXT 2.4:
Alte Ver­si­on:
Arbeits­me­nü 2.1:

Die Makros funk­tio­nie­ren in Libre­Of­fice und Open­Of­fice ab Ver­si­on 4.x unter Win­dows, Linux und Mac OSX. Ledig­lich bei Ubun­tu mit dem Unity-Desk­top gibt es eine Ein­schrän­kung: Das Menü wird per Makro nicht rich­tig aktua­li­siert, sodass neue Ein­trä­ge erst nach einem Neu­start von Libre­Of­fice auf­tau­chen. Eine Lösung für die­ses Pro­blem ist mir zur­zeit nicht bekannt.

Der Makro-Code ermög­licht die Über­nah­me des aktu­ell genutz­ten Doku­ments in ein Menü. Wenn Sie die Arbeit an einem Doku­ment wie­der auf­neh­men, wäh­len Sie ein­fach den zuge­hö­ri­gen Menü-Ein­trag aus. Zusätz­lich gibt es einen Dia­log, über den Sie die gespei­cher­ten Ein­trä­ge ver­wal­ten. Sie kön­nen Ein­trä­ge aus der Lis­te löschen, alle Ein­trä­ge löschen oder die Rei­hen­fol­ge ändern. Zusätz­lich gibt es noch die Kom­fort­funk­ti­on „Öff­ne Doku­ment-Ord­ner“, der im Datei-Mana­ger den Ord­ner anzeigt, in dem das aktu­ell geöff­ne­te Doku­ment liegt. Das ist prak­tisch, wenn Sie Mate­ria­li­en wie Bil­der oder PDFs im glei­chen Ord­ner able­gen. Sie müs­sen dann den Ord­ner nicht erst umständ­lich im Datei-Mana­ger auf­ru­fen, um hier Datei­en abzu­le­gen oder zu ändern.

Arbeitsmenü oder Favoritenmenü für LibreOffice
Über das neue Arbeits­me­nü laden Sie schnell die häu­fig genutz­ten Doku­men­te.

So installieren Sie die Makros

Libre­Of­fice bezie­hungs­wei­se Open­Of­fice star­ten aus Sicher­heits­grün­den stan­dard­mä­ßig kei­ne Makros aus Doku­men­ten, die Sie von Ihrer Fest­plat­te laden. Um das zu ändern, gehen Sie auf „Extras -> Optio­nen“ und dann unter „Libre­Of­fice“ auf „Sicher­heit“. Kli­cken Sie auf „Makro­si­cher­heit“. Stel­len Sie das Sicher­heits­le­vel auf „Mit­tel, kli­cken Sie auf „OK“ und noch ein­mal auf „OK“. Open­Of­fice-Nut­zer gehen auf „Extras -> Ein­stel­lun­gen“ und dann auf „Open­Of­fice“ und „Sicher­heit“.

Laden Sie die Datei Arbeitsmenu.zip her­un­ter und Ent­pa­cken Sie das Archiv. Öff­nen Sie dann Arbeitsmenu.odt per Dop­pel­klick. Bestä­ti­gen Sie die Sicher­heits­ab­fra­ge per Klick auf „Makros akti­vie­ren“. Kli­cken Sie auf „Arbeits­me­nü instal­lie­ren“. Damit kopie­ren Sie die Makro-Biblio­thek „lib­Ar­beits­me­nü“ in den Makro­spei­cher „Mei­ne Makros & Dia­lo­ge“. Wenn Sie möch­ten, stel­len Sie das Sicher­heits­le­vel wie­der zurück auf „Hoch“.

Makrosicherheit
Um die Makros zu instal­lie­ren, müs­sen Sie hier mit „Makros akti­vie­ren“ bestä­ti­gen.

Alter­na­tiv ver­wen­den Sie die Erwei­te­rung. Die OXT-Datei lässt sich ein­fach per Dop­pel­klick im Büro­pa­ket öff­nen. Oder Sie ver­wen­den „Extras -> Exten­si­on-Mana­ger“.

So nutzen Sie die Makros

Das Makro erzeugt den neu­en Ein­trag „Arbeits­me­nü“ in der Menü­leis­te. Um ein neu­es Doku­ment hin­zu­zu­fü­gen spei­chern Sie die­ses zuerst und kli­cken dann auf „Arbeits­me­nü -> Zum Menü hin­zu­fü­gen“. Der Pfad zum Doku­ment erscheint dann im Menü. Wenn Sie spä­ter die Arbeit an einem Doku­ment fort­set­zen wol­len, kli­cken Sie den zuge­hö­ri­gen Ein­trag im Menü an.

Tipp: Sie kön­nen auch Doku­ment­vor­la­gen in das Menü auf­neh­men. Öff­nen Sie die gewünsch­te Doku­ment­vor­la­ge über „Datei -> Doku­ment­vor­la­ge -> Ver­wal­ten“ zum Bear­bei­ten und fügen Sie die Datei über „Arbeits­me­nü -> Zum Menü hin­zu­fü­gen“ hin­zu.

Dialog
Dia­log zur Ver­wal­tung der häu­fig genutz­ten Doku­men­te.

Datei-Lis­te ver­wal­ten: Per Klick auf „Arbeits­me­nü -> Optio­nen“ erhal­ten Sie Zugriff auf die Lis­te der Ein­trä­ge. Über die Pfeil-Schalt­flä­chen lässt sich die Rei­hen­fol­ge ändern. Um einen Ein­trag zu ent­fer­nen, kli­cken Sie ihn an und dann auf „Löschen“. „Alle Löschen“ ent­fernt alle Ein­trä­ge nach Rück­fra­ge. Über die Schalt­flä­che „Öff­nen“ kön­nen Sie das gera­de mar­kier­te Doku­ment öff­nen und über „Zei­gen“ öff­nen Sie den Ord­ner, in dem das Doku­ment liegt, im Datei-Mana­ger. Die­se Funk­ti­on errei­chen Sie auch direkt über den Menü­punkt „Arbeits­me­nü -> Öff­ne Doku­ment-Ord­ner“. Über die Schalt­flä­che „Spei­chern und schlie­ßen“ über­neh­men Sie Ände­run­gen im Dia­log und been­den ihn. „Abbre­chen“ schließt den Dia­log, ohne die Ände­run­gen zu spei­chern.

Ansichts­op­tio­nen ändern: Nach einem Klick auf „Ein­stel­lun­gen“ kön­nen Sie die Ansicht des Menüs ändern. Vor­ein­ge­stellt ist die Anzei­ge des voll­stän­di­gen Pfa­des im Menü. Bei lan­gen Pfa­den kön­nen die Menü­ein­trä­ge sehr lang wer­den. In die­sem Fall wäh­len Sie die Opti­on „Gekürz­ter Pfad“ und geben hin­ter „Län­ge der Anzei­ge“ die Anzahl der Zei­chen ein, die ein Menü­punkt maxi­mal haben soll. Wenn Sie „Nur Datei­na­me“ wäh­len, zeigt das Menü nur die Datei­na­men. Dann besteht bei gleich­na­mi­gen Doku­men­ten in unter­schied­li­chen Ord­nern jedoch Ver­wechs­lungs­ge­fahr. Die­se Ein­stel­lun­gen betref­fen jedoch nur die Anzei­ge. Die Makros spei­chern immer den kom­plet­ten Pfad zur Datei.

Wenn Sie ein Häk­chen vor „Letz­tes Doku­ment auto­ma­tisch öff­nen“ set­zen, wird das ers­te Doku­ment aus der Lis­te beim Start des Büro­pro­gram­me auto­ma­tisch gela­den. Das funk­tio­niert noch nicht ganz befrie­di­gend. Unter Win­dows star­tet Libre­Of­fice stan­dard­mä­ßig mit dem Start­mo­dul, das die zuletzt ver­wen­de­ten Doku­men­te anzeigt. Das auto­ma­tisch gela­de­ne Doku­ment wird zuerst geöff­net und das Start­mo­dul erst danach. Wenn Sie das Start­mo­dul oder das Doku­ment schlie­ßen, wer­den jeweils bei­de geschos­sen. Das Pro­blem lässt sich umge­hen, indem Sie das Modul Libre­Of­fice-Wri­ter über eine Ver­knüp­fung star­ten. Dann öff­net sich nur ein Fens­ter. Das Doku­ment wird auch auto­ma­tisch geöff­net, wenn Sie ein ande­res Doku­ment öff­nen. Ganz befrie­di­gend ist das nicht. Wahr­schein­lich ist es bes­ser, etwa eine eigen Schalt­flä­che in einer Sym­bol­leis­te zu erstel­len und die­se mit dem Makro „Open­Last­Doc“ zu ver­knüp­fen. Dann genügt ein Klick, um das letz­te Doku­ment zu öff­nen. Sym­bol­leis­ten gibt es aller­dings nicht im Start­cen­ter, eshalb man auch dafür den Libre­Of­fice-Wri­ter direkt star­ten muss.

Makro individuell konfigurieren

Das Makro erstellt stan­dard­mä­ßig nur Menü-Ein­trä­ge in den Office-Modu­len Wri­te und Calc sowie in der Über­sichts­sei­te. Wenn Sie das Arbeits­me­nü auch in ande­ren Modu­len ver­wen­den wol­len, gehen Sie auf „Extras -> Makros -> Makros ver­wal­ten -> Libre­Of­fice Basic“. Gehen Sie unter „Mei­ne Makros“ auf „lib­Ar­beits­me­nu -> modArb­men“, und kli­cken Sie auf „Bear­bei­ten“. Unter „Func­tion Get­In­ter­faces As Array“ sehen Sie die Defi­ni­ti­on der Office-Modu­le. Wenn Sie bei­spiels­wei­se das Menü auch in Draw („Zeich­nung“) sehen wol­len, ent­fer­nen Sie das Hoch­kom­ma vor

myInterfaces(X)="com.sun.star.drawing.DrawingDocument"

Ändern Sie „myInterfaces(X)“ auf „myInterfaces(3)“ und „Dim myInterfaces(2)“ auf „Dim myInterfaces(3)“. Wenn Sie auch Impress hin­zu­fü­gen möch­ten, ändern Sie die Zei­le

myInterfaces(X)="com.sun.star.presentation.PresentationDocument"

in „myInterfaces(4)“ und erhö­hen den Wert für das Array auf „Dim myInterfaces(4)“.
Außer­dem kön­nen Sie bei Bedarf den Namen der INI-Datei hin­ter „strI­ni­Fi­le­Na­me=“ ändern, in dem das Makro die Menü­ein­trä­ge spei­chert. Eine wei­te­re Anpas­sung kann für Linux erfor­der­lich sein. Da es hier – je nach Dis­tri­bu­ti­on – unter­schied­li­che Datei-Mana­ger zu Ein­satz kom­men, tra­gen Sie des­sen Namen hin­ter „str­Li­nux­Fi­le­Ma­na­ger=“ ein. Für Ubun­tu bei­spiels­wei­se

Const strLinuxFileManager="nautilus"

Und für Linux Mint:

Const strLinuxFileManager="nemo"

Wel­ches Betriebs­sys­tem jeweils zum Ein­satz kommt, ermit­telt das Makro auto­ma­tisch.

Technische Informationen zur Arbeitsweise der Makros

Damit das Arbeits­me­nü beim Start von Libre­Of­fice bezie­hungs­wei­se Open­Of­fice erscheint und dyna­misch gefüllt wird, muss das Unter­pro­gramm „Modul­e­Init()“ auto­ma­tisch gestar­tet wer­den. Die Instal­la­ti­ons-Rou­ti­ne erzeugt dazu einen pas­sen­den Ein­trag, den Sie über „Extras -> Anpas­sen“ auf der Regis­ter­kar­te „Ereig­nis­se“ hin­ter „Pro­gramm­start“ sehen kön­nen. Die Instal­la­ti­ons-Rou­ti­ne berück­sich­tigt, ob hier bereits ein von Ihnen selbst erstell­ter Ein­trag vor­han­den ist. Es fragt gege­be­nen­falls, ob die­ser ersetzt wer­den soll. Wenn Sie hier mit „Nein“ ant­wor­ten, müs­sen Sie selbst „Modul­e­Init()“ in Ihre Auto­start-Makro auf­neh­men. Ent­spre­chend wird auch bei der De-Instal­la­ti­on gefragt, ob der Ein­trag bei „Pro­gramm­start“ unter „Ereig­nis­se“ ent­fernt wer­den soll.

Das Makro spei­chert die Menü-Ein­trä­ge in der Datei Arbeitsmenu.ini. Die­se wird etwa bei Libre­Of­fice unter Win­dows im Ver­zeich­nis „%appdata%\LibreOffice\4\user\config“ erstellt. „Modul­e­Init()“ liest die INI-Datei aus und erstell­te die Menü­ein­trä­ge neu. Das Menü wird nicht per­ma­nent gespei­chert, son­dern immer dyna­misch erzeugt. Das kann sich ein wenig auf die Start­zeit des Office-Pakets aus­wir­ken, vor allem, wenn Sie Menüs für meh­re­re Office-Modu­le erzeu­gen. Auf einem durch­schnitt­lich schnel­len PC soll­te die Ver­zö­ge­rung aber kaum spür­bar sein.

So deinstallieren Sie das Makro

Wenn Sie das Arbeits­me­nü nicht mehr ver­wen­den wol­len, öff­nen Sie erneut die Datei Arbeitsmenu.odt. Kli­cken Sie auf „Arbeits­me­nü de-instal­lie­ren“.

Die Erwei­te­rung lässt sich über „Extras -> Exten­si­on-Mana­ger“ deinstal­lie­ren.

Sie kön­nen die Biblio­thek auch manu­ell ent­fer­nen. Dazu gehen Sie auf „Extras -> Makros -> Makros ver­wal­ten -> Libre­Of­fice Basic“ und kli­cken auf die Schalt­flä­che „Ver­wal­ten“. Gehen Sie auf die Regis­ter­kar­te „Biblio­the­ken“, wäh­len die „lib­Ar­beits­me­nu“ aus, und kli­cken Sie auf „Löschen“. Danach gehen Sie auf „Extras -> Anpas­sen“ und die Regis­ter­kar­te „Ereig­nis­se“. Löschen Sie die Akti­on hin­ter „Pro­gramm­start“.

Makros im Quelltext

REM ******  BASIC  **********
REM Arbeitsmenu Version 2.4 *
REM *************************
Private oDialog as Variant  
Dim oListBox As Variant
Dim ListBoxChanged As Boolean
Dim mySettings(2)
Dim isBusy As Boolean
Dim MyIni
Const strMenuID="vnd.openoffice.org:Arbmenu"
Const strLibName="libArbeitsmenu"
Const strModName="modArbmen"

Const strIniFileName="Arbeitsmenu.ini"
Const strLinuxFileManager="nautilus" ' Ubuntu
'Const strLinuxFileManager="nemo" ' Linux Mint


Sub OpenLastDoc
OpenDoc(1)
End Sub

' get interfaces where menu should be added
' 
Function GetInterfaces  As Array
' increase the value when adding more interfaces
' 2 means 3 values (0, 1, 2)
Dim myInterfaces(2) As Variant 
myInterfaces(0)="com.sun.star.text.TextDocument" 'show menu in Writer
myInterfaces(1)="com.sun.star.sheet.SpreadsheetDocument" 'show menu in Calc
myInterfaces(2)="com.sun.star.frame.StartModule" 'show menu on start page

' more examples
'myInterfaces(3)="com.sun.star.drawing.DrawingDocument" ' show menu in Draw
'myInterfaces(4)="com.sun.star.presentation.PresentationDocument" ' show menu in Impress

GetInterfaces=myInterfaces()
End Function


' create menu and fill with entries
' must be executed on LibreOffice startup (OnStartApp event)
Sub ModuleInit
Dim Doc As Object
Dim myInterfaces()

  If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
  End If


myInterfaces()=GetInterfaces ' interfaces where menu should be placed
' CreateTopLevelMenu("<path>","<interface>")
' AddSubMenu("<path>","<menutext>","<interface>")
 For i = 0 To UBound(myInterfaces)
   If FindMenuByID(strMenuID, myInterfaces(i)) = -1 Then
    CreateTopLevelMenu(strMenuID,"Arbeits~menü",myInterfaces(i) )
    AddSubMenu(strMenuID, "macro:///"+strLibName+"."+strModName+".AddToMenu()","Zum Menü hinzufügen",0,myInterfaces(i) )
    AddSubMenu(strMenuID, "macro:///"+strLibName+"."+strModName+".ArbMenOptions()","Optionen",0,myInterfaces(i))
    'add seperator
    AddSubMenu(strMenuID, "","",1,myInterfaces(i))
    AddSubMenu(strMenuID, "macro:///"+strLibName+"."+strModName+".ShowCurrentDocFolder()","Öffne Dokument-Ordner",0,myInterfaces(i))
    'add seperator
    AddSubMenu(strMenuID, "","",1,myInterfaces(i))    
   End If
next i

Dim myItems (1)
myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 
'create new ini with defaults
If  Not  checkForFile(myIni) Then
mySettings(0)="3" 'file name
mySettings(1)="80" 'text lenght
mySettings(2)=0 'AutoOpen last document
CreateIniFile(myIni, 0, myItems(), mySettings())
End If
 ' get entries from ini
 For i = 0 To UBound(myInterfaces)
  FillMenuFromIni(myInterfaces(i))
 Next i
 
'AutoOpen (experimental)
AutoOpenDoc=Val(getIniValue(myIni, "Settings", "AutoOpen"))
If AutoOpenDoc=1 Then  OpenDoc(1) 
End Sub

' remove documents from menu
Sub cmdClear_Click
Dim sVar as Integer
sVar=MsgBox("Wollen Sie wirklich alle Einträge löschen?",256 + 32 +1,"Alle Löschen?")
If sVar=1 Then
 ListBoxChanged=True
 ClearListBox
End If
End Sub

' show selected item in dialog
Sub FillLabel
 selItem=oListBox.SelectedItemPos()
 if selItem=-1 Then Exit Sub
 oLabel = oDialog.getControl("Label1")
 oLabel.SetText(oListBox.getItem(selItem))
End Sub


' something was modified in dialog?
Sub DialogModified
ListBoxChanged=True
End Sub


' move entry down
Sub cmDown_Click
Dim nCount As Integer
nCount = oListBox.getItemCount()
If nCount = 0 Then Exit Sub
selItem=oListBox.SelectedItemPos()
If selItem = -1 Then Exit Sub
If selItem=nCount-1 Then Exit Sub
ReDim myList(nCount - 1)

ListBoxChanged=True
 intIDX = selItem

   For i = 0 To nCount - 1
     S = oListBox.getItem(i)
     myList(i) = S
   Next i

strItem1 = myList(intIDX)
strItem0 = myList(intIDX + 1)
myList(intIDX + 1) = strItem1
myList(intIDX) = strItem0
ClearListBox
For i = 0 To nCount -1
 oListBox.addItem (Trim(myList(i)),i)
Next i
oListBox.selectItemPos(intIDX + 1, True)
End Sub

' move entry up
Sub cmUp_Click
Dim intIDX, strItem1, strItem0
nCount = oListBox.getItemCount()
If nCount = 0 Then Exit Sub
selItem=oListBox.SelectedItemPos()
If selItem= 0 Then Exit Sub
Dim myList()
ReDim myList(nCount - 1)
ListBoxChanged = True
intIDX = selItem
For i = 0 To nCount -1
  S = oListBox.getItem(i)
  myList(i) = S
Next i
strItem1 = myList(intIDX)
strItem0 = myList(intIDX - 1)
myList(intIDX - 1) = strItem1
myList(intIDX) = strItem0
ClearListBox
For i = 0 To nCount -1
 oListBox.addItem (Trim(myList(i)),i)
Next i
oListBox.selectItemPos(intIDX - 1, True)
End Sub

' add current document to menu
Sub AddToMenu

'prevent second time call
If isBusy=True Then Exit Sub
isBusy=True

Dim i As Integer
Dim numItems As Integer
Dim myInterfaces()
If GetDocumentURL <> "" Then
 myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 
 numItems=Val(getIniValue(myIni, "ArbMenu", "ItemsCount"))
 
 Dim myItems(numItems+1)
' read old items from ini
 For i = 1 to numItems
   myItems(i)="Item"+Trim(Str(i)) + "=" + getIniValue(myIni, "ArbMenu", "Item"+Trim(Str(i)))
 Next i
 
' get settings from ini
mySettings(0)=getIniValue(myIni, "Settings", "Option")
mySettings(1)=getIniValue(myIni, "Settings", "NumChar")
mySettings(2)=getIniValue(myIni, "Settings", "AutoOpen")

 
 ' add new entry to menu
 myItems(numItems+1)="Item"+Trim(Str(numItems+1))+"="+GetDocumentURL
 ' write ini file
 CreateIniFile(myIni, numItems+1, myItems(),mySettings())

 ' refresh menu all interfaces
 myInterfaces()=GetInterfaces
 For i = 0 To UBound(myInterfaces)
  FillMenuFromIni(myInterfaces(i))
 Next i
End If 
isBusy=False
End Sub

' show options dialog
Sub ArbMenOptions
Dim nCount As Integer
 DialogLibraries.LoadLibrary(strLibName)
 oDialog = createUnoDialog(DialogLibraries.libArbeitsmenu.dlgArbMen)
 oDialog.Model.Step = 1 ' show first page
 oListBox = oDialog.getControl("ListBox1")
 FillListBoxFromIni ' get menu entries form ini
 ListBoxChanged=False
 oDialog.execute ' show dialog
End Sub

' remove selected item from list
Sub RemoveSelectedItem
ListBoxChanged=True
selItem=oListBox.SelectedItemPos()
If selItem >=0 Then
oListBox.removeItems(selItem,1)
End If 
End Sub

' remove all entries from list
Sub ClearListBox
  Dim nCount As Integer
   nCount = oListBox.getItemCount()
  If nCount >0 Then
   For i = 0 to nCount-1
    oListBox.removeItems(0,1)
   Next i
  End If
End Sub

' get menu entries from ini
Sub FillMenuFromIni (myInterface As String)
Dim numItems As Integer
Dim n As Integer
Dim numMenuItems
Dim myOption As Integer
Dim NumChar As Integer
Dim S As String
' we need the tools library (ConvertFromUrl)
  If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
  End If
' remove menu entries starting at 5
numMenuItems=GetNumMenuEntries(strMenuID, myInterface)
If numMenuItems > 5 Then
RemoveSubMenu(strMenuID, numMenuItems-5, myInterface)
End If


myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 
numItems=getIniValue(myIni, "ArbMenu", "ItemsCount")

'no entries = exit
If numItems=0 Then Exit Sub

myOption=Val(getIniValue(myIni, "Settings", "Option"))
If myOption <=0 Or myOption >=4 Then myOption=3 ' default 3 full path names

NumChar=Val(getIniValue(myIni, "Settings", "NumChar"))
If NumChar=0 Then NumChar=80 ' default 80 characters

'fill menu from ini
 For n = 1 to numItems
   myDoc=getIniValue(myIni, "ArbMenu", "Item"+Val(n))
Select Case myOption
 '1 filename only
 Case 1
  S=FileNameoutofPath(myDoc)
 '2 short path
 Case 2
  S=LongDirFix(myDoc,NumChar)
 '3 full path
 Case 3
 S=myDoc
End Select
' add new menu entry
AddSubMenu(strMenuID, "macro:///"+strLibName+"."+strModName+".OpenDoc("+Trim(Str(n)) +")",Trim(Str(n) + " " + S),0,myInterface)
Next n
End Sub

' fill dialog listbox from ini
Sub FillListBoxFromIni
ClearListBox
Dim numItems As Integer
Dim n As Integer
Dim myOption As Integer
Dim NumChar As Integer

myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 
numItems=getIniValue(myIni, "ArbMenu", "ItemsCount")

'settings
myOption=Val(getIniValue(myIni, "Settings", "Option"))
If myOption <=0 Or myOption >=4 Then myOption=3
oCheckbox = oDialog.getControl("OptionButton"+ Trim (Str(myOption)))
oCheckbox.Model.State=1

NumChar=Val(getIniValue(myIni, "Settings", "NumChar"))
If NumChar=0 Then NumChar=80
oTextField=oDialog.getControl("txtLength")
oTextField.Text=Trim(Str(NumChar))

AutoOpenDoc=Val(getIniValue(myIni, "Settings", "AutoOpen"))
oCheckAutoOpen = oDialog.getControl("chkAutoOpen")
oCheckAutoOpen.Model.State=AutoOpenDoc

For n = 0 to numItems-1
  myDoc=getIniValue(myIni, "ArbMenu", "Item"+Val(n+1))
  oListBox.addItem( myDoc, n )
Next n
End Sub

' close dialog
Sub CancelDialog
oDialog.endExecute()
End Sub

' close dialog and save
Sub CloseDialogAndSave

Dim myOption As Integer
Dim NumChar As Integer
Dim S As String

'Nothing has changed, exit
If ListBoxChanged=false Then
oDialog.endExecute()
Exit Sub
End If

Dim n As Integer
Dim myInterfaces ()
myInterfaces()=GetInterfaces
myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 

'get option settings
For i = 1 to 3
oCheckbox = oDialog.getControl("OptionButton"+ Trim (Str(i)))
If oCheckbox.Model.State=1 Then myOption = i
Next i

oTextField=oDialog.getControl("txtLength")
NumChar=Trim(Val(oTextField.getText()))
If NumChar=0 Then NumChar=80

mySettings(0)=Trim(Str(myOption))
mySettings(1)=Trim(Str(NumChar))
oCheckAutoOpen = oDialog.getControl("chkAutoOpen")
mySettings(2)=oCheckAutoOpen.Model.State

'write ini from ListBox values
numItems=oListBox.getItemCount()
Dim myItems(numItems)
For n = 1 to numItems
myItems(n)="Item" + Trim(Str(n)) + "=" + oListBox.getItem(n-1)
Next n

' save ini file
CreateIniFile(myIni, numItems, myItems(), mySettings())

'remove all menu entries
numItems=getIniValue(myIni, "ArbMenu", "ItemsCount")

For i = 0 To UBound(myInterfaces)
RemoveSubMenu(strMenuID, numItems, myInterfaces(i))
Next i


' refresh menu
 For i = 0 To UBound(myInterfaces)
  FillMenuFromIni(myInterfaces(i))
 Next i

oDialog.endExecute() 'close dialog
End Sub

' dialog: switch step 1 or 2
Sub DialogSettings
If oDialog.Model.Step = 1 Then
 oDialog.Model.Step = 2
 oDialog.Model.cmdSettings.Label="Einträge"
Else
 oDialog.Model.Step = 1
  oDialog.Model.cmdSettings.Label="Einstellungen" 
End If
End Sub

' open doc folder in file manager
Sub OpenFileManager(DocDir)
Dim TheOS
TheOS=OS()
If TheOS="WINDOWS" then
WinDir=Environ("Windir")
Shell(Windir+"\explorer.exe /e,"+DocDir,1) ' Windows
ElseIf TheOS="UNIX" Then
Shell(strLinuxFileManager + " "+ DocDir ,1) ' Linux
ElseIf  TheOS="OSX" Then
Shell("open "+ DocDir ,1) ' OSX
End If
End Sub

' open current docs folder in file manager
Sub ShowCurrentDocFolder
dim oDoc as object
oDoc = ThisComponent
If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
  End If
On error goto ErrH:
If (oDoc.hasLocation) Then ' document saved?
OpenFileManager(DirectoryNameoutofPath(oDoc.getURL(), "/"))
Else
MsgBox("Bitte speichern Sie das Dokument, bevor Sie diese Funktion verwenden.",64,"Dokument ist nicht gespeichert")
End If
Exit Sub
ErrH: ' document has no location
MsgBox("Die Funktion steht hier nicht zur Verfügung.",64,"Fehler")
End Sub

' show selected document folder in file manager
Sub ShowDocFolder
Dim selItem
Dim myDoc

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
  End If
  
selItem=oListBox.SelectedItemPos()

 If selItem >=0 Then
   myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 
   myDoc=getIniValue(myIni, "ArbMenu", "Item"+Val(selItem + 1))
     If checkForFile(ConvertToUrl(myDoc))=True Then
       OpenFileManager(DirectoryNameoutofPath(ConvertToUrl(myDoc), "/"))
     Else
      MsgBox("Die Datei " + myDoc +" ist nicht vorhanden" )   
     End If  
 Else
 oLabel = oDialog.getControl("Label1")
 oLabel.SetText("Es ist nichts ausgewählt") ' nothing selected
 End If
End Sub

' Dialog: open document
Sub OpenDocFromDialog
Dim selItem
selItem=oListBox.SelectedItemPos()
 If selItem >=0 Then
  OpenDoc ( selItem + 1 )
  'CancelDialog
  Else
 oLabel = oDialog.getControl("Label1")
 oLabel.SetText("Es ist nichts ausgewählt")
 End If
End Sub

' open document from menu
Sub OpenDoc (index As Integer)
' https://wiki.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Handling_Documents
Dim args (0) as New com.sun.star.beans.PropertyValue
' optional macro setting
'args(0).Name="MacroExecutionMode"
'args(0).Value=6 'Use configuration to retrieve macro settings. Treat cases when user confirmation required as approved.
' Reference: https://www.openoffice.org/api/docs/common/ref/com/sun/star/document/MacroExecMode.html
'args(0).Name="OpenNewView"
'args(0).Value=true


myIni=ConvertFromUrl(getConfigPath+ "/" + strIniFileName) 
myDoc=getIniValue(myIni, "ArbMenu", "Item"+Val(index))
' file exists?
If checkForFile(ConvertToUrl(myDoc))=True Then ' file exists?
' Reference: https://wiki.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Handling_Documents
' TheDoc=StarDesktop.loadComponentFromURL(ConvertToUrl(myDoc),"_blank",0,args())
TheDoc=StarDesktop.loadComponentFromURL(ConvertToUrl(myDoc),"_default",0,args())
Else
 MsgBox("Die Datei " + myDoc +" ist nicht vorhanden" )
End If
End Sub

' get document path
Function GetDocumentURL As String
  Dim oDoc
  Dim sDocURL
  oDoc = ThisComponent
  If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
  End If
  On error goto ErrH:
  If (oDoc.hasLocation()) Then
    GetDocumentURL= ConvertFromUrl(oDoc.getURL())
    Else
    MsgBox("Sie müssen das Dokument erst speichern.") ' not saved yet
  End If
Exit Function
ErrH:
MsgBox("Die Funktion steht hier nicht zur Verfügung.",64,"Fehler")  
  End Function

' 
' Get submenus from given menu 'PopupIndex'
'
Function getItemContainer (Byval PopupIndex AS Integer, _
								Settings AS Object) _
								AS Object
	Dim Popup AS Object
	Dim i AS Integer
	
	Popup = Settings.getByIndex (PopupIndex)
	For i = 0 to uBound (Popup)
		If Popup(i).Name = "ItemDescriptorContainer" Then
			getItemContainer = Popup(i).Value
			Exit Function
		End If
	Next
End Function

' test only, not used
Sub CheckMenu
myInterface="com.sun.star.text.TextDocument"
sMenuBar = "private:resource/menubar/menubar"
strMenuID2="vnd.openoffice.org:Arbmenu"
sMyPopupMenuCmdId=strMenuID
oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") 
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(myInterface)
oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true )
iPos=FindMenuByID(strMenuID2,myInterface)
oPopupMenu() = oMenuBarSettings.getByIndex( iPos )
oPopupMenuContainer = getItemContainer (iPos, oMenuBarSettings)
nEntries=oPopupMenuContainer.getCount()
oMenuItem()= oPopupMenuContainer.getByIndex(0)
MsgBox("Menüeinträge: " + nEntries + Chr(13) + "Erstes Menü: " + oMenuItem(0).Value)
End Sub

' number of menu entries
Function GetNumMenuEntries (ID As String, Interface As String) As Integer
sMenuBar = "private:resource/menubar/menubar"
oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") 
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(Interface)
oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true )
iPos=FindMenuByID(ID,Interface)

 If iPos >= 0 Then
   oPopupMenu() = oMenuBarSettings.getByIndex( iPos )  
  if Not IsEmpty(oPopupMenu) Then
   oPopupMenuContainer = getItemContainer (iPos, oMenuBarSettings)
   GetNumMenuEntries=oPopupMenuContainer.getCount()
  End If
 End If 

End Function


' remove documents from menu
Sub RemoveSubMenu(ID As String, numItems As integer, Interface As String)
sMenuBar = "private:resource/menubar/menubar"
oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") 
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(Interface)
oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true )
iPos=FindMenuByID(ID, Interface)
 If iPos >= 0 Then
  oPopupMenu() = oMenuBarSettings.getByIndex( iPos )
  oPopupMenuContainer= getItemContainer (iPos, oMenuBarSettings)

  For i = 1 to numItems
   oPopupMenuContainer.removeByIndex(5)
  Next i

  oModuleCfgMgr.replaceSettings( sMenuBar, oMenuBarSettings )
 End If 
End Sub

' add sub menu
Sub AddSubMenu (ID As String, Action As String, Label As String, iType As Integer, Interface As String)
Dim nSubNumItems As Integer
sMenuBar = "private:resource/menubar/menubar"
oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") 
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(Interface)
oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true )
iPos=FindMenuByID(ID, Interface)

 If iPos >= 0 Then
  oPopupMenu() = oMenuBarSettings.getByIndex( iPos )
  nPopupMenuCount = ubound(oPopupMenu())
  oPopupMenuContainer = getItemContainer (iPos, oMenuBarSettings)
  nSubNumItems=oPopupMenuContainer.getCount()
  oMenuItem = CreateMenuItem( Action,Label,iType )
  oPopupMenuContainer.insertByIndex( nSubNumItems, oMenuItem )
  oModuleCfgMgr.replaceSettings( sMenuBar, oMenuBarSettings )
 End If 

End Sub

' create main menu entry
Sub CreateTopLevelMenu(ID As String, Label As String, Interface As String)
sMenuBar = "private:resource/menubar/menubar"
sMyPopupMenuCmdId = "vnd.openoffice.org:" +ID 
oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") 
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(Interface)
oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true )
nCount = oMenuBarSettings.getCount()
oPopupMenu = CreatePopupMenu( ID, Label, oMenuBarSettings )
'insert after last item
oMenuBarSettings.insertByIndex( nCount, oPopupMenu )
oModuleCfgMgr.replaceSettings( sMenuBar, oMenuBarSettings )
End Sub

' locate menu by ID
Function FindMenuByID (ID As String, Interface As String) As Integer
FindMenuByID=-1
sMenuBar = "private:resource/menubar/menubar"
oModuleCfgMgrSupplier = createUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") 
oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(Interface)
oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true ) 
nCount = oMenuBarSettings.getCount()
 for i = 0 to nCount-1
   oPopupMenu() = oMenuBarSettings.getByIndex( i )
 If oPopupMenu(0).Value=ID Then FindMenuByID=i
next i
End Function

' create menu
Function CreatePopupMenu( CommandId, Label, Factory ) as Variant
        Dim aPopupMenu(3) as new com.sun.star.beans.PropertyValue

        aPopupMenu(0).Name = "CommandURL"
        aPopupMenu(0).Value = CommandId
        aPopupMenu(1).Name = "Label"
        aPopupMenu(1).Value = Label
        aPopupMenu(2).Name = "Type"
        aPopupMenu(2).Value = 0
        aPopupMenu(3).Name = "ItemDescriptorContainer"
        aPopupMenu(3).Value = Factory.createInstanceWithContext(GetDefaultContext() )
        CreatePopupMenu = aPopupMenu()
End Function

' create menu item
Function CreateMenuItem( Command as String, Label as String, iType As Integer ) as Variant
        Dim aMenuItem(2) as new com.sun.star.beans.PropertyValue
        aMenuItem(0).Name = "CommandURL"
        aMenuItem(0).Value = Command
        aMenuItem(1).Name = "Label"
        aMenuItem(1).Value = Label
        aMenuItem(2).Name = "Type"
        aMenuItem(2).Value = iType
        CreateMenuItem = aMenuItem()
End Function

Rem ------------------------------------------
rem helper
Rem ------------------------------------------
' which operating system?
function OS()as string  
  select case getGUIType
  case 1: OS="WINDOWS"
  case 3: OS="MAC"
  case 4: OS=iif(instr(environ("HOME"),"Users")=0,"UNIX","OSX")
  end select
end function

'LO/OO config path
Function getConfigPath As String
oPathSettings = CreateUnoService( "com.sun.star.util.PathSettings" )
sPathConfig = oPathSettings.UserConfig
if right(sPathConfig,6) <> "config" then
  getConfigPath=""
Else
 getConfigPath=sPathConfig
endif
End Function

' shorten path
Function LongDirFix (TargetString As String, Max As Integer) As String
Dim i, LblLen, StringLen As Integer
Dim TempString As String

        TempString = TargetString
        LblLen = Max

                If Len(TempString) <= LblLen Then
                LongDirFix = TempString
                Exit Function
                End If
 
        LblLen = LblLen - 6

                For i = Len(TempString) - LblLen To Len(TempString)
                If Mid$(TempString, i, 1) = "\" Then Exit For
                Next
 
        'On one line:
        LongDirFix = Left$(TempString, 3) & "..." & Right$(TempString, Len(TempString) - (i - 1))

End Function

' does sUrl (ini file) exist?
Function checkForFile (sUrl As String) As Boolean
   oSimpleFileAccess = createUnoService( "com.sun.star.ucb.SimpleFileAccess" )
    If oSimpleFileAccess.exists(sUrl) = TRUE Then
      checkForFile=True
   Else
      checkForFile=False
   End If
End Function

' CreateIni
Sub CreateIniFile (myIniFile As String, NumItems As Integer, myItems As Array, mySettings As Array)
Dim i As Integer
fileAccessService = createUnoService("com.sun.star.ucb.SimpleFileAccess")
textOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
'now open the file..
outputStream = fileAccessService.openFileWrite(myIniFile)
outputStream.truncate()
textOutputStream.setOutputStream(outputStream)

textOutputStream.writeString("[Settings]"  +Chr(13) +Chr(10))
textOutputStream.writeString("Option=" + mySettings(0)+Chr(13) +Chr(10))
textOutputStream.writeString("NumChar=" + mySettings(1)+Chr(13) +Chr(10))
textOutputStream.writeString("AutoOpen=" + mySettings(2)+Chr(13) +Chr(10))


textOutputStream.writeString("[ArbMenu]"  +Chr(13) +Chr(10))
'numItems=0
textOutputStream.writeString("ItemsCount=" + Trim(Str(NumItems))+Chr(13) +Chr(10))

If numItems=0 Then ' no items, exit
textOutputStream.writeString(Chr(13) +Chr(10))
textOutputStream.closeOutput()
Exit Sub
End If

For i = 1 to UBound(myItems)
textOutputStream.writeString(myItems(i)+Chr(13) +Chr(10))
Next i

textOutputStream.writeString(Chr(13) +Chr(10))
'and don't forget to close it..
textOutputStream.closeOutput()
End Sub

' get value from ini file
Function getIniValue(sIniPath As String, sIniNode As String, sIniKey As String)
   
   oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
   iKeyLength = len(sIniKey)
   
   If oUcb.Exists(sIniPath) Then
   
      oInputStream = createUnoService("com.sun.star.io.TextInputStream")
      oFile = oUcb.OpenFileReadWrite(sIniPath)
      oInputStream.SetInputStream(oFile.GetInputStream)

      'find node
      Do While Not oInputStream.IsEOF
         sLine = oInputStream.ReadLine
         If sLine = "[" & sIniNode & "]" Then
            sLine = oInputStream.ReadLine
            Exit Do 'going out here and start the next loop, searching the key
         End If
      Loop
      
      'find key
      Do While ((Not (Left(sLine, 1) = "[")) AND (Not oInputStream.IsEOF))
         If left(sLine, iKeyLength) = sIniKey Then
            sValue = mid(sLine,iKeyLength + 2)
            Exit Do ' going out, no need for further searching
         End If
         sLine = oInputStream.Readline
      Loop

      oInputStream.CloseInput()
   Else
      msgbox("ini-file:" & sIniPath & " nicht gefunden.")
   End If

   getIniValue = sValue
   
End Function


Schlagwörter:


Kommentare

2 Antworten zu „LibreOffice und OpenOffice: Schnellstartmenü für häufig genutzte Dokumente“

  1. Avatar von Frank Volberg
    Frank Volberg

    Hal­lo, nach der Instal­la­ti­on habe ich ein Pro­blem mit dem Tool. Instal­liert ist Libre­Of­fice 6.1.5.2(64bit), Java 8 201.
    Beim Start von Libre­Of­fice kommt eine Feh­ler­mel­dung im Makro­e­di­tor: BASIC-Lauf­zeit­feh­ler, Objekt­va­ria­ble nicht belegt.
    Im Edi­tor wird die Zei­le 506 ange­zeigt: GetNumMenuEntries=oPopupMenuContainer.getCount().

    Das Tool läßt sich nicht mehr deinstal­lie­ren, der Menü­ein­trag bleibt bestehen, und auch nicht mehr kor­rekt instal­lie­ren, die Feh­ler­mel­dung bleibt hart­nä­ckig bestehen.
    Fra­ge: Was kann ich tun?
    Mit bes­ten Grü­ßen
    Frank Vol­berg

    1. Es kann sein, dass es bei neue­ren Lib­re-Office-Ver­sio­nen zu Pro­ble­men kommt. Das wer­de ich bei Gele­gen­heit durch ein Update behe­ben.
      Wenn die Deinstal­la­ti­on nicht klappt, bit­te auf „Extras -> Anpas­sen“ und dann auf die Regis­ter­kar­te „Ereig­nis­se“ gehen. Hin­ter „Spei­chern in:“ bit­te „Libre­Of­fice“ wäh­len. Dann bei „Pro­gramm­start“ den Auto­start des Makros löschen.
      Auf der Regis­ter­kar­te „Menüs“ wäh­len Sie auf der rech­ten Sei­te „Arbeits­me­nü“ und löschen es über die „x“-Schaltfläche.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Neueste Kommentare


Die Website durchsuchen