PanelGadget Question
Posted: Fri Apr 18, 2008 3:04 pm
				
				Is there any easy way to associate a panelgadget item with a gadget contained in the item?
			http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
AddGadgetItem (0, -1,"Panel 2")
item = SendMessage_(GadgetID(0), #TCM_GETITEMCOUNT, 0,0)-1
ButtonGadget(2, 10, 15, 80, 24,"Button 1") : SetGadgetData(2, item)
Code: Select all
Structure FILE
 Filename.s
 Editor.l
 Panel.l
EndStructure
Global NewList FileList.FILE()Code: Select all
Procedure MenuNew() ;Open a new panel
 
 AddElement(FileList())
 FileList()\Panel = CountGadgetItems(#EditorPanel)
 FileList()\Filename = "<New>" + Str(FileList()\Panel)
 
 OpenGadgetList(#EditorPanel)
  AddGadgetItem(#EditorPanel, FileList()\Panel, FileList()\Filename)
  FileList()\Editor = EditorGadget(#PB_Any, BorderSize, BorderSize, GetGadgetAttribute(#EditorPanel, #PB_Panel_ItemWidth) - BorderSize2, GetGadgetAttribute(#EditorPanel, #PB_Panel_ItemHeight) - BorderSize2)
 CloseGadgetList()
 
 SendMessage_(GadgetID(FileList()\Editor), #EM_LIMITTEXT, -1, 0)
 SetGadgetColor(FileList()\Editor, #PB_Gadget_BackColor, $dfffff)
 EditorFont(FileList()\Editor, "Courier")
 EditorFontSize(FileList()\Editor, 10)
 SetGadgetState(#EditorPanel, FileList()\Panel)
 
EndProcedureCode: Select all
Procedure MenuClose() ;Close the active panel
 Protected State.l = GetGadgetState(#EditorPanel)
 
 If CountList(FileList()) = 0 ;If no panels
  ProcedureReturn ;Exit
 EndIf
 
 ResetList(FileList())
 While NextElement(FileList()) ;Find the active panel
  If FileList()\Panel = State : Break : EndIf
 Wend
 
 OpenGadgetList(#EditorPanel) ;Delete panel item and editor gadget
  RemoveGadgetItem(#EditorPanel, FileList()\Panel)
  FreeGadget(FileList()\Editor)
 CloseGadgetList()
 
 If FileList()\Panel = CountGadgetItems(#EditorPanel)
  SetGadgetState(#EditorPanel, FileList()\Panel - 1) ;Use last panel
 Else
  SetGadgetState(#EditorPanel, FileList()\Panel) ;Use next panel
 EndIf
 
 DeleteElement(FileList())
 ResetList(FileList())
 While NextElement(FileList())
  If FileList()\Panel > State
   FileList()\Panel - 1 ;Reorder panel IDs to match new panel items
  EndIf
 Wend
 
EndProcedureCode: Select all
OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
PanelGadget(0,0,0,0,0)
AddGadgetItem(0,-1,"untitled1")
AddGadgetItem(0,-1,"untitled2")
AddGadgetItem(0,-1,"untitled3")
Procedure EnumChildProc(hwnd,lParam)
	Static WinNum
	
	WinNum + 1
	Debug "Window Handle #" + Str(WinNum) + " = " + Str(hwnd)
	
	ProcedureReturn 1
EndProcedure
EnumChildWindows_(GadgetID(0),@EnumChildProc(),0)
While WaitWindowEvent() ! #PB_Event_CloseWindow : WendCode: Select all
Procedure.l SetTabId(panelGad, tabNum)
  i$ = GetGadgetItemText(panelGad, tabNum)
  tci.TC_ITEM
  tci\mask = #TCIF_PARAM
  
  ;... Get the ID of the previous Panel added and increment by 1
  id = GetGadgetData(panelGad) + 1
  
  ;... Set the new Panel ID
  tci\lParam = id
  SendMessage_(GadgetID(panelGad), #TCM_SETITEM, tabNum, tci)
  
  ;... Increment our Panel ID data
  SetGadgetData(panelGad, id)
  
EndProcedure
Procedure GetTabId(panelGad, tabNum)
  tci.TC_ITEM\mask = #TCIF_PARAM
  SendMessage_(GadgetID(panelGad), #TCM_GETITEM, tabNum, @tci)
  SetGadgetText(0, "Panel ID is: " + Str(tci\lParam))
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  TextGadget(0, 10, 10, 100, 30, "Panel ID is: ")
  PanelGadget(1, 10, 40, 480, 350) 
  AddGadgetItem(1, 0, "Panel 0") 
  AddGadgetItem(1, 1, "Panel 1") 
  AddGadgetItem(1, 2, "Panel 2") 
  CloseGadgetList()
  
  ;... Set the PanleGadget Data to -1
  SetGadgetData(1, -1)
  
  ButtonGadget(2, 200, 10, 100, 25, "Remove Panel 1")
  
  ;... Add Panel ID's to each Panel (tab)
  For i = 0 To CountGadgetItems(1) - 1
    SetTabId(1, i)
  Next
  
  ;... Get the Panel ID for selected Panel
  GetTabId(1, GetGadgetState(1))
  
  Repeat
    event = WaitWindowEvent()
    If event = #PB_Event_Gadget And EventGadget() = 1
      ;... Get the Panel ID for selected Panel
      GetTabId(1, GetGadgetState(1))
    EndIf
    
    If EventType() = #PB_EventType_LeftClick And EventGadget() = 2
      RemoveGadgetItem(1, 1)
      AddGadgetItem(1, 1, "Panel 3")
      ;... Set the Panel ID for out new Panel
      SetTabId(1, 1)
      DisableGadget(2, 1)
    EndIf
    
  Until event = #PB_Event_CloseWindow  
EndIf
Code: Select all
Structure FILE
 Filename.s
 Editor.l
 hwnd.l
EndStructure
Global NewList FileList.FILE()Code: Select all
Procedure GetPanelID(Panel.l, Item.l)
 Protected tc.TC_ITEM ;Tab Control (Panel) Structure
 tc.TC_ITEM\mask = #TCIF_PARAM ;Use application-defined data
 SendMessage_(GadgetID(Panel), #TCM_GETITEM, Item, @tc)
 ProcedureReturn tc\lParam ;Return panel item handle
 
EndProcedureCode: Select all
Procedure MenuNew() ;Open a new panel
 
 Protected State.l = CountGadgetItems(#EditorPanel)
 
 AddElement(FileList()) ;New element
 FileList()\Filename = "<New>" ;+ Str(State)
 
 OpenGadgetList(#EditorPanel) ;New panel item and editor gadget
  AddGadgetItem(#EditorPanel, State, FileList()\Filename)
  FileList()\Editor = EditorGadget(#PB_Any, BorderSize, BorderSize, GetGadgetAttribute(#EditorPanel, #PB_Panel_ItemWidth) - BorderSize2, GetGadgetAttribute(#EditorPanel, #PB_Panel_ItemHeight) - BorderSize2)
 CloseGadgetList()
 
 EditorFont(FileList()\Editor, "Courier") ;Modify the editor gadget
 EditorFontSize(FileList()\Editor, 10)
 SetGadgetColor(FileList()\Editor, #PB_Gadget_BackColor, $dfffff)
 SendMessage_(GadgetID(FileList()\Editor), #EM_LIMITTEXT, -1, 0)
 
 FileList()\hwnd = GetPanelID(#EditorPanel, State)
 
 SetActiveGadget(FileList()\Editor)
 SetGadgetState(#EditorPanel, State) ;Set as active panel
 
EndProcedureCode: Select all
Procedure MenuClose() ;Close the active panel
 Protected State.l, lParam.l
 
 If CountList(FileList()) = 0
  ProcedureReturn ;If no panels then exit
 EndIf
 
 State = GetGadgetState(#EditorPanel) 
 lParam = GetPanelID(#EditorPanel, State)
 
 ResetList(FileList())
 While NextElement(FileList()) ;Find the active panel
  If FileList()\hwnd = lParam : Break : EndIf
 Wend
 
 OpenGadgetList(#EditorPanel) ;Delete panel item and editor gadget
  RemoveGadgetItem(#EditorPanel, State)
  FreeGadget(FileList()\Editor)
 CloseGadgetList()
 
 If State = CountGadgetItems(#EditorPanel)
  SetGadgetState(#EditorPanel, State - 1) ;Use last panel
 Else
  SetGadgetState(#EditorPanel, State) ;Use next panel
 EndIf
 
 DeleteElement(FileList())
 
EndProcedure