bis zu libreoffice 3 funktioniere folgendes Makro:
Code: Alles auswählen
SUB Texyl_switchMenuitem (BYVAL MenuName AS STRING, _
BYVAL Itemname AS STRING, _
Enable AS BOOLEAN) _
AS BOOLEAN
DIM DocFrame AS VARIANT
DIM MenuRes AS VARIANT
DIM LayoutManager AS VARIANT
DIM Menubar AS VARIANT
DIM Popup AS VARIANT
DIM MItemId AS INTEGER
DIM ItemId AS INTEGER
DIM iString AS STRING
DIM i AS INTEGER
DIM IsHere AS BOOLEAN
IsHere = FALSE
REM Erstmal den Frame vom Controller holen
DocFrame = ThisComponent.getCurrentController().getFrame()
REM Davon den Layoutmanager
LayoutManager = DocFrame.LayoutManager()
REM Jetzt das Element Menubar holen
MenuRes = LayoutManager.getElement ("private:resource/menubar/menubar")
MenuBar = MenuRes.XMenuBar
REM Nun den Menüpunkt finden
FOR i = 0 TO MenuBar.getItemCount ()
MItemId = MenuBar.getItemId (i)
iString = MenuBar.getItemText (MItemId)
IF iString = MenuName THEN
IsHere = TRUE
EXIT FOR
END IF
NEXT
IF IsHere THEN
Popup = MenuBar.getPopupMenu (MItemId)
IsHere = FALSE
REM Endlich die einzelnen Items durchsuchen
FOR i = 0 TO Popup.getItemCount()
ItemId = Popup.getItemId (i)
iString = Popup.getItemText (ItemId)
IF strComp (iString, Itemname, 1) = 0 THEN
IsHere = TRUE
EXIT FOR
END IF
NEXT
REM und umschalten
IF IsHere THEN
Popup.enableItem (ItemId, Enable)
ELSE
msgbox "Menüeintrag nicht gefunden"
END IF
ELSE
msgbox "Menü nicht gefunden"
END IF
END SUB
Ich habe den Fehler "nach hinten" verschieben können, indem ich die Variablen Menubar und Popup GLOBAL deklariere und sie nur einmal erzeuge. Beim Schließen des Dokumentes resp. libreoffice ist nichts zu bemerken. Doch muss ich beim Laden des Dokumentes "wiederherstellen". Alle Versuche den Fehler zu finden, schlagen auch nach 3 Tagen fehl.
Da das Makro unter libreoffice 3 funktionierte, sehe ich zwei Möglichkeiten:
1. Es gibt einen Bug
2. Es hat sich was geändert. Aber was? Ich kann ändern, was ich will: Der Fehler bleibt - ohne Meldung!
Habe an den Properties der Eintrage getüfftelt und herausgefunden, dass es eine mit Namen "Enabled" geben kann.
Den Wert kann man auf TRUE oder FALSE setzen:
Code: Alles auswählen
OPTION EXPLICIT
PRIVATE CONST MENURESOURCE = "private:resource/menubar/menubar"
SUB test()
REM Ein Eintrag muß mit Extra->Anpassen in der Menüleiste
REM erzeugt werden.
REM Das Popup befindet sich am Index 9 der Menubar (letzter Eintrag?)
REM Es hat min. 2 Einträge
setItemEnabled (9, 1, TRUE)
END SUB
SUB setItemEnabled (BYVAL PopupIx AS INTEGER, _
BYVAL ItemIx AS INTEGER, _
BYVAL Enable AS BOOLEAN)_
DIM DocCfgMng AS OBJECT
DIM Settings AS OBJECT
DIM ItemContainer AS OBJECT
DIM Item() AS OBJECT
DIM Prop AS NEW com.sun.star.beans.PropertyValue
DIM i AS INTEGER
DIM Exist AS BOOLEAN
DocCfgMng = ThisComponent.getUIConfigurationManager ()
IF DocCfgMng.hasSettings (MENURESOURCE) THEN
Settings = DocCfgMng.getSettings (MENURESOURCE, TRUE)
ItemContainer = getItemContainer (PopupIx, Settings)
Item = ItemContainer.getByIndex (ItemIx)
REM Poperty "Enabled" suchen
FOR i = 0 TO uBound (Item)
IF Item(i).Name = "Enabled" THEN
Item(i).Value = Enable
Exist = TRUE
EXIT FOR
END IF
NEXT
REM Property "Enabled" nicht vorhanden
IF NOT Exist THEN
REDIM PRESERVE Item(uBound(Item) + 1)
Prop.Name = "Enabled"
Prop.Value = Enable
Item(uBound(Item)) = Prop
END IF
ItemContainer.replaceByIndex (ItemIx, Item)
DocCfgMng.replaceSettings (MENURESOURCE, Settings)
END IF
END SUB
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