Code: Select all
;-TOP
; Comment: Module Advanced Gadget Functions
; Author : mk-soft
; Version: v1.05
; Created: 30.10.2016
; Updated:
; Link :
;
; *****************************************************************************
DeclareModule AGF ; Advanced Gadget Functions
Declare GetParentWindowID(Gadget)
Declare GetPreviousGadget(Gadget, WindowID)
Declare GetNextGadget(Gadget, WindowID)
EndDeclareModule
; ---------------------------------------------------------------------------
Module AGF ; Advanced Gadget Functions
EnableExplicit
; Import internal function ------------------------------------------------------------
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_GetObject( PB_Object , DynamicOrArrayID)
PB_Window_Objects.i
PB_Gadget_Objects.i
EndImport
CompilerElse
ImportC ""
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_GetObject( PB_Object , DynamicOrArrayID)
PB_Window_Objects.i
PB_Gadget_Objects.i
EndImport
CompilerEndIf
CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
; PB Interne Struktur Gadget MacOS
Structure sdkGadget
*gadget
*container
*vt
UserData.i
Window.i
Type.i
Flags.i
EndStructure
CompilerEndIf
; ---------------------------------------------------------------------------
Procedure GetParentWindowID(Gadget)
Protected GadgetID, GadgetWindowID
If IsGadget(Gadget)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_MacOS
Protected *Gadget.sdkGadget = IsGadget(Gadget)
GadgetWindowID = WindowID(*Gadget\Window)
CompilerCase #PB_OS_Linux
GadgetID = GadgetID(Gadget)
GadgetWindowID = gtk_widget_get_toplevel_ (GadgetID)
CompilerCase #PB_OS_Windows
GadgetID = GadgetID(Gadget)
While GadgetID
GadgetWindowID = GadgetID : GadgetID = GetParent_( GadgetID )
Wend
CompilerEndSelect
EndIf
ProcedureReturn GadgetWindowID
EndProcedure
; ---------------------------------------------------------------------------
Procedure GetPreviousGadget(Gadget, WindowID)
Protected object, prev_id, type
prev_id = -1
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
type = GadgetType(object)
If type <> #PB_GadgetType_Text And type <> #PB_GadgetType_Frame
If GetParentWindowID(object) = WindowID
If gadget = object
If prev_id > 0
PB_Object_EnumerateAbort(PB_Gadget_Objects)
Break
EndIf
Else
prev_id = object
EndIf
EndIf
EndIf
Wend
ProcedureReturn prev_id
EndProcedure
; ---------------------------------------------------------------------------
Procedure GetNextGadget(Gadget, WindowID)
Protected object, next_id, type
next_id = -1
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
type = GadgetType(object)
If type <> #PB_GadgetType_Text And type <> #PB_GadgetType_Frame
If GetParentWindowID(object) = WindowID
If next_id < 0
next_id = object
EndIf
If gadget = object
If PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
If GetParentWindowID(object) = WindowID
next_id = object
PB_Object_EnumerateAbort(PB_Gadget_Objects)
Break
EndIf
EndIf
EndIf
EndIf
EndIf
Wend
ProcedureReturn next_id
EndProcedure
EndModule
; *****************************************************************************
;- Example
CompilerIf #PB_Compiler_IsMainFile
UseModule AGF
Global Dim gad(4)
If OpenWindow(0, 0, 0, 400, 230, "TAB and SHIFT + TAB in linux and mac", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
gad(0) = CanvasGadget(#PB_Any, 20, 20, 300, 30, #PB_Canvas_Keyboard)
gad(1) = CanvasGadget(#PB_Any, 20, 60, 300, 30, #PB_Canvas_Keyboard)
gad(2) = CanvasGadget(#PB_Any, 20, 100, 300, 30, #PB_Canvas_Keyboard)
gad(3) = CanvasGadget(#PB_Any, 20, 140, 300, 30, #PB_Canvas_Keyboard)
gad(4) = CanvasGadget(#PB_Any, 20, 180, 300, 30, #PB_Canvas_Keyboard)
SetActiveGadget(gad(0))
Text$ = "I have Focus use TAB or SHIT + TAB"
StartDrawing(CanvasOutput(gad(0)))
DrawText((OutputWidth() - TextWidth(Text$)) / 2, (OutputHeight() - TextHeight(Text$)) / 2, Text$, 0, $FFFFFF)
StopDrawing()
AddKeyboardShortcut(0,#PB_Shortcut_Tab,10)
AddKeyboardShortcut(0,#PB_Shortcut_Tab|#PB_Shortcut_Shift ,20)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Menu
Select EventMenu()
Case 10
Text$ = "I have Focus use TAB or SHIT + TAB"
StartDrawing(CanvasOutput(GetActiveGadget()))
Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
StopDrawing()
SetActiveGadget(GetNextGadget(GetActiveGadget(), WindowID(GetActiveWindow())))
StartDrawing(CanvasOutput(GetActiveGadget()))
DrawText((OutputWidth() - TextWidth(Text$)) / 2, (OutputHeight() - TextHeight(Text$)) / 2, Text$, 0, $FFFFFF)
StopDrawing()
Case 20
Text$ = "I have Focus use TAB or SHIT + TAB"
StartDrawing(CanvasOutput(GetActiveGadget()))
Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
StopDrawing()
SetActiveGadget(GetPreviousGadget(GetActiveGadget(), WindowID(GetActiveWindow())))
StartDrawing(CanvasOutput(GetActiveGadget()))
DrawText((OutputWidth() - TextWidth(Text$)) / 2, (OutputHeight() - TextHeight(Text$)) / 2, Text$, 0, $FFFFFF)
StopDrawing()
EndSelect
EndSelect
Until Quit = 1
EndIf
CompilerEndIf