Added Module, theme color, deselected event and autosize when changing Font by Mesa, highlighted tab by azjio & Mesa
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