Page 1 of 1

Modern Menu 1st try

Posted: Tue May 09, 2023 2:36 pm
by Mesa
This is a try to create a menu with the Stargate' TabBar Gadget.
I've modify a little his code.

A little buggy, MS WIndows only but it's possible.

M.

Code: Select all

;---> First attempt to create a menu with a TabBarGadget


;|-------------------------------------------------------------------------------------------------
;|
;|  Title            : TabBarGadget
;|  Version          : 'kenmo-mods' fork based off v1.5 Beta 2a
;|  Copyright        : UnionBytes
;|                     (Martin Guttmann alias STARGÅTE)
;|  PureBasic        : 5.20+
;|  String Format    : Ascii, Unicode
;|  Operating System : Windows, Linux, MacOS
;|  Processor        : x86, x64
;|
;|-------------------------------------------------------------------------------------------------
;|
;|  Description      : Gadget for displaying and using tabs like in the browser
;|
;|  Forum Topic      : http://www.purebasic.fr/german/viewtopic.php?f=8&t=24788
;|                     http://www.purebasic.fr/english/viewtopic.php?f=12&t=47588
;|  Website          : https://www.unionbytes.de/libs/tabbargadget/
;|
;|  Documentation    : http://help.unionbytes.de/tbg/
;|
;|	Added theme color by Mesa
;|
;|-------------------------------------------------------------------------------------------------




CompilerIf #PB_Compiler_IsMainFile
	EnableExplicit
CompilerEndIf



;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;-  1. Constants / Konstanten
;|__________________________________________________________________________________________________



; Attribute für das TabBarGadget
Enumeration
	#TabBarGadget_None                 = 0<<0
	#TabBarGadget_CloseButton          = 1<<0
	#TabBarGadget_NewTab               = 1<<1
	#TabBarGadget_TextCutting          = 1<<2
	#TabBarGadget_MirroredTabs         = 1<<3
	#TabBarGadget_Vertical             = 1<<4
	#TabBarGadget_NoTabMoving          = 1<<5
	#TabBarGadget_MultiLine            = 1<<6
	#TabBarGadget_BottomLine           = 1<<7
	#TabBarGadget_PopupButton          = 1<<8
	#TabBarGadget_Editable             = 1<<9
	#TabBarGadget_MultiSelect          = 1<<10
	#TabBarGadget_CheckBox             = 1<<11
	#TabBarGadget_SelectedCloseButton  = 1<<12
	#TabBarGadget_ReverseOrdering      = 1<<13
	#TabBarGadget_ImageSize            = 1<<23
	#TabBarGadget_TabTextAlignment     = 1<<24
	#TabBarGadget_ScrollPosition       = 1<<25
	#TabBarGadget_NormalTabLength      = 1<<26 ; für Später
	#TabBarGadget_MaxTabLength         = 1<<27
	#TabBarGadget_MinTabLength         = 1<<28
	#TabBarGadget_TabRounding          = 1<<29
EndEnumeration

; Global attributes for all TabBarGadgets
Enumeration
	#TabBarGadgetGlobal_WheelDirection   = 1 << 0
	#TabBarGadgetGlobal_WheelAction      = 1 << 1
	#TabBarGadgetGlobal_DrawDisabled     = 1 << 2
	#TabBarGadgetGlobal_MiddleClickClose = 1 << 3
	#TabBarGadgetGlobal_DoubleClickNew   = 1 << 4
	#TabBarGadgetGlobal_TabBarColor      = 1 << 5
	#TabBarGadgetGlobal_BorderColor      = 1 << 6
	#TabBarGadgetGlobal_FaceColor        = 1 << 7
	#TabBarGadgetGlobal_TextColor        = 1 << 8
EndEnumeration

; TabBarGadgetEvent
Enumeration #PB_EventType_FirstCustomValue
	#TabBarGadget_EventType_Pushed
	#TabBarGadget_EventType_Updated      ; Das Gadget hat sich aktualisiert (intern)
	#TabBarGadget_EventType_Change			 ; Der aktive Tab wurde geändert
	#TabBarGadget_EventType_Resize			 ; La taille de la barre a changé
	#TabBarGadget_EventType_NewItem			 ; un nouvel onglet est demandé
	#TabBarGadget_EventType_CloseItem		 ; ein Tab soll geschlossen werden
	#TabBarGadget_EventType_SwapItem		 ; der aktive Tab wurde verschoben
	#TabBarGadget_EventType_EditItem		 ; der Text einer Karte wurde geändert
	#TabBarGadget_EventType_CheckBox		 ; der Status der Checkbox hat sich geändert
	#TabBarGadget_EventType_PopupButton	 ; le bouton contextuel a été enfoncé 
	#TabBarGadget_EventType_DeSelected	 ; MESA
EndEnumeration




; Constantes de position pour les commandes "Item"
Enumeration
	#TabBarGadgetItem_None        = -1
	#TabBarGadgetItem_NewTab      = -2
	#TabBarGadgetItem_Selected    = -3
	#TabBarGadgetItem_Event       = -4
EndEnumeration

; constantes d'état
Enumeration
	#TabBarGadget_Disabled        = 1<<0
	#TabBarGadget_Selected        = 1<<1
	#TabBarGadget_Checked         = 1<<2
EndEnumeration

; constantes d'état
Enumeration
	#TabBarGadgetUpdate_Directly  = 0
	#TabBarGadgetUpdate_PostEvent = 1
EndEnumeration

; MouseWheel actions
Enumeration
	#TabBarGadgetWheelAction_None   = 0
	#TabBarGadgetWheelAction_Scroll = 1
	#TabBarGadgetWheelAction_Change = 2
EndEnumeration

#TabBarGadget_DefaultHeight     = 1

; Default colors
#TabBarGadgetColor_TabBarDefault = $D0D0D0
#TabBarGadgetColor_BorderDefault = $808080
#TabBarGadgetColor_FaceDefault   = $D0D0D0
#TabBarGadgetColor_TextDefault   = $000000


; Constante Interne
#TabBarGadget_PreviousArrow   = 1<<30
#TabBarGadget_NextArrow       = 1<<31
#TabBarGadgetItem_DisableFace = -1
#TabBarGadgetItem_NormalFace  = 0
#TabBarGadgetItem_HoverFace   = 1
#TabBarGadgetItem_ActiveFace  = 2
#TabBarGadgetItem_MoveFace    = 3

; Compile switch for extra safety - could affect callback performance!
CompilerIf Not Defined(TabBarGadget_EnableCallbackGadgetCheck, #PB_Constant)
	#TabBarGadget_EnableCallbackGadgetCheck = #False
CompilerEndIf

; Compile switch to use WinAPI for drawing clearer text
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
	CompilerIf Not Defined(TabBarGadget_EnableWinAPIText, #PB_Constant)
		#TabBarGadget_EnableWinAPIText = #True
	CompilerEndIf
CompilerElse
	#TabBarGadget_EnableWinAPIText = #False
CompilerEndIf



;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;-  2. Structures / Strukturen
;|__________________________________________________________________________________________________



; Entrée triée pour la troncation du texte
Structure TabBarGadgetSortedItem
	*Item.TabBarGadgetItem  ; Onglet
	Characters.i						; nombre de lettres
EndStructure

; Paramètres actuels une ligne d'onglet
Structure TabBarGadgetRow
	Length.i  ; Longueur actuelle d'une ligne
	Items.i		; Nombre actuel d'onglets
EndStructure

; Couleurs pour un item
Structure TabBarGadgetItemColor
	Text.i        ; couleur du texte
	Background.i	; Couleur de l'arrière plan
	FaceColorSelected.i 							;MESA
	TextColorSelected	.i							;MESA
	BorderColor.i											;MESA
EndStructure

; Emplacement et taille d'un onglet
Structure TabBarGadgetItemLayout
	X.i         ; X-Position
	Y.i					; Y-Position
	Width.i			; largeur (intérieure)
	Height.i		; hauteur (intérieure)
	PaddingX.i	; Grossissement (par exemple avec onglet actif)
	PaddingY.i	;
	CrossX.i		; Position des X fermeture
	CrossY.i		;
	TextX.i			; Textposition
	TextY.i			;
	CheckX.i		; Checkbox-Position
	CheckY.i		;
	ImageX.i		; Icon-Position
	ImageY.i		;
EndStructure

; Onglet
Structure TabBarGadgetItem
	Text.s                                  ; Text
	ShortText.s															; verkürzter Text
	Color.TabBarGadgetItemColor							; Farbattribute
	Image.i																	; Bild (Kopie vom Original)
	DrawedImage.i														; Bild (Kopie ggf. rotiert)
	DataValue.i															; Benutzer-Daten-Wert
	Attributes.i														; Attribute
	Disabled.i															; Deaktiviert
	Selected.i															; Aktuell ausgewählt
	Checked.i																; Abgehakt
	ToolTip.s																; ToolTip
	Length.i																; Longueur en pixels (TEMP)
	Row.i																		; Zeile (TEMP)
	Position.i															; Position (TEMP)
	Visible.i																; Sichtbar und wird gezeichnet (TEMP)
	Face.i																	; Aussehen (TEMP)
	Layout.TabBarGadgetItemLayout						; Layout der Karte (TEMP)
	*PreviousSelectedItem.TabBarGadgetItem	; Zuvor ausgewählter Tab
EndStructure

; Tooltips
Structure TabBarGadgetToolTip
	*Current                         ; Adresse actuelle de l'info-bulle
	*Old														 ; Ancienne adresse d'info-bulle
	ItemText.s											 ; Texte de l'onglet
	NewText.s												 ; Texte pour l'onglet "Nouveau"
	CloseText.s											 ; Texte pour le bouton de fermeture
EndStructure




;   Texte pour le bouton de fermeture
; Onglet modifié
Structure TabBarGadgetEditor
	*Item.TabBarGadgetItem  ; Carte à modifier
	OldText.s								; Ancien texte avant modification
	Cursor.i								; Cursor-Position
	Selection.i							; longueur du marqueur de texte
	Selectable.i						; Si le mouvement de la souris entraîne une surbrillance du texte
EndStructure

; Layout der Leiste
Structure TabBarGadgetLayout
	PreviousButtonX.i  ; Position de la flèche de navigation "retour"
	PreviousButtonY.i
	NextButtonX.i  ; Position "avant" de la flèche de navigation 
	NextButtonY.i
	PopupButtonX.i ; Position de la flèche popup
	PopupButtonY.i
	ButtonWidth.i  ; taille des boutons
	ButtonHeight.i
	ButtonSize.i
EndStructure

; Registerkartenleiste
Structure TabBarGadget
	Number.i                          ; #Nummer
	Window.i													; Fenster-Nummer
	FontID.i													; Schrift
	DataValue.i												; Benutzer-Daten-Wert
	Attributes.i											; Attribute
	List    Item.TabBarGadgetItem()		; Registerkarten
	NewTabItem.TabBarGadgetItem				; "Neu"-Registerkarte
	*SelectedItem.TabBarGadgetItem		; ausgewählte Registerkarte
	*MoveItem.TabBarGadgetItem				; bewegte Registerkarte
	*HoverItem.TabBarGadgetItem				; hervorgehobene Registerkarte
	HoverClose.i											; Schließenbutton hervorgehoben
	HoverCheck.i											; Checkbox hervorgehoben
	HoverArrow.i											; Navigationbutton hervorgehoben
	*ReadyToMoveItem.TabBarGadgetItem	; Registerkarte die bereit ist bewegt zu werden
	*LockedItem.TabBarGadgetItem			; Registerkarte angeschlagen wurde (für Klicks)
	LockedClose.i											; Schließenbutton angeschlagen
	LockedCheck.i											; Schließenbutton angeschlagen
	LockedArrow.i											; Navigationsbutton angeschlagen
	SaveMouseX.i											; position de la souris enregistrée
	SaveMouseY.i											; position de la souris enregistrée
	MouseX.i													; X-Mausposition
	MouseY.i													; Y-Mausposition
	Event.i														; dernier événement
	EventTab.i												; Position de l'onglet où le dernier événement était
	Shift.i														; déplacement de la barre
	LastShift.i												; Maximale sinnvolle Verschiebung
	FocusingSelectedTab.i							; l'onglet sélectionné doit avoir le focus
	MaxLength.i												; maximal nutzbare Länge für Karten
	Length.i													; Longueur de toutes les cartes visibles
	Radius.i													; Radius der Kartenrundung
	MinTabLength.i										; minimale Länge einer Karte
	MaxTabLength.i										; maximale Länge einer Karte
	NormalTabLength.i									; normale Länge einer Karte
	TabTextAlignment.i								; Alignement du texte 
	ToolTip.TabBarGadgetToolTip				; ToolTip
	TabSize.i													; Größer einer Registerkarte
	Rows.i														; Anzahl der Zeilen
	Resized.i													; Das Gadget muss vergrößert werden
	Editor.TabBarGadgetEditor					; Editor für eine Karte
	Layout.TabBarGadgetLayout					; Disposition des barres
	UpdatePosted.i										; Mise à jour PostEvent #True
	CompilerIf #TabBarGadget_EnableWinAPIText
		DrawingID.i                     ; Drawing handle for API text drawing
		PrevFont.i											; Store previous font handle to restore
		DrawRect.RECT										; Allocate a RECT struct for WinAPI
	CompilerEndIf
	TabBarColor.i 										;MESA
	BorderColor.i											;MESA
	FaceColor.i												;MESA
	TextColor.i												;MESA
	FaceColorSelected.i								;MESA
	TextColorSelected	.i							;MESA
	MenuIsOpen.i											;MESA
EndStructure

; Timer für das kontinuierliche Scrollen
Structure TabBarGadget_Timer
	*TabBarGadget.TabBarGadget  ; TabBarGadget-ID
	Type.i											; Modus (Scrollen)
	Mutex.i											; Mutex zur Sicherung
EndStructure

; Include für das Registerkartenleisten-Gadget
Structure TabBarGadgetInclude
	;   TabBarColor.i                   ; Hintergrundfarbe des Gadgets
	;   FaceColor.i                     ; Hintergrundfarbe einer Karte
	HoverColorPlus.i                ; Farbänderung für den Hover-Effekt
	ActivColorPlus.i								; Farbänderung für aktuell ausgewählte Karten
	BorderColor.i										; Rahmenfarbe
	TextColor.i											; Textfarbe
	PaddingX.i											; Remplissage (texte à encadrer)
	PaddingY.i											; Remplissage (texte à encadrer)
	Margin.i												; Marge (en bordure du gadget)
	ImageSpace.i										; Espace libre entre l'image et le texte
	CloseButtonSize.i								; Taille de la croix fermer
	CheckBoxSize.i
	ImageSize.i
	ArrowSize.i                     ; Taille de la flèche de navigation
	ArrowWidth.i										;
	ArrowHeight.i										;
	Radius.i												; Radius der Abrundung der Karte
	MinTabLength.i									; Mimimale Länge einer Karte
	MaxTabLength.i									; Maximale Länge einer Karte
	TabTextAlignment.i
	VerticalTextBugFix.f
	NormalTabLength.i               ; [für später]
	FadeOut.i												; Länge der Farbausblendung bei einer Navigation
	WheelDirection.i								; Scrollrichtung bei Mausradbewegung
	WheelAction.i										; Action for MouseWheel events
	RowDirection.i									; Reihenfolge der Zeilen
	EnableDoubleClickForNewTab.i		; Doppelklick ins "Leere" erzeigt ein Ereignis
	EnableMiddleClickForCloseTab.i	; Mittelklick auf eine Karte erzeigt ein Ereignis
	Timer.TabBarGadget_Timer				; Timer für das kontinuierliche Scrollen
	DefaultFontID.i									; System default font ID
	DrawDisabled.i									; Disable redraw for batch tab changes
EndStructure





;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;-  3. Initializations / Initialisierungen
;|__________________________________________________________________________________________________



Global TabBarGadgetInclude.TabBarGadgetInclude
Declare TabBarGadget_Timer(Null.i)

; Ces valeurs peuvent ensuite être modifiées dans l'include ainsi que dans le code principal via TabBarGadgetInclude\Field. 
With TabBarGadgetInclude
	CompilerSelect #PB_Compiler_OS
		CompilerCase #PB_OS_Windows
			;       \TabBarColor   = $FF<<24 | GetSysColor_(#COLOR_BTNFACE)
			;       \BorderColor   = $FF<<24 | GetSysColor_(#COLOR_3DSHADOW)
			;       \FaceColor     = $FF<<24 | GetSysColor_(#COLOR_BTNFACE)
			;       \TextColor     = $FF<<24 | GetSysColor_(#COLOR_BTNTEXT)
		CompilerDefault
			;       \TabBarColor   = $FF<<24 | #TabBarGadgetColor_TabBarDefault
			;       \BorderColor   = $FF<<24 | #TabBarGadgetColor_BorderDefault
			;       \FaceColor     = $FF<<24 | #TabBarGadgetColor_FaceDefault
			;       \TextColor     = $FF<<24 | #TabBarGadgetColor_TextDefault
	CompilerEndSelect
	\HoverColorPlus               = $FF101010
	\ActivColorPlus               = $FF101010
	\PaddingX                     = 6  ; Space from tab border to text
	\PaddingY                     = 5	 ; Space from tab border to text
	\Margin                       = 0	 ; Space from tab to border
	\ImageSpace                   = 3	 ; Space from image zu text
	\ImageSize                    = 16
	\CloseButtonSize              = 13 ; Size of the close cross
	\CheckBoxSize                 = 10
	\ArrowSize                    = 5  ; Size of the Arrow in the button in navigation
	\ArrowWidth                   = 12 ; Width of the Arrow-Button in navigation
	\ArrowHeight                  = 18 ; Height of the Arrow-Button in navigation
	\Radius                       = 0	 ; Radius of the edge of the tab
	\TabTextAlignment             = -1
	\VerticalTextBugFix           = 1.05
	\MinTabLength                 = 0
	\MaxTabLength                 = 10000
	\NormalTabLength              = 150
	\FadeOut                      = 32 ; Length of fade out to the navi
	\WheelDirection               = -1
	\WheelAction                  = #TabBarGadgetWheelAction_Change;#TabBarGadgetWheelAction_Scroll;#TabBarGadgetWheelAction_None
	\RowDirection                 = 1															 ; not used
	\EnableDoubleClickForNewTab   = #False												 ;#True;
	\EnableMiddleClickForCloseTab = #False												 ;#True;
	\Timer\Mutex                  = CreateMutex()
	CompilerIf #PB_Compiler_Thread
		CreateThread(@TabBarGadget_Timer(), #Null)
	CompilerEndIf
EndWith






;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;-  4. Procedures & Macros / Prozeduren & Makros
;|__________________________________________________________________________________________________



;-  4.1 Private procedures for internal calculations ! Not for use !
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

; StartDrawing() wrapper which saves handle for WinAPI drawing
Procedure.i TabBarGadget_StartDrawing(*TabBarGadget.TabBarGadget)
	;Update(*), Callback(), UpdateTabBarGadget(Gadget.i)
	CompilerIf #TabBarGadget_EnableWinAPIText
		With *TabBarGadget
			\DrawingID = StartDrawing(CanvasOutput(*TabBarGadget\Number))
			If \DrawingID
				\PrevFont = SelectObject_(\DrawingID, \FontID)
				\DrawRect\right  = OutputWidth()
				\DrawRect\bottom = OutputHeight()
				SetBkMode_(\DrawingID, #TRANSPARENT)
			EndIf
			ProcedureReturn \DrawingID
		EndWith
	CompilerElse
		ProcedureReturn StartDrawing(CanvasOutput(*TabBarGadget\Number))
	CompilerEndIf
EndProcedure

; StopDrawing() wrapper which clears handle for WinAPI drawing
Procedure.i TabBarGadget_StopDrawing(*TabBarGadget.TabBarGadget)
	;Update(*), Callback(),, UpdateTabBarGadget(Gadget.i)
	CompilerIf #TabBarGadget_EnableWinAPIText
		With *TabBarGadget
			If (\DrawingID)
				SelectObject_(\DrawingID, \PrevFont)
				\DrawingID = #Null
			EndIf
		EndWith
	CompilerEndIf
	StopDrawing()
EndProcedure

; DrawText() wrapper which uses Windows API if enabled
Procedure TabBarGadget_DrawText(*TabBarGadget.TabBarGadget, x.i, y.i, Text.s, Color.i)
	;1xDrawItem(*,*), Examine(*), 
	CompilerIf #TabBarGadget_EnableWinAPIText
		With *TabBarGadget
			\DrawRect\left = x
			\DrawRect\top  = y
			SetTextColor_(\DrawingID, Color & $00FFFFFF)
			DrawText_(\DrawingID, @Text, -1, @\DrawRect, #DT_NOPREFIX | #DT_SINGLELINE)
		EndWith
	CompilerElse
		DrawText(x, y, Text, Color)
	CompilerEndIf
EndProcedure


; Renvoie l'adresse (ID) de l'onglet.
; La position peut être une constante, une position ou un ID.
Procedure.i TabBarGadget_ItemID(*TabBarGadget.TabBarGadget, Position.i) 
	;ItemID(*), Examine(*)(wheel), AddTabBarGadgetItem()
	;,, TabBarGadgetItemID(G,),RemoveTabBarGadgetItem(G,),SetTabBarGadgetState(G,),SetTabBarGadgetItemAttribute(G,)
	;,, SetTabBarGadgetItemImage(G,), SetTabBarGadgetItemPosition(G,),SetTabBarGadgetItemState(G,)
	With *TabBarGadget
		
		Select Position
			Case #TabBarGadgetItem_Event
				ProcedureReturn TabBarGadget_ItemID(*TabBarGadget, \EventTab)
			Case #TabBarGadgetItem_Selected
				If \SelectedItem
					ChangeCurrentElement(\Item(), \SelectedItem)
					ProcedureReturn @\Item()
				Else
					ProcedureReturn #Null
				EndIf
			Case #TabBarGadgetItem_NewTab
				ProcedureReturn @\NewTabItem
			Case #TabBarGadgetItem_None
				ProcedureReturn #Null
			Default
				If Position >= 0 And Position < ListSize(\Item())
					ProcedureReturn SelectElement(\Item(), Position)
				ElseIf Position >= ListSize(\Item())
					ForEach \Item()
						If @\Item() = Position
							ProcedureReturn @\Item()
						EndIf
					Next
				EndIf
		EndSelect
		
	EndWith
	
EndProcedure



; Libère à nouveau les ressources d'un onglet.
Procedure TabBarGadget_ClearItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) 
	;RemoveItem(*,*)
	;,,FreeTabBarGadget(Gadget.i),ClearTabBarGadgetItems(Gadget.i)
	If *Item\Image
		FreeImage(*Item\Image)
	EndIf
	If *Item\DrawedImage
		FreeImage(*Item\DrawedImage)
	EndIf
	
EndProcedure



; Sélectionne l'onglet spécifié et met à jour la hiérarchie de sélection
Procedure TabBarGadget_SelectItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) 
	;RemoveItem(*,*),Examine(*)
	;,,SetTabBarGadgetState(G,),SetTabBarGadgetItemState(G,)
	If *TabBarGadget\Attributes & #TabBarGadget_MultiSelect = #False
		ForEach *TabBarGadget\Item()
			*TabBarGadget\Item()\Selected = #False
		Next
	EndIf
	If *Item
		*Item\Selected = #True
		If *Item <> *TabBarGadget\SelectedItem
			*Item\PreviousSelectedItem = *TabBarGadget\SelectedItem
		EndIf
		*TabBarGadget\FocusingSelectedTab = #True
	EndIf
	*TabBarGadget\SelectedItem = *Item
	
EndProcedure



; Désélectionne l'onglet spécifié et met à jour la hiérarchie de sélection
Procedure TabBarGadget_UnselectItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) ; Code OK
																																												;RemoveItem(*,*), Examine(*)
																																												;,,SetTabBarGadgetItemState(G,)
	If *item																																							;*
		*Item\Selected = #False
		ForEach *TabBarGadget\Item()
			If *TabBarGadget\Item()\PreviousSelectedItem = *Item
				If *Item\PreviousSelectedItem <> *TabBarGadget\Item()
					*TabBarGadget\Item()\PreviousSelectedItem = *Item\PreviousSelectedItem
				Else
					*TabBarGadget\Item()\PreviousSelectedItem = #Null
				EndIf
			EndIf
		Next
		If *TabBarGadget\SelectedItem = *Item ; La sélection doit être modifiée
			*TabBarGadget\SelectedItem = *Item\PreviousSelectedItem
			If *TabBarGadget\SelectedItem
				*TabBarGadget\SelectedItem\Selected = #True
			EndIf
		EndIf
	EndIf;*
EndProcedure



; Supprime l'onglet et met à jour la hiérarchie de sélection
Procedure TabBarGadget_RemoveItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) 
	;,,RemoveTabBarGadgetItem(G,)
	
	If *Item = #Null
		ProcedureReturn
	EndIf
	
	With *TabBarGadget
		If (\HoverItem = *Item)
			\HoverItem = #Null
		EndIf
		If (\HoverCheck = *Item)
			\HoverCheck = #Null
		EndIf
		If (\HoverClose = *Item)
			\HoverClose = #Null
		EndIf
		If (\LockedItem = *Item)
			\LockedItem = #Null
		EndIf
		If (\LockedCheck = *Item)
			\LockedCheck = #Null
		EndIf
		If (\LockedClose = *Item)
			\LockedClose = #Null
		EndIf
		If (\MoveItem = *Item)
			\MoveItem = #Null
		EndIf
		If (\ReadyToMoveItem = *Item)
			\ReadyToMoveItem = #Null
		EndIf
	EndWith
	
	TabBarGadget_ClearItem(*TabBarGadget, *Item)
	If *TabBarGadget\SelectedItem
		TabBarGadget_UnselectItem(*TabBarGadget, *Item)
		If *TabBarGadget\SelectedItem = #Null
			ChangeCurrentElement(*TabBarGadget\Item(), *Item)
			If NextElement(*TabBarGadget\Item())
				TabBarGadget_SelectItem(*TabBarGadget.TabBarGadget, *TabBarGadget\Item())
			ElseIf PreviousElement(*TabBarGadget\Item())
				TabBarGadget_SelectItem(*TabBarGadget.TabBarGadget, *TabBarGadget\Item())
			EndIf
		EndIf
	Else
		TabBarGadget_UnselectItem(*TabBarGadget, *Item)
	EndIf
	
	ChangeCurrentElement(*TabBarGadget\Item(), *Item)
	DeleteElement(*TabBarGadget\Item())
	
EndProcedure



; Renvoie #True si la souris est à l'intérieur du rectangle.
;   La largeur et la hauteur peuvent également être négatives.
Procedure.i TabBarGadget_MouseIn(*TabBarGadget.TabBarGadget, X.i, Y.i, Width.i, Height.i) 
	;Examine_Editor(*),Examine(*)
	
	With *TabBarGadget
		
		If Width  < 0 : X + Width  : Width  * -1 : EndIf
		If Height < 0 : Y + Height : Height * -1 : EndIf
		If \MouseX >= X And \MouseX < X+Width And \MouseY >= Y And \MouseY < Y+Height
			ProcedureReturn #True
		EndIf
		
	EndWith
	
EndProcedure



; ajout de couleur
Procedure.i TabBarGadget_ColorPlus(Color.i, Plus.i) 
	;DrawButton(),DrawItem(*, *)
	
	If Color&$FF + Plus&$FF < $FF
		Color + Plus&$FF
	Else
		Color | $FF
	EndIf
	If Color&$FF00 + Plus&$FF00 < $FF00
		Color + Plus&$FF00
	Else
		Color | $FF00
	EndIf
	If Color&$FF0000 + Plus&$FF0000 < $FF0000
		Color + Plus&$FF0000
	Else
		Color | $FF0000
	EndIf
	
	ProcedureReturn Color
	
EndProcedure



; Soustraction de couleur
Procedure.i TabBarGadget_ColorMinus(Color.i, Minus.i) ; Code OK
																											;DrawButton(),DrawItem(*, *)
	
	If Color&$FF - Minus&$FF > 0
		Color - Minus&$FF
	Else
		Color & $FFFFFF00
	EndIf
	If Color&$FF00 - Minus&$FF00 > 0
		Color - Minus&$FF00
	Else
		Color & $FFFF00FF
	EndIf
	If Color&$FF0000 - Minus&$FF0000 > 0
		Color - Minus&$FF0000
	Else
		Color & $FF00FFFF
	EndIf
	
	ProcedureReturn Color
	
EndProcedure



; Dessiner une croix (fermée)
Procedure TabBarGadget_DrawCross(X.i, Y.i, Size.i, Color.i) ; Code OK
																														;DrawItem(*, *)
	
	
	Protected Alpha.i = Alpha(Color)/4
	
	Line(X  , Y+1     , Size-1,  Size-1, Color&$FFFFFF|Alpha<<24)
	Line(X+1, Y       , Size-1,  Size-1, Color&$FFFFFF|Alpha<<24)
	Line(X  , Y+Size-2, Size-1, -Size+1, Color&$FFFFFF|Alpha<<24)
	Line(X+1, Y+Size-1, Size-1, -Size+1, Color&$FFFFFF|Alpha<<24)
	Line(X  , Y       , Size  ,  Size  , Color)
	Line(X  , Y+Size-1, Size  , -Size  , Color)
	
EndProcedure



; Dessine un bouton
Procedure TabBarGadget_DrawButton(X.i, Y.i, Width.i, Height.i, Type.i, Color, Vertical.i=#False) ; Code OK
																																																 ;DrawItem(*, *),Draw(*)
	
	If Type
		DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
		ResetGradientColors()
		If Type = 1
			GradientColor(0.0, TabBarGadget_ColorPlus(Color, $404040))
			GradientColor(0.5, Color)
			GradientColor(1.0, TabBarGadget_ColorMinus(Color, $404040))
		ElseIf Type = -1
			GradientColor(1.0, TabBarGadget_ColorPlus(Color, $404040))
			GradientColor(0.5, Color)
			GradientColor(0.0, TabBarGadget_ColorMinus(Color, $404040))
		EndIf
		If Vertical
			LinearGradient(X, Y, X+Width-1, Y)
			RoundBox(X, Y, Width, Height, 3, 3)
			DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
			RoundBox(X, Y, Width, Height, 3, 3, TabBarGadgetInclude\BorderColor&$FFFFFF|$80<<24)
		Else
			LinearGradient(X, Y, X, Y+Height-1)
			RoundBox(X, Y, Width, Height, 3, 3)
			DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
			RoundBox(X, Y, Width, Height, 3, 3, TabBarGadgetInclude\BorderColor&$FFFFFF|$80<<24)
		EndIf
		DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
	EndIf
	
EndProcedure



; Dessiner une flèche
Procedure TabBarGadget_DrawArrow(X.i, Y.i, Type.i, Color.i, Attributes.i=#Null) ; Code OK
																																								;Draw(*)
	
	Protected Index.i, Alpha.i = Alpha(Color)/4
	
	With TabBarGadgetInclude
		If Attributes & #TabBarGadget_Vertical
			If Attributes & #TabBarGadget_MirroredTabs
				Select Type
					Case #TabBarGadget_PopupButton
						X - \ArrowSize/2-1
						For Index = 1 To \ArrowSize
							Line(X+Index, Y-Index, 1, Index*2, Color)
						Next
						LineXY(X, Y-1, X+\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
				EndSelect
			Else
				Select Type
					Case #TabBarGadget_PopupButton
						X + \ArrowSize/2
						For Index = 1 To \ArrowSize
							Line(X-Index, Y-Index, 1, Index*2, Color)
						Next
						LineXY(X, Y-1, X-\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
				EndSelect
			EndIf
			If Attributes & #TabBarGadget_MirroredTabs XOr Attributes & #TabBarGadget_ReverseOrdering
				Select Type
					Case #TabBarGadget_PreviousArrow
						Y - \ArrowSize/2-1
						For Index = 1 To \ArrowSize
							Line(X-Index, Y+Index, Index*2, 1, Color)
						Next
						LineXY(X-1, Y, X-1-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
					Case #TabBarGadget_NextArrow
						Y + \ArrowSize/2
						For Index = 1 To \ArrowSize
							Line(X-Index, Y-Index, Index*2, 1, Color)
						Next
						LineXY(X-1, Y, X-1-\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
				EndSelect
			Else
				Select Type
					Case #TabBarGadget_PreviousArrow
						Y + \ArrowSize/2
						For Index = 1 To \ArrowSize
							Line(X-Index, Y-Index, Index*2, 1, Color)
						Next
						LineXY(X-1, Y, X-1-\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
					Case #TabBarGadget_NextArrow
						Y - \ArrowSize/2-1
						For Index = 1 To \ArrowSize
							Line(X-Index, Y+Index, Index*2, 1, Color)
						Next
						LineXY(X-1, Y, X-1-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
				EndSelect
			EndIf
		Else
			Select Type
				Case #TabBarGadget_PopupButton			
					Y + \ArrowSize/2
					For Index = 1 To \ArrowSize
						Line(X-Index, Y-Index, Index*2, 1, Color)
					Next
					LineXY(X-1, Y, X-1-\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
					LineXY(X, Y, X+\ArrowSize, Y-\ArrowSize, Color&$FFFFFF|Alpha<<24)
			EndSelect
			If Attributes & #TabBarGadget_ReverseOrdering
				Select Type
					Case #TabBarGadget_PreviousArrow
						X + \ArrowSize/2
						For Index = 1 To \ArrowSize
							Line(X-Index, Y-Index, 1, Index*2, Color)
						Next
						LineXY(X, Y-1, X-\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
					Case #TabBarGadget_NextArrow
						X - \ArrowSize/2-1
						For Index = 1 To \ArrowSize
							Line(X+Index, Y-Index, 1, Index*2, Color)
						Next
						LineXY(X, Y-1, X+\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
				EndSelect
			Else
				Select Type
					Case #TabBarGadget_PreviousArrow
						X - \ArrowSize/2-1
						For Index = 1 To \ArrowSize
							Line(X+Index, Y-Index, 1, Index*2, Color)
						Next
						LineXY(X, Y-1, X+\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X+\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
					Case #TabBarGadget_NextArrow
						X + \ArrowSize/2
						For Index = 1 To \ArrowSize
							Line(X-Index, Y-Index, 1, Index*2, Color)
						Next
						LineXY(X, Y-1, X-\ArrowSize, Y-1-\ArrowSize, Color&$FFFFFF|Alpha<<24)
						LineXY(X, Y, X-\ArrowSize, Y+\ArrowSize, Color&$FFFFFF|Alpha<<24)
				EndSelect
			EndIf
		EndIf
	EndWith
	
EndProcedure



; Renvoie la longueur de l'item.
Procedure.i TabBarGadget_ItemLength(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) ; Code OK
																																												;TextCutting(*),Update(*)
	
	
	Protected TextLength.i = TextWidth(*Item\ShortText)
	Protected Length.i = 2 * TabBarGadgetInclude\PaddingX
	Protected Characters.i, VerticalTextBugFix.f = 1.0
	
	If *TabBarGadget\Attributes & #TabBarGadget_Vertical
		TextLength * TabBarGadgetInclude\VerticalTextBugFix ; 5 % plus long en raison de l'inexactitude de TextWidth lors de la rotation
		VerticalTextBugFix = TabBarGadgetInclude\VerticalTextBugFix
	EndIf
	If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
		Length + TabBarGadgetInclude\CloseButtonSize-4 + TabBarGadgetInclude\ImageSpace
	EndIf
	If *Item\Attributes & #TabBarGadget_CheckBox
		Length + TabBarGadgetInclude\CheckBoxSize + TabBarGadgetInclude\ImageSpace
	EndIf
	If *Item\Image
		If *TabBarGadget\Attributes & #TabBarGadget_Vertical
			Length + ImageHeight(*Item\Image)
		Else
			Length + ImageWidth(*Item\Image)
		EndIf
		If *Item\ShortText
			Length + TabBarGadgetInclude\ImageSpace
		EndIf
	ElseIf *Item = *TabBarGadget\NewTabItem And *Item\Text = ""
		Length + 16
	EndIf
	If *Item <> *TabBarGadget\NewTabItem
		If TextLength+Length < *TabBarGadget\MinTabLength
			Length = *TabBarGadget\MinTabLength-TextLength
		EndIf
		If TextLength+Length > *TabBarGadget\MaxTabLength
			Characters = Len(*Item\Text)
			Repeat
				Characters - 1
				TextLength = TextWidth(Left(*Item\Text, Characters)+"..")*VerticalTextBugFix
			Until Characters = 1 Or TextLength+Length <= *TabBarGadget\MaxTabLength
			*Item\ShortText = Left(*Item\Text, Characters) + ".."
		EndIf
	EndIf
	
	ProcedureReturn TextLength + Length
	
EndProcedure



; Renvoie l'espace maximum disponible pour les onglets.
Procedure.i TabBarGadget_MaxLength(*TabBarGadget.TabBarGadget, WithNewTab.i=#True) ; Code OK
																																									 ;Update(*)
	
	
	Protected Length.i
	
	With *TabBarGadget
		If \Attributes & #TabBarGadget_Vertical
			Length = OutputHeight() - TabBarGadgetInclude\Margin*2
		Else
			Length = OutputWidth()  - TabBarGadgetInclude\Margin*2
		EndIf
		If \Attributes & #TabBarGadget_NewTab And WithNewTab
			Length - *TabBarGadget\NewTabItem\Length + 1
		EndIf
		If \Attributes & #TabBarGadget_PreviousArrow
			Length - TabBarGadgetInclude\ArrowWidth
		EndIf
		If \Attributes & #TabBarGadget_NextArrow
			Length - TabBarGadgetInclude\ArrowWidth
			If \Attributes & #TabBarGadget_NewTab
				Length - TabBarGadgetInclude\Margin
			EndIf
		EndIf
		If \Attributes & #TabBarGadget_PopupButton
			Length - TabBarGadgetInclude\ArrowHeight
		EndIf
	EndWith
	
	ProcedureReturn Length
	
EndProcedure



; Exécute le rognage du texte jusqu'à ce que tous les onglets tiennent dans la barre.
Procedure.i TabBarGadget_TextCutting(*TabBarGadget.TabBarGadget) ; Code OK
																																 ;Update(*)
	
	Protected NewList SortedItem.TabBarGadgetSortedItem()
	Protected *SortedItem.TabBarGadgetSortedItem
	Protected MaxLength.i = 1, Length.i
	
	With *TabBarGadget
		
		; Créez des entrées triées par longueur de texte (grand -> petit).
		ForEach \Item()
			\Item()\ShortText      = \Item()\Text
			\Item()\Length         = TabBarGadget_ItemLength(*TabBarGadget, @\Item())
			If *TabBarGadget\Editor\Item <> \Item()
				LastElement(SortedItem())
				*SortedItem            = AddElement(SortedItem())
				*SortedItem\Item       = @\Item()
				*SortedItem\Characters = Len(\Item()\Text)
				While PreviousElement(SortedItem()) And *SortedItem\Item\Length > SortedItem()\Item\Length
					SwapElements(SortedItem(), @SortedItem(), *SortedItem)
					ChangeCurrentElement(SortedItem(), *SortedItem)
				Wend
			EndIf
			MaxLength + \Item()\Length - 1
		Next
		
		; Effectuez le rognage du texte jusqu'à ce que tous les onglets tiennent dans la largeur maximale.
		While MaxLength > \MaxLength And FirstElement(SortedItem())
			*SortedItem = @SortedItem()
			If *SortedItem\Characters > 3 And *SortedItem\Item\Length > \MinTabLength
				*SortedItem\Characters - 1
				*SortedItem\Item\ShortText = Left(*SortedItem\Item\Text, *SortedItem\Characters)+".."
				Length = TabBarGadget_ItemLength(*TabBarGadget, *SortedItem\Item)
				MaxLength - (*SortedItem\Item\Length-Length)
				*SortedItem\Item\Length = Length
				While NextElement(SortedItem()) And *SortedItem\Item\Length < SortedItem()\Item\Length
					SwapElements(SortedItem(), @SortedItem(), *SortedItem)
					ChangeCurrentElement(SortedItem(), *SortedItem)
				Wend
			Else
				DeleteElement(SortedItem())
			EndIf
		Wend
		
	EndWith
	
	ProcedureReturn MaxLength
	
EndProcedure



; Fait pivoter l'image en fonction de l'orientation de la barre
Procedure TabBarGadget_RotateImage(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem) ; Code OK
																																											 ;ReplaceImage(*, *),DrawItem(*, *)	
																																											 ;,,SetTabBarGadgetAttribute(G,)	
	
	Protected LastX.i = ImageWidth(*Item\Image)-1
	Protected LastY.i = ImageHeight(*Item\Image)-1
	Protected Dim Pixel.l(LastX, LastY)
	Protected Y.i, X.i, RotatedImage.i
	
	If *Item\DrawedImage
		FreeImage(*Item\DrawedImage)
	EndIf
	
	If *TabBarGadget\Attributes & #TabBarGadget_Vertical
		If StartDrawing(ImageOutput(*Item\Image))
			DrawingMode(#PB_2DDrawing_AllChannels)
			For Y = 0 To LastY
				For X = 0 To LastX
					Pixel(X, Y) = Point(X, Y)
				Next
			Next
			StopDrawing()
		EndIf
		CompilerIf #PB_Compiler_Version >= 520
			*Item\DrawedImage = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32, #PB_Image_Transparent)
		CompilerElse
			*Item\DrawedImage = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32|#PB_Image_Transparent)
		CompilerEndIf
		If StartDrawing(ImageOutput(*Item\DrawedImage))
			DrawingMode(#PB_2DDrawing_AllChannels)
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				For Y = 0 To LastY
					For X = 0 To LastX
						Plot(LastY-Y, X, Pixel(X, Y))
					Next
				Next
			Else
				For Y = 0 To LastY
					For X = 0 To LastX
						Plot(Y, LastX-X, Pixel(X, Y))
					Next
				Next
			EndIf
			StopDrawing()
		EndIf
	Else
		*Item\DrawedImage = CopyImage(*Item\Image, #PB_Any)
	EndIf
	
EndProcedure



; (Re)définir une nouvelle icône pour l'onglet
Procedure TabBarGadget_ReplaceImage(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem, NewImageID.i=#Null) ; Code OK
																																																						;,,AddTabBarGadgetItem(G,),SetTabBarGadgetItemImage(G)
	
	
	If *Item\Image
		FreeImage(*Item\Image)
		*Item\Image = #Null
	EndIf
	If *Item\DrawedImage
		FreeImage(*Item\DrawedImage)
		*Item\DrawedImage = #Null
	EndIf
	If NewImageID
		CompilerIf #PB_Compiler_Version >= 520
			*Item\Image = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32, #PB_Image_Transparent)
		CompilerElse
			*Item\Image = CreateImage(#PB_Any, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize, 32|#PB_Image_Transparent)
		CompilerEndIf
		If StartDrawing(ImageOutput(*Item\Image))
			DrawingMode(#PB_2DDrawing_AlphaBlend)
			DrawImage(NewImageID, 0, 0, TabBarGadgetInclude\ImageSize, TabBarGadgetInclude\ImageSize)
			StopDrawing()
		EndIf
		TabBarGadget_RotateImage(*TabBarGadget, *Item)
	EndIf
	
EndProcedure



; Calcule la disposition d'un onglet
Procedure TabBarGadget_ItemLayout(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
	;Update(*)
	
	; 	\PaddingX                     = 6  ; Space from tab border to text
	; 	\PaddingY                     = 5	 ; Space from tab border to text
	; 	\Margin                       = 4	 ; Space from tab to border
	
	Protected TextAreaLength.i = *Item\Length - 2 * TabBarGadgetInclude\PaddingX
	Protected NextSelected.i, PreviousSelected.i
	
	PushListPosition(*TabBarGadget\Item())
	If *Item\Selected
		ChangeCurrentElement(*TabBarGadget\Item(), *Item)
		If NextElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
			NextSelected = #True
		EndIf
		ChangeCurrentElement(*TabBarGadget\Item(), *Item)
		If PreviousElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
			PreviousSelected = #True
		EndIf
	EndIf
	PopListPosition(*TabBarGadget\Item())
	
	With TabBarGadgetInclude
		
		If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
			TextAreaLength - (TabBarGadgetInclude\CloseButtonSize-4 + TabBarGadgetInclude\ImageSpace)
		EndIf
		If *Item\Attributes & #TabBarGadget_CheckBox
			TextAreaLength - (TabBarGadgetInclude\CheckBoxSize + TabBarGadgetInclude\ImageSpace)
		EndIf
		If *Item\Image
			If *TabBarGadget\Attributes & #TabBarGadget_Vertical
				TextAreaLength - (ImageHeight(*Item\Image)+TabBarGadgetInclude\ImageSpace)
			Else
				TextAreaLength - (ImageWidth(*Item\Image)+TabBarGadgetInclude\ImageSpace)
			EndIf
		EndIf
		
		If *TabBarGadget\Attributes & #TabBarGadget_Vertical
			*Item\Layout\Height = *Item\Length
			*Item\Layout\Width  = *TabBarGadget\TabSize + 1
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				*Item\Layout\X      = *TabBarGadget\TabSize * *Item\Row; - 1
			Else
				*Item\Layout\X      = OutputWidth() - *TabBarGadget\TabSize * (*Item\Row+1)
			EndIf
			If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering XOr *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				*Item\Layout\Y    = *Item\Position
			Else
				*Item\Layout\Y    = OutputHeight() - *Item\Position - *Item\Length
			EndIf
			If *Item\Selected
				*Item\Layout\Width  + \Margin
				If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs = 0
					*Item\Layout\X    - \Margin
				EndIf
			EndIf
			*Item\Layout\PaddingX = \PaddingY
			*Item\Layout\PaddingY = \PaddingX
			*Item\Layout\CrossX = *Item\Layout\X + (*Item\Layout\Width-\CloseButtonSize)/2
			*Item\Layout\CheckX = *Item\Layout\X + (*Item\Layout\Width-\CheckBoxSize)/2
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				*Item\Layout\TextX  = *Item\Layout\X + (*Item\Layout\Width+TextHeight("|"))/2
			Else
				*Item\Layout\TextX  = *Item\Layout\X + (*Item\Layout\Width-TextHeight("|"))/2
			EndIf
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs XOr *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
				*Item\Layout\CrossY = *Item\Layout\Y + *Item\Layout\Height - (\CloseButtonSize-3) - *Item\Layout\PaddingY
				*Item\Layout\TextY = *Item\Layout\Y + *Item\Layout\PaddingY + (TextAreaLength-TextWidth(*Item\ShortText)*\VerticalTextBugFix) * (*TabBarGadget\TabTextAlignment+1)/2
				If *Item\Image
					*Item\Layout\ImageX = *Item\Layout\X + (*Item\Layout\Width-ImageWidth(*Item\Image))/2
					*Item\Layout\ImageY = *Item\Layout\Y + *Item\Layout\PaddingY
					*Item\Layout\TextY + ImageHeight(*Item\Image) + \ImageSpace
				EndIf
				If *Item\Attributes & #TabBarGadget_CheckBox
					*Item\Layout\TextY + \CheckBoxSize + \ImageSpace
				EndIf
				*Item\Layout\CheckY = *Item\Layout\TextY-\CheckBoxSize-\ImageSpace 
				If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering : *Item\Layout\TextY + TextWidth(*Item\ShortText)*\VerticalTextBugFix : EndIf
			Else
				*Item\Layout\CrossY = *Item\Layout\Y + (-3) + *Item\Layout\PaddingY
				*Item\Layout\TextY = *Item\Layout\Y + *Item\Layout\Height - *Item\Layout\PaddingY - (TextAreaLength-TextWidth(*Item\ShortText)*\VerticalTextBugFix) * (*TabBarGadget\TabTextAlignment+1)/2
				If *Item\Image
					*Item\Layout\ImageX = *Item\Layout\X + (*Item\Layout\Width-ImageWidth(*Item\Image))/2
					*Item\Layout\ImageY = *Item\Layout\Y + *Item\Layout\Height-ImageHeight(*Item\Image) - *Item\Layout\PaddingY
					*Item\Layout\TextY - ImageHeight(*Item\Image) - \ImageSpace
				EndIf
				If *Item\Attributes & #TabBarGadget_CheckBox
					*Item\Layout\TextY - \CheckBoxSize - \ImageSpace
				EndIf
				*Item\Layout\CheckY = *Item\Layout\TextY+\ImageSpace
				If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering : *Item\Layout\TextY - TextWidth(*Item\ShortText)*\VerticalTextBugFix : EndIf
			EndIf
			If *Item\Selected
				If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs XOr *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
					If PreviousSelected = #False
						*Item\Layout\Y - \Margin/2
						*Item\Layout\Height + \Margin/2
					EndIf
					If NextSelected = #False
						*Item\Layout\Height + \Margin/2
					EndIf
				Else
					If NextSelected = #False
						*Item\Layout\Y - \Margin/2
						*Item\Layout\Height + \Margin/2
					EndIf
					If PreviousSelected = #False
						*Item\Layout\Height + \Margin/2
					EndIf
				EndIf
			EndIf
		Else
			*Item\Layout\Width  = *Item\Length
			*Item\Layout\Height = *TabBarGadget\TabSize + 1
			If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
				*Item\Layout\X      = OutputWidth() - *Item\Position - *Item\Length
			Else
				*Item\Layout\X      = *Item\Position
			EndIf
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				*Item\Layout\Y      = *TabBarGadget\TabSize * *Item\Row; - 1
			Else
				*Item\Layout\Y      = OutputHeight() - *TabBarGadget\TabSize * (*Item\Row+1)
			EndIf
			If *Item\Selected
				*Item\Layout\Height + \Margin
				If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs = 0
					*Item\Layout\Y    - \Margin
				EndIf
			EndIf
			*Item\Layout\PaddingX = \PaddingX
			*Item\Layout\PaddingY = \PaddingY
			*Item\Layout\CrossY = *Item\Layout\Y + (*Item\Layout\Height-\CloseButtonSize)/2
			*Item\Layout\CheckY = *Item\Layout\Y + (*Item\Layout\Height-\CheckBoxSize)/2
			*Item\Layout\TextY  = *Item\Layout\Y + (*Item\Layout\Height-TextHeight("|"))/2
			If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
				*Item\Layout\CrossX = *Item\Layout\X + (-3) + *Item\Layout\PaddingX
				*Item\Layout\TextX = *Item\Layout\X + *Item\Layout\Width-TextWidth(*Item\ShortText) - *Item\Layout\PaddingX - (TextAreaLength-TextWidth(*Item\ShortText)) * (*TabBarGadget\TabTextAlignment+1)/2
				If *Item\Image
					*Item\Layout\ImageX = *Item\Layout\X + *Item\Layout\Width-ImageWidth(*Item\Image) - *Item\Layout\PaddingX
					*Item\Layout\ImageY = *Item\Layout\Y + (*Item\Layout\Height-ImageHeight(*Item\Image))/2
					*Item\Layout\TextX - ImageWidth(*Item\Image) - \ImageSpace
				EndIf
				If *Item\Attributes & #TabBarGadget_CheckBox
					*Item\Layout\TextX - \CheckBoxSize - \ImageSpace
				EndIf
				*Item\Layout\CheckX = *Item\Layout\TextX + TextWidth(*Item\ShortText) + \ImageSpace
			Else
				*Item\Layout\CrossX = *Item\Layout\X + *Item\Layout\Width - (\CloseButtonSize-3) - *Item\Layout\PaddingX
				*Item\Layout\TextX = *Item\Layout\X + *Item\Layout\PaddingX + (TextAreaLength-TextWidth(*Item\ShortText)) * (*TabBarGadget\TabTextAlignment+1)/2
				If *Item\Image
					*Item\Layout\ImageX = *Item\Layout\X + *Item\Layout\PaddingX
					*Item\Layout\ImageY = *Item\Layout\Y + (*Item\Layout\Height-ImageHeight(*Item\Image))/2
					*Item\Layout\TextX + ImageWidth(*Item\Image) + \ImageSpace
				EndIf
				If *Item\Attributes & #TabBarGadget_CheckBox
					*Item\Layout\TextX + \CheckBoxSize + \ImageSpace
				EndIf
				*Item\Layout\CheckX = *Item\Layout\TextX - \CheckBoxSize - \ImageSpace
			EndIf
			If *Item\Selected
				If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
					If NextSelected = #False
						*Item\Layout\X - \Margin/2
						*Item\Layout\Width + \Margin/2
					EndIf
					If PreviousSelected = #False
						*Item\Layout\Width + \Margin/2
					EndIf
				Else
					If PreviousSelected = #False
						*Item\Layout\X - \Margin/2
						*Item\Layout\Width + \Margin/2
					EndIf
					If NextSelected = #False
						*Item\Layout\Width + \Margin/2
					EndIf
				EndIf
			EndIf
		EndIf
		
	EndWith
	
EndProcedure



; Calcule la mise en page = Layout
Procedure TabBarGadget_Layout(*TabBarGadget.TabBarGadget)
	;1x Update(*)
	
	
	Protected Shift.i
	
	With TabBarGadgetInclude
		
		If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
			Shift = -TabBarGadgetInclude\Margin
		Else
			Shift = TabBarGadgetInclude\Margin
		EndIf
		
		If *TabBarGadget\Attributes & #TabBarGadget_Vertical
			*TabBarGadget\Layout\ButtonHeight = \ArrowWidth
			*TabBarGadget\Layout\ButtonWidth  = \ArrowHeight
			*TabBarGadget\Layout\ButtonSize   = \ArrowHeight
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs XOr *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
				If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
					*TabBarGadget\Layout\PopupButtonX = (OutputWidth()+Shift) / 2
					*TabBarGadget\Layout\PopupButtonY = OutputHeight() - *TabBarGadget\Layout\ButtonSize / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
					*TabBarGadget\Layout\PreviousButtonX = (OutputWidth()+Shift) / 2
					*TabBarGadget\Layout\PreviousButtonY = *TabBarGadget\Layout\ButtonHeight / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
					*TabBarGadget\Layout\NextButtonX = (OutputWidth()+Shift) / 2
					*TabBarGadget\Layout\NextButtonY = OutputHeight() - *TabBarGadget\Layout\ButtonHeight / 2
					If *TabBarGadget\Attributes & #TabBarGadget_NewTab
						*TabBarGadget\Layout\NextButtonY - *TabBarGadget\NewTabItem\Length-TabBarGadgetInclude\Margin
					EndIf
					If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
						*TabBarGadget\Layout\NextButtonY - *TabBarGadget\Layout\ButtonSize
					EndIf
				EndIf
			Else
				If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
					*TabBarGadget\Layout\PopupButtonX = (OutputWidth()+Shift) / 2
					*TabBarGadget\Layout\PopupButtonY = *TabBarGadget\Layout\ButtonSize / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
					*TabBarGadget\Layout\PreviousButtonX = (OutputWidth()+Shift) / 2
					*TabBarGadget\Layout\PreviousButtonY = OutputHeight() - *TabBarGadget\Layout\ButtonHeight / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
					*TabBarGadget\Layout\NextButtonX = (OutputWidth()+Shift) / 2
					*TabBarGadget\Layout\NextButtonY = *TabBarGadget\Layout\ButtonHeight / 2
					If *TabBarGadget\Attributes & #TabBarGadget_NewTab
						*TabBarGadget\Layout\NextButtonY + *TabBarGadget\NewTabItem\Length+TabBarGadgetInclude\Margin
					EndIf
					If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
						*TabBarGadget\Layout\NextButtonY + *TabBarGadget\Layout\ButtonSize
					EndIf
				EndIf
			EndIf
		Else
			*TabBarGadget\Layout\ButtonHeight = \ArrowHeight
			*TabBarGadget\Layout\ButtonWidth  = \ArrowWidth
			*TabBarGadget\Layout\ButtonSize   = \ArrowHeight
			If *TabBarGadget\Attributes & #TabBarGadget_ReverseOrdering
				If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
					*TabBarGadget\Layout\PopupButtonX = *TabBarGadget\Layout\ButtonSize / 2
					*TabBarGadget\Layout\PopupButtonY = (OutputHeight()+Shift) / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
					*TabBarGadget\Layout\PreviousButtonX = OutputWidth() - *TabBarGadget\Layout\ButtonWidth / 2
					*TabBarGadget\Layout\PreviousButtonY = (OutputHeight()+Shift) / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
					*TabBarGadget\Layout\NextButtonX = *TabBarGadget\Layout\ButtonWidth / 2
					*TabBarGadget\Layout\NextButtonY = (OutputHeight()+Shift) / 2
					If *TabBarGadget\Attributes & #TabBarGadget_NewTab
						*TabBarGadget\Layout\NextButtonX + *TabBarGadget\NewTabItem\Length+TabBarGadgetInclude\Margin
					EndIf
					If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
						*TabBarGadget\Layout\NextButtonX + *TabBarGadget\Layout\ButtonSize
					EndIf
				EndIf
			Else
				If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
					*TabBarGadget\Layout\PopupButtonX = OutputWidth() - *TabBarGadget\Layout\ButtonSize / 2
					*TabBarGadget\Layout\PopupButtonY = (OutputHeight()+Shift) / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_PreviousArrow
					*TabBarGadget\Layout\PreviousButtonX = *TabBarGadget\Layout\ButtonWidth / 2
					*TabBarGadget\Layout\PreviousButtonY = (OutputHeight()+Shift) / 2
				EndIf
				If *TabBarGadget\Attributes & #TabBarGadget_NextArrow
					*TabBarGadget\Layout\NextButtonX = OutputWidth() - *TabBarGadget\Layout\ButtonWidth / 2
					*TabBarGadget\Layout\NextButtonY = (OutputHeight()+Shift) / 2
					If *TabBarGadget\Attributes & #TabBarGadget_NewTab
						*TabBarGadget\Layout\NextButtonX - *TabBarGadget\NewTabItem\Length-TabBarGadgetInclude\Margin
					EndIf
					If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
						*TabBarGadget\Layout\NextButtonX - *TabBarGadget\Layout\ButtonSize
					EndIf
				EndIf
			EndIf
			
		EndIf
		
	EndWith
	
EndProcedure
; Dessiner un onglet
Procedure TabBarGadget_DrawItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
	;Draw(*)
	
	
	Protected X.i, Y.i, LayoutX.i, LayoutY.i, LayoutWidth.i, LayoutHeight.i, Padding.i
	Protected Color.i, Width.i, Height.i, Text.s, Len.i, Angle.i
	
	With TabBarGadgetInclude
		;     *item\Color\Text
		
		; Orientation de l'onglet
		If *TabBarGadget\Attributes & #TabBarGadget_Vertical
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				LayoutX = -*TabBarGadget\Radius-1
			EndIf
			LayoutWidth = *TabBarGadget\Radius
		Else
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				LayoutY = -*TabBarGadget\Radius-1
			EndIf
			LayoutHeight = *TabBarGadget\Radius
		EndIf
		
		; Regarder
		ResetGradientColors()
		If *TabBarGadget\Attributes & #TabBarGadget_Vertical
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				LinearGradient(*Item\Layout\X+*Item\Layout\Width-1, 0, *Item\Layout\X, 0)
			Else
				LinearGradient(*Item\Layout\X, 0, *Item\Layout\X+*Item\Layout\Width-1, 0)
			EndIf
		Else
			If #False ;*TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				LinearGradient(0, *Item\Layout\Y+*Item\Layout\Height-1, 0, *Item\Layout\Y)
			Else
				LinearGradient(0, *Item\Layout\Y, 0, *Item\Layout\Y+*Item\Layout\Height-1)
			EndIf
		EndIf
		Select *Item\Face
			Case #TabBarGadgetItem_MoveFace
				;*Item\Color\Text= *TabBarGadget\TextColor;MESA
				;Color = TabBarGadget_ColorPlus(*Item\Color\Background, \ActivColorPlus)
				; 				Color =*Item\Color\FaceColorSelected
				Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \ActivColorPlus);MESA
				GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF101010)&$FFFFFF|$C0<<24)
				GradientColor(0.5, Color&$FFFFFF|$C0<<24)
				GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF101010)&$FFFFFF|$C0<<24)
			Case #TabBarGadgetItem_DisableFace
				GradientColor(0.0, TabBarGadget_ColorPlus(*Item\Color\Background, $FF202020)&$FFFFFF|$80<<24)
				GradientColor(0.5, *Item\Color\Background&$FFFFFF|$80<<24)
				GradientColor(0.6, TabBarGadget_ColorMinus(*Item\Color\Background, $FF101010)&$FFFFFF|$80<<24)
				GradientColor(1.0, TabBarGadget_ColorMinus(*Item\Color\Background, $FF303030)&$FFFFFF|$80<<24)
			Case #TabBarGadgetItem_NormalFace
				; 				*Item\Color\BorderColor= *TabBarGadget\BorderColor										;MESA
				*Item\Color\Text= *TabBarGadget\TextColor;MESA
				GradientColor(0.0, TabBarGadget_ColorPlus(*Item\Color\Background, $FF202020))
				GradientColor(0.5, *Item\Color\Background)
				GradientColor(0.6, TabBarGadget_ColorMinus(*Item\Color\Background, $FF101010))
				GradientColor(1.0, TabBarGadget_ColorMinus(*Item\Color\Background, $FF303030))
				;-Examine................
			Case #TabBarGadgetItem_HoverFace
				; 				*Item\Color\BorderColor= *TabBarGadget\BorderColor										;MESA
				;Color = TabBarGadget_ColorPlus(*Item\Color\Background, \HoverColorPlus)
				Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \HoverColorPlus);MESA
				*Item\Color\Text= *TabBarGadget\TextColorSelected															;MESA;
				GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF202020))
				GradientColor(0.5, Color)
				GradientColor(0.6, TabBarGadget_ColorMinus(Color, $FF101010))
				GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF303030))
			Case #TabBarGadgetItem_ActiveFace
				Color = TabBarGadget_ColorPlus(*Item\Color\Background, \ActivColorPlus)
				Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \ActivColorPlus);MESA
				GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF101010))
				GradientColor(0.5, Color)
				GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF303030))
				
		EndSelect
		
		;     ; andere ausgewählte Nachbarn = autres voisins sélectionnés
		;     If *Item <> *TabBarGadget\NewTabItem And *Item\Selected
		;       PushListPosition(*TabBarGadget\Item())
		;       ChangeCurrentElement(*TabBarGadget\Item(), *Item)
		;       If NextElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
		;         LayoutWidth - \Margin/2
		;       EndIf
		;       ChangeCurrentElement(*TabBarGadget\Item(), *Item)
		;       If PreviousElement(*TabBarGadget\Item()) And *TabBarGadget\Item()\Selected
		;         LayoutX     + \Margin/2
		;         LayoutWidth - \Margin/2
		;       EndIf
		;       PopListPosition(*TabBarGadget\Item())
		;     EndIf
		
		;  Dessin Onglet
		DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
		RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius)
		DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
		If *Item\Disabled
			RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius, *TabBarGadget\BorderColor&$FFFFFF|$80<<24);mesa
		Else
			RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius, *TabBarGadget\BorderColor);mesa 
		EndIf
		DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
		
		If *TabBarGadget\Attributes & #TabBarGadget_Vertical
			Angle = 90 + 180*Bool(*TabBarGadget\Attributes&#TabBarGadget_MirroredTabs)
			If *Item\Image
				If *Item\DrawedImage = #Null
					*Item\DrawedImage = TabBarGadget_RotateImage(*Item\Image, Angle)
				EndIf
				If *Item\Disabled
					DrawAlphaImage(ImageID(*Item\DrawedImage), *Item\Layout\ImageX, *Item\Layout\ImageY, $40)
				Else
					DrawAlphaImage(ImageID(*Item\DrawedImage), *Item\Layout\ImageX, *Item\Layout\ImageY, $FF)
				EndIf
			EndIf
			If *Item\Disabled
				DrawRotatedText(*Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, Angle, *Item\Color\Text&$FFFFFF|$40<<24)
			Else
				DrawRotatedText(*Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, Angle, *Item\Color\Text)
			EndIf
		Else
			If *Item\Image
				If *Item\Disabled
					DrawAlphaImage(ImageID(*Item\Image), *Item\Layout\ImageX, *Item\Layout\ImageY, $40)
				Else
					DrawAlphaImage(ImageID(*Item\Image), *Item\Layout\ImageX, *Item\Layout\ImageY, $FF)
				EndIf
			EndIf
			If *Item\Disabled
				DrawText(*Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, *Item\Color\Text&$FFFFFF|$40<<24)
			Else
				TabBarGadget_DrawText(*TabBarGadget, *Item\Layout\TextX, *Item\Layout\TextY, *Item\ShortText, *Item\Color\Text)
				If *TabBarGadget\Editor\Item = *Item
					DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_XOr)
					If *TabBarGadget\Editor\Selection < 0
						LayoutX = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor+*TabBarGadget\Editor\Selection))-1
						LayoutWidth = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor)) - LayoutX
						Box(*Item\Layout\TextX+LayoutX, *Item\Layout\TextY, LayoutWidth, TextHeight("|"))
					Else
						LayoutX = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor))-1
						LayoutWidth = TextWidth(Left(*Item\Text, *TabBarGadget\Editor\Cursor+*TabBarGadget\Editor\Selection)) - LayoutX
						Box(*Item\Layout\TextX+LayoutX, *Item\Layout\TextY, LayoutWidth, TextHeight("|"))
					EndIf
					DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
				EndIf
			EndIf
		EndIf
			
		


Re: Modern Menu 1st try

Posted: Tue May 09, 2023 2:38 pm
by Mesa
Part2/3

Code: Select all

		
		; CheckBox
		If *Item\Attributes & #TabBarGadget_CheckBox
			DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
			If *TabBarGadget\HoverItem = *Item And *TabBarGadget\HoverCheck
				RoundBox(*Item\Layout\CheckX, *Item\Layout\CheckY, \CheckBoxSize, \CheckBoxSize, 2, 2, *Item\Color\Text); hover
			ElseIf *Item\Disabled
				RoundBox(*Item\Layout\CheckX, *Item\Layout\CheckY, \CheckBoxSize, \CheckBoxSize, 2, 2, *Item\Color\Text&$FFFFFF|$40<<24);;\BorderColor&$FFFFFF|$40<<24
			Else
				RoundBox(*Item\Layout\CheckX, *Item\Layout\CheckY, \CheckBoxSize, \CheckBoxSize, 2, 2, *Item\Color\Text&$FFFFFF|$40<<24);;\BorderColor
			EndIf
			If *Item\Checked
				DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
				LinearGradient(*Item\Layout\CheckX+2, *Item\Layout\CheckY+2, *Item\Layout\CheckX+\CheckBoxSize-2, *Item\Layout\CheckY+\CheckBoxSize-2)
				ResetGradientColors()
				If *Item\Disabled
					GradientColor(0, *Item\Color\Text&$FFFFFF|$20000000)
					GradientColor(0.5, *Item\Color\Text&$FFFFFF|$30000000)
					GradientColor(1, *Item\Color\Text&$FFFFFF|$20000000)
				Else
					GradientColor(0, *Item\Color\Text&$FFFFFF|$80000000)
					GradientColor(0.5, *Item\Color\Text&$FFFFFF|$C0000000)
					GradientColor(1, *Item\Color\Text&$FFFFFF|$80000000)
				EndIf
				Box(*Item\Layout\CheckX+2, *Item\Layout\CheckY+2, \CheckBoxSize-4, \CheckBoxSize-4)
			EndIf
			DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
		EndIf
		
		; bouton de fermeture
		If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
If *TabBarGadget\HoverItem = *Item And *TabBarGadget\HoverClose
				If *TabBarGadget\LockedClose And *TabBarGadget\LockedItem = *Item
					TabBarGadget_DrawButton(*Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, -1, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				Else
					TabBarGadget_DrawButton(*Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, 1, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				EndIf
			EndIf
			If *Item\Disabled
				TabBarGadget_DrawCross(*Item\Layout\CrossX+3, *Item\Layout\CrossY+3, \CloseButtonSize-6, *Item\Color\Text&$FFFFFF|$40<<24)
			Else
				TabBarGadget_DrawCross(*Item\Layout\CrossX+3, *Item\Layout\CrossY+3, \CloseButtonSize-6, *Item\Color\Text)
			EndIf
		EndIf
		
	EndWith
	
EndProcedure

; Gère les évènements lors de l'édition d'un onglet
Procedure TabBarGadget_Examine_Editor(*TabBarGadget.TabBarGadget)
	;1xExamine(*)
	
	
	Protected MinDistance.i, Distance.i, Index.i
	
	With *TabBarGadget
		
		If \Editor\Item	
			
			If TabBarGadget_MouseIn(*TabBarGadget, \Editor\Item\Layout\X, \Editor\Item\Layout\Y,  \Editor\Item\Layout\Width, \Editor\Item\Layout\Height)
				SetGadgetAttribute(\Number, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
			Else
				SetGadgetAttribute(\Number, #PB_Canvas_Cursor, #PB_Cursor_Default)
			EndIf
			
			Select EventType()
				Case #PB_EventType_LeftDoubleClick
					If \Editor\Item = \HoverItem
						\Editor\Cursor = 0
						\Editor\Selection = Len(\Editor\Item\Text)
						\Editor\Selectable = #False
					EndIf
				Case #PB_EventType_LeftButtonDown
					If \Editor\Item = \HoverItem
						\Editor\Cursor = 0
						\Editor\Selection = 0
						\Editor\Selectable = #True
						MinDistance = $FFFF
						For Index = Len(\Editor\Item\Text) To 0 Step -1
							Distance = Abs(\Editor\Item\Layout\TextX+TextWidth(Left(\Editor\Item\Text, Index))-\MouseX)
							If Distance < MinDistance
								\Editor\Cursor = Index
								MinDistance = Distance
							EndIf
						Next
					Else
						If \Editor\OldText <> \Editor\Item\Text
							ChangeCurrentElement(\Item(), \Editor\Item)
							PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_EditItem, ListIndex(\Item()))
						EndIf
						\Editor\Item = #Null
						ProcedureReturn #Null
					EndIf
				Case #PB_EventType_MouseMove
					
					If \Editor\Item = \HoverItem And \Editor\Selectable
						\Editor\Selection = 0
						MinDistance = $FFFF
						For Index = Len(\Editor\Item\Text) To 0 Step -1
							Distance = Abs(\Editor\Item\Layout\TextX+TextWidth(Left(\Editor\Item\Text, Index))-\MouseX)
							If Distance < MinDistance
								\Editor\Selection = Index-\Editor\Cursor
								MinDistance = Distance
							EndIf
						Next
					EndIf
				Case #PB_EventType_LeftButtonUp
					
					\Editor\Selectable = #False
				Case #PB_EventType_Input
					If \Editor\Selection > 0
						\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
						\Editor\Selection = 0
					ElseIf \Editor\Selection < 0
						\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
						\Editor\Cursor + \Editor\Selection
						\Editor\Selection = 0
					EndIf
					\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Chr(GetGadgetAttribute(\Number, #PB_Canvas_Input)) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
					\Editor\Item\ShortText = \Editor\Item\Text
					\Editor\Cursor + 1
				Case #PB_EventType_KeyDown
					Select GetGadgetAttribute(\Number, #PB_Canvas_Key)
						Case #PB_Shortcut_Return
							If \Editor\OldText <> \Editor\Item\Text
								ChangeCurrentElement(\Item(), \Editor\Item)
								PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_EditItem, ListIndex(\Item()))
							EndIf
							\Editor\Item = #Null
							ProcedureReturn #Null
						Case #PB_Shortcut_Escape
							\Editor\Item\Text = \Editor\OldText
							\Editor\Item\ShortText = \Editor\Item\Text
							\Editor\Item = #Null
							ProcedureReturn #Null
						Case #PB_Shortcut_Left
							If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Shift
								If \Editor\Cursor+\Editor\Selection > 0
									\Editor\Selection - 1
								EndIf
							Else
								\Editor\Selection = 0
								If \Editor\Cursor > 0
									\Editor\Cursor - 1
								EndIf
							EndIf
						Case #PB_Shortcut_Right
							If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Shift
								If \Editor\Cursor+\Editor\Selection < Len(\Editor\Item\Text)
									\Editor\Selection + 1
								EndIf
							Else
								\Editor\Selection = 0
								If \Editor\Cursor < Len(\Editor\Item\Text)
									\Editor\Cursor + 1
								EndIf
							EndIf
						Case #PB_Shortcut_Home
							\Editor\Cursor = 0
						Case #PB_Shortcut_End
							\Editor\Cursor = Len(\Editor\Item\Text)
						Case #PB_Shortcut_Back
							If \Editor\Selection > 0
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
								\Editor\Selection = 0
							ElseIf \Editor\Selection < 0
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
								\Editor\Cursor + \Editor\Selection
								\Editor\Selection = 0
							ElseIf \Editor\Cursor > 0
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor-1) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
								\Editor\Cursor - 1
							EndIf
						Case #PB_Shortcut_Delete
							If \Editor\Selection > 0
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
								\Editor\Selection = 0
							ElseIf \Editor\Selection < 0
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
								\Editor\Cursor + \Editor\Selection
								\Editor\Selection = 0
							ElseIf \Editor\Cursor < Len(\Editor\Item\Text)
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+2)
							EndIf
						Case #PB_Shortcut_C
							If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Control
								If \Editor\Selection > 0
									SetClipboardText(Mid(\Editor\Item\Text, \Editor\Cursor+1, \Editor\Selection))
								ElseIf \Editor\Selection < 0
									SetClipboardText(Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1, -\Editor\Selection))
								EndIf
							EndIf
						Case #PB_Shortcut_V
							If GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Control
								If \Editor\Selection > 0
									\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + Mid(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection+1)
									\Editor\Selection = 0
								ElseIf \Editor\Selection < 0
									\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor+\Editor\Selection) + Mid(\Editor\Item\Text, \Editor\Cursor+1)
									\Editor\Cursor + \Editor\Selection
									\Editor\Selection = 0
								EndIf
								\Editor\Item\Text = Left(\Editor\Item\Text, \Editor\Cursor) + GetClipboardText() + Mid(\Editor\Item\Text, \Editor\Cursor+1)
								\Editor\Item\ShortText = \Editor\Item\Text
								\Editor\Cursor + Len(GetClipboardText())
							EndIf
					EndSelect
					\Editor\Item\ShortText = \Editor\Item\Text
				Case #PB_EventType_LostFocus
					If \Editor\OldText <> \Editor\Item\Text
						ChangeCurrentElement(\Item(), \Editor\Item)
						PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_EditItem, ListIndex(\Item()))
					EndIf
					\Editor\Item = #Null
			EndSelect
			
		Else
			
			SetGadgetAttribute(\Number, #PB_Canvas_Cursor, #PB_Cursor_Default)
			
		EndIf
		
	EndWith
	
EndProcedure
 


; Détermine l'apparence et l'emplacement des onglets
Procedure TabBarGadget_Examine(*TabBarGadget.TabBarGadget)
	;1xCallback()
	
	
	Protected MinLength.i, X.i, Y.i, Shift.i, MousePosition.i, Row.i
	Protected Index.i, Distance.i, MinDistance.i
	Protected Menu.i
	
	With *TabBarGadget
		
		; Initialisierung
		\ToolTip\Current = #Null
		\MouseX      = GetGadgetAttribute(\Number, #PB_Canvas_MouseX)
		\MouseY      = GetGadgetAttribute(\Number, #PB_Canvas_MouseY)
		\Event       = #Null
		\EventTab    = #TabBarGadgetItem_None
		\HoverItem   = #Null
		\HoverClose  = #False
		\HoverCheck  = #False
		\HoverArrow  = #Null
		DrawingFont(\FontID)
		
		; Survoler les onglets
		If \MoveItem = #Null
			
			ForEach \Item()
				If \Item()\Visible And TabBarGadget_MouseIn(*TabBarGadget, \Item()\Layout\X, \Item()\Layout\Y,  \Item()\Layout\Width-1, \Item()\Layout\Height-1)
					\HoverItem = \Item()
				EndIf
			Next
			If \Attributes & #TabBarGadget_NewTab And TabBarGadget_MouseIn(*TabBarGadget, \NewTabItem\Layout\X, \NewTabItem\Layout\Y, \NewTabItem\Layout\Width-1, \NewTabItem\Layout\Height-1)
				\HoverItem = \NewTabItem
			EndIf
			
		EndIf
		
		; Navigation
		If \Attributes & (#TabBarGadget_PreviousArrow|#TabBarGadget_NextArrow)
			
			; MouseWheel Scroll Action
			If EventType() = #PB_EventType_MouseWheel
				If TabBarGadgetInclude\WheelAction = #TabBarGadgetWheelAction_Scroll
					\Shift + TabBarGadgetInclude\WheelDirection * GetGadgetAttribute(\Number, #PB_Canvas_WheelDelta)
					If \Shift < 0
						\Shift = 0
					ElseIf \Shift > \LastShift
						\Shift = \LastShift
					EndIf
				EndIf
			EndIf
			
			LockMutex(TabBarGadgetInclude\Timer\Mutex)
			TabBarGadgetInclude\Timer\Type = #Null
			If \Attributes & #TabBarGadget_PreviousArrow
				If TabBarGadget_MouseIn(*TabBarGadget, \Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight)
					\HoverArrow = #TabBarGadget_PreviousArrow
					\HoverItem = #Null
					TabBarGadgetInclude\Timer\Type = #TabBarGadget_PreviousArrow
					Select EventType()
						Case #PB_EventType_LeftButtonDown
							\LockedArrow = #TabBarGadget_PreviousArrow
							TabBarGadgetInclude\Timer\TabBarGadget = *TabBarGadget
						Case #PB_EventType_LeftButtonUp
							If \LockedArrow = \HoverArrow And \Shift > 0
								\Shift - 1
							EndIf
					EndSelect
				EndIf
			EndIf
			If \Attributes & #TabBarGadget_NextArrow
				If TabBarGadget_MouseIn(*TabBarGadget, \Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight)
					\HoverArrow = #TabBarGadget_NextArrow
					\HoverItem = #Null
					TabBarGadgetInclude\Timer\Type = #TabBarGadget_NextArrow
					Select EventType()
						Case #PB_EventType_LeftButtonDown
							\LockedArrow = #TabBarGadget_NextArrow
							TabBarGadgetInclude\Timer\TabBarGadget = *TabBarGadget
						Case #PB_EventType_LeftButtonUp
							If \LockedArrow = \HoverArrow And \Shift < \LastShift
								\Shift + 1
							EndIf
					EndSelect
				EndIf
			EndIf
			UnlockMutex(TabBarGadgetInclude\Timer\Mutex)
			
		EndIf
		
		; MouseWheel Change Action
		If EventType() = #PB_EventType_MouseWheel
			If TabBarGadgetInclude\WheelAction = #TabBarGadgetWheelAction_Change
				If TabBarGadget_ItemID(*TabBarGadget, #TabBarGadgetItem_Selected)
					Index = ListIndex(\Item()) + TabBarGadgetInclude\WheelDirection * Sign(GetGadgetAttribute(\Number, #PB_Canvas_WheelDelta))
					If (Index >= 0) And (Index < ListSize(\Item()))
						TabBarGadget_SelectItem(*TabBarGadget, TabBarGadget_ItemID(*TabBarGadget, Index))
						\EventTab = Index
						PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
					EndIf
				EndIf
			EndIf
		EndIf
		
		; Popup-Button
		If \Attributes & #TabBarGadget_PopupButton
			If TabBarGadget_MouseIn(*TabBarGadget, \Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize)
				\HoverArrow = #TabBarGadget_PopupButton
				\HoverItem = #Null
				Select EventType()
					Case #PB_EventType_LeftButtonDown
						\LockedArrow = #TabBarGadget_PopupButton
					Case #PB_EventType_LeftButtonUp
						If \LockedArrow = \HoverArrow
							PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_PopupButton, -1)
						EndIf
				EndSelect
			EndIf
		EndIf
		
		; onglets
		If \HoverItem
			
			; Info-bulle,  bouton de fermeture et case à cocher
			If \HoverItem\ToolTip
				\ToolTip\Current = @\HoverItem\ToolTip
			Else
				\ToolTip\Current = @\HoverItem\Text
			EndIf
			If ( \HoverItem\Attributes & #TabBarGadget_CloseButton Or (\HoverItem\Attributes & #TabBarGadget_SelectedCloseButton And \HoverItem\Selected) ) And \Editor\Item <> \HoverItem
				If TabBarGadget_MouseIn(*TabBarGadget, \HoverItem\Layout\CrossX, \HoverItem\Layout\CrossY, TabBarGadgetInclude\CloseButtonSize, TabBarGadgetInclude\CloseButtonSize)
					\HoverClose = \HoverItem
					\ToolTip\Current = @\ToolTip\CloseText
					Select EventType()
						Case #PB_EventType_LeftButtonDown
							\LockedClose = \HoverItem
						Case #PB_EventType_LeftButtonUp
							If \LockedClose = \HoverClose
								ChangeCurrentElement(\Item(), \LockedClose)
								\EventTab = ListIndex(\Item())
								PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_CloseItem, \EventTab)
							EndIf
					EndSelect
				EndIf
			EndIf
			If \HoverItem\Attributes & #TabBarGadget_CheckBox And \HoverItem\Disabled = #False And \Editor\Item <> \HoverItem
				If TabBarGadget_MouseIn(*TabBarGadget, \HoverItem\Layout\CheckX, \HoverItem\Layout\CheckY, TabBarGadgetInclude\CheckBoxSize, TabBarGadgetInclude\CheckBoxSize)
					\HoverCheck = \HoverItem
					Select EventType()
						Case #PB_EventType_LeftButtonDown
							\LockedCheck = \HoverItem
						Case #PB_EventType_LeftButtonUp
							If \LockedCheck = \HoverCheck
								ChangeCurrentElement(\Item(), \LockedCheck)
								\EventTab = ListIndex(\Item())
								PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_CheckBox, \EventTab)
								\HoverItem\Checked = 1 - \HoverItem\Checked
							EndIf
					EndSelect
				EndIf
			EndIf
			
			; NewTab gestion d'événements
			If \HoverItem = \NewTabItem
				\EventTab = #TabBarGadgetItem_NewTab
				\ToolTip\Current = @\ToolTip\NewText
			Else
				ChangeCurrentElement(\Item(), \HoverItem)
				\EventTab = ListIndex(\Item())
			EndIf
			
			; select
			Select EventType()
				Case #PB_EventType_LeftButtonDown				
					\LockedItem = \HoverItem
					If \LockedItem = \NewTabItem
						PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_NewItem, \EventTab)
					ElseIf \LockedClose = #False And \LockedCheck = #False
						
						If \HoverItem\Disabled = #False
							
							If \Attributes & #TabBarGadget_MultiSelect And GetGadgetAttribute(\Number, #PB_Canvas_Modifiers) & #PB_Canvas_Control
								If \HoverItem\Selected
									
									TabBarGadget_UnselectItem(*TabBarGadget, \HoverItem)
								Else
									TabBarGadget_SelectItem(*TabBarGadget, \HoverItem)
								EndIf
								PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
							Else
								ForEach \Item()
									\Item()\Selected = #False
								Next
								If \SelectedItem <> \HoverItem
									
									PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
									TabBarGadget_SelectItem(*TabBarGadget, \HoverItem)
								Else;mesa
										;	Debug "ok";****************************ON/OFF****************
									\SelectedItem = 0
									PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Change, \EventTab)
									PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_DeSelected, \EventTab)
								EndIf
								
							EndIf
						EndIf
						If Not \Attributes & #TabBarGadget_NoTabMoving And \Editor\Item = #Null
							\ReadyToMoveItem = \HoverItem
							\SaveMouseX = \MouseX
							\SaveMouseY = \MouseY
						EndIf
					EndIf
					
					;menu
					\MenuIsOpen = \MenuIsOpen!1
					If \MenuIsOpen = 1
						If \SelectedItem = \HoverItem
							ChangeCurrentElement(\Item(), \SelectedItem)
							menu=ListIndex(\Item())			
							TabBarGadget_StopDrawing(*TabBarGadget)
							If \Attributes & #TabBarGadget_Vertical
								DisplayPopupMenu(menu,WindowID(\Window),GadgetX(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\X+\HoverItem\Layout\Width,GadgetY(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\Y)	
							Else
								DisplayPopupMenu(menu,WindowID(\Window),GadgetX(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\X,GadgetY(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\Y+\HoverItem\Layout\Height)
							EndIf
							TabBarGadget_StartDrawing(*TabBarGadget)
							; 					Else
						EndIf
					Else
						
					EndIf
					
				Case #PB_EventType_MiddleButtonDown
					\LockedItem = \HoverItem
				Case #PB_EventType_MiddleButtonUp
					If TabBarGadgetInclude\EnableMiddleClickForCloseTab And \LockedItem = \HoverItem And \LockedItem <> \NewTabItem And \LockedItem <> \Editor\Item
						PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_CloseItem, \EventTab)
						\MoveItem        = #Null
						\ReadyToMoveItem = #Null
					EndIf
					\LockedItem = #Null
				Case #PB_EventType_MouseMove
					; move
					If \ReadyToMoveItem
						If Abs(\SaveMouseX-\MouseX) > 4 Or Abs(\SaveMouseY-\MouseY) > 4
							\MoveItem = \ReadyToMoveItem
							If \Attributes & (#TabBarGadget_NextArrow|#TabBarGadget_PreviousArrow)
								LockMutex(TabBarGadgetInclude\Timer\Mutex)
								TabBarGadgetInclude\Timer\TabBarGadget = *TabBarGadget
								UnlockMutex(TabBarGadgetInclude\Timer\Mutex)
							EndIf
						EndIf
					EndIf
					
					If \MenuIsOpen
						If \SelectedItem <> \HoverItem
							mouse_event_(#MOUSEEVENTF_LEFTDOWN,0, 0, 0, 0)
							Sleep_(60)
							mouse_event_(#MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
							\MenuIsOpen = 0
							If \HoverItem
								ChangeCurrentElement(\Item(), \HoverItem)
								menu=ListIndex(\Item())
								TabBarGadget_StopDrawing(*TabBarGadget)
								If \Attributes & #TabBarGadget_Vertical
									DisplayPopupMenu(menu,WindowID(\Window),GadgetX(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\X+\HoverItem\Layout\Width,GadgetY(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\Y)	
								Else
									DisplayPopupMenu(menu,WindowID(\Window),GadgetX(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\X,GadgetY(\Number,#PB_Gadget_ScreenCoordinate)+\HoverItem\Layout\Y+\HoverItem\Layout\Height)
								EndIf
								TabBarGadget_StartDrawing(*TabBarGadget)
							EndIf
						EndIf
					EndIf
					
					
				Case #PB_EventType_LeftDoubleClick
					If \Attributes & #TabBarGadget_Editable And \HoverItem\Disabled = #False
						\Editor\Item    = \HoverItem
						\Editor\OldText = \Editor\Item\Text
					EndIf
			EndSelect
			
		EndIf
		
		; Editor
		TabBarGadget_Examine_Editor(*TabBarGadget)
		
		; Divers
		Select EventType()
			Case #PB_EventType_LeftButtonUp
				
				\LockedClose     = #False
				\LockedCheck     = #False
				\MoveItem        = #Null
				\ReadyToMoveItem = #Null
				\LockedArrow     = #Null
				LockMutex(TabBarGadgetInclude\Timer\Mutex)
				TabBarGadgetInclude\Timer\TabBarGadget = #Null
				UnlockMutex(TabBarGadgetInclude\Timer\Mutex)
			Case #PB_EventType_MouseLeave
				\HoverItem       = #Null
			Case #PB_EventType_LeftDoubleClick
				If TabBarGadgetInclude\EnableDoubleClickForNewTab And \HoverArrow = #Null And \HoverItem = #Null
					PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_NewItem, \EventTab)
				EndIf
		EndSelect
		If (\Shift <= 0 And \HoverArrow = #TabBarGadget_PreviousArrow) Or (\Shift >= \LastShift And \HoverArrow = #TabBarGadget_NextArrow)
			\HoverArrow = #False
		EndIf
		
		; Tab Shift : Trouvez et échangez les onglet
		If \MoveItem
			\EventTab = \MoveItem
			If \Attributes & #TabBarGadget_Vertical
				If \Attributes & #TabBarGadget_MultiLine
					If \Attributes & #TabBarGadget_MirroredTabs
						Row = Int((\MouseX-TabBarGadgetInclude\Margin)/\TabSize)
					Else
						Row = Int(\Rows-(\MouseX-TabBarGadgetInclude\Margin)/\TabSize)
					EndIf
					If Row < 0 : Row = 0 : ElseIf Row >= \Rows : Row = \Rows-1 : EndIf
					MousePosition = Row*\MaxLength + \MouseY
				Else
					MousePosition = \MouseY
				EndIf
				If Not (\Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering)
					MousePosition = OutputHeight() - MousePosition
				EndIf
			Else
				If \Attributes & #TabBarGadget_MultiLine
					If \Attributes & #TabBarGadget_MirroredTabs
						Row = Int((\MouseY-TabBarGadgetInclude\Margin)/\TabSize)
					Else
						Row = Int(\Rows-(\MouseY-TabBarGadgetInclude\Margin)/\TabSize)
					EndIf
					If Row < 0 : Row = 0 : ElseIf Row >= \Rows : Row = \Rows-1 : EndIf
					MousePosition = Row*\MaxLength + \MouseX
				Else
					MousePosition = \MouseX
				EndIf
				If \Attributes & #TabBarGadget_ReverseOrdering
					MousePosition = OutputWidth() - MousePosition
				EndIf
			EndIf
			If Not \Event
				ChangeCurrentElement(\Item(), \MoveItem)
				While NextElement(\Item())
					If MousePosition > \Item()\Position + \MaxLength*\Item()\Row
						SwapElements(\Item(), @\Item(), \MoveItem)
						\Item()\Position = \MoveItem\Position
						\MoveItem\Position = \Item()\Position + \Item()\Length
						\Event = #TabBarGadget_EventType_SwapItem
						PushListPosition(\Item())
						ChangeCurrentElement(\Item(), \MoveItem)
						\EventTab = ListIndex(\Item())
						PopListPosition(\Item())
					EndIf
				Wend
			EndIf
			If Not \Event
				ChangeCurrentElement(\Item(), \MoveItem)
				While PreviousElement(\Item()) And ListIndex(\Item()) >= \Shift-1
					If \MoveItem\Length < \Item()\Length
						MinLength = \MoveItem\Length
					Else
						MinLength = \Item()\Length
					EndIf
					If MousePosition < \Item()\Position + \MaxLength*\Item()\Row + MinLength
						SwapElements(\Item(), @\Item(), \MoveItem)
						\MoveItem\Position = \Item()\Position
						\Item()\Position = \MoveItem\Position + \MoveItem\Length
						\Event = #TabBarGadget_EventType_SwapItem
						PushListPosition(\Item())
						ChangeCurrentElement(\Item(), \MoveItem)
						\EventTab = ListIndex(\Item())
						PopListPosition(\Item())
					EndIf
				Wend
			EndIf
			If \Event = #TabBarGadget_EventType_SwapItem
				PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_SwapItem, \EventTab)
			EndIf
		EndIf
		
		; Mettre à jour l'info-bulle
		If \ToolTip\Current <> \ToolTip\Old
			If \ToolTip\Current = #Null
				GadgetToolTip(\Number, "")
			ElseIf \ToolTip\Current = @\ToolTip\NewText Or \ToolTip\Current =  @\ToolTip\CloseText
				GadgetToolTip(\Number, PeekS(\ToolTip\Current))
			ElseIf \HoverItem And \ToolTip\Current = @\HoverItem\ToolTip
				GadgetToolTip(\Number, PeekS(\ToolTip\Current))
			Else
				GadgetToolTip(\Number, ReplaceString(\ToolTip\ItemText, "%ITEM", PeekS(\ToolTip\Current)))
			EndIf
			\ToolTip\Old = \ToolTip\Current
		EndIf
		
	EndWith
	
EndProcedure



; Détermine l'apparence et l'emplacement des onglets
Procedure TabBarGadget_Update(*TabBarGadget.TabBarGadget)
	;Callback()
	;,, UpdateTabBarGadget(G)
	
	Protected FocusingSelectedTab.i
	Protected ShowLength.i, X.i
	Protected OldAttributes.i
	Protected Difference.f, Factor.f, Position.i, Length.i, MaxWidth.i, MousePosition.i
	Protected *Item.TabBarGadgetItem, Row.i, Rows.i=1
	Protected *Current, *Last, AddLength.i, RowCount.i
	Protected Dim Row.TabBarGadgetRow(0)
	
	With *TabBarGadget
		
		; préparation
		DrawingFont(\FontID)
		\Attributes & ~(#TabBarGadget_PreviousArrow|#TabBarGadget_NextArrow) ; d'abord pas de navigation
		If \TabSize = 0
			; SetTabBarGadgetFont(Gadget.i, FontID.i) => ; Reset to 0 to force
			;  a new size calculation = *TabBarGadget\TabSize = 0
			If \Attributes & #TabBarGadget_Vertical
				If GadgetWidth(\Number) > 1
					\TabSize = OutputWidth() - TabBarGadgetInclude\Margin
				Else
					\TabSize = TextHeight("|") + TabBarGadgetInclude\PaddingY*2
				EndIf
			Else
				If GadgetHeight(\Number) > 1
					\TabSize = OutputHeight() - TabBarGadgetInclude\Margin
				Else
					\TabSize = TextHeight("|") + TabBarGadgetInclude\PaddingY*2
				EndIf
			EndIf
		EndIf
		If \Attributes & #TabBarGadget_NewTab
			\NewTabItem\Length = TabBarGadget_ItemLength(*TabBarGadget, \NewTabItem)
			\NewTabItem\Row = 0
		EndIf
		
		; Barre d'onglets multi-lignes
		If \Attributes & #TabBarGadget_MultiLine
			
			\MaxLength = TabBarGadget_MaxLength(*TabBarGadget)
			\Length    = \MaxLength
			\Shift     = 0
			
			; déterminer les latitudes
			Length = 1
			ForEach \Item()
				\Item()\Row = 0
				\Item()\Length  = TabBarGadget_ItemLength(*TabBarGadget, \Item())
				\Item()\Visible = #True
				Length - 1 + \Item()\Length
			Next
			
			; Configurer plusieurs lignes
			If Length > \MaxLength
				Row = 0
				Row(Row)\Length = 1
				ForEach \Item()
					If NextElement(\Item())
						PreviousElement(\Item())
						MaxWidth = TabBarGadget_MaxLength(*TabBarGadget, #False)
					Else
						LastElement(\Item())
						MaxWidth = TabBarGadget_MaxLength(*TabBarGadget)
					EndIf
					If Row(Row)\Length-1+\Item()\Length > MaxWidth And Row(Row)\Items > 0
						Row + 1
						ReDim Row(Row)
						Row(Row)\Length = 1
					EndIf
					Row(Row)\Length - 1 + \Item()\Length
					Row(Row)\Items + 1
					\Item()\Row = Row
				Next
			Else
				Row(Row)\Length = Length
			EndIf
			Rows = Row+1
			
			; élargir
			If Rows > 1
				MaxWidth = TabBarGadget_MaxLength(*TabBarGadget, #False)
				ForEach \Item()
					AddLength = (MaxWidth-Row(\Item()\Row)\Length)/Row(\Item()\Row)\Items
					If \Item()\Row <> Rows-1 Or AddLength < 0
						\Item()\Length + AddLength
						Row(\Item()\Row)\Length + AddLength
						Row(\Item()\Row)\Items - 1
					EndIf
				Next
			EndIf
			
			; Calculer les positions
			Length = TabBarGadgetInclude\Margin
			Row = 0
			ForEach \Item()
				If Row <> \Item()\Row
					Row + 1
					Length = TabBarGadgetInclude\Margin
				EndIf
				\Item()\Position = Length
				Length + \Item()\Length - 1
			Next
			If Row(Rows-1)\Length > TabBarGadget_MaxLength(*TabBarGadget) And LastElement(\Item())
				\Item()\Length = TabBarGadget_MaxLength(*TabBarGadget, #False)
				Rows + 1
				\NewTabItem\Row = Rows-1
				\NewTabItem\Position = TabBarGadgetInclude\Margin
			Else
				\NewTabItem\Row = Rows-1
				\NewTabItem\Position = TabBarGadgetInclude\Margin+Row(\NewTabItem\Row)\Length - 1
			EndIf
			
			; Barre d'onglets sur une seule ligne
		Else
			
			\MaxLength = TabBarGadget_MaxLength(*TabBarGadget)
			
			; raccourcissement du texte si nécessaire
			If \Attributes & #TabBarGadget_TextCutting
				\Length = TabBarGadget_TextCutting(*TabBarGadget)
				If \Length <= \MaxLength
					\Shift = 0
				EndIf
			EndIf
			
			; déterminer les latitudes
			\Length = 1
			ForEach \Item()
				\Item()\Length = TabBarGadget_ItemLength(*TabBarGadget, \Item())
				\Item()\Row    = 0
				\Length + \Item()\Length-1
			Next
			
			; Besoin de navigation ?
			If \Length > \MaxLength
				\Attributes | (#TabBarGadget_PreviousArrow | #TabBarGadget_NextArrow)
				\MaxLength = TabBarGadget_MaxLength(*TabBarGadget)
			Else
				;\Shift = 0
			EndIf
			
			; Déterminer LastShift
			If LastElement(\Item())
				\LastShift = ListIndex(\Item())
				ShowLength = \Item()\Length
				While PreviousElement(\Item())
					If ShowLength + \Item()\Length - 1 > \MaxLength - Bool(ListIndex(\Item())>0)*TabBarGadgetInclude\FadeOut
						Break
					Else
						ShowLength + \Item()\Length - 1
						\LastShift - 1
					EndIf
				Wend
			Else
				\LastShift = 0
			EndIf
			
			; si nécessaire, amener l'onglet actuellement sélectionné dans la zone visible
			If \FocusingSelectedTab And \SelectedItem
				ChangeCurrentElement(\Item(), \SelectedItem)
				If ListIndex(\Item()) <= \Shift
					\Shift = ListIndex(\Item())
				Else
					While \Shift < \LastShift And SelectElement(\Item(), \Shift)
						ShowLength = \Item()\Length
						If \Item() = \SelectedItem
							Break
						EndIf
						While NextElement(\Item())
							If ShowLength + \Item()\Length - 1 > \MaxLength - (Bool(\Shift>0)+Bool(\Shift<\LastShift))*TabBarGadgetInclude\FadeOut
								\Shift + 1
								Break
							ElseIf \Item() = \SelectedItem
								Break 2
							EndIf
							ShowLength + \Item()\Length - 1
						Wend
					Wend
				EndIf
				\FocusingSelectedTab = #False
			EndIf
			
			If \Shift > \LastShift
				\Shift = \LastShift
			EndIf
			\MaxLength - (Bool(\Shift>0)+Bool(\Shift<\LastShift))*TabBarGadgetInclude\FadeOut
			
			; position des onglets
			
			; onglet précédent
			If \Attributes & #TabBarGadget_PreviousArrow
				If \Shift > 0
					ForEach \Item()
						\Item()\Position = -$FFFF
						\Item()\Visible  = #False
						If ListIndex(\Item()) >= \Shift-1 : Break : EndIf
					Next
					Position = TabBarGadgetInclude\ArrowWidth + TabBarGadgetInclude\Margin + TabBarGadgetInclude\FadeOut
					SelectElement(\Item(), \Shift-1)
					\Item()\Position = Position - \Item()\Length + 1
					\Item()\Visible  = #True
				Else
					Position = TabBarGadgetInclude\ArrowWidth + TabBarGadgetInclude\Margin
				EndIf
			Else
				Position = TabBarGadgetInclude\Margin
			EndIf
			
			; onglets visibles
			\Length = 0
			If SelectElement(\Item(), \Shift)
				Repeat
					\Item()\Position = Position + \Length
					\Item()\Visible  = #True
					If \Length + \Item()\Length - 1 > \MaxLength
						Break
					EndIf
					\Length + \Item()\Length - 1
				Until Not NextElement(\Item())
			EndIf
			
			; onglet suivant
			If \Attributes & #TabBarGadget_NextArrow And ListIndex(\Item()) <> -1
				If ListIndex(\Item()) <> ListSize(\Item())-1
					\Item()\Position = Position + \Length
					\Length + \Item()\Length - 1
					\Item()\Visible  = #True
					If NextElement(\Item())
						\Item()\Position = Position + \Length
						\Item()\Visible  = #True
					EndIf
				EndIf
				If \Attributes & #TabBarGadget_NewTab
					If \Attributes & #TabBarGadget_Vertical
						\NewTabItem\Position = OutputHeight()-\NewTabItem\Length-TabBarGadgetInclude\Margin/2
					Else
						\NewTabItem\Position = OutputWidth()-\NewTabItem\Length-TabBarGadgetInclude\Margin/2
					EndIf
					If \Attributes & #TabBarGadget_PopupButton
						\NewTabItem\Position - TabBarGadgetInclude\ArrowHeight
					EndIf
				EndIf
				While NextElement(\Item())
					\Item()\Position = $FFFF
					\Item()\Visible  = #False
				Wend
			Else
				If \Attributes & #TabBarGadget_NewTab
					\NewTabItem\Position = Position + \Length
				EndIf
			EndIf
			
			Row(0)\Length = Position - TabBarGadgetInclude\Margin+\Length+1
			
		EndIf
		
		; Redimensionnement du gadget
		If Rows <> \Rows And (EventType() >= #PB_EventType_FirstCustomValue Or GetGadgetAttribute(\Number, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton = #False)
			TabBarGadget_StopDrawing(*TabBarGadget)
			If \Attributes & #TabBarGadget_Vertical
				ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, Rows*\TabSize+TabBarGadgetInclude\Margin, #PB_Ignore)
			Else
				ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, #PB_Ignore, Rows*\TabSize+TabBarGadgetInclude\Margin)
			EndIf
			PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_Resize, -1)
			TabBarGadget_StartDrawing(*TabBarGadget)
			DrawingFont(\FontID)
			\Resized = #True
			\Rows = Rows
		EndIf
		
		; Animation de l'onglet mobile
		If \MoveItem
			If \Attributes & #TabBarGadget_Vertical
				If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
					MousePosition = \MouseY
				Else
					MousePosition = OutputHeight()-\MouseY-1
				EndIf
			Else
				If \Attributes & #TabBarGadget_ReverseOrdering
					MousePosition = OutputWidth()-\MouseX-1
				Else
					MousePosition = \MouseX
				EndIf
			EndIf
			Difference = Abs(\MoveItem\Position-(MousePosition-\MoveItem\Length/2))
			If Difference > 24
				Position = MousePosition - \MoveItem\Length/2
			Else
				Factor = Pow(Difference/24, 2)
				Position = \MoveItem\Position*(1-Factor) + (MousePosition-\MoveItem\Length/2)*Factor
			EndIf
			If \Attributes & #TabBarGadget_PreviousArrow = #Null
				If Position < TabBarGadgetInclude\Margin
					Position = TabBarGadgetInclude\Margin
				EndIf
			ElseIf \Shift <= 0 And Position < TabBarGadgetInclude\Margin + TabBarGadgetInclude\ArrowWidth
				Position = TabBarGadgetInclude\Margin + TabBarGadgetInclude\ArrowWidth
			EndIf
			If (\Attributes & #TabBarGadget_NextArrow = #Null Or \Shift >= \LastShift) And Position + \MoveItem\Length + 1 - TabBarGadgetInclude\Margin > Row(\MoveItem\Row)\Length - 1
				Position = Row(\MoveItem\Row)\Length + TabBarGadgetInclude\Margin - \MoveItem\Length
			EndIf
			\MoveItem\Position = Position
		EndIf
		
		; Apparences
		ForEach \Item()
			If \Item()\Disabled
				\Item()\Face = #TabBarGadgetItem_DisableFace
			ElseIf \Item() = \MoveItem
				\Item()\Face = #TabBarGadgetItem_MoveFace
			ElseIf \Item() = \SelectedItem Or \Item()\Selected
				\Item()\Face = #TabBarGadgetItem_ActiveFace
			ElseIf \Item() = \HoverItem
				\Item()\Face = #TabBarGadgetItem_HoverFace
			Else
				\Item()\Face = #TabBarGadgetItem_NormalFace
			EndIf
			TabBarGadget_ItemLayout(*TabBarGadget, \Item())
		Next
		If \NewTabItem = \HoverItem
			\NewTabItem\Face = #TabBarGadgetItem_HoverFace
		Else
			\NewTabItem\Face = #TabBarGadgetItem_NormalFace
		EndIf
		TabBarGadget_ItemLayout(*TabBarGadget, \NewTabItem)
		TabBarGadget_Layout(*TabBarGadget)
		
		*TabBarGadget\UpdatePosted = #False
		
	EndWith
	
EndProcedure



; Dessine tout le TabBarGadget
Procedure TabBarGadget_Draw(*TabBarGadget.TabBarGadget)
	;Callback()
	;,, UpdateTabBarGadget(G)
	
	If TabBarGadgetInclude\DrawDisabled
		ProcedureReturn
	EndIf
	
	Protected X.i, Y.i, Size.i, SelectedItemDrawed.i, MoveItemDrawed.i, Row.i, *LastItem
	
	With *TabBarGadget
		
		; initialisation
		DrawingFont(\FontID)
		DrawingMode(#PB_2DDrawing_AllChannels)
		Box(0, 0, OutputWidth(), OutputHeight(), *TabBarGadget\TabBarColor);TabBarGadgetInclude\TabBarColor);MESA
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		
		; Onglets visibles
		*LastItem = LastElement(\Item())
		For Row = \Rows-1 To 0 Step -1
			If *LastItem
				PushListPosition(\Item())
				While \Item()\Row >= Row
					If \Item()\Visible And \Item()\Selected = #False And \Item() <> \MoveItem
						TabBarGadget_DrawItem(*TabBarGadget, \Item())
					EndIf
					If Not PreviousElement(\Item())
						Break
					EndIf
				Wend
			EndIf
			; le cas échéant. "Onglet "Nouveau" (si pas de navigation)
			If \NewTabItem\Row = Row And \Attributes & #TabBarGadget_NewTab And \Attributes & #TabBarGadget_NextArrow = #Null
				TabBarGadget_DrawItem(*TabBarGadget, \NewTabItem)
			EndIf
			; le cas échéant sous-lignes
			If Row = 0 And \Attributes & #TabBarGadget_BottomLine
				If \Attributes & #TabBarGadget_Vertical
					If \Attributes & #TabBarGadget_MirroredTabs
						Line(0, 0, 1, OutputHeight(), TabBarGadgetInclude\BorderColor)
					Else
						Line(OutputWidth()-1, 0, 1, OutputHeight(), TabBarGadgetInclude\BorderColor)
					EndIf
				Else
					If \Attributes & #TabBarGadget_MirroredTabs
						Line(0, 0, OutputWidth(), 1, TabBarGadgetInclude\BorderColor)
					Else
						Line(0, OutputHeight()-1, OutputWidth(), 1, TabBarGadgetInclude\BorderColor)
					EndIf
				EndIf
			EndIf
			; le cas échéant onglet actif
			If *LastItem
				PopListPosition(\Item())
				While \Item()\Row >= Row
					If \Item()\Visible And \Item()\Selected = #True And \Item() <> \MoveItem
						TabBarGadget_DrawItem(*TabBarGadget, \Item())
					EndIf
					If Not PreviousElement(\Item())
						Break
					EndIf
				Wend
			EndIf
			; le cas échéant onglet mobile
			If \MoveItem And \MoveItem\Row = Row
				TabBarGadget_DrawItem(*TabBarGadget, \MoveItem)
			EndIf
		Next
		
		; Masque espace flèches de navigation
		DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
		ResetGradientColors()
		GradientColor(0.0, *TabBarGadget\TabBarColor);MESA TabBarGadgetInclude\TabBarColor&$FFFFFF)
		GradientColor(0.5, *TabBarGadget\TabBarColor|$A0<<24);MESA TabBarGadgetInclude\TabBarColor&$FFFFFF|$A0<<24)
		GradientColor(1.0, *TabBarGadget\TabBarColor|$FF<<24);MESA TabBarGadgetInclude\TabBarColor&$FFFFFF|$FF<<24)
		
		Size = TabBarGadgetInclude\Margin + TabBarGadgetInclude\ArrowWidth + TabBarGadgetInclude\FadeOut
		If \Attributes & #TabBarGadget_PreviousArrow And \Shift
			If \Attributes & #TabBarGadget_Vertical
				If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
					LinearGradient(0, Size, 0, Size-TabBarGadgetInclude\FadeOut)
					Box(0, 0, OutputWidth(), Size)
				Else
					LinearGradient(0, OutputHeight()-Size, 0, OutputHeight()-Size+TabBarGadgetInclude\FadeOut)
					Box(0, OutputHeight()-Size, OutputWidth(), Size)
				EndIf
			Else
				If \Attributes & #TabBarGadget_ReverseOrdering
					LinearGradient(OutputWidth()-Size, 0, OutputWidth()-Size+TabBarGadgetInclude\FadeOut, 0)
					Box(OutputWidth()-Size, 0, Size, OutputHeight())
				Else
					LinearGradient(Size, 0, Size-TabBarGadgetInclude\FadeOut, 0)
					Box(0, 0, Size, OutputHeight())
				EndIf
			EndIf
		EndIf
		If \Attributes & #TabBarGadget_NextArrow And \Shift < \LastShift
			If \Attributes & #TabBarGadget_NewTab
				Size + \NewTabItem\Length+TabBarGadgetInclude\Margin
			EndIf
			If \Attributes & #TabBarGadget_PopupButton
				Size + TabBarGadgetInclude\ArrowHeight
			EndIf
			If \Attributes & #TabBarGadget_Vertical
				If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
					LinearGradient(0, OutputHeight()-Size, 0, OutputHeight()-Size+TabBarGadgetInclude\FadeOut)
					Box(0, OutputHeight()-Size, OutputWidth(), Size)
				Else
					LinearGradient(0, Size, 0, Size-TabBarGadgetInclude\FadeOut)
					Box(0, 0, OutputWidth(), Size)
				EndIf
			Else
				If \Attributes & #TabBarGadget_ReverseOrdering
					LinearGradient(Size, 0, Size-TabBarGadgetInclude\FadeOut, 0)
					Box(0, 0, Size, OutputHeight())
				Else
					LinearGradient(OutputWidth()-Size, 0, OutputWidth()-Size+TabBarGadgetInclude\FadeOut, 0)
					Box(OutputWidth()-Size, 0, Size, OutputHeight())
				EndIf
			EndIf
		EndIf
		
		; Navigation *TabBarGadget
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		If \Attributes & #TabBarGadget_PreviousArrow
			If \HoverArrow = #TabBarGadget_PreviousArrow
				If \HoverArrow = \LockedArrow
					TabBarGadget_DrawButton(\Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				Else
					TabBarGadget_DrawButton(\Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				EndIf
				TabBarGadget_DrawArrow(\Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
			ElseIf \Shift > 0
				TabBarGadget_DrawArrow(\Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
			Else
				TabBarGadget_DrawArrow(\Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor&$FFFFFF|$20<<24, *TabBarGadget\Attributes)
			EndIf
		EndIf
		If \Attributes & #TabBarGadget_NextArrow
			If \HoverArrow = #TabBarGadget_NextArrow
				If \HoverArrow = \LockedArrow
					TabBarGadget_DrawButton(\Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				Else
					TabBarGadget_DrawButton(\Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				EndIf
				TabBarGadget_DrawArrow(\Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
			ElseIf \Shift < \LastShift
				TabBarGadget_DrawArrow(\Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
			Else
				TabBarGadget_DrawArrow(\Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor&$FFFFFF|$20<<24, *TabBarGadget\Attributes)
			EndIf
		EndIf
		
		; Onglets "nouveaux" (si navigation)
		If \Attributes & #TabBarGadget_NewTab And \Attributes & #TabBarGadget_NextArrow
			TabBarGadget_DrawItem(*TabBarGadget, \NewTabItem)
		EndIf
		
		; Popup-Bouton
		If \Attributes & #TabBarGadget_PopupButton
			If \HoverArrow = #TabBarGadget_PopupButton
				If \HoverArrow = \LockedArrow
					TabBarGadget_DrawButton(\Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				Else
					TabBarGadget_DrawButton(\Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
				EndIf
				TabBarGadget_DrawArrow(\Layout\PopupButtonX, \Layout\PopupButtonY, #TabBarGadget_PopupButton,*TabBarGadget\TextColor , *TabBarGadget\Attributes);
			Else
				TabBarGadget_DrawArrow(\Layout\PopupButtonX, \Layout\PopupButtonY, #TabBarGadget_PopupButton, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes);
				
			EndIf
		EndIf
		
	EndWith
	
EndProcedure



; Boucle continue pour le défilement automatique dans la navigation
Procedure TabBarGadget_Timer(Null.i) ; Code OK
																		 ;1x Dans initialisation = CreateThread(@TabBarGadget_Timer(), #Null)
	
	
	With TabBarGadgetInclude\Timer
		Repeat
			If \TabBarGadget
				Delay(250)
				Repeat
					LockMutex(\Mutex)
					If \TabBarGadget
						CompilerIf (#PB_Compiler_OS <> #PB_OS_MacOS) Or (#PB_Compiler_Version >= 560)
							PostEvent(#PB_Event_Gadget, \TabBarGadget\Window, \TabBarGadget\Number, #TabBarGadget_EventType_Pushed, \Type)
						CompilerEndIf
						UnlockMutex(\Mutex)
					Else
						UnlockMutex(\Mutex)
						Break
					EndIf
					Delay(150)
				ForEver
			Else
				Delay(50)
			EndIf
		ForEver
	EndWith
	
EndProcedure



; Envoie un événement pour mettre à jour l'onglet.
Procedure TabBarGadget_PostUpdate(*TabBarGadget.TabBarGadget) ; Code OK
																															;,,AddTabBarGadgetItem(G,),RemoveTabBarGadgetItem(G,),ClearTabBarGadgetItems(G),SetTabBarGadgetAttribute(G
																															;,,SetTabBarGadgetFont(G,)
																															;,,SetTabBarGadgetState(G,),SetTabBarGadgetColor(G,),SetTabBarGadgetItemAttribute(G,),SetTabBarGadgetItemColor(G),
																															;,,SetTabBarGadgetItemImage(G,),SetTabBarGadgetItemPosition(G,),SetTabBarGadgetItemState(G,),
																															;,,SetTabBarGadgetItemText(G,)
	If *TabBarGadget\UpdatePosted = #False
		*TabBarGadget\UpdatePosted = #True
		PostEvent(#PB_Event_Gadget, *TabBarGadget\Window, *TabBarGadget\Number, #TabBarGadget_EventType_Updated, -1)
	EndIf
	
EndProcedure


; Callback pour BindGadgetEvent()
Procedure TabBarGadget_Callback() ; Code OK
																	;,,FreeTabBarGadget(G), TabBarGadget(G,)
	
	
	CompilerIf (#TabBarGadget_EnableCallbackGadgetCheck)
		If Not IsGadget(EventGadget())
			ProcedureReturn
		EndIf
	CompilerEndIf
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(EventGadget())
	If *TabBarGadget = #Null
		ProcedureReturn
	EndIf
	
	If EventType() >= #PB_EventType_FirstCustomValue
		*TabBarGadget\EventTab = EventData()
		Select EventType()
			Case #TabBarGadget_EventType_Pushed
				Select EventData()
					Case #TabBarGadget_PreviousArrow
						If *TabBarGadget\Shift > 0
							*TabBarGadget\Shift - 1
						EndIf
					Case #TabBarGadget_NextArrow
						If *TabBarGadget\Shift < *TabBarGadget\LastShift
							*TabBarGadget\Shift + 1
						EndIf
				EndSelect
				If TabBarGadget_StartDrawing(*TabBarGadget)
					TabBarGadget_Update(*TabBarGadget)
					TabBarGadget_Draw(*TabBarGadget)
					TabBarGadget_StopDrawing(*TabBarGadget)
				EndIf
			Case #TabBarGadget_EventType_Updated
				If TabBarGadget_StartDrawing(*TabBarGadget)
					TabBarGadget_Update(*TabBarGadget)
					TabBarGadget_Draw(*TabBarGadget)
					TabBarGadget_StopDrawing(*TabBarGadget)
				Else
					*TabBarGadget\UpdatePosted = #False
				EndIf
		EndSelect
	Else
		If TabBarGadget_StartDrawing(*TabBarGadget)
			TabBarGadget_Examine(*TabBarGadget)
			TabBarGadget_Update(*TabBarGadget)
			TabBarGadget_Draw(*TabBarGadget)
			TabBarGadget_StopDrawing(*TabBarGadget)
		EndIf
	EndIf
	
EndProcedure


;-  4.2 Procedures for the TabBarGadget
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

; Effectue une mise à jour calcul et redessine le gadget.
Procedure UpdateTabBarGadget(Gadget.i) ; Code OK, Hilfe OK
																			 ;,,1xTabBarGadget(G,)
	
	;Mesa
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *Item.TabBarGadgetItem = TabBarGadget_ItemID(*TabBarGadget, #TabBarGadgetItem_Selected)
	
	TabBarGadget_UnselectItem(*TabBarGadget,TabBarGadget_ItemID(*TabBarGadget,#TabBarGadgetItem_Selected))
	
	*TabBarGadget\MenuIsOpen = 0
	
	
	If TabBarGadget_StartDrawing(*TabBarGadget)
		TabBarGadget_Update(*TabBarGadget)
		TabBarGadget_Draw(*TabBarGadget)
		TabBarGadget_StopDrawing(*TabBarGadget)
	EndIf					
	
	
EndProcedure



; Gibt das angegebene TabBarGadget wieder frei.
Procedure FreeTabBarGadget(Gadget.i) ; Code OK, Hilfe OK
	
	If Not IsGadget(Gadget)
		ProcedureReturn
	EndIf
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	SetGadgetData(Gadget, #Null)
	
	UnbindGadgetEvent(*TabBarGadget\Number, @TabBarGadget_Callback())
	FreeGadget(Gadget)
	ForEach *TabBarGadget\Item()
		TabBarGadget_ClearItem(*TabBarGadget, *TabBarGadget\Item())
	Next
	ClearStructure(*TabBarGadget, TabBarGadget)
	FreeMemory(*TabBarGadget)
	
EndProcedure

Macro UseThemeColor()
	;MESA 
	
	Select UCase(ColorTheme$) 
		Case "BLACKDARK"
			*TabBarGadget\TabBarColor   	= $FF000000
			*TabBarGadget\BorderColor   	= $FF000000
			*TabBarGadget\FaceColor     	= $FF3B2C29
			*TabBarGadget\TextColor     	= $FFFFFFFF
			*TabBarGadget\FaceColorSelected = $FF000000
			*TabBarGadget\TextColorSelected = $FFFFFFFF
			
		Case "BLACKBLACK"
			*TabBarGadget\TabBarColor   	= $FF000000
			*TabBarGadget\BorderColor   	= $FF000000
			*TabBarGadget\FaceColor     	= $FF000000
			*TabBarGadget\TextColor     	= $FFFFFFFF
			*TabBarGadget\FaceColorSelected = $FF000000
			*TabBarGadget\TextColorSelected = $FFFFFFFF
			
		Case "BLUEORANGE"
			*TabBarGadget\TabBarColor   	= $FF996B5C
			*TabBarGadget\BorderColor   	= $FF996B5C
			*TabBarGadget\FaceColor     	= $FF804E3A
			*TabBarGadget\TextColor     	= $FFFFFFFF
			*TabBarGadget\FaceColorSelected = $FF5192F1
			*TabBarGadget\TextColorSelected = $FFDEDEDE
			
		Case "BLUEBLUE"
			*TabBarGadget\TabBarColor   	= $FFC25455
			*TabBarGadget\BorderColor   	= $FF000000
			*TabBarGadget\FaceColor     	= $FFC25455
			*TabBarGadget\TextColor     	= $FFFFFFFF
			*TabBarGadget\FaceColorSelected = $FFC25455
			*TabBarGadget\TextColorSelected = $FFFFFFFF
			
		Default
			CompilerSelect #PB_Compiler_OS
				CompilerCase #PB_OS_Windows	
					*TabBarGadget\TabBarColor   = $FF<<24 | GetSysColor_(#COLOR_BTNFACE)
					*TabBarGadget\BorderColor   = $FF<<24 | GetSysColor_(#COLOR_BTNFACE);GetSysColor_(#COLOR_3DSHADOW)
					*TabBarGadget\FaceColor     = $FF<<24 | GetSysColor_(#COLOR_BTNFACE)	
					*TabBarGadget\TextColor     = $FF<<24 | GetSysColor_(#COLOR_BTNTEXT)	
					*TabBarGadget\FaceColorSelected = *TabBarGadget\FaceColor													
					*TabBarGadget\TextColorSelected = *TabBarGadget\TextColor													
				CompilerDefault
					*TabBarGadget\TabBarColor   = $FF<<24 | #TabBarGadgetColor_TabBarDefault
					*TabBarGadget\BorderColor   = $FF<<24 | #TabBarGadgetColor_BorderDefault
					*TabBarGadget\FaceColor     = $FF<<24 | #TabBarGadgetColor_FaceDefault	 
					*TabBarGadget\TextColor     = $FF<<24 | #TabBarGadgetColor_TextDefault	 
					*TabBarGadget\FaceColorSelected = *TabBarGadget\FaceColor														 
					*TabBarGadget\TextColorSelected = *TabBarGadget\TextColor														 
			CompilerEndSelect																							 
	EndSelect																														 
	
	
EndMacro

;-
; Erstellt ein neus TabBarGadget.
Procedure.i TabBarGadget(Gadget.i, X.i, Y.i, Width.i, Height.i, Attributes.i, Window.i, ColorTheme$="") ; Code OK
	
	Protected *TabBarGadget.TabBarGadget = AllocateMemory(SizeOf(TabBarGadget))
	Protected Result.i, OldGadgetList.i, DummyGadget.i
	
	InitializeStructure(*TabBarGadget, TabBarGadget)
	OldGadgetList = UseGadgetList(WindowID(Window))
	
	Result = CanvasGadget(Gadget, X, Y, Width, Height, #PB_Canvas_Keyboard)
	UseGadgetList(OldGadgetList)
	If Gadget = #PB_Any
		Gadget = Result
	EndIf
	SetGadgetData(Gadget, *TabBarGadget)
	
	CompilerSelect #PB_Compiler_OS
		CompilerCase #PB_OS_Windows
			TabBarGadgetInclude\DefaultFontID = GetGadgetFont(#PB_Default)
		CompilerDefault
			DummyGadget = TextGadget(#PB_Any, 0, 0, 10, 10, "Dummy")
			TabBarGadgetInclude\DefaultFontID = GetGadgetFont(DummyGadget)
			FreeGadget(DummyGadget)
	CompilerEndSelect
	
	UseThemeColor();MESA
	With *TabBarGadget
		\Attributes                  = Attributes
		\Number                      = Gadget
		\Window                      = Window
		\NewTabItem\Color\Text       = \TextColor
		\NewTabItem\Color\Background = \FaceColor
		\Radius                      = TabBarGadgetInclude\Radius
		\MinTabLength                = TabBarGadgetInclude\MinTabLength
		\MaxTabLength                = TabBarGadgetInclude\MaxTabLength
		\NormalTabLength             = TabBarGadgetInclude\NormalTabLength
		\TabTextAlignment            = TabBarGadgetInclude\TabTextAlignment
		\FontID                      = TabBarGadgetInclude\DefaultFontID
		\EventTab                    = #TabBarGadgetItem_None
		; 		\Width=Width;MESA
		; 		\Height=Height;MESA
	EndWith
	
	BindGadgetEvent(Gadget, @TabBarGadget_Callback())
	;BindEvent(#PB_Event_Gadget, @TabBarGadget_Callback(), #PB_All, Gadget, #PB_All) ; Aktuelle nicht benutzbar
	
	UpdateTabBarGadget(Gadget)
	
	
	ProcedureReturn Result
	
EndProcedure


;-
; Fügt eine Registerkarte an die angegebenen Position ein.
Procedure.i AddTabBarGadgetItem(Gadget.i, Position.i, Text.s, ImageID.i=#Null, DataValue.i=#Null) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *Item.TabBarGadgetItem
	
	If Position = #TabBarGadgetItem_NewTab
		*TabBarGadget\Attributes | #TabBarGadget_NewTab
		*Item = @*TabBarGadget\NewTabItem
	ElseIf TabBarGadget_ItemID(*TabBarGadget, Position)
		*Item = InsertElement(*TabBarGadget\Item())
	Else
		LastElement(*TabBarGadget\Item())
		*Item = AddElement(*TabBarGadget\Item())
		Position = ListIndex(*TabBarGadget\Item())
	EndIf
	
	With *Item
		\Text             = Text
		\ShortText        = Text
		TabBarGadget_ReplaceImage(*TabBarGadget, *Item, ImageID)
		\DataValue        = DataValue
		\Color\Text       = *TabBarGadget\TextColor
		\Color\Background = *TabBarGadget\FaceColor
		\Color\FaceColorSelected = *TabBarGadget\FaceColorSelected;MESA
		\Color\TextColorSelected = *TabBarGadget\TextColorSelected;*MESA
		If *Item <> @*TabBarGadget\NewTabItem
			\Attributes       = *TabBarGadget\Attributes
		EndIf
	EndWith
	
	TabBarGadget_PostUpdate(*TabBarGadget)
	
	ProcedureReturn Position
	
EndProcedure



; Gibt die einmalige ID der angegebenen Registerkarte zurück.
Procedure.i TabBarGadgetItemID(Gadget.i, Position.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	ProcedureReturn TabBarGadget_ItemID(*TabBarGadget, Position)
	
EndProcedure



; Entfernt die Registerkarte mit der angegebenen Position.
Procedure RemoveTabBarGadgetItem(Gadget.i, Position.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	If Position = #TabBarGadgetItem_NewTab
		*TabBarGadget\Attributes & ~#TabBarGadget_NewTab
	ElseIf TabBarGadget_ItemID(*TabBarGadget, Position)
		TabBarGadget_RemoveItem(*TabBarGadget, *TabBarGadget\Item())
	EndIf
	
	TabBarGadget_PostUpdate(*TabBarGadget)
	
EndProcedure



; Entfernt alle Registerkarten aus der Leiste.
Procedure ClearTabBarGadgetItems(Gadget.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	ForEach *TabBarGadget\Item()
		TabBarGadget_ClearItem(*TabBarGadget, *TabBarGadget\Item())
	Next
	ClearList(*TabBarGadget\Item())
	*TabBarGadget\SelectedItem = #Null
	
	TabBarGadget_PostUpdate(*TabBarGadget)
	
EndProcedure



; Gibt die Anzahl der Registerkarten zurück.
Procedure.i CountTabBarGadgetItems(Gadget.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	ProcedureReturn ListSize(*TabBarGadget\Item())
	
EndProcedure





;-  4.3 Set- & Get-Prozeduren
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯



; Définir une info-bulle pour la barre d'onglets (pour les onglets, l'onglet "Nouveau" et le bouton de fermeture)
Procedure TabBarGadgetToolTip(Gadget.i, ItemText.s="", NewText.s="", CloseText.s="") ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	*TabBarGadget\ToolTip\ItemText  = ItemText
	*TabBarGadget\ToolTip\NewText   = NewText
	*TabBarGadget\ToolTip\CloseText = CloseText
	
EndProcedure



; Défini une info-bulle pour l'onglet.
Procedure TabBarGadgetItemToolTip(Gadget.i, Tab.i, Text.s) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		*Item\ToolTip = Text
	EndIf
	
EndProcedure





Re: Modern Menu 1st try

Posted: Tue May 09, 2023 2:39 pm
by Mesa
Part3/3

Code: Select all

; Modifie la valeur d'un attribut de barre d'onglets. 
Procedure SetTabBarGadgetAttribute(Gadget.i, Attribute.i, Value.i, Overwrite.i=#True) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	Select Attribute
		Case #TabBarGadget_CloseButton, #TabBarGadget_SelectedCloseButton, #TabBarGadget_NewTab, #TabBarGadget_NoTabMoving, #TabBarGadget_BottomLine,
		     #TabBarGadget_MultiLine, #TabBarGadget_PopupButton, #TabBarGadget_Editable, #TabBarGadget_CheckBox, #TabBarGadget_ReverseOrdering
			If Value
				*TabBarGadget\Attributes | Attribute
				If Overwrite
					ForEach *TabBarGadget\Item()
						*TabBarGadget\Item()\Attributes | Attribute
					Next
				EndIf
			Else
				*TabBarGadget\Attributes & ~Attribute
				If Overwrite
					ForEach *TabBarGadget\Item()
						*TabBarGadget\Item()\Attributes & ~Attribute
					Next
				EndIf
			EndIf
		Case #TabBarGadget_MultiSelect
			If Value
				*TabBarGadget\Attributes | Attribute
			Else
				*TabBarGadget\Attributes & ~Attribute
				ForEach *TabBarGadget\Item()
					*TabBarGadget\Item()\Selected = #False
				Next
				If *TabBarGadget\SelectedItem
					*TabBarGadget\SelectedItem\Selected = #True
				EndIf
			EndIf
		Case #TabBarGadget_TextCutting
			If Value
				*TabBarGadget\Attributes | Attribute
			Else
				ForEach *TabBarGadget\Item()
					*TabBarGadget\Item()\ShortText = *TabBarGadget\Item()\Text
				Next
				*TabBarGadget\Attributes & ~Attribute
			EndIf
		Case #TabBarGadget_MirroredTabs, #TabBarGadget_Vertical
			*TabBarGadget\Rows = 0
			If Value
				*TabBarGadget\Attributes | Attribute
			Else
				*TabBarGadget\Attributes & ~Attribute
			EndIf
			ForEach *TabBarGadget\Item()
				If *TabBarGadget\Item()\Image
					TabBarGadget_RotateImage(*TabBarGadget, *TabBarGadget\Item())
				EndIf
			Next
			If *TabBarGadget\NewTabItem\Image
				TabBarGadget_RotateImage(*TabBarGadget, *TabBarGadget\NewTabItem)
			EndIf
		Case #TabBarGadget_TabRounding
			*TabBarGadget\Radius = Value
		Case #TabBarGadget_MinTabLength
			*TabBarGadget\MinTabLength = Value
		Case #TabBarGadget_TabTextAlignment
			*TabBarGadget\TabTextAlignment = Value
		Case #TabBarGadget_MaxTabLength
			ForEach *TabBarGadget\Item()
				*TabBarGadget\Item()\ShortText = *TabBarGadget\Item()\Text
			Next
			*TabBarGadget\MaxTabLength = Value
		Case #TabBarGadget_ScrollPosition
			If Value < 0
				*TabBarGadget\Shift = 0
			ElseIf Value > *TabBarGadget\LastShift
				*TabBarGadget\Shift = *TabBarGadget\LastShift
			Else
				*TabBarGadget\Shift = Value
			EndIf
	EndSelect
	
	TabBarGadget_PostUpdate(*TabBarGadget)
	
EndProcedure



; Gibt den Wert eines Attributs der Registerkartenleiste zurück.
Procedure.i GetTabBarGadgetAttribute(Gadget.i, Attribute.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	Select Attribute
		Case #TabBarGadget_CloseButton, #TabBarGadget_SelectedCloseButton, #TabBarGadget_NewTab, #TabBarGadget_MirroredTabs, #TabBarGadget_TextCutting,
		     #TabBarGadget_NoTabMoving, #TabBarGadget_BottomLine, #TabBarGadget_MultiLine, #TabBarGadget_PopupButton, #TabBarGadget_Editable,
		     #TabBarGadget_MultiSelect, #TabBarGadget_Vertical, #TabBarGadget_CheckBox, #TabBarGadget_ReverseOrdering
			If *TabBarGadget\Attributes & Attribute
				ProcedureReturn #True
			Else
				ProcedureReturn #False
			EndIf
		Case #TabBarGadget_TabRounding
			ProcedureReturn *TabBarGadget\Radius
		Case #TabBarGadget_MinTabLength
			ProcedureReturn *TabBarGadget\MinTabLength
		Case #TabBarGadget_MaxTabLength
			ProcedureReturn *TabBarGadget\MaxTabLength
		Case #TabBarGadget_ScrollPosition
			ProcedureReturn *TabBarGadget\Shift
		Case #TabBarGadget_TabTextAlignment
			ProcedureReturn *TabBarGadget\TabTextAlignment
	EndSelect
	
EndProcedure



; Ändert den Daten-Wert der Registerkartenleiste.
Procedure SetTabBarGadgetData(Gadget.i, DataValue.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	*TabBarGadget\DataValue = DataValue
	
EndProcedure



; Gibt den Daten-Wert der Registerkartenleiste zurück.
Procedure.i GetTabBarGadgetData(Gadget.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	ProcedureReturn *TabBarGadget\DataValue
	
EndProcedure



; Ändert die zu nutzende Schrift.
Procedure SetTabBarGadgetFont(Gadget.i, FontID.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	If FontID = #PB_Default
		*TabBarGadget\FontID = TabBarGadgetInclude\DefaultFontID
	Else
		*TabBarGadget\FontID = FontID
	EndIf
	
	; Reset to 0 to force a new size calculation
	*TabBarGadget\TabSize = 0
	
	TabBarGadget_PostUpdate(*TabBarGadget)
	
EndProcedure



; Ändert den Status der Registerkartenleiste.
Procedure SetTabBarGadgetState(Gadget.i, State.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *Item.TabBarGadgetItem
	
	ForEach *TabBarGadget\Item()
		*TabBarGadget\Item()\Selected = #False
	Next
	Select State
		Case #TabBarGadgetItem_None, #TabBarGadgetItem_NewTab
			*TabBarGadget\SelectedItem = #Null
		Case #TabBarGadgetItem_Selected
		Default
			*Item = TabBarGadget_ItemID(*TabBarGadget, State)
			If *Item
				TabBarGadget_SelectItem(*TabBarGadget, *Item)
			EndIf
	EndSelect
	
	TabBarGadget_PostUpdate(*TabBarGadget)
	
EndProcedure



; Gibt den Status der Registerkartenleiste zurück.
Procedure.i GetTabBarGadgetState(Gadget.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	If *TabBarGadget\SelectedItem
		ChangeCurrentElement(*TabBarGadget\Item(), *TabBarGadget\SelectedItem)
		ProcedureReturn ListIndex(*TabBarGadget\Item())
	EndIf
	
	ProcedureReturn #TabBarGadgetItem_None
	
EndProcedure






; Wechselt zur der Registerkarte mit dem angegebenen Text
Procedure SetTabBarGadgetText(Gadget.i, Text.s) ; Code OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	*TabBarGadget\SelectedItem = #Null
	ForEach *TabBarGadget\Item()
		If *TabBarGadget\Item()\Text = Text
			SetTabBarGadgetState(Gadget, @*TabBarGadget\Item())
			Break
		EndIf
	Next
	
EndProcedure



; Gibt den Text der aktuell ausgewählten Registerkarte zurück.
Procedure.s GetTabBarGadgetText(Gadget.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	If *TabBarGadget\SelectedItem
		ProcedureReturn *TabBarGadget\SelectedItem\Text
	EndIf
	
EndProcedure



Procedure SetTabBarGadgetColor(Gadget.i, Type.i, Color.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget);MESA
	
	Select Type
		Case #PB_Gadget_BackColor;#TabBarGadgetGlobal_TabBarColor
			If Color = #PB_Default
				CompilerIf #PB_Compiler_OS = #PB_OS_Windows
					*TabBarGadget\TabBarColor = GetSysColor_(#COLOR_BTNFACE)
				CompilerElse
					*TabBarGadget\TabBarColor = #TabBarGadgetColor_TabBarDefault
				CompilerEndIf
			Else
				*TabBarGadget\TabBarColor = Color
			EndIf
			*TabBarGadget\TabBarColor | ($FF << 24)
		Case #PB_Gadget_LineColor;#TabBarGadgetGlobal_BorderColor
			If Color = #PB_Default
				CompilerIf #PB_Compiler_OS = #PB_OS_Windows
					*TabBarGadget\BorderColor = GetSysColor_(#COLOR_3DSHADOW)
				CompilerElse
					*TabBarGadget\BorderColor = #TabBarGadgetColor_BorderDefault
				CompilerEndIf
			Else
				*TabBarGadget\BorderColor = Color
			EndIf
			TabBarGadgetInclude\BorderColor | ($FF << 24)
		Case #PB_Gadget_TitleBackColor;#TabBarGadgetGlobal_FaceColor
			If Color = #PB_Default
				CompilerIf #PB_Compiler_OS = #PB_OS_Windows
					*TabBarGadget\FaceColor = GetSysColor_(#COLOR_BTNFACE)
				CompilerElse
					*TabBarGadget\FaceColor = #TabBarGadgetColor_FaceDefault
				CompilerEndIf
			Else
				*TabBarGadget\FaceColor = Color
			EndIf
			*TabBarGadget\FaceColor | ($FF << 24)
		Case #PB_Gadget_FrontColor;#TabBarGadgetGlobal_TextColor
			If Color = #PB_Default
				CompilerIf #PB_Compiler_OS = #PB_OS_Windows
					*TabBarGadget\TextColor = GetSysColor_(#COLOR_BTNTEXT)
				CompilerElse
					*TabBarGadget\TextColor = #TabBarGadgetColor_TextDefault
				CompilerEndIf
			Else
				*TabBarGadget\TextColor = Color
			EndIf
			*TabBarGadget\TextColor | ($FF << 24)
			
	EndSelect
	
	TabBarGadget_PostUpdate(GetGadgetData(Gadget))
	
	
EndProcedure
 

Procedure.i GetTabBarGadgetColor(Gadget.i, Type.i) ; MESA Code OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	Select Type
		Case #PB_Gadget_FrontColor
			ProcedureReturn *TabBarGadget\TextColor & $FFFFFF
		Case #PB_Gadget_BackColor ; and face color *TabBarGadget\FaceColor
			ProcedureReturn *TabBarGadget\TabBarColor & $FFFFFF
		Case #PB_Gadget_LineColor
			ProcedureReturn *TabBarGadget\BorderColor & $FFFFFF
		Case #PB_Gadget_TitleBackColor
			ProcedureReturn *TabBarGadget\FaceColor & $FFFFFF
	EndSelect
	
EndProcedure



; Set attributes global to all TabBarGadgets
Procedure SetTabBarGadgetGlobalAttribute(Attribute.i, Value.i)
	
	Select Attribute
		Case #TabBarGadgetGlobal_WheelDirection
			If Value > 0
				TabBarGadgetInclude\WheelDirection = 1
			Else
				TabBarGadgetInclude\WheelDirection = -1
			EndIf
		Case #TabBarGadgetGlobal_WheelAction
			TabBarGadgetInclude\WheelAction = Value
		Case #TabBarGadgetGlobal_DrawDisabled
			If Value
				TabBarGadgetInclude\DrawDisabled = #True
			Else
				TabBarGadgetInclude\DrawDisabled = #False
			EndIf
		Case #TabBarGadgetGlobal_MiddleClickClose
			If Value
				TabBarGadgetInclude\EnableMiddleClickForCloseTab = #True
			Else
				TabBarGadgetInclude\EnableMiddleClickForCloseTab = #False
			EndIf
		Case #TabBarGadgetGlobal_DoubleClickNew
			If Value
				TabBarGadgetInclude\EnableDoubleClickForNewTab = #True
			Else
				TabBarGadgetInclude\EnableDoubleClickForNewTab = #False
			EndIf
			;     Case #TabBarGadgetGlobal_TabBarColor
			;       If Value = #PB_Default
			;         CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			;           *TabBarGadget\TabBarColor = GetSysColor_(#COLOR_BTNFACE)
			;         CompilerElse
			;           *TabBarGadget\TabBarColor = #TabBarGadgetColor_TabBarDefault
			;         CompilerEndIf
			;       Else
			;         *TabBarGadget\TabBarColor = Value
			;       EndIf
			;       *TabBarGadget\TabBarColor | ($FF << 24)
			;     Case #TabBarGadgetGlobal_BorderColor
			;       If Value = #PB_Default
			;         CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			;           *TabBarGadget\BorderColor = GetSysColor_(#COLOR_3DSHADOW)
			;         CompilerElse
			;           *TabBarGadget\BorderColor = #TabBarGadgetColor_BorderDefault
			;         CompilerEndIf
			;       Else
			;         *TabBarGadget\BorderColor = Value
			;       EndIf
			;       TabBarGadgetInclude\BorderColor | ($FF << 24)
			;     Case #TabBarGadgetGlobal_FaceColor
			;       If Value = #PB_Default
			;         CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			;           *TabBarGadget\FaceColor = GetSysColor_(#COLOR_BTNFACE)
			;         CompilerElse
			;           *TabBarGadget\FaceColor = #TabBarGadgetColor_FaceDefault
			;         CompilerEndIf
			;       Else
			;         *TabBarGadget\FaceColor = Value
			;       EndIf
			;       *TabBarGadget\FaceColor | ($FF << 24)
			;     Case #TabBarGadgetGlobal_TextColor
			;       If Value = #PB_Default
			;         CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			;           *TabBarGadget\TextColor = GetSysColor_(#COLOR_BTNTEXT)
			;         CompilerElse
			;           *TabBarGadget\TextColor = #TabBarGadgetColor_TextDefault
			;         CompilerEndIf
			;       Else
			;         *TabBarGadget\TextColor = Value
			;       EndIf
			;       *TabBarGadget\TextColor | ($FF << 24)
	EndSelect
	
EndProcedure

; Get attributes global to all TabBarGadgets
Procedure GetTabBarGadgetGlobalAttribute(Attribute.i)
	
	Select Attribute
		Case #TabBarGadgetGlobal_WheelDirection
			ProcedureReturn TabBarGadgetInclude\WheelDirection
		Case #TabBarGadgetGlobal_WheelAction
			ProcedureReturn TabBarGadgetInclude\WheelAction
		Case #TabBarGadgetGlobal_DrawDisabled
			ProcedureReturn TabBarGadgetInclude\DrawDisabled
		Case #TabBarGadgetGlobal_MiddleClickClose
			ProcedureReturn TabBarGadgetInclude\EnableMiddleClickForCloseTab
		Case #TabBarGadgetGlobal_DoubleClickNew
			ProcedureReturn TabBarGadgetInclude\EnableDoubleClickForNewTab
			;     Case #TabBarGadgetGlobal_TabBarColor
			;       ProcedureReturn TabBarGadgetInclude\TabBarColor & $FFFFFF
			;     Case #TabBarGadgetGlobal_BorderColor
			;       ProcedureReturn TabBarGadgetInclude\BorderColor & $FFFFFF
			;     Case #TabBarGadgetGlobal_FaceColor
			;       ProcedureReturn TabBarGadgetInclude\FaceColor & $FFFFFF
			;     Case #TabBarGadgetGlobal_TextColor
			;       ProcedureReturn TabBarGadgetInclude\TextColor & $FFFFFF
	EndSelect
	
EndProcedure



; Ändert die Attribute der angegebenen Registerkarte.
Procedure SetTabBarGadgetItemAttribute(Gadget.i, Tab.i, Attribute.i, Value.i)
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *Item.TabBarGadgetItem = TabBarGadget_ItemID(*TabBarGadget, Tab)
	
	If *Item And *Item <> *TabBarGadget\NewTabItem
		Select Attribute
			Case #TabBarGadget_CloseButton, #TabBarGadget_SelectedCloseButton, #TabBarGadget_CheckBox
				If Value
					*Item\Attributes | Attribute
				Else
					*Item\Attributes & ~Attribute
				EndIf
		EndSelect
		TabBarGadget_PostUpdate(*TabBarGadget)
	EndIf
	
EndProcedure



; Gibt den Status der angegebenen Registerkarte zurück.
Procedure.i GetTabBarGadgetItemAttribute(Gadget.i, Tab.i, Attribute.i)
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	Protected State.i
	
	If *Item
		Select Attribute
			Case #TabBarGadget_CloseButton, #TabBarGadget_SelectedCloseButton, #TabBarGadget_CheckBox
				If *Item\Attributes & Attribute
					ProcedureReturn #True
				Else
					ProcedureReturn #False
				EndIf
		EndSelect
	EndIf
	
EndProcedure



; Ändert den Datenwert der angegebenen Registerkarte.
Procedure SetTabBarGadgetItemData(Gadget.i, Tab.i, DataValue.i) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		*Item\DataValue = DataValue
	EndIf
	
EndProcedure



; Gibt den Datenwert der angegebenen Registerkarte zurück.
Procedure.i GetTabBarGadgetItemData(Gadget.i, Tab.i) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		ProcedureReturn *Item\DataValue
	EndIf
	
EndProcedure



; Ändert die Farbe der angegebenen Registerkarte.
Procedure SetTabBarGadgetItemColor(Gadget.i, Tab.i, Type.i, Color.i) ; Code OK, Hilfe OK
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)			 ;MESA
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		Select Type
			Case #PB_Gadget_FrontColor
				If Color = #PB_Default
					Color = *TabBarGadget\TextColor
				EndIf
				*Item\Color\Text = Color | $FF<<24
			Case #PB_Gadget_BackColor
				If Color = #PB_Default
					Color = *TabBarGadget\FaceColor
				EndIf
				*Item\Color\Background = Color | $FF<<24
		EndSelect
		TabBarGadget_PostUpdate(GetGadgetData(Gadget))
	EndIf
	
EndProcedure



; Gibt die Farbe der angegebenen Registerkarte zurück.
Procedure.i GetTabBarGadgetItemColor(Gadget.i, Tab.i, Type.i) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		Select Type
			Case #PB_Gadget_FrontColor
				ProcedureReturn *Item\Color\Text & $FFFFFF
			Case #PB_Gadget_BackColor
				ProcedureReturn *Item\Color\Background & $FFFFFF
		EndSelect
	EndIf
	
EndProcedure



; Ändert das Icon der angegebenen Registerkarte.
Procedure SetTabBarGadgetItemImage(Gadget.i, Tab.i, ImageID.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *Item.TabBarGadgetItem = TabBarGadget_ItemID(*TabBarGadget, Tab)
	
	If *Item
		TabBarGadget_ReplaceImage(*TabBarGadget, *Item, ImageID)
		TabBarGadget_PostUpdate(*TabBarGadget)
	EndIf
	
EndProcedure



; Ändert die Position der angegebenen Registerkarte (die Registerkarte wird also verschoben).
Procedure SetTabBarGadgetItemPosition(Gadget.i, Tab.i, Position.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *NewItem.TabBarGadgetItem = TabBarGadget_ItemID(*TabBarGadget, Position)
	Protected *Item.TabBarGadgetItem = TabBarGadget_ItemID(*TabBarGadget, Tab)
	
	If *Item And *Item <> *TabBarGadget\NewTabItem
		If *NewItem And *NewItem <> *TabBarGadget\NewTabItem
			If Position > Tab
				MoveElement(*TabBarGadget\Item(), #PB_List_After, *NewItem)
			Else
				MoveElement(*TabBarGadget\Item(), #PB_List_Before, *NewItem)
			EndIf
		Else
			MoveElement(*TabBarGadget\Item(), #PB_List_Last)
		EndIf
		TabBarGadget_PostUpdate(*TabBarGadget)
	EndIf
	
EndProcedure



; Gibt die Position der angegebenen Registerkarte zurück.
Procedure GetTabBarGadgetItemPosition(Gadget.i, Tab.i) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	
	With *TabBarGadget
		
		Select Tab
			Case #TabBarGadgetItem_Event
				ProcedureReturn \EventTab
			Case #TabBarGadgetItem_Selected
				If \SelectedItem
					ChangeCurrentElement(\Item(), \SelectedItem)
					ProcedureReturn ListIndex(\Item())
				Else
					ProcedureReturn #TabBarGadgetItem_None
				EndIf
			Case #TabBarGadgetItem_NewTab, #TabBarGadgetItem_None
				ProcedureReturn Tab
			Default
				If Tab >= 0 And Tab < ListSize(\Item())
					ProcedureReturn Tab
				ElseIf Tab >= ListSize(\Item())
					ForEach \Item()
						If @\Item() = Tab
							ProcedureReturn ListIndex(\Item())
						EndIf
					Next
					ProcedureReturn #TabBarGadgetItem_None
				EndIf
		EndSelect
		
	EndWith
	
EndProcedure



; Ändert den Status der angegebenen Registerkarte.
Procedure SetTabBarGadgetItemState(Gadget.i, Tab.i, State.i, Mask.i=#TabBarGadget_Disabled|#TabBarGadget_Selected|#TabBarGadget_Checked) ; Code OK, Hilfe OK
	
	Protected *TabBarGadget.TabBarGadget = GetGadgetData(Gadget)
	Protected *Item.TabBarGadgetItem = TabBarGadget_ItemID(*TabBarGadget, Tab)
	
	If *Item And *Item <> *TabBarGadget\NewTabItem
		If Mask & #TabBarGadget_Disabled
			*Item\Disabled = Bool(State&#TabBarGadget_Disabled)
		EndIf
		If Mask & #TabBarGadget_Checked
			*Item\Checked = Bool(State&#TabBarGadget_Checked)
		EndIf
		If Mask & #TabBarGadget_Selected
			If State & #TabBarGadget_Selected
				TabBarGadget_SelectItem(*TabBarGadget, *Item)
			Else
				TabBarGadget_UnselectItem(*TabBarGadget, *Item)
			EndIf
		EndIf
		TabBarGadget_PostUpdate(*TabBarGadget)
	EndIf
	
EndProcedure



; Gibt den Status der angegebenen Registerkarte zurück.
Procedure.i GetTabBarGadgetItemState(Gadget.i, Tab.i) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		ProcedureReturn (*Item\Disabled*#TabBarGadget_Disabled) | (*Item\Selected*#TabBarGadget_Selected) | (*Item\Checked*#TabBarGadget_Checked)
	EndIf
	
EndProcedure



; Ändert den Text der angegebenen Registerkarte.
Procedure SetTabBarGadgetItemText(Gadget.i, Tab.i, Text.s) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		*Item\Text      = Text
		*Item\ShortText = Text
		TabBarGadget_PostUpdate(GetGadgetData(Gadget))
	EndIf
	
EndProcedure



; Gibt den Text der angegebenen Registerkarte zurück.
Procedure.s GetTabBarGadgetItemText(Gadget.i, Tab.i) ; Code OK, Hilfe OK
	
	Protected *Item.TabBarGadgetItem = TabBarGadgetItemID(Gadget, Tab)
	
	If *Item
		ProcedureReturn *Item\Text
	EndIf
	
EndProcedure


;- ------------------------------------------------------------------------------------
;- Test

; ====================Menu non modal
Structure MENUINFO
	cbSize.l
	fMask.l
	dwStyle.l
	cyMax.l
	hbrBack.i
	dwContextHelpID.l
	dwMenuData.i
EndStructure

#MIM_STYLE=$00000010
#MIM_APPLYTOSUBMENUS=$80000000
#MNS_AUTODISMISS=$10000000
#MNS_MODELESS=$40000000

Procedure.i MenuSetMultitasking(menu.i)
	Protected result.i,mi.MENUINFO
	mi\cbSize=SizeOf(mi)
	mi\fMask=#MIM_STYLE|#MIM_APPLYTOSUBMENUS
	mi\dwStyle=#MNS_AUTODISMISS|#MNS_MODELESS 
	result=SetMenuInfo_(MenuID(menu),mi)
	ProcedureReturn result
EndProcedure
; =====================    
; =====================Menus
;-menu
UsePNGImageDecoder()
If LoadImage(1,#PB_Compiler_Home + "Examples\Sources\Data\ToolBar\Open.png")         
	If CreatePopupImageMenu(0, #PB_Menu_ModernLook)
		MenuItem(1, "&New")
		MenuItem(2, "Open",ImageID(1))
		MenuItem(3, "Save")
		MenuItem(4, "Quit") ; Ajout de l'image perso
		MenuBar()
		OpenSubMenu("Recents")
		MenuItem(5, "PureBasic.exe")
		MenuItem(6, "Test.txt")
		CloseSubMenu()
		MenuSetMultitasking(0)
	EndIf
	
EndIf
If CreatePopupImageMenu(1, #PB_Menu_ModernLook)
	MenuItem(7, "Cut",ImageID(1))
	MenuItem(8, "Copy")
	MenuItem(9, "Past")
	MenuSetMultitasking(1)
EndIf

Define i
For i=2 To 7
	If CreatePopupMenu(i)
		MenuItem(8+i, "Test "+Str(i))
	EndIf
	MenuSetMultitasking(i)	
Next i
; ================== end menu

Enumeration
	#Window
	#Image
	#Gadget_TabBar
	#Gadget_Vertical
	#Gadget_CloseButton
	#Gadget_SelectedCloseButton
	#Gadget_EmptyButton
	#Gadget_MirroredTabs
	#Gadget_TextCutting
	#Gadget_NoTabMoving
	#Gadget_TabRounding
	#Gadget_MultiLine
	#Gadget_BottomLine
	#Gadget_Editable
	#Gadget_MultiSelect
	#Gadget_CheckBox
	#Gadget_ReverseOrdering
	#Gadget_TabTextAlignment
	#Gadget_MinTabLength
	#Gadget_MaxTabLength
	#Gadget_Item
	#Gadget_ItemBackColor
	#Gadget_ItemFrontColor
	#Gadget_ItemText
	#Gadget_ItemImage
	#Gadget_ItemDisabled
	#Gadget_ItemSelected
	#Gadget_ItemChecked
	#Gadget_ItemCloseButton
	#Gadget_ItemCheckBox
	#Gadget_Events
	#Gadget_Container
EndEnumeration

Procedure BorderGadget(ID.i, X.i, Y.i, Width.i, Height.i, Text.s)
	Protected Result.i
	If ID = #PB_Any
		Result = ContainerGadget(ID, X, Y, Width, Height)
		SetGadgetData(Result, FrameGadget(#PB_Any, 0, 0, Width, Height, Text))
	Else
		Result = ContainerGadget(ID, X, Y, Width, Height)
		SetGadgetData(ID, FrameGadget(#PB_Any, 0, 0, Width, Height, Text))
	EndIf
	ProcedureReturn Result
EndProcedure

Procedure GetItemGadgetState()
	Select GetGadgetState(#Gadget_Item)
		Case -1
			ProcedureReturn #TabBarGadgetItem_None
		Case 0
			ProcedureReturn #TabBarGadgetItem_NewTab
		Default
			ProcedureReturn GetGadgetState(#Gadget_Item)-1
	EndSelect
EndProcedure

Procedure UpdateItemAttributes(Position)
	If GetGadgetText(#Gadget_ItemText) <> GetTabBarGadgetItemText(#Gadget_TabBar, Position)
		SetGadgetText(#Gadget_ItemText, GetTabBarGadgetItemText(#Gadget_TabBar, Position))
	EndIf
	SetGadgetState(#Gadget_ItemDisabled, (GetTabBarGadgetItemState(#Gadget_TabBar, Position)&#TabBarGadget_Disabled))
	SetGadgetState(#Gadget_ItemSelected, (GetTabBarGadgetItemState(#Gadget_TabBar, Position)&#TabBarGadget_Selected))
	SetGadgetState(#Gadget_ItemChecked, (GetTabBarGadgetItemState(#Gadget_TabBar, Position)&#TabBarGadget_Checked))
	SetGadgetState(#Gadget_ItemCloseButton, GetTabBarGadgetItemAttribute(#Gadget_TabBar, Position, #TabBarGadget_CloseButton))
	SetGadgetState(#Gadget_ItemCheckBox, GetTabBarGadgetItemAttribute(#Gadget_TabBar, Position, #TabBarGadget_CheckBox))
EndProcedure

Procedure UpdateItemGadget(Position)
	Protected Index
	ClearGadgetItems(#Gadget_Item)
	AddGadgetItem(#Gadget_Item, #PB_Default, "NewTab")
	For Index = 1 To CountTabBarGadgetItems(#Gadget_TabBar)
		AddGadgetItem(#Gadget_Item, #PB_Default, "Position "+Str(Index-1))
	Next
	SetTabBarGadgetState(#Gadget_TabBar, Position)
	SetGadgetState(#Gadget_Item, Position+1)
	UpdateItemAttributes(GetItemGadgetState())
EndProcedure


;- win
Define Color.i, FileName.s, Position.i



OpenWindow(#Window, 0, 0, 800, 450, "TabBarGadget", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)

TabBarGadget(#Gadget_TabBar, 0, 0, WindowWidth(#Window), #TabBarGadget_DefaultHeight,#TabBarGadget_PopupButton|#TabBarGadget_NoTabMoving  , #Window, "BLUEORANGE");"BLACKDARK""BLACKBLACK""BLUEBLUE"
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "File")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Edition")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Project")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Form")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Compiler")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Debug")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Tools")
AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "Help")
TabBarGadgetToolTip(#Gadget_TabBar, "%ITEM", "new", "close")

; ;-menu                           
; If LoadImage(1,#PB_Compiler_Home + "Examples\Sources\Data\ToolBar\Open.png")         
; 	If CreatePopupImageMenu(0, #PB_Menu_ModernLook)
; 		MenuItem(1, "&New",ImageID(1))
; 		MenuItem(2, "Open")
; 		MenuItem(3, "Save")
; 		MenuItem(4, "Quit") ; Ajout de l'image perso
; 		MenuBar()
; 		OpenSubMenu("Recents")
; 		MenuItem(5, "PureBasic.exe")
; 		MenuItem(6, "Test.txt")
; 		CloseSubMenu()
; 		MenuSetMultitasking(0)
; 	EndIf
; 	
; EndIf
; If CreatePopupImageMenu(1, #PB_Menu_ModernLook)
; 	MenuItem(7, "Cut",ImageID(1))
; 	MenuItem(8, "Copy")
; 	MenuItem(9, "Past")
; 	MenuSetMultitasking(1)
; EndIf
; 
; Define i
; For i=2 To 7
; 	If CreatePopupMenu(i)
; 		MenuItem(8+i, "Test "+Str(i))
; 	EndIf
; MenuSetMultitasking(i)	
; Next i
; ; end menu



If ContainerGadget(#Gadget_Container, 0, GadgetHeight(#Gadget_TabBar), WindowWidth(#Window), WindowHeight(#Window)-GadgetHeight(#Gadget_TabBar), #PB_Container_Flat)
	
	If BorderGadget(#PB_Any, 5, 5, 170, 370, "Attributes for the bar")
		CheckBoxGadget(#Gadget_CloseButton, 10, 20, 130, 20, "tab close button")
		CheckBoxGadget(#Gadget_SelectedCloseButton, 10, 40, 130, 20, "selected tab close button")
		CheckBoxGadget(#Gadget_EmptyButton, 10, 60, 130, 20, "'new' tab")
		CheckBoxGadget(#Gadget_CheckBox, 10, 80, 130, 20, "tab check box")
		CheckBoxGadget(#Gadget_Vertical, 10, 100, 130, 20, "vertical tab bar")
		CheckBoxGadget(#Gadget_MirroredTabs, 10, 120, 130, 20, "mirror tab bar")
		CheckBoxGadget(#Gadget_ReverseOrdering, 10, 140, 130, 20, "reverse ordering")
		CheckBoxGadget(#Gadget_MultiLine, 10, 160, 130, 20, "multiline tab bar")
		CheckBoxGadget(#Gadget_TextCutting, 10, 180, 130, 20, "text cutting")
		CheckBoxGadget(#Gadget_Editable, 10, 200, 130, 20, "editable tab text")
		CheckBoxGadget(#Gadget_MultiSelect, 10, 220, 130, 20, "multi select")
		CheckBoxGadget(#Gadget_NoTabMoving, 10, 240, 130, 20, "no tab moving"):SetGadgetState(#Gadget_NoTabMoving, #PB_CheckBox_Checked)
		CheckBoxGadget(#Gadget_BottomLine, 10, 260, 130, 20, "bottom line")
		TextGadget(#PB_Any, 10, 285, 90, 20, "tab text align:")
		SpinGadget(#Gadget_TabTextAlignment, 100, 280, 60, 20, -1, 1, #PB_Spin_Numeric)
		SetGadgetState(#Gadget_TabTextAlignment, GetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_TabTextAlignment))
		TextGadget(#PB_Any, 10, 305, 90, 20, "tab rounding:")
		SpinGadget(#Gadget_TabRounding, 100, 300, 60, 20, 0, 20, #PB_Spin_Numeric)
		SetGadgetState(#Gadget_TabRounding, GetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_TabRounding))
		TextGadget(#PB_Any, 10, 325, 90, 20, "min tab length:")
		SpinGadget(#Gadget_MinTabLength, 100, 320, 60, 20, 0, 1000, #PB_Spin_Numeric)
		SetGadgetState(#Gadget_MinTabLength, GetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MinTabLength))
		TextGadget(#PB_Any, 10, 345, 90, 20, "max tab length:")
		SpinGadget(#Gadget_MaxTabLength, 100, 340, 60, 20, 0, 1000, #PB_Spin_Numeric)
		SetGadgetState(#Gadget_MaxTabLength, GetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MaxTabLength))
		CloseGadgetList()
	EndIf
	
	If BorderGadget(#PB_Any, 180, 5, 375, 195, "Tabs")
		TextGadget(#PB_Any, 10, 28, 50, 20, "Position:")
		ComboBoxGadget(#Gadget_Item, 60, 25, 100, 20)
		ButtonGadget(#Gadget_ItemBackColor, 10, 50, 100, 20, "background color")
		ButtonGadget(#Gadget_ItemFrontColor, 115, 50, 100, 20, "text color")
		TextGadget(#PB_Any, 10, 78, 30, 20, "Text:")
		StringGadget(#Gadget_ItemText, 40, 75, 175, 20, GetTabBarGadgetText(#Gadget_TabBar))
		CheckBoxGadget(#Gadget_ItemDisabled, 10, 100, 100, 20, "disabled")
		CheckBoxGadget(#Gadget_ItemSelected, 10, 120, 100, 20, "selected")
		CheckBoxGadget(#Gadget_ItemChecked, 10, 140, 100, 20, "checked")
		CheckBoxGadget(#Gadget_ItemCloseButton, 210, 100, 100, 20, "close button")
		CheckBoxGadget(#Gadget_ItemCheckBox, 210, 120, 100, 20, "check box")
		ButtonGadget(#Gadget_ItemImage, 10, 165, 100, 20, "image or icon", #PB_Button_Toggle)
		CloseGadgetList()
	EndIf
	
	If BorderGadget(#PB_Any, 180, 210, 225, 120, "Events")
		EditorGadget(#Gadget_Events, 10, 20, 200, 90, #PB_Editor_ReadOnly)
		CloseGadgetList()
	EndIf
	
	
	UpdateItemGadget(0)
	
EndIf


Procedure Resize()
	
	If GetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_Vertical)
		ResizeGadget(#Gadget_TabBar, 0, 0, #PB_Ignore, WindowHeight(#Window))
		UpdateTabBarGadget(#Gadget_TabBar)
		ResizeGadget(#Gadget_Container, GadgetWidth(#Gadget_TabBar), 0, WindowWidth(#Window)-GadgetWidth(#Gadget_TabBar), WindowHeight(#Window))
	Else
		ResizeGadget(#Gadget_TabBar, 0, 0, WindowWidth(#Window), #PB_Ignore)
		UpdateTabBarGadget(#Gadget_TabBar)
		ResizeGadget(#Gadget_Container, 0, GadgetHeight(#Gadget_TabBar), WindowWidth(#Window), WindowHeight(#Window)-GadgetHeight(#Gadget_TabBar))
	EndIf
	
EndProcedure

BindEvent(#PB_Event_SizeWindow, @Resize())
Resize()

Repeat
	
	Select WaitWindowEvent()
		Case #PB_Event_Menu    
			Select EventMenu()  
				Case 1 
					Debug "Menu : New"
					UpdateTabBarGadget(#Gadget_TabBar)
				Case 2 
					Debug "Menu : Open"
					UpdateTabBarGadget(#Gadget_TabBar)
				Case 3 
					Debug "Menu : Save"
					UpdateTabBarGadget(#Gadget_TabBar)
				Case 4 
					End
				Case 5 
					Debug "Menu : PureBasic.exe"
					UpdateTabBarGadget(#Gadget_TabBar)
				Case 6 
					Debug "Menu : Text.txt"
					UpdateTabBarGadget(#Gadget_TabBar)
				Case 7 To 16 
					Debug "Test"
					UpdateTabBarGadget(#Gadget_TabBar)
			EndSelect
		Case #PB_Event_CloseWindow
			
			End
			
		Case #PB_Event_SizeWindow
			
		Case #PB_Event_Gadget
			;- events
			Select EventGadget()
				Case #Gadget_TabBar
					Select EventType()
						Case #TabBarGadget_EventType_Pushed
							Debug "ok"
							AddGadgetItem(#Gadget_Events, 0, "pushed: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
							Position = AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "New tab")
							UpdateItemGadget(Position)
						Case #TabBarGadget_EventType_NewItem
							AddGadgetItem(#Gadget_Events, 0, "NewItem: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
							Position = AddTabBarGadgetItem(#Gadget_TabBar, #PB_Default, "New tab")
							UpdateItemGadget(Position)
						Case #TabBarGadget_EventType_CloseItem
							AddGadgetItem(#Gadget_Events, 0, "CloseItem: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
							RemoveTabBarGadgetItem(#Gadget_TabBar, #TabBarGadgetItem_Event)
						Case #TabBarGadget_EventType_Change
							AddGadgetItem(#Gadget_Events, 0, "Change: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
						Case #TabBarGadget_EventType_CheckBox
							AddGadgetItem(#Gadget_Events, 0, "CheckBox: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
						Case #TabBarGadget_EventType_Resize
							AddGadgetItem(#Gadget_Events, 0, "Resize")
							Resize()
						Case #TabBarGadget_EventType_EditItem
							AddGadgetItem(#Gadget_Events, 0, "EditItem: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
						Case #TabBarGadget_EventType_SwapItem
							AddGadgetItem(#Gadget_Events, 0, "SwapItem: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
						Case #TabBarGadget_EventType_DeSelected
							;             	Debug "ok" ;MESA
							;             	Debug GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)
							AddGadgetItem(#Gadget_Events, 0, "DeSelected: "+Str(GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)))
							
							
					EndSelect
					UpdateItemAttributes(GetItemGadgetState())
				Case #Gadget_CloseButton
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_CloseButton, GetGadgetState(#Gadget_CloseButton))
				Case #Gadget_SelectedCloseButton
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_SelectedCloseButton, GetGadgetState(#Gadget_SelectedCloseButton))
				Case #Gadget_EmptyButton;*******
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_NewTab, GetGadgetState(#Gadget_EmptyButton))
				Case #Gadget_Vertical
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_Vertical, GetGadgetState(#Gadget_Vertical))
					Resize()
				Case #Gadget_MirroredTabs
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MirroredTabs, GetGadgetState(#Gadget_MirroredTabs))
				Case #Gadget_TextCutting
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_TextCutting, GetGadgetState(#Gadget_TextCutting))
				Case #Gadget_NoTabMoving
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_NoTabMoving, GetGadgetState(#Gadget_NoTabMoving))
				Case #Gadget_TabRounding
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_TabRounding, GetGadgetState(#Gadget_TabRounding))
				Case #Gadget_MultiLine
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MultiLine, GetGadgetState(#Gadget_MultiLine))
				Case #Gadget_BottomLine
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_BottomLine, GetGadgetState(#Gadget_BottomLine))
				Case #Gadget_Editable
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_Editable, GetGadgetState(#Gadget_Editable))
				Case #Gadget_MultiSelect
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MultiSelect, GetGadgetState(#Gadget_MultiSelect))
				Case #Gadget_CheckBox
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_CheckBox, GetGadgetState(#Gadget_CheckBox))
				Case #Gadget_ReverseOrdering
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_ReverseOrdering, GetGadgetState(#Gadget_ReverseOrdering))
				Case #Gadget_MinTabLength
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MinTabLength, GetGadgetState(#Gadget_MinTabLength))
				Case #Gadget_MaxTabLength
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_MaxTabLength, GetGadgetState(#Gadget_MaxTabLength))
				Case #Gadget_TabTextAlignment
					SetTabBarGadgetAttribute(#Gadget_TabBar, #TabBarGadget_TabTextAlignment, GetGadgetState(#Gadget_TabTextAlignment))
				Case #Gadget_Item
					SetGadgetText(#Gadget_ItemText, GetTabBarGadgetItemText(#Gadget_TabBar, GetItemGadgetState()))
					UpdateItemAttributes(GetItemGadgetState())
				Case #Gadget_ItemBackColor
					Color = GetTabBarGadgetItemColor(#Gadget_TabBar, GetTabBarGadgetState(#Gadget_TabBar), #PB_Gadget_BackColor)
					Color = ColorRequester(Color)
					If Color > -1
						SetTabBarGadgetItemColor(#Gadget_TabBar, GetItemGadgetState(), #PB_Gadget_BackColor, Color)
					EndIf
				Case #Gadget_ItemFrontColor
					Color = GetTabBarGadgetItemColor(#Gadget_TabBar, GetTabBarGadgetState(#Gadget_TabBar), #PB_Gadget_FrontColor)
					Color = ColorRequester(Color)
					If Color > -1
						SetTabBarGadgetItemColor(#Gadget_TabBar, GetItemGadgetState(), #PB_Gadget_FrontColor, Color)
					EndIf
				Case #Gadget_ItemText
					SetTabBarGadgetItemText(#Gadget_TabBar, GetItemGadgetState(), GetGadgetText(#Gadget_ItemText))
				Case #Gadget_ItemDisabled
					SetTabBarGadgetItemState(#Gadget_TabBar, GetItemGadgetState(), GetGadgetState(#Gadget_ItemDisabled)*#TabBarGadget_Disabled, #TabBarGadget_Disabled)
				Case #Gadget_ItemSelected
					SetTabBarGadgetItemState(#Gadget_TabBar, GetItemGadgetState(), GetGadgetState(#Gadget_ItemSelected)*#TabBarGadget_Selected, #TabBarGadget_Selected)
				Case #Gadget_ItemChecked
					SetTabBarGadgetItemState(#Gadget_TabBar, GetItemGadgetState(), GetGadgetState(#Gadget_ItemChecked)*#TabBarGadget_Checked, #TabBarGadget_Checked)
				Case #Gadget_ItemCloseButton
					SetTabBarGadgetItemAttribute(#Gadget_TabBar, GetItemGadgetState(), #TabBarGadget_CloseButton, GetGadgetState(#Gadget_ItemCloseButton))
				Case #Gadget_ItemCheckBox
					SetTabBarGadgetItemAttribute(#Gadget_TabBar, GetItemGadgetState(), #TabBarGadget_CheckBox, GetGadgetState(#Gadget_ItemCheckBox))
				Case #Gadget_ItemImage
					If GetGadgetState(#Gadget_ItemImage)
						FileName = OpenFileRequester("Image", "", "Images (*.bmp;*.png)|*.bmp;*.png", 0)
						If FileName And LoadImage(#Image, FileName)
							SetTabBarGadgetItemImage(#Gadget_TabBar, GetItemGadgetState(), ImageID(#Image))
						EndIf
					Else
						SetTabBarGadgetItemImage(#Gadget_TabBar, GetItemGadgetState(), #Null)
					EndIf
			EndSelect
			
	EndSelect
	
ForEver


Re: Modern Menu 1st try

Posted: Tue May 09, 2023 2:42 pm
by Mesa
...

Re: Modern Menu 1st try

Posted: Tue May 09, 2023 5:50 pm
by benubi
This looks really great but there's a glitch.

When I select a menu item, the menu-title gets dragged after the mouse, but no mouse button is pressed and it's not what I want or expect.

Re: Modern Menu 1st try

Posted: Tue May 09, 2023 11:04 pm
by jassing
benubi wrote: Tue May 09, 2023 5:50 pmWhen I select a menu item, the menu-title gets dragged after the mouse, but no mouse button is pressed and it's not what I want or expect.
yes, there is a glitch -- the top level menu item can follow the mouse; it's odd.
But it looks great.

Re: Modern Menu 1st try

Posted: Wed May 10, 2023 10:43 am
by Mesa
benubi wrote: Tue May 09, 2023 5:50 pm This looks really great but there's a glitch.

When I select a menu item, the menu-title gets dragged after the mouse, but no mouse button is pressed and it's not what I want or expect.
===> Just add the attribute #TabBarGadget_NoTabMoving to the tabbargadget.

Change

Code: Select all

TabBarGadget(#Gadget_TabBar, 0, 0, WindowWidth(#Window), #TabBarGadget_DefaultHeight,#TabBarGadget_PopupButton , #Window, "BLUEORANGE");"BLACKDARK""BLACKBLACK""BLUEBLUE"
by

Code: Select all

TabBarGadget(#Gadget_TabBar, 0, 0, WindowWidth(#Window), #TabBarGadget_DefaultHeight,#TabBarGadget_PopupButton|#TabBarGadget_NoTabMoving  , #Window, "BLUEORANGE");"BLACKDARK""BLACKBLACK""BLUEBLUE"

The code is already update in the first posts.


M.

Re: Modern Menu 1st try

Posted: Wed May 10, 2023 2:08 pm
by jassing
If you select a top-level menu item, then go to select a different one, it takes two clicks; I think people are used to a single click.
It looks really good & seems feature-rich.
One thing I miss in (even the standard) menu is a way to right-justify one or two items, notably "help" or something. Would be nice if it could allow just right justifying some of the items.

Re: Modern Menu 1st try

Posted: Thu May 25, 2023 10:39 am
by idle
Looks really good.

Re: Modern Menu 1st try

Posted: Thu Jun 01, 2023 12:28 pm
by Kwai chang caine
Very nice, works fine here
Thanks for sharing 8)