Page 1 of 1

Enumerate* and Count*(Window,Gadget,Image)

Posted: Mon Feb 16, 2015 7:33 am
by mestnyi

Code: Select all

  CompilerIf Not Defined(PB_Object_Count, #PB_Function) And
             Not Defined(PB_Object_Count, #PB_Procedure) 
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      Import ""
      CompilerElse
        ImportC ""
        CompilerEndIf
        PB_Object_EnumerateStart( PB_Objects )
        PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
        PB_Object_EnumerateAbort( PB_Objects )
        
        PB_Object_Count( PB_Objects )
        
        PB_Window_Objects.i
        PB_Gadget_Objects.i
        PB_Image_Objects.i
      EndImport
  CompilerEndIf

  CompilerIf Not Defined(EnumerateStartGadget, #PB_Function) And
             Not Defined(EnumerateStartGadget, #PB_Procedure) 
    EnableExplicit
    
    ProcedureDLL CountWindow() ;Returns count window
      ProcedureReturn PB_Object_Count(PB_Window_Objects)
    EndProcedure
    
    ProcedureDLL CountGadget() ;Returns count gadget
      ProcedureReturn PB_Object_Count(PB_Gadget_Objects)
    EndProcedure
    
    ProcedureDLL CountImage() ;Returns count image
      ProcedureReturn PB_Object_Count(PB_Image_Objects)
    EndProcedure
    
    
    ProcedureDLL EnumerateStartWindow() ;Returns pb window object 
      PB_Object_EnumerateStart(PB_Window_Objects)
      ProcedureReturn PB_Window_Objects
    EndProcedure
    
    ProcedureDLL EnumerateStartGadget() ;Returns pb gadget object 
      PB_Object_EnumerateStart(PB_Gadget_Objects)
      ProcedureReturn PB_Gadget_Objects
    EndProcedure
    
    ProcedureDLL EnumerateStartImage() ;Returns pb Image object 
      PB_Object_EnumerateStart(PB_Image_Objects)
      ProcedureReturn PB_Image_Objects
    EndProcedure
    
    
    ProcedureDLL EnumerateNextWindow( *Window.Integer ) ;Returns next enumerate pb object 
      Protected PBObject, Window =-1
      PBObject = PB_Object_EnumerateNext( PB_Window_Objects, @Window )
      
      If IsWindow( Window )
        PokeI( *Window, PeekI( @Window ) )
      EndIf
      
      ProcedureReturn PBObject
    EndProcedure
    
    ProcedureDLL EnumerateNextGadget2( *Gadget.Integer, Window ) 
      Protected PBObject, WindowID, GadgetID, GadgetWindowID, Gadget =-1
      PBObject = PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget)
      
      If IsGadget( Gadget )
        PokeI( *Gadget, PeekI( @Gadget ) )
      EndIf
      
      If (IsWindow(Window) And IsGadget(Gadget))
        WindowID = WindowID( Window )
        GadgetID = GadgetID( Gadget )
        CompilerSelect #PB_Compiler_OS 
          CompilerCase #PB_OS_Linux 
            GadgetWindowID = gtk_widget_get_toplevel_ ( GadgetID )
          CompilerCase #PB_OS_Windows
            While GadgetID 
              GadgetWindowID = GadgetID
              GadgetID = GetParent_( GadgetID )
              If Not GadgetID
                Break
              EndIf
            Wend 
        CompilerEndSelect
        
        If GadgetWindowID = WindowID
          ProcedureReturn PBObject
        Else
          ProcedureReturn EnumerateNextGadget2( *Gadget, Window )
        EndIf  
      Else
        ProcedureReturn PBObject
      EndIf  
    EndProcedure
    ProcedureDLL EnumerateNextGadget( *Gadget ) ;Returns next enumerate pb object  
      ProcedureReturn EnumerateNextGadget2( *Gadget, #PB_All )
    EndProcedure
    Macro EnumerateNextGadget( Gadget, Window = #PB_All ) 
      EnumerateNextGadget2( Gadget, Window ) 
    EndMacro
    
    ProcedureDLL EnumerateNextImage( *Image.Integer ) ;Returns next enumerate pb object 
      Protected PBObject, Image =-1
      PBObject = PB_Object_EnumerateNext(PB_Image_Objects, @Image)
      
      If IsImage( Image )
        PokeI( *Image, PeekI( @Image ) )
      EndIf
      
      ProcedureReturn PBObject
    EndProcedure
    
    
    ProcedureDLL EnumerateAbortWindow() ;Abort enumerate window
      ProcedureReturn PB_Object_EnumerateAbort(PB_Window_Objects)
    EndProcedure
    
    ProcedureDLL EnumerateAbortGadget() ;Abort enumerate gadget
      ProcedureReturn PB_Object_EnumerateAbort(PB_Gadget_Objects)
    EndProcedure
    
    ProcedureDLL EnumerateAbortImage() ;Abort enumerate image
      ProcedureReturn PB_Object_EnumerateAbort(PB_Image_Objects)
    EndProcedure
    
    DisableExplicit
  CompilerEndIf
  
  CompilerIf #PB_Compiler_IsMainFile
    X = 200
    For i = 1 To 4
      OpenWindow(i, 200, X, 150, 60, "Window_" + Trim(Str(i)))
      ContainerGadget(i*5, 5, 5, 120,50, #PB_Container_Flat)
      ButtonGadget(i,10,10,100,30,"Button_" + Trim(Str(i)))
      CloseGadgetList()
      X + 100
    Next
    
    Debug "Begen enumerate window"
    If EnumerateStartWindow( )
      While EnumerateNextWindow( @Window )
        Debug "Window "+Window
      Wend
      EnumerateAbortWindow()
    EndIf
    
    Debug "Begen enumerate all gadget"
    If EnumerateStartGadget( )
      While EnumerateNextGadget( @Gadget )
        Debug "Gadget "+Gadget
      Wend
      EnumerateAbortGadget() 
    EndIf
    
    Window = 3
    
    Debug "Begen enumerate gadget window = 3"
    If EnumerateStartGadget( )
      While EnumerateNextGadget( @Gadget, Window )
        Debug "Gadget "+Str(Gadget) +" Window "+ Window
      Wend
      EnumerateAbortGadget() 
    EndIf
    
    Repeat
      If CountWindow( ) 
        Event = WaitWindowEvent( )
        If Event = #PB_Event_CloseWindow
          CloseWindow( EventWindow( ) )
          Debug "Close " + EventWindow( )
        EndIf
      Else 
        Break
      EndIf
    ForEver
    
    Debug "Exit"
  CompilerEndIf
with module

Code: Select all

;- Enumerate
DeclareModule Enumerate
  Declare CountWindow()
  Declare CountGadget()
  Declare CountImage()
  
  Declare StartWindow()
  Declare StartGadget()
  Declare StartImage()
  
  Declare NextWindow( *Window.Integer )
  Declare NextGadget( *Gadget.Integer, Window = #PB_All ) 
  Declare NextImage( *Image.Integer )
  
  Declare AbortWindow()
  Declare AbortGadget()
  Declare AbortImage()
EndDeclareModule

Module Enumerate
  EnableExplicit
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Import ""
    CompilerElse
      ImportC ""
      CompilerEndIf
      PB_Object_EnumerateStart( PB_Objects )
      PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
      PB_Object_EnumerateAbort( PB_Objects )
      
      PB_Object_Count( PB_Objects )
      
      PB_Window_Objects.i
      PB_Gadget_Objects.i
      PB_Image_Objects.i
    EndImport
    
    Procedure CountWindow() ;Returns count window
      ProcedureReturn PB_Object_Count(PB_Window_Objects)
    EndProcedure
    Procedure CountGadget() ;Returns count gadget
      ProcedureReturn PB_Object_Count(PB_Gadget_Objects)
    EndProcedure
    Procedure CountImage() ;Returns count image
      ProcedureReturn PB_Object_Count(PB_Image_Objects)
    EndProcedure
    
    Procedure StartWindow() ;Returns pb window object 
      PB_Object_EnumerateStart(PB_Window_Objects)
      ProcedureReturn PB_Window_Objects
    EndProcedure
    Procedure StartGadget() ;Returns pb gadget object 
      PB_Object_EnumerateStart(PB_Gadget_Objects)
      ProcedureReturn PB_Gadget_Objects
    EndProcedure
    Procedure StartImage() ;Returns pb Image object 
      PB_Object_EnumerateStart(PB_Image_Objects)
      ProcedureReturn PB_Image_Objects
    EndProcedure
    
    Procedure NextWindow( *Window.Integer ) ;Returns next enumerate pb object 
      Protected PB_Object, Window =-1
      PB_Object = PB_Object_EnumerateNext( PB_Window_Objects, @Window )
      
      If IsWindow( Window )
        PokeI( *Window, PeekI( @Window ) )
      EndIf
      
      ProcedureReturn PB_Object
    EndProcedure
    Procedure NextGadget( *Gadget.Integer, Window = #PB_All)  ;Returns next enumerate pb object
      Protected PB_Object, WindowID, GadgetID, GadgetWindowID, Gadget =-1
      PB_Object = PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget)
      
      If IsGadget( Gadget )
        PokeI( *Gadget, PeekI( @Gadget ) )
      EndIf
      
      If (IsWindow(Window) And IsGadget(Gadget))
        WindowID = WindowID( Window )
        GadgetID = GadgetID( Gadget )
        CompilerSelect #PB_Compiler_OS 
          CompilerCase #PB_OS_Linux 
            GadgetWindowID = gtk_widget_get_toplevel_ ( GadgetID )
          CompilerCase #PB_OS_Windows
            While GadgetID 
              GadgetWindowID = GadgetID
              GadgetID = GetParent_( GadgetID )
              If Not GadgetID
                Break
              EndIf
            Wend 
        CompilerEndSelect
        
        If GadgetWindowID = WindowID
          ProcedureReturn PB_Object
        Else
          ProcedureReturn NextGadget( *Gadget, Window )
        EndIf  
      Else
        ProcedureReturn PB_Object
      EndIf  
    EndProcedure
    Procedure NextImage( *Image.Integer ) ;Returns next enumerate pb object 
      Protected PB_Object, Image =-1
      PB_Object = PB_Object_EnumerateNext(PB_Image_Objects, @Image)
      
      If IsImage( Image )
        PokeI( *Image, PeekI( @Image ) )
      EndIf
      
      ProcedureReturn PB_Object
    EndProcedure
    
    Procedure AbortWindow() ;Abort enumerate window
      ProcedureReturn PB_Object_EnumerateAbort(PB_Window_Objects)
    EndProcedure
    Procedure AbortGadget() ;Abort enumerate gadget
      ProcedureReturn PB_Object_EnumerateAbort(PB_Gadget_Objects)
    EndProcedure
    Procedure AbortImage() ;Abort enumerate image
      ProcedureReturn PB_Object_EnumerateAbort(PB_Image_Objects)
    EndProcedure
    
    DisableExplicit
  EndModule
  
  
  
  CompilerIf #PB_Compiler_IsMainFile
    X = 200
    For i = 1 To 4
      OpenWindow(i, 200, X, 150, 60, "Window_" + Trim(Str(i)))
      ContainerGadget(i*5, 5, 5, 120,50, #PB_Container_Flat)
      ButtonGadget(i,10,10,100,30,"Button_" + Trim(Str(i)))
      CloseGadgetList()
      X + 100
    Next
    
    Debug "Begen enumerate window"
    If Enumerate::StartWindow( )
      While Enumerate::NextWindow( @Window )
        Debug "Window "+Window
      Wend
      Enumerate::AbortWindow()
    EndIf
    
    Debug "Begen enumerate all gadget"
    If Enumerate::StartGadget( )
      While Enumerate::NextGadget( @Gadget )
        Debug "Gadget "+Gadget
      Wend
      Enumerate::AbortGadget() 
    EndIf
    
    Window = 3
    
    Debug "Begen enumerate gadget window = 3"
    If Enumerate::StartGadget( )
      While Enumerate::NextGadget( @Gadget, Window )
        Debug "Gadget "+Str(Gadget) +" Window "+ Window
      Wend
      Enumerate::AbortGadget() 
    EndIf
    
    Repeat
      If Enumerate::CountWindow( ) 
        Event = WaitWindowEvent( )
        If Event = #PB_Event_CloseWindow
          CloseWindow( EventWindow( ) )
          Debug "Close " + EventWindow( )
        EndIf
      Else 
        Break
      EndIf
    ForEver
    
    Debug "Exit"
  CompilerEndIf

; IDE Options = PureBasic 5.24 LTS (Windows - x64)
; CursorPosition = 158
; FirstLine = 61
; Folding = EQBg--
; EnableUnicode
; EnableXP