Basic Univers
; Auteur : Denis, Forum Français
; Date : Janvier 2006
; Purebasic Version : jusqu'à la 3.94

; Description
; GetGadgetType(id, IdType)
; IdType : #PB_staticID ou #PB_DynamicID
; La commande permet de tester des gadgets en passant l'identifiant à tester (id)
; L'identifiant peut être l'id statique (#gadget)
; ou le handle (GadgetID(#gadget)
; L'id est le 1er paramètre de la fonction
; Le second paramètre indique le type du 1er paramètre
; #PB_staticID --> le 1er paramètre est l'id statique du gadget
; #PB_DynamicID --> le 1er paramètre est le handle du gadget


Enumeration
      #PB_ButtonGadget = 1
      #PB_ButtonImageGadget ; 2
      #PB_CalendarGadget ; 3
      #PB_CheckBoxGadget ; 4
      #PB_ComboBoxGadget ; 5
      #PB_ContainerGadget ; 6
      #PB_DateGadget ; 7
      #PB_EditorGadget ; 8
      #PB_ExplorerComboGadget ; 9
      #PB_ExplorerListGadget ; 10
      #PB_ExplorerTreeGadget ; 11
      #PB_Frame3DGadget ; 12
      #PB_HyperLinkGadget ; 13
      #PB_ImageGadget ; 14
      #PB_IPAddressGadget ; 15
      #PB_ListIconGadget ; 16
      #PB_ListViewGadget ; 17
      #PB_MDIGadget ; 18
      #PB_OptionGadget ; 19
      #PB_PanelGadget ; 20
      #PB_ProgressBarGadget ; 21
      #PB_ScrollAreaGadget ; 22
      #PB_ScrollBarGadget ; 23
      #PB_SpinGadget ; 24
      #PB_SplitterGadget ; 25
      #PB_StringGadget ; 26
      #PB_TextGadget ; 27
      #PB_TrackBarGadget ; 28
      #PB_TreeGadget ; 29
      #PB_WebGadget ; 30
EndEnumeration


Structure Place_Pile
      ZonePile.b[256] ; permet d'utiliser une zone de la pile de 256 octets
      ; pour stocker une chaîne de caractères directement
      ; sans passer par les commandes PB ni l'API
EndStructure


Structure GadgetFunctions
      FreeGadget.l
      GetGadgetState.l
      SetGadgetState.l
      GetGadgetText.l
      SetGadgetText.l
      AddGadgetItem.l
      AddGadgetItem2.l
      RemoveGadgetItem.l
      ClearGadgetItemList.l
      ResizeGadget.l
      CountGadgetItems.l
      GetGadgetItemState.l
      SetGadgetItemState.l
      GetGadgetItemText.l
      SetGadgetItemText.l
      OpenGadgetList2.l
      GadgetX.l
      GadgetY.l
      GadgetWidth.l
      GadgetHeight.l
      HideGadget.l
EndStructure


; Les class des différents gadgets

#PB_ListIconGadget_Class = "SysListView32"
#PB_ExplorerListGadget_Class = "SysListView32"
#PB_TreeGadget_Class = "SysTreeView32"
#PB_ExplorerTreeGadget_Class = "SysTreeView32"
#PB_ButtonGadget_Class = "Button"
#PB_ButtonImageGadget_Class = "Button"
#PB_CalendarGadget_Class = "SysMonthCal32"
#PB_CheckBoxGadget_Class = "Button"
#PB_ComboBoxGadget_Class = "ComboBox"
#PB_ContainerGadget_Class = "PureContainer"
#PB_DateGadget_Class = "SysDateTimePick32"
#PB_EditorGadget_Class = "RichEdit20A"
#PB_ExplorerComboGadget_Class = "ComboBoxEx32"
#PB_Frame3DGadget_Class = "Button"
#PB_HyperLinkGadget_Class = "Static"
#PB_ImageGadget_Class = "Static"
#PB_IPAddressGadget_Class = "SysIPAddress32"
#PB_ListViewGadget_Class = "ListBox"
#PB_MDIGadget_Class = "MDIClient"
#PB_OptionGadget_Class = "Button"
#PB_PanelGadget_Class = "SysTabControl32"
#PB_ProgressBarGadget_Class = "msctls_progress32"
#PB_ScrollAreaGadget_Class = "PureScrollArea"
#PB_ScrollBarGadget_Class = "ScrollBar"
#PB_SpinGadget_Class = "Edit"
#PB_SplitterGadget_Class = "PureSplitter"
#PB_StringGadget_Class = "Edit"
#PB_TextGadget_Class = "Static"
#PB_TrackBarGadget_Class = "msctls_trackbar32"
#PB_WebGadget_Class = "AtlAxWin"
#PB_StatusBar_Class = "msctls_statusbar32"


#erreur = - 1

#BS_PUSHLIKE = $1000

#PB_staticID  = 0 ; indique que c'est l'id statique comme 1er paramètre
#PB_DynamicID = 1 ; indique que c'est le handle comme 1er paramètre



Procedure GetGadgetType(id, idType)
      ; id est l'id statique passé à tester
      ; retourne -1 si le l'identifiant n'est pas un identifiant d'un Gadget reconnu
      ; sinon retourne une des constantes suivantes
     
      ; #PB_ButtonGadget
      ; #PB_ButtonImageGadget
      ; #PB_CalendarGadget
      ; #PB_CheckBoxGadget
      ; #PB_ComboBoxGadget
      ; #PB_ContainerGadget
      ; #PB_DateGadget
      ; #PB_EditorGadget
      ; #PB_ExplorerComboGadget
      ; #PB_ExplorerListGadget
      ; #PB_ExplorerTreeGadget
      ; #PB_Frame3DGadget
      ; #PB_HyperLinkGadget
      ; #PB_ImageGadget
      ; #PB_IPAddressGadget
      ; #PB_ListIconGadget
      ; #PB_ListViewGadget
      ; #PB_MDIGadget
      ; #PB_OptionGadget
      ; #PB_PanelGadget
      ; #PB_ProgressBar
      ; #PB_ProgressBarGadget
      ; #PB_ScrollAreaGadget
      ; #PB_ScrollBarGadget
      ; #PB_SpinGadget
      ; #PB_SplitterGadget
      ; #PB_StringGadget
      ; #PB_TextGadget
      ; #PB_TrackBarGadget
      ; #PB_TreeGadget
      ; #PB_WebGadget
     
     
      Protected resultat.l, Memoire.Place_Pile, *Table.GadgetFunctions, classe.s
     
      resultat = #erreur
     
      If idType = #PB_DynamicID
            If IsWindow_(id)
                  id = GetDlgCtrlID_(id)
            EndIf
      ElseIf idType <> #PB_staticID
            ProcedureReturn resultat
      EndIf
     
      *Table = IsGadget(id)
      If *Table
            ; on teste la longueur de la chaîne de la classe du gagdet
            Nb_Char = GetClassName_(GadgetID(id), Memoire, 256)
            If Nb_Char
                  classe = PeekS(Memoire)
                 
                  Select Nb_Char
                             
                        Case 4
                              ; comparaison avec "Edit"  pour SpinGadget ou StringGadget
                              If classe = "Edit"
                                    ; il n'y a pas de fonction GetGadgetState pour StringGadget
                                    ; la valeur stocké dans la table virtuelle des gadgets est 0 pour StringGadget
                                    *Table = PeekL(*Table + 4)
                                    If *Table\GetGadgetState
                                          resultat = #PB_SpinGadget
                                    Else
                                          resultat = #PB_StringGadget
                                    EndIf
                              EndIf
                             
                        Case 6
                              ; comparaison avec "Static" pour TextGadget ou ImageGadget ou HyperLinkGadget
                              If classe = "Static"
                                    ; il n'y a pas de fonction SetGadgetState pour TextGadget et HyperLinkGadget
                                    ; la valeur stocké dans la table virtuelle des gadgets est <> 0 pour ImageGadget
                                    *Table = PeekL(*Table + 4)
                                    If *Table\SetGadgetState
                                          resultat = #PB_ImageGadget
                                    ElseIf GetWindowLong_(GadgetID(id), #GWL_STYLE) & $20000
                                          resultat = #PB_TextGadget
                                    Else
                                          resultat = #PB_HyperLinkGadget
                                    EndIf
                                    ; comparaison avec "Button" pour ButtonGadget ou ButtonImageGadget
                                    ; ou CheckBoxGadget ou OptionGadget ou Frame3DGadget
                              ElseIf classe = "Button"
                                    *Table = PeekL(*Table + 4)
                                    ; avec la table virtuelle et les fonctions, on ne peut séparer
                                    ; que le ButtonImageGadget avec SetGadgetState()
                                    If *Table\SetGadgetState And * Table\GetGadgetState = 0
                                          resultat = #PB_ButtonImageGadget
                                    Else
                                          ; on différencie le reste avec les styles
                                          ; voir les posts ici mais j'ai modifié pour optiongadget
                                          ; http://forums.purebasic.com/english/viewtopic.php?t = 14082
                                          ; http://forums.purebasic.com/english/viewtopic.php?t = 11173
                                         
                                          Style = GetWindowLong_(GadgetID(id), #GWL_STYLE)
                                          If Style & #BS_GROUPBOX = #BS_GROUPBOX
                                                resultat = #PB_Frame3DGadget
                                          ElseIf Style & #BS_CHECKBOX = #BS_CHECKBOX Or Style & #BS_AUTOCHECKBOX = #BS_AUTOCHECKBOX Or Style & #BS_3STATE = #BS_3STATE Or Style & #BS_AUTO3STATE = #BS_AUTO3STATE
                                                If Style & #BS_PUSHLIKE = #BS_PUSHLIKE
                                                      resultat = #PB_ButtonGadget
                                                Else
                                                      resultat = #PB_CheckBoxGadget
                                                EndIf
                                          ElseIf Style & #BS_RADIOBUTTON = #BS_RADIOBUTTON Or Style & #BS_AUTORADIOBUTTON = #BS_AUTORADIOBUTTON
                                                If Style & #BS_PUSHLIKE = #BS_PUSHLIKE
                                                      resultat = #PB_ButtonGadget
                                                Else
                                                      resultat = #PB_OptionGadget
                                                EndIf
                                          ElseIf Style = #BS_PUSHBUTTON Or Style & #BS_DEFPUSHBUTTON = #BS_DEFPUSHBUTTON
                                                resultat = #PB_ButtonGadget
                                          EndIf
                                    EndIf
                              EndIf
                             
                        Case 7
                              ; comparaison avec "ListBox"  pour le ListViewGadget
                              If classe = #PB_ListViewGadget_Class
                                    resultat = #PB_ListViewGadget
                              EndIf
                             
                        Case 8
                              ; comparaison avec "ComboBox"  pour le ComboBoxGadget
                              If classe = #PB_ComboBoxGadget_Class
                                    resultat = #PB_ComboBoxGadget
                                    ; comparaison avec "AtlAxWin"   pour le WebGadget
                              ElseIf classe = #PB_WebGadget_Class
                                    resultat = #PB_WebGadget
                              EndIf
                             
                        Case 9
                              ; comparaison avec "MDIClient"  pour MDIGadget
                              If classe = #PB_MDIGadget_Class
                                    resultat = #PB_MDIGadget
                                    ; comparaison avec "ScrollBar"  pour le ScrollBarGadget
                              ElseIf classe = #PB_ScrollBarGadget_Class
                                    resultat = #PB_ScrollBarGadget
                              EndIf
                             
                        Case 11
                              ; comparaison "RichEdit20A" pour l'EditorGadget
                              If classe = #PB_EditorGadget_Class
                                    resultat = #PB_EditorGadget
                              EndIf
                             
                        Case 12
                              ; comparaison "ComboBoxEx32" pour le ExplorerComboGadget
                              If classe = #PB_ExplorerComboGadget_Class
                                    resultat = #PB_ExplorerComboGadget
                                    ; comparaison avec "PureSplitter"  pour le "SplitterGadget
                              ElseIf classe = #PB_SplitterGadget_Class
                                    resultat = #PB_SplitterGadget
                              EndIf
                             
                        Case 13
                              ; comparaison "SysMonthCal32" pour le calendargadget
                              If classe = #PB_CalendarGadget_Class
                                    resultat = #PB_CalendarGadget
                                    ; comparaison "PureContainer" pour le ContainerGadget
                              ElseIf classe = #PB_ContainerGadget_Class
                                    resultat = #PB_ContainerGadget
                                    ; comparaison "SysListView32" pour la ListIconGadget ou l'ExplorerListGadget
                              ElseIf classe = "SysListView32"
                                    ; il n'y a pas de fonction SetGadgetItemState pour l'ExplorerListGadget
                                    ; la valeur stocké dans la table virtuelle des gadgets est 0 pour l'ExplorerListGadget
                                    *Table = PeekL(*Table + 4)
                                    If *Table\SetGadgetItemState
                                          resultat = #PB_ListIconGadget
                                    Else
                                          resultat = #PB_ExplorerListGadget
                                    EndIf
                                    ; comparaison "SysTreeView32" pour le TreeGadget ou l'ExplorerTreeGadget
                              ElseIf classe = "SysTreeView32"
                                    ; il n'y a pas de fonction SetGadgetItemState pour l'ExplorerTreeGadget
                                    ; la valeur stocké dans la table virtuelle des gadgets est 0 pour l'ExplorerTreeGadget
                                    *Table = PeekL(*Table + 4)
                                    If *Table\SetGadgetItemState
                                          resultat = #PB_TreeGadget
                                    Else
                                          resultat = #PB_ExplorerTreeGadget
                                    EndIf
                              EndIf
                             
                        Case 14
                              ; comparaison "SysIPAddress32" pour l'IPAddressGadget
                              If classe = #PB_IPAddressGadget_Class
                                    resultat = #PB_IPAddressGadget
                                    ; comparaison avec "PureScrollArea"  pour le ScrollAreaGadget
                              ElseIf classe = #PB_ScrollAreaGadget_Class
                                    resultat = #PB_ScrollAreaGadget
                              EndIf
                             
                        Case 15
                              ; comparaison avec "SysTabControl32"   pour le PanelGadget
                              If classe = #PB_PanelGadget_Class
                                    resultat = #PB_PanelGadget
                              EndIf
                             
                        Case 17
                              ; comparaison "SysDateTimePick32" pour le DateGadget
                              If classe = #PB_DateGadget_Class
                                    resultat = #PB_DateGadget
                                    ; comparaison avec "msctls_progress32" pour la progressbar
                              ElseIf classe = #PB_ProgressBarGadget_Class
                                    resultat = #PB_ProgressBarGadget
                                    ; comparaison avec "msctls_trackbar32"   pour le TrackbarGadget
                              ElseIf classe = #PB_TrackBarGadget_Class
                                    resultat = #PB_TrackBarGadget
                              EndIf
                  EndSelect
            EndIf
      EndIf
     
      ProcedureReturn resultat
EndProcedure