🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Menüeintrag inaktivieren (2 x gelöst)

Alles zur Programmierung im LibreOffice.
Antworten
Koto
Beiträge: 19
Registriert: Do 30. Aug 2012, 17:05

Menüeintrag inaktivieren (2 x gelöst)

Beitrag von Koto » Fr 22. Nov 2013, 16:32

Hallo,
folgendes Problem:
Ich habe mit Menü Extras -> Anpassen ein Menü mit zwei Eintragen erzeugt. Ich möchte, dass Eintrag1 aktiv ist, solange Eintrag2 inaktiv bleibt. Klicke ich auf Eintrag2, wird es aktiv und Eintrag1 inaktiv. Vergleichbar mit Datei -> Speichern, wenn ich schon gespeichert habe; es ist noch "visible", aber inaktiv.

Mit

Code: Alles auswählen

FUNCTION Texyl_switchMenuitem (BYVAL NameMenu AS STRING, _
						   BYVAL Itemname AS STRING, _
						   Value AS BOOLEAN) AS BOOLEAN
	DIM CfgMgrSupplier AS OBJECT
	DIM CfgMgr AS OBJECT
	DIM MenuBarSettings AS OBJECT
	DIM PopupMenu AS OBJECT ''Container des Menüpunktes
	DIM ThisPopupMenu AS OBJECT
	DIM MenuItem AS OBJECT
	DIM TexylMenu AS OBJECT
	DIM TESTO AS Object
	DIM i AS INTEGER
	
	CfgMgr = ThisComponent.UIConfigurationManager
	MenuBarSettings = CfgMgr.getSettings( "private:resource/menubar/menubar", true )
	
	REM Menü finden
	FOR i = 0 TO MenuBarSettings.Count
		PopupMenu = MenuBarSettings.getByIndex (i)
		
		IF PopupMenu(3).Value = Texyl_MENU THEN
			EXIT FOR
		END IF
	NEXT
	
	REM Item finden
	ThisPopupMenu = PopupMenu(2).Value
	FOR i = 0 TO ThisPopupMenu.Count
		MenuItem = ThisPopupMenu.getByIndex(i)
		
		IF MenuItem(3).Value = Itemname THEN
			EXIT FOR
		END IF
	NEXT
	
        REM oder auch
	TESTO = CfgMgr.getUIElementsInfo ("UNKNOWN")
	TexylMenu = CfgMgr.getSettings( TESTO(0)(0).Value, true )
END FUNCTION
erhalte ich zunächst, was ich suche. Ich finde aber nichts, womit ich ein Item mit irgendein "enable" auf false oder true setzen könnte. Da blicke ich durch UNO oderwasauchimmer nicht durch. Bei eigenen Dialogen ist es einfach zu machen. Diese Eigenschaft sollte es doch auch für Menuitems geben, die ich mit Libreoffice selbst erzeugt habe.

Ich danke schonmal für alle Tipps und Tricks

Löse das jetzt so:

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
Zuletzt geändert von Koto am Sa 4. Jan 2014, 13:14, insgesamt 3-mal geändert.

Koto
Beiträge: 19
Registriert: Do 30. Aug 2012, 17:05

Re: Menüeintrag inaktivieren

Beitrag von Koto » So 24. Nov 2013, 09:10

Also antworte ich mir halt selber.

Das Problem ist nach einigen Tagen intensiver Suche gelöst.

Code: Alles auswählen

'* @brief Aktiviert oder Deaktiviert einen Eintrag eines Menüs
'*
'* Aus dem Controller der Komponente wird der Layoutmanager der
'* Komponente geladen. Mit diesem kann das Element \c Menubar
'* über die ResourceURL \c private:resource/menubar/menubar gefunden
'* werden.
'* 
'* Dies enthält den Verweis auf das Interface \c XMenuBar aus
'* "::com::sun::star::awt:: ", das mit dem Interface XMenu die
'* Methoden zur Verfügung stellt, die Menubar zu manipulieren.
'* s. http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/XMenu.html.
'*
'* Mit deren Hilfe angelt man sich zum gesuchten PopupMenu, um das
'* Interface \c XPopupMenu zu erhalten, das ebenfalls auf XMenu aufbaut.
'* s. http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/XPopupMenu.html
'* Es kann also auf gleiche Weise nach dem Menüeintrag gesucht werden, um ihn
'* wie gewünscht zu schalten
'*
'! @author Klaus Bergles
'! @version Die wirklich erste Version
'! @date 24.11.2013
'! @copyright GNU General Public License
'! @copyright Deutsche Übersetzung:
'! @copyright http://www.gnu.de/documents/gpl.de.html
'! @copyright English:
'! @copyright http://www.gnu.org/licenses/gpl-3.0.html
'*
'* @param MenuName Der Title des gesuchten Menüpunts. Er kann eine
'* Tilde enthalten, die im Menü als Unterstrich zu erkennen ist.
'* @param Itemname Das Menuitem, dessen Zustand geändert werden soll.
'* Es kann eine Tilde enthalten, die im Menü als Unterstrich zu
'* erkennen ist.
'* @param Enable
'* - \b TRUE Das Item ist sichtbar und wird aktiv
'* - \b FALSE Das Item ist sichtbar und wird inaktiv
SUB Texyl_switchMenuitem (BYVAL MenuName AS STRING, _
						   BYVAL Itemname AS STRING, _
						   Enable AS BOOLEAN) _
						   AS BOOLEAN
	DIM DocFrame AS OBJECT
	DIM MenuRes AS OBJECT
	DIM LayoutManager AS OBJECT
	DIM Menubar AS OBJECT
	DIM Popup AS OBJECT
	DIM ItemId AS INTEGER
	DIM iString AS STRING
	DIM i AS INTEGER
	
	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 ()
		ItemId = MenuBar.getItemId (i)
		iString = MenuBar.getItemText (ItemId)
		
		IF iString = MenuName THEN
			EXIT FOR
		END IF
	NEXT
	Popup = MenuBar.getPopupMenu (ItemId)
	
	REM Endlich die einzelnen Items durchsuchen
	FOR i = 0 TO Popup.getItemCount()
		ItemId = Popup.getItemId (i)
		iString = Popup.getItemText (ItemId)
		
		IF inStr (iString, Itemname) > 0 THEN
			EXIT FOR
		END IF
	NEXT
	
	REM und umschalten
	Popup.enableItem (ItemId, Enable)
END SUB



An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten