Code: Select all
; 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 *TabBarGadget
			
			; 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
			
			; Gradient de couleur
			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
					Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \ActivColorPlus)
					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
					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))
				Case #TabBarGadgetItem_HoverFace							
					; 					Color = TabBarGadget_ColorPlus(*Item\Color\Background, \HoverColorPlus)
					Color = TabBarGadget_ColorPlus(*Item\Color\FaceColorSelected, \HoverColorPlus)																																					; 				*Item\Color\Text= *TabBarGadget\TextColorSelected;
					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)
					GradientColor(0.0, TabBarGadget_ColorPlus(Color, $FF101010))
					GradientColor(0.5, Color)
					GradientColor(1.0, TabBarGadget_ColorMinus(Color, $FF101010))
			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)
			Else
				RoundBox(*Item\Layout\X+LayoutX, *Item\Layout\Y+LayoutY, *Item\Layout\Width+LayoutWidth, *Item\Layout\Height+LayoutHeight, *TabBarGadget\Radius, *TabBarGadget\Radius, *TabBarGadget\BorderColor) 
			EndIf
			
			DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
			
			; AZJIO Add a thin line on the active tab. Highlights the active tab more clearly (vividly)
			;https://www.purebasic.fr/english/viewtopic.php?t=47588&start=165
			If *Item\Attributes & #TabBarGadget_HighlightSelectedTab
				If *Item\Face = #TabBarGadgetItem_ActiveFace	
					Box(*Item\Layout\X+LayoutX + 2, *Item\Layout\Y+LayoutY + 1, *Item\Layout\Width+LayoutWidth - 4, \HighlightHeight, \HighlightColor)
				EndIf
			EndIf
			
			;Image
			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
			
			; 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(*TabBarGadget, *Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, (-1)*\CloseButtonType, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					Else
						TabBarGadget_DrawButton(*TabBarGadget, *Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, \CloseButtonType, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					EndIf
				Else
					If \CloseButtonType>20;opaque
						TabBarGadget_DrawButton(*TabBarGadget, *Item\Layout\CrossX, *Item\Layout\CrossY, \CloseButtonSize, \CloseButtonSize, \CloseButtonType, *Item\Color\Background, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					EndIf
				EndIf
				;Disabled cross and colors are managed inside TabBarGadget_DrawCross
				TabBarGadget_DrawCross(*TabBarGadget, *Item, *Item\Layout\CrossX+DesktopScaledX(3), *Item\Layout\CrossY+DesktopScaledY(3))																																																										; 			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
		
		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 \WheelAction = #TabBarGadgetWheelAction_Scroll
						\Shift + \WheelDirection * GetGadgetAttribute(\Number, #PB_Canvas_WheelDelta)
						If \Shift < 0
							\Shift = 0
						ElseIf \Shift > \LastShift
							\Shift = \LastShift
						EndIf
					EndIf
				EndIf
				
				LockMutex(\Timer\Mutex)
				\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
						\Timer\Type = #TabBarGadget_PreviousArrow
						Select EventType()
							Case #PB_EventType_LeftButtonDown
								\LockedArrow = #TabBarGadget_PreviousArrow
								\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
						\Timer\Type = #TabBarGadget_NextArrow
						Select EventType()
							Case #PB_EventType_LeftButtonDown
								\LockedArrow = #TabBarGadget_NextArrow
								\Timer\TabBarGadget = *TabBarGadget
							Case #PB_EventType_LeftButtonUp
								If \LockedArrow = \HoverArrow And \Shift < \LastShift
									\Shift + 1
								EndIf
						EndSelect
					EndIf
				EndIf
				UnlockMutex(\Timer\Mutex)
				
			EndIf
			
			; MouseWheel Change Action
			If EventType() = #PB_EventType_MouseWheel
				If \WheelAction = #TabBarGadgetWheelAction_Change
					If TabBarGadget_ItemID(*TabBarGadget, #TabBarGadgetItem_Selected)
						Index = ListIndex(\Item()) + \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, \CloseButtonSize, \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, \CheckBoxSize, \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
										
										\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
					Case #PB_EventType_MiddleButtonDown
						\LockedItem = \HoverItem
					Case #PB_EventType_MiddleButtonUp
						If \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
						If \ReadyToMoveItem
							If Abs(\SaveMouseX-\MouseX) > 4 Or Abs(\SaveMouseY-\MouseY) > 4
								\MoveItem = \ReadyToMoveItem
								If \Attributes & (#TabBarGadget_NextArrow|#TabBarGadget_PreviousArrow)
									LockMutex(\Timer\Mutex)
									\Timer\TabBarGadget = *TabBarGadget
									UnlockMutex(\Timer\Mutex)
								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
			If \HoverItem <> \NewTabItem
				TabBarGadget_Examine_Editor(*TabBarGadget)
			EndIf
			
			; Divers
			Select EventType()
				Case #PB_EventType_LeftButtonUp
					\LockedClose     = #False
					\LockedCheck     = #False
					\MoveItem        = #Null
					\ReadyToMoveItem = #Null
					\LockedArrow     = #Null
					LockMutex(\Timer\Mutex)
					\Timer\TabBarGadget = #Null
					UnlockMutex(\Timer\Mutex)
				Case #PB_EventType_MouseLeave
					\HoverItem       = #Null
				Case #PB_EventType_LeftDoubleClick
					If \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-\Margin)/\TabSize)
						Else
							Row = Int(\Rows-(\MouseX-\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-\Margin)/\TabSize)
						Else
							Row = Int(\Rows-(\MouseY-\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() - \Margin
					Else
						\TabSize = TextHeight("|") + \PaddingY*2
					EndIf
				Else
					If GadgetHeight(\Number) > 1
						\TabSize = OutputHeight() - \Margin
					Else
						\TabSize = TextHeight("|") + \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
				
				; Elargir
				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 = \Margin
				Row = 0
				ForEach \Item()
					If Row <> \Item()\Row
						Row + 1
						Length = \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 = \Margin
				Else
					\NewTabItem\Row = Rows-1
					\NewTabItem\Position = \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)*\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))*\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))*\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 = \ArrowWidth + \Margin + \FadeOut
						SelectElement(\Item(), \Shift-1)
						\Item()\Position = Position - \Item()\Length + 1
						\Item()\Visible  = #True
					Else
						Position = \ArrowWidth + \Margin
					EndIf
				Else
					Position = \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-\Margin/2
						Else
							\NewTabItem\Position = OutputWidth()-\NewTabItem\Length-\Margin/2
						EndIf
						If \Attributes & #TabBarGadget_PopupButton
							\NewTabItem\Position - \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 - \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, DesktopUnscaledX(Rows*\TabSize+\Margin), #PB_Ignore)
				Else
					ResizeGadget(\Number, #PB_Ignore, #PB_Ignore, #PB_Ignore, DesktopUnscaledY(Rows*\TabSize+\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 < \Margin
						Position = \Margin
					EndIf
				ElseIf \Shift <= 0 And Position < \Margin + \ArrowWidth
					Position = \Margin + \ArrowWidth
				EndIf
				If (\Attributes & #TabBarGadget_NextArrow = #Null Or \Shift >= \LastShift) And Position + \MoveItem\Length + 1 - \Margin > Row(\MoveItem\Row)\Length - 1
					Position = Row(\MoveItem\Row)\Length + \Margin - \MoveItem\Length
				EndIf
				\MoveItem\Position = Position
			EndIf
			
			; Apparence
			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)
		
		With *TabBarGadget
			If \DrawDisabled
				ProcedureReturn
			EndIf
			
			Protected X.i, Y.i, Size.i, SelectedItemDrawed.i, MoveItemDrawed.i, Row.i, *LastItem
			
			; initialisation
			DrawingFont(\FontID)
			DrawingMode(#PB_2DDrawing_AllChannels)
			Box(0, 0, OutputWidth(), OutputHeight(), *TabBarGadget\TabBarColor)
			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(), \BorderColor)
						Else
							Line(OutputWidth()-1, 0, 1, OutputHeight(), \BorderColor)
						EndIf
					Else
						If \Attributes & #TabBarGadget_MirroredTabs
							Line(0, 0, OutputWidth(), 1, \BorderColor)
						Else
							Line(0, OutputHeight()-1, OutputWidth(), 1, \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, \TabBarColor&$FFFFFF)
			GradientColor(0.5, \TabBarColor&$FFFFFF|$A0<<24)
			GradientColor(1.0, \TabBarColor&$FFFFFF|$FF<<24)
			
			Size = \Margin + \ArrowWidth + \FadeOut
			If \Attributes & #TabBarGadget_PreviousArrow And \Shift
				If \Attributes & #TabBarGadget_Vertical
					If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
						LinearGradient(0, Size, 0, Size-\FadeOut)
						Box(0, 0, OutputWidth(), Size)
					Else
						LinearGradient(0, OutputHeight()-Size, 0, OutputHeight()-Size+\FadeOut)
						Box(0, OutputHeight()-Size, OutputWidth(), Size)
					EndIf
				Else
					If \Attributes & #TabBarGadget_ReverseOrdering
						LinearGradient(OutputWidth()-Size, 0, OutputWidth()-Size+\FadeOut, 0)
						Box(OutputWidth()-Size, 0, Size, OutputHeight())
					Else
						LinearGradient(Size, 0, Size-\FadeOut, 0)
						Box(0, 0, Size, OutputHeight())
					EndIf
				EndIf
			EndIf
			If \Attributes & #TabBarGadget_NextArrow And \Shift < \LastShift
				If \Attributes & #TabBarGadget_NewTab
					Size + \NewTabItem\Length+\Margin
				EndIf
				If \Attributes & #TabBarGadget_PopupButton
					Size + \ArrowHeight
				EndIf
				If \Attributes & #TabBarGadget_Vertical
					If \Attributes & #TabBarGadget_MirroredTabs XOr \Attributes & #TabBarGadget_ReverseOrdering
						LinearGradient(0, OutputHeight()-Size, 0, OutputHeight()-Size+\FadeOut)
						Box(0, OutputHeight()-Size, OutputWidth(), Size)
					Else
						LinearGradient(0, Size, 0, Size-\FadeOut)
						Box(0, 0, OutputWidth(), Size)
					EndIf
				Else
					If \Attributes & #TabBarGadget_ReverseOrdering
						LinearGradient(Size, 0, Size-\FadeOut, 0)
						Box(0, 0, Size, OutputHeight())
					Else
						LinearGradient(OutputWidth()-Size, 0, OutputWidth()-Size+\FadeOut, 0)
						Box(OutputWidth()-Size, 0, Size, OutputHeight())
					EndIf
				EndIf
			EndIf
			
			; Navigation 
			DrawingMode(#PB_2DDrawing_AlphaBlend)
			If \Attributes & #TabBarGadget_PreviousArrow
				
				If \HoverArrow = #TabBarGadget_PreviousArrow
					If \HoverArrow = \LockedArrow
						TabBarGadget_DrawButton(*TabBarGadget, \Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					Else
						TabBarGadget_DrawButton(*TabBarGadget, \Layout\PreviousButtonX-\Layout\ButtonWidth/2, \Layout\PreviousButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					EndIf
					TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
				ElseIf \Shift > 0
					TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PreviousButtonX, \Layout\PreviousButtonY, #TabBarGadget_PreviousArrow, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
				Else
					TabBarGadget_DrawArrow(*TabBarGadget, \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(*TabBarGadget, \Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					Else
						TabBarGadget_DrawButton(*TabBarGadget, \Layout\NextButtonX-\Layout\ButtonWidth/2, \Layout\NextButtonY-\Layout\ButtonHeight/2, \Layout\ButtonWidth, \Layout\ButtonHeight, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					EndIf
					TabBarGadget_DrawArrow(*TabBarGadget, \Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
				ElseIf \Shift < \LastShift
					TabBarGadget_DrawArrow(*TabBarGadget, \Layout\NextButtonX, \Layout\NextButtonY, #TabBarGadget_NextArrow, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
				Else
					TabBarGadget_DrawArrow(*TabBarGadget, \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(*TabBarGadget, \Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize, -1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					Else
						TabBarGadget_DrawButton(*TabBarGadget, \Layout\PopupButtonX-\Layout\ButtonSize/2, \Layout\PopupButtonY-\Layout\ButtonSize/2, \Layout\ButtonSize, \Layout\ButtonSize, 1, *TabBarGadget\FaceColor, *TabBarGadget\Attributes & #TabBarGadget_Vertical)
					EndIf
					TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PopupButtonX, \Layout\PopupButtonY, #TabBarGadget_PopupButton, *TabBarGadget\TextColor, *TabBarGadget\Attributes)
				Else
					TabBarGadget_DrawArrow(*TabBarGadget, \Layout\PopupButtonX, \Layout\PopupButtonY, #TabBarGadget_PopupButton, *TabBarGadget\TextColor&$FFFFFF|$80<<24, *TabBarGadget\Attributes)
				EndIf
			EndIf
			
		EndWith
		
	EndProcedure


