TabBarGadget - Tabs like in a browser

Share your advanced PureBasic knowledge/code with the community.
User avatar
kenmo
Addict
Addict
Posts: 1967
Joined: Tue Dec 23, 2003 3:54 am

Re: TabBarGadget - Tabs like in a browser

Post by kenmo »

Hello STARGATE and TabBarGadget users!

As I mentioned before, I did some very minor cleanup and put the TabBarGadget on GitHub:
- GitHub repo

I have some updates. First, I started a develop branch with STARGATE's recommended changes from this thread:
- develop branch
- See diff/changes

Second, I created another branch called kenmo-mods with lots of changes I've collected over ~6 years of using TabBarGadget
- kenmo-mods branch
- See diff/changes
- Direct link to TabBarGadget.pbi


Here is the log of changes:
Return 24-bit color from GetTabBarGadgetItemColor() (remove alpha)
viewtopic.php?p=549690#p549690

Unbind gadget before freeing it (and free gadget before freeing memory)
viewtopic.php?p=552651#p552651

Don't force EnableExplicit if being Included in another file

Check that StartDrawing() succeeded before drawing

Force a recalculation of TabSize after changing font

Prevent thread+PostEvent issue on Mac PureBasic pre-5.60

Clear references to *Item before removing it

Clear UpdatePosted flag even if StartDrawing() fails

Define RGB constants for default colors

Added more safety checks to Callback and FreeTabBarGadget()

Store the default font ID so it can be reused by SetTabBarGadgetFont()

Added function to change WheelDirection - SetTabBarGadgetGlobalAttribute()

Made MouseWheel action settable (None, Scroll, or Change tab)

Added global DrawDisabled attribute (for batch tab changes)

Add global attributes for MiddleClickForClose and DoubleClickForNew

Added attributes to set the Bar, Border, Face, and Text default colors

Added support for WinAPI DrawText_() for clearer text on some Windows

Added GetTabBarGadgetGlobalAttribute() for the new attributes
Hopefully this is useful to some people :) Now I have a place to track my TabBarGadget mods that aren't comments copied and pasted in various files.
STARGATE maybe you can consider some of these changes for your future official release.
User avatar
STARGÅTE
Addict
Addict
Posts: 2067
Joined: Thu Jan 10, 2008 1:30 pm
Location: Germany, Glienicke
Contact:

Re: TabBarGadget - Tabs like in a browser

Post by STARGÅTE »

@kenmo:

Thank you very much for your contribution.
I added the link to the GitHub on the first page.

>>STARGATE maybe you can consider some of these changes for your future official release.
Of course! Regarding "Added support for WinAPI DrawText_() for clearer text on some Windows":
It was also my question to change the whole code to VectorDrawing, what do you think of?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Lizard - Script language for symbolic calculations and moreTypeface - Sprite-based font include/module
User avatar
kenmo
Addict
Addict
Posts: 1967
Joined: Tue Dec 23, 2003 3:54 am

Re: TabBarGadget - Tabs like in a browser

Post by kenmo »

It was also my question to change the whole code to VectorDrawing, what do you think of?
Oh, I guess we have to see. I know VectorDrawing is a lot more powerful.

But I like DrawText_() API because, for me and some others (not everyone?) it makes the text look more like a "native" gadget.
Here are two posts of mine with example images:
viewtopic.php?p=496305#p496305
viewtopic.php?p=474574#p474574


Anyway, you can borrow or not borrow any of those modifications I made :) Some are new functionality, some were for stability/safety.
I finally put them into Git because it gives you a nice history, a nice way to track and see every change, easy to share.

"SetTabBarGadgetGlobalAttribute()" is a little odd, but it's OK for my usage. There's already SetTabBarGadgetAttribute() but I think you're already using all 32 bit flags! :D
Fred
Administrator
Administrator
Posts: 16619
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: TabBarGadget - Tabs like in a browser

Post by Fred »

There is an issue when enable the DPI Aware flag on Windows and having a scaling <> 100%, the gadget size isn't right. To fix it, use DesktopUnscaledX/Y in ResizeGadget()

Code: Select all

If \Attributes & #TabBarGadget_Vertical
  ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, DesktopUnscaledX(Rows*\TabSize+TabBarGadgetInclude\Margin), #PB_Ignore)
Else
  ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, #PB_Ignore, DesktopUnscaledY(Rows*\TabSize+TabBarGadgetInclude\Margin))
EndIf
Default size needs to be adjusted as well

Code: Select all

  \PaddingX                     = DesktopScaledX(6)  ; Space from tab border to text
  \PaddingY                     = DesktopScaledX(5)  ; Space from tab border to text
  \Margin                       = 4                  ; Space from tab to border
  \ImageSpace                   = DesktopScaledX(3)  ; Space from image zu text
  \ImageSize                    = DesktopScaledX(16)
  \CloseButtonSize              = DesktopScaledX(13) ; Size of the close cross
  \CheckBoxSize                 = DesktopScaledX(10)
  \ArrowSize                    = DesktopScaledX(5)  ; Size of the Arrow in the button in navigation
  \ArrowWidth                   = DesktopScaledX(12) ; Width of the Arrow-Button in navigation
  \ArrowHeight                  = DesktopScaledY(18) ; Height of the Arrow-Button in navigation
  \Radius                       = DesktopScaledX(3)  ; Radius of the edge of the tab
Close cross as well

Code: Select all

      If *Item\Disabled
        TabBarGadget_DrawCross(*Item\Layout\CrossX+DesktopScaledX(3), *Item\Layout\CrossY+DesktopScaledY(3), \CloseButtonSize-DesktopScaledX(6), *Item\Color\Text&$FFFFFF|$40<<24)
      Else
        TabBarGadget_DrawCross(*Item\Layout\CrossX+DesktopScaledX(3), *Item\Layout\CrossY+DesktopScaledY(3), \CloseButtonSize-DesktopScaledX(6), *Item\Color\Text)
      EndIf
There is probably some other tweak to do here and here, as I patched it only for the IDE
User avatar
chi
Addict
Addict
Posts: 1028
Joined: Sat May 05, 2007 5:31 pm
Location: Linz, Austria

Re: TabBarGadget - Tabs like in a browser

Post by chi »

Thanks! Speaking of IDE Tabs... Due to my dark theme I have black text on dark gray background. It would be nice to change that.
Et cetera is my worst enemy
User avatar
STARGÅTE
Addict
Addict
Posts: 2067
Joined: Thu Jan 10, 2008 1:30 pm
Location: Germany, Glienicke
Contact:

Re: TabBarGadget - Tabs like in a browser

Post by STARGÅTE »

chi wrote: Fri May 20, 2022 12:45 pm Thanks! Speaking of IDE Tabs... Due to my dark theme I have black text on dark gray background. It would be nice to change that.
Usually the colors were set dynamically:

Code: Select all

	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   = $FFD0D0D0
			\BorderColor   = $FF808080
			\FaceColor     = $FFD0D0D0
			\TextColor     = $FF000000
	CompilerEndSelect
However, there is not Linux equivalent.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Lizard - Script language for symbolic calculations and moreTypeface - Sprite-based font include/module
User avatar
chi
Addict
Addict
Posts: 1028
Joined: Sat May 05, 2007 5:31 pm
Location: Linz, Austria

Re: TabBarGadget - Tabs like in a browser

Post by chi »

STARGÅTE wrote: Fri May 20, 2022 5:51 pm Usually the colors were set dynamically:
The TabBarGadget demo works as expected, but in the IDE as soon as I save the text goes black ;(
Image
Et cetera is my worst enemy
Fred
Administrator
Administrator
Posts: 16619
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: TabBarGadget - Tabs like in a browser

Post by Fred »

Better create a proper IDE bug report to not hijack this thread.
fryquez
Enthusiast
Enthusiast
Posts: 362
Joined: Mon Dec 21, 2015 8:12 pm

Re: TabBarGadget - Tabs like in a browser

Post by fryquez »

chi wrote: Fri May 20, 2022 7:02 pm The TabBarGadget demo works as expected, but in the IDE as soon as I save the text goes black ;(
SourceManagement.pb --> RefreshSourceTitle()
AZJIO
Addict
Addict
Posts: 1315
Joined: Sun May 14, 2017 1:48 am

Re: TabBarGadget - Tabs like in a browser

Post by AZJIO »

I'm experimenting and I'm missing the mouse right click event to bring up the menu on the tab. And also I tried to close the tab instead of editing the tab name. I got it all.

Code: Select all

				Case #PB_EventType_RightButtonDown
					\LockedItem = \HoverItem
					If \LockedItem <> \NewTabItem And \LockedClose = #False And \LockedCheck = #False
						If \HoverItem\Disabled = #False
							If \SelectedItem = \HoverItem
								PostEvent(#PB_Event_Gadget, \Window, \Number, #TabBarGadget_EventType_RightDown, \EventTab)
							EndIf
						EndIf
					EndIf


				Case #PB_EventType_LeftDoubleClick
; 					If \Attributes & #TabBarGadget_Editable And \HoverItem\Disabled = #False
; 						\Editor\Item    = \HoverItem
; 						\Editor\OldText = \Editor\Item\Text
; 					EndIf
					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
AZJIO
Addict
Addict
Posts: 1315
Joined: Sun May 14, 2017 1:48 am

Re: TabBarGadget - Tabs like in a browser

Post by AZJIO »

Draws a line on top of the active tab. The radius of rounding of the corners of the tab does not make it possible to adjust the length automatically.

Code: Select all

Procedure TabBarGadget_DrawItem(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
; 	...
		; Registerkarte zeichnen (line 80 from the beginning of the function)
; 	...
	DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend) ; line 89 from the beginning of the function
; 	It's added. A thin line on the active tab. Highlights the active tab more clearly (vividly)
		If *Item\Face = #TabBarGadgetItem_ActiveFace
			Box(*Item\Layout\X+LayoutX + 2, *Item\Layout\Y+LayoutY + 1, *Item\Layout\Width+LayoutWidth - 4, 1, $FFFFFF00)
		EndIf
wombats
Enthusiast
Enthusiast
Posts: 663
Joined: Thu Dec 29, 2011 5:03 pm

Re: TabBarGadget - Tabs like in a browser

Post by wombats »

AZJIO wrote: Tue Jun 27, 2023 12:31 am I'm experimenting and I'm missing the mouse right click event to bring up the menu on the tab.
You can check for #PB_EventType_RightClick.

Code: Select all

Case #PB_EventType_RightClick
  Define clickedTab = GetTabBarGadgetItemPosition(#Gadget_TabBar, #TabBarGadgetItem_Event)
AZJIO
Addict
Addict
Posts: 1315
Joined: Sun May 14, 2017 1:48 am

Re: TabBarGadget - Tabs like in a browser

Post by AZJIO »

I made 26 individual examples
Download
AZJIO
Addict
Addict
Posts: 1315
Joined: Sun May 14, 2017 1:48 am

Re: TabBarGadget - Tabs like in a browser

Post by AZJIO »

Red button to close tab.

Code: Select all

Procedure TabBarGadget_DrawCross(X.i, Y.i, Size.i, Color.i) ; Code OK
	Color = $FFFFFFFF
	Box(X - 3, Y - 3, Size + 6,  Size + 6, $FF6666FF)
; 	Box(X - 2, Y - 2, Size + 4,  Size + 4, $FF6666FF)
Image
Mesa
Enthusiast
Enthusiast
Posts: 345
Joined: Fri Feb 24, 2012 10:19 am

Re: TabBarGadget - Tabs like in a browser

Post by Mesa »

Added Module, theme color, deselected event and autosize when changing Font by Mesa, highlighted tab by azjio & Mesa
[Update: 17 11 2023 Fixed bugs on the newtab button]

1/3

Code: Select all

;|-------------------------------------------------------------------------------------------------
;|
;|  Title            : TabBarGadget
;|  Version          : 'kenmo-mods' fork based off v1.6 Beta 1
;|  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 Module, theme color, deselected event and autosize when changing Font by Mesa, highlighted tab by azjio & Mesa
;|
;|-------------------------------------------------------------------------------------------------




CompilerIf #PB_Compiler_IsMainFile
	EnableExplicit
CompilerEndIf


DeclareModule TabBarGadget
	
	
	;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
	;-  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_HighlightSelectedTab = 1<<14
		#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
		; Do not exceed 1<<31 with a 32bit OS
	EndEnumeration
	
	; Global attributes for all TabBarGadgets
	Enumeration
		#TabBarGadget_WheelDirection   = 1 << 0
		#TabBarGadget_WheelAction      = 1 << 1
		#TabBarGadget_DrawDisabled     = 1 << 2
		#TabBarGadget_MiddleClickClose = 1 << 3
		#TabBarGadget_DoubleClickNew   = 1 << 4
		#TabBarGadget_TabBarColor      = 1 << 5
		#TabBarGadget_BorderColor      = 1 << 6
		#TabBarGadget_FaceColor        = 1 << 7
		#TabBarGadget_TextColor        = 1 << 8
		#TabBarGadget_FaceColorSelected= 1 << 9
		#TabBarGadget_TextColorSelected= 1 << 10
	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	 ; l'onglet actif est déselectionné
	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_FaceSelectedDefault   = $D0D0D0
	#TabBarGadgetColor_TextDefault   = $000000
	#TabBarGadgetColor_TextSelectedDefault   = $000000
	
	
	; Constante Interne
	#TabBarGadget_PreviousArrow   = 1<<30
	#TabBarGadget_NextArrow       = 1<<31; Do not exceed 31 with a 32bit OS
	#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 							
		TextColorSelected	.i							
		BorderColor.i											
		
	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  ; Tab à 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
	
	; Timer für das kontinuierliche Scrollen
	Structure TabBarGadget_Timer
		*TabBarGadget.TabBarGadget  ; TabBarGadget-ID
		Type.i											; Modus (Scrollen)
		Mutex.i											; Mutex zur Sicherung
	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; Bouton Fermer en surbrillance
		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 										; Hintergrundfarbe des Gadgets
		BorderColor.i											; Rahmenfarbe
		FaceColor.i												; Hintergrundfarbe einer Karte
		TextColor.i												; Textfarbe
		FaceColorSelected.i								;
		TextColorSelected.i								;
		
		HoverColorPlus.i               ; Farbänderung für den Hover-Effekt
		ActivColorPlus.i							 ; Farbänderung für aktuell ausgewählte Karten
		PaddingX.i										 ; Innenabstand (Text zu Rahmen)                
		PaddingY.i										 ; Innenabstand (Text zu Rahmen)                   
		Margin.i											 ; Außenabstand (Rahmen zu Gadget-Rand)                    
		ImageSpace.i									 ; Freiraum zwischen Bild und Text                 
		ImageSize.i										 ; Größe des Navigationspfeils
		CloseButtonSize.i							 ; Größe des Schließenkreuzes
		CheckBoxSize.i								 
		ArrowSize.i										 
		ArrowWidth.i									 
		ArrowHeight.i									 
		VerticalTextBugFix.f					 
		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
		
		CrossColor.i
		CrossBkgColor.i
		HighlightColor.i
		HighlightHeight.i
		CloseButtonType.i ;11= rounded square&transparent, 12 square&transparent, 21 rounded square&opaque, 22 square&opaque
		
	EndStructure
	
	
	; Declare public
	; 
	Declare UpdateTabBarGadget(Gadget.i)
	Declare FreeTabBarGadget(Gadget.i) 
	
	Declare.i TabBarGadget(Gadget.i, X.i, Y.i, Width.i, Height.i, Attributes.i, Window.i, ColorTheme$="")
	Declare.i AddTabBarGadgetItem(Gadget.i, Position.i, Text.s, ImageID.i=#Null, DataValue.i=#Null)
	Declare.i TabBarGadgetItemID(Gadget.i, Position.i) 
	Declare RemoveTabBarGadgetItem(Gadget.i, Position.i)
	Declare ClearTabBarGadgetItems(Gadget.i) 
	Declare.i CountTabBarGadgetItems(Gadget.i)
	
	;-  Set- & Get-Declare
	Declare TabBarGadgetToolTip(Gadget.i, ItemText.s="", NewText.s="", CloseText.s="")
	Declare TabBarGadgetItemToolTip(Gadget.i, Tab.i, Text.s) 
	Declare SetTabBarGadgetAttribute(Gadget.i, Attribute.i, Value.i, Overwrite.i=#True)
	Declare.i GetTabBarGadgetAttribute(Gadget.i, Attribute.i) 
	Declare SetTabBarGadgetData(Gadget.i, DataValue.i) 
	Declare.i GetTabBarGadgetData(Gadget.i)
	Declare SetTabBarGadgetFont(Gadget.i, FontID.i, AutoResize.i = #True)
	Declare SetTabBarGadgetState(Gadget.i, State.i) 
	Declare.i GetTabBarGadgetState(Gadget.i) 
	Declare SetTabBarGadgetText(Gadget.i, Text.s)
	Declare.s GetTabBarGadgetText(Gadget.i) 
	Declare SetTabBarGadgetColor(Gadget.i, Type.i, Color.i) 
	Declare.i GetTabBarGadgetColor(Gadget.i, Type.i)
	Declare SetTabBarGadgetItemAttribute(Gadget.i, Tab.i, Attribute.i, Value.i)
	Declare.i GetTabBarGadgetItemAttribute(Gadget.i, Tab.i, Attribute.i)
	Declare SetTabBarGadgetItemData(Gadget.i, Tab.i, DataValue.i) 
	Declare.i GetTabBarGadgetItemData(Gadget.i, Tab.i)						
	Declare SetTabBarGadgetItemColor(Gadget.i, Tab.i, Type.i, Color.i)
	Declare.i GetTabBarGadgetItemColor(Gadget.i, Tab.i, Type.i) 
	Declare SetTabBarGadgetItemImage(Gadget.i, Tab.i, ImageID.i) 
	Declare SetTabBarGadgetItemPosition(Gadget.i, Tab.i, Position.i)
	Declare GetTabBarGadgetItemPosition(Gadget.i, Tab.i) 
	Declare SetTabBarGadgetItemState(Gadget.i, Tab.i, State.i, Mask.i=#TabBarGadget_Disabled|#TabBarGadget_Selected|#TabBarGadget_Checked) 
	Declare.i GetTabBarGadgetItemState(Gadget.i, Tab.i)
	Declare SetTabBarGadgetItemText(Gadget.i, Tab.i, Text.s) 
	Declare.s GetTabBarGadgetItemText(Gadget.i, Tab.i) 
	
EndDeclareModule



Module TabBarGadget
	
	
	;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
	;-  3. Initializations / Initialisierungen
	;|__________________________________________________________________________________________________
	
	
	Declare TabBarGadget_Timer(Null.i)
	
	
	;|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
	;-  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)
		;Found in: 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) 
		;RemoveItem(*,*), Examine(*)
		;,,SetTabBarGadgetItemState(G,)
		
		*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 
			*TabBarGadget\SelectedItem = *Item\PreviousSelectedItem
			If *TabBarGadget\SelectedItem
				*TabBarGadget\SelectedItem\Selected = #True
			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) 
		;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 (fermer tab)
	Procedure TabBarGadget_DrawCross(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem, X.i, Y.i) ; , Size.i, Color.iCode OK
																																																 ;TabBarGadget_DrawItem(*, *)																																														 ;TabBarGadget_DrawItem(*,*)																																														 ;DrawItem(*, *)
		
		Protected Size.i = *TabBarGadget\CloseButtonSize-DesktopScaledX(6)
		Protected Color.i, Alpha.i
		
		If *Item\Disabled
			If *TabBarGadget\CloseButtonType > 20
				Color = *TabBarGadget\CrossColor&$FFFFFF|$40<<24
			Else
				Color = *Item\Color\Text&$FFFFFF|$40<<24
			EndIf
		Else
			If *TabBarGadget\CloseButtonType > 20
				Color = *TabBarGadget\CrossColor
			Else	
				Color = *Item\Color\Text
			EndIf
		EndIf
		Alpha = 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(*TabBarGadget.TabBarGadget, X.i, Y.i, Width.i, Height.i, Type.i, Color, Vertical.i=#False) 
		;DrawItem(*, *),Draw(*)
		
		Protected Angle.i		
		
		If Type <> 0
			
			If Mod(Type,2) = 0
				Angle = 0; square
			Else
				Angle = 3; rounded square
			EndIf
			
			Select  Type
				Case 1,11,12
					DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
					ResetGradientColors()
					GradientColor(0.0, TabBarGadget_ColorPlus(Color, $404040))
					GradientColor(0.5, Color)
					GradientColor(1.0, TabBarGadget_ColorMinus(Color, $404040))
					If Vertical
						LinearGradient(X, Y, X+Width-1, Y)
						RoundBox(X, Y, Width, Height, Angle, Angle)
						DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
						RoundBox(X, Y, Width, Height, Angle, Angle, *TabBarGadget\BorderColor&$FFFFFF|$80<<24)
					Else
						LinearGradient(X, Y, X, Y+Height-1)
						RoundBox(X, Y, Width, Height, Angle, Angle)
						DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
						RoundBox(X, Y, Width, Height, Angle, Angle, *TabBarGadget\BorderColor&$FFFFFF|$80<<24)
					EndIf
				Case -1,-11,-12
					DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
					ResetGradientColors()
					GradientColor(1.0, TabBarGadget_ColorPlus(Color, $404040))
					GradientColor(0.5, Color)
					GradientColor(0.0, TabBarGadget_ColorMinus(Color, $404040))
					If Vertical
						LinearGradient(X, Y, X+Width-1, Y)
						RoundBox(X, Y, Width, Height, Angle, Angle)
						DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
						RoundBox(X, Y, Width, Height, Angle, Angle, *TabBarGadget\BorderColor&$FFFFFF|$80<<24)
					Else
						LinearGradient(X, Y, X, Y+Height-1)
						RoundBox(X, Y, Width, Height, Angle, Angle)
						DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
						RoundBox(X, Y, Width, Height, Angle, Angle, *TabBarGadget\BorderColor&$FFFFFF|$80<<24)
					EndIf
					
				Case 21, -21, 22,-22
					;DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend
					DrawingMode(#PB_2DDrawing_Default)
					RoundBox(X, Y, Width, Height, Angle, Angle, *TabBarGadget\CrossBkgColor&$FFFFFF|$80<<24)		
					
			EndSelect
			
			DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
		EndIf
		
	EndProcedure
	
	
	
	; Dessiner une flèche
	Procedure TabBarGadget_DrawArrow(*TabBarGadget.TabBarGadget, X.i, Y.i, Type.i, Color.i, Attributes.i=#Null) ; Code OK
																																																							;TabBarGadget_Draw(*)																																																					;TabBarGadget_Draw(*)																																																					;Draw(*)
		
		Protected Index.i, Alpha.i = Alpha(Color)/4
		
		With *TabBarGadget
			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 + *TabBarGadget\ArrowSize/2+0
							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)
		;TextCutting(*),Update(*)
		
		With *TabBarGadget
			
			Protected TextLength.i = TextWidth(*Item\ShortText)
			Protected Length.i = 2 * \PaddingX
			Protected Characters.i, VerticalTextBugFix.f = 1.0
			
			If *TabBarGadget\Attributes & #TabBarGadget_Vertical
				TextLength * \VerticalTextBugFix ; 5 % plus long en raison de l'inexactitude de TextWidth lors de la rotation
				VerticalTextBugFix = \VerticalTextBugFix
			EndIf
			If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
				Length + \CloseButtonSize-4 + \ImageSpace
			EndIf
			If *Item\Attributes & #TabBarGadget_CheckBox
				Length + \CheckBoxSize + \ImageSpace
			EndIf
			If *Item\Image
				If *TabBarGadget\Attributes & #TabBarGadget_Vertical
					Length + ImageHeight(*Item\Image)
				Else
					Length + ImageWidth(*Item\Image)
				EndIf
				If *Item\ShortText
					Length + \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
			
		EndWith
		
	EndProcedure
	
	
	
	; Renvoie l'espace maximum disponible pour les onglets.
	Procedure.i TabBarGadget_MaxLength(*TabBarGadget.TabBarGadget, WithNewTab.i=#True) 
		;Update(*)
		
		Protected Length.i
		
		With *TabBarGadget
			If \Attributes & #TabBarGadget_Vertical
				Length = OutputHeight() - \Margin*2
			Else
				Length = OutputWidth()  - \Margin*2
			EndIf
			If \Attributes & #TabBarGadget_NewTab And WithNewTab
				Length - *TabBarGadget\NewTabItem\Length + 1
			EndIf
			If \Attributes & #TabBarGadget_PreviousArrow
				Length - \ArrowWidth
			EndIf
			If \Attributes & #TabBarGadget_NextArrow
				Length - \ArrowWidth
				If \Attributes & #TabBarGadget_NewTab
					Length - \Margin
				EndIf
			EndIf
			If \Attributes & #TabBarGadget_PopupButton
				Length - \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) 
		;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) 
		;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
		
		With *TabBarGadget
			
			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, \ImageSize, \ImageSize, 32, #PB_Image_Transparent)
				CompilerElse
					*Item\DrawedImage = CreateImage(#PB_Any, \ImageSize, \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
			
		EndWith
		
	EndProcedure
	
	
	
	; (Re)définir une nouvelle icône pour l'onglet
	Procedure TabBarGadget_ReplaceImage(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem, NewImageID.i=#Null) 
		;,,AddTabBarGadgetItem(G,),SetTabBarGadgetItemImage(G)
		
		With *TabBarGadget 
			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, \ImageSize, \ImageSize, 32, #PB_Image_Transparent)
				CompilerElse
					*Item\Image = CreateImage(#PB_Any, \ImageSize, \ImageSize, 32|#PB_Image_Transparent)
				CompilerEndIf
				If StartDrawing(ImageOutput(*Item\Image))
					DrawingMode(#PB_2DDrawing_AlphaBlend)
					DrawImage(NewImageID, 0, 0, \ImageSize, \ImageSize)
					StopDrawing()
				EndIf
				TabBarGadget_RotateImage(*TabBarGadget, *Item)
			EndIf
		EndWith
	EndProcedure
	
	
	
	; Calcule la disposition d'un onglet
	Procedure TabBarGadget_ItemLayout(*TabBarGadget.TabBarGadget, *Item.TabBarGadgetItem)
		;Update(*)
		
		With *TabBarGadget 
			Protected TextAreaLength.i = *Item\Length - 2 * \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())
			
			If *Item\Attributes & #TabBarGadget_CloseButton Or (*Item\Attributes & #TabBarGadget_SelectedCloseButton And *Item\Selected)
				TextAreaLength - (\CloseButtonSize-4 + \ImageSpace)
			EndIf
			If *Item\Attributes & #TabBarGadget_CheckBox
				TextAreaLength - (\CheckBoxSize + \ImageSpace)
			EndIf
			If *Item\Image
				If *TabBarGadget\Attributes & #TabBarGadget_Vertical
					TextAreaLength - (ImageHeight(*Item\Image)+\ImageSpace)
				Else
					TextAreaLength - (ImageWidth(*Item\Image)+\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 le Layout
	Procedure TabBarGadget_Layout(*TabBarGadget.TabBarGadget)
		;1x Update(*)
		
		Protected Shift.i
		
		With *TabBarGadget
			
			If *TabBarGadget\Attributes & #TabBarGadget_MirroredTabs
				Shift = -\Margin
			Else
				Shift = \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-\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+\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+\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-\Margin
						EndIf
						If *TabBarGadget\Attributes & #TabBarGadget_PopupButton
							*TabBarGadget\Layout\NextButtonX - *TabBarGadget\Layout\ButtonSize
						EndIf
					EndIf
				EndIf
				
			EndIf
			
		EndWith
		
	EndProcedure
Last edited by Mesa on Fri Nov 17, 2023 4:29 pm, edited 1 time in total.
Post Reply