Serializer for PB Gadgets (PB4.10)

Share your advanced PureBasic knowledge/code with the community.
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Serializer for PB Gadgets (PB4.10)

Post by ts-soft »

This is a first testversion with some bugs. Please test it and give me an feedback.
You can save and restore all datas in your gadgets (PBGadgets only) in a XML-Stream.
This is useful for listview, listicon, editor and so on, all gadgets supported (MDIGadget not supported, its a window :wink: )

The Source:

Code: Select all

; Serializer_Include.pbi
; Author: ts-soft
; Second: kiffi
; PB-Version: 4.10 and greater

; ### workaround for beta #######################
; ### can deleted after PB 4.10 release         #
Procedure.s GetXMLAttribute_(*Node, Attribute$)
  If XMLNodeType(*Node) = #PB_XML_Normal
    ExamineXMLAttributes(*Node)
    While NextXMLAttribute(*Node)
      If XMLAttributeName(*Node) = Attribute$
        ProcedureReturn XMLAttributeValue(*Node)
      EndIf
    Wend
  EndIf
EndProcedure
Macro GetXMLAttribute(Node, Attribute)
  GetXMLAttribute_(Node, Attribute)
EndMacro
; #### end workaround ############################

Structure Serializer_Struc
  PBID.l
  Ident.s
EndStructure

Enumeration ;Serializerflags
  #Serializer_X             = 1
  #Serializer_Y             = 1 << 1
  #Serializer_Width         = 1 << 2
  #Serializer_Height        = 1 << 3
  #Serializer_Attribut      = 1 << 4
  #Serializer_Color         = 1 << 5
  #Serializer_Data          = 1 << 6
  #Serializer_State         = 1 << 7
  #Serializer_Style         = 1 << 8
  #Serializer_Text          = 1 << 9
  #Serializer_ItemColor     = 1 << 10
  #Serializer_ItemData      = 1 << 11
  #Serializer_ItemState     = 1 << 12
  #Serializer_ItemText      = 1 << 13
  #Serializer_Defaults = #Serializer_State|#Serializer_Text|#Serializer_ItemState|#Serializer_ItemText
EndEnumeration

Procedure Serialize_Standard(PBID.l, oGadget.l, flags.l)

  Protected oNode.l

  If flags & #Serializer_X
    SetXMLAttribute(oGadget, "x", Str(GadgetX(PBID)))
  EndIf
  If flags & #Serializer_Y
    SetXMLAttribute(oGadget, "y", Str(GadgetY(PBID)))
  EndIf
  If flags & #Serializer_Width
    SetXMLAttribute(oGadget, "width", Str(GadgetWidth(PBID)))
  EndIf
  If flags & #Serializer_Height
    SetXMLAttribute(oGadget, "height", Str(GadgetHeight(PBID)))
  EndIf
  If flags & #Serializer_Style
    SetXMLAttribute(oGadget, "style", Str(GetWindowLong_(GadgetID(PBID), #GWL_STYLE)))
  EndIf
  If flags & #Serializer_Attribut
    Select GadgetType(PBID)
      Case #PB_GadgetType_Calendar
        SetXMLAttribute(oGadget, "ca_minimum", Str(GetGadgetAttribute(PBID, #PB_Calendar_Minimum)))
        SetXMLAttribute(oGadget, "ca_maximum", Str(GetGadgetAttribute(PBID, #PB_Calendar_Maximum)))
      Case #PB_GadgetType_Date
        SetXMLAttribute(oGadget, "da_minimum", Str(GetGadgetAttribute(PBID, #PB_Date_Minimum)))
        SetXMLAttribute(oGadget, "da_maximum", Str(GetGadgetAttribute(PBID, #PB_Date_Maximum)))
      Case #PB_GadgetType_Editor
        SetXMLAttribute(oGadget, "readonly", Str(GetGadgetAttribute(PBID, #PB_Editor_ReadOnly)))
      Case #PB_GadgetType_Panel
        SetXMLAttribute(oGadget, "pa_itemwidth", Str(GetGadgetAttribute(PBID, #PB_Panel_ItemWidth)))
        SetXMLAttribute(oGadget, "pa_itemheight", Str(GetGadgetAttribute(PBID, #PB_Panel_ItemHeight)))
        SetXMLAttribute(oGadget, "pa_tabheight", Str(GetGadgetAttribute(PBID, #PB_Panel_ItemWidth)))
      Case #PB_GadgetType_ProgressBar
        SetXMLAttribute(oGadget, "pr_minimum", Str(GetGadgetAttribute(PBID, #PB_ProgressBar_Minimum)))
        SetXMLAttribute(oGadget, "pr_maximum", Str(GetGadgetAttribute(PBID, #PB_ProgressBar_Maximum)))
      Case #PB_GadgetType_ScrollArea
        SetXMLAttribute(oGadget, "sc_innerwidth", Str(GetGadgetAttribute(PBID, #PB_ScrollArea_InnerWidth)))
        SetXMLAttribute(oGadget, "sc_innerheight", Str(GetGadgetAttribute(PBID, #PB_ScrollArea_InnerHeight)))
        SetXMLAttribute(oGadget, "sc_x", Str(GetGadgetAttribute(PBID, #PB_ScrollArea_X)))
        SetXMLAttribute(oGadget, "sc_y", Str(GetGadgetAttribute(PBID, #PB_ScrollArea_Y)))
      Case #PB_GadgetType_Spin
        SetXMLAttribute(oGadget, "sp_minimum", Str(GetGadgetAttribute(PBID, #PB_Spin_Minimum)))
        SetXMLAttribute(oGadget, "sp_maximum", Str(GetGadgetAttribute(PBID, #PB_Spin_Maximum)))
      Case #PB_GadgetType_Splitter
        SetXMLAttribute(oGadget, "firstminimumsize", Str(GetGadgetAttribute(PBID, #PB_Splitter_FirstMinimumSize)))
        SetXMLAttribute(oGadget, "secondminimumsize", Str(GetGadgetAttribute(PBID, #PB_Splitter_SecondMinimumSize)))
        SetXMLAttribute(oGadget, "firstgadget", Str(GetGadgetAttribute(PBID, #PB_Splitter_FirstGadget)))
        SetXMLAttribute(oGadget, "secondgadget", Str(GetGadgetAttribute(PBID, #PB_Splitter_SecondGadget)))
      Case #PB_GadgetType_TrackBar
        SetXMLAttribute(oGadget, "tb_minimum", Str(GetGadgetAttribute(PBID, #PB_TrackBar_Minimum)))
        SetXMLAttribute(oGadget, "tb_maximum", Str(GetGadgetAttribute(PBID, #PB_TrackBar_Maximum)))
    EndSelect
  EndIf
  If flags & #Serializer_Color
    Select GadgetType(PBID)
      Case #PB_GadgetType_Calendar, #PB_GadgetType_Date
        SetXMLAttribute(oGadget, "frontcolor", Str(GetGadgetColor(PBID, #PB_Gadget_FrontColor)))
        SetXMLAttribute(oGadget, "backcolor", Str(GetGadgetColor(PBID, #PB_Gadget_BackColor)))
        SetXMLAttribute(oGadget, "titlebackcolor", Str(GetGadgetColor(PBID, #PB_Gadget_TitleBackColor)))
        SetXMLAttribute(oGadget, "titlefrontcolor", Str(GetGadgetColor(PBID, #PB_Gadget_TitleFrontColor)))
        SetXMLAttribute(oGadget, "graytextcolor", Str(GetGadgetColor(PBID, #PB_Gadget_GrayTextColor)))
      Case #PB_GadgetType_Container
        SetXMLAttribute(oGadget, "backcolor", Str(GetGadgetColor(PBID, #PB_Gadget_BackColor)))
      Case #PB_GadgetType_Editor, #PB_GadgetType_ListView, #PB_GadgetType_ProgressBar, #PB_GadgetType_Spin, #PB_GadgetType_String, #PB_GadgetType_Text
        SetXMLAttribute(oGadget, "frontcolor", Str(GetGadgetColor(PBID, #PB_Gadget_FrontColor)))
        SetXMLAttribute(oGadget, "backcolor", Str(GetGadgetColor(PBID, #PB_Gadget_BackColor)))
      Case #PB_GadgetType_ExplorerList, #PB_GadgetType_ExplorerTree, #PB_GadgetType_ListIcon
        SetXMLAttribute(oGadget, "frontcolor", Str(GetGadgetColor(PBID, #PB_Gadget_FrontColor)))
        SetXMLAttribute(oGadget, "backcolor", Str(GetGadgetColor(PBID, #PB_Gadget_BackColor)))
        SetXMLAttribute(oGadget, "linecolor", Str(GetGadgetColor(PBID, #PB_Gadget_LineColor)))
      Case #PB_GadgetType_HyperLink
        SetXMLAttribute(oGadget, "frontcolor", Str(GetGadgetColor(PBID, #PB_Gadget_FrontColor)))
    EndSelect
  EndIf
  If flags & #Serializer_Data
    SetXMLAttribute(oGadget, "data", Str(GetGadgetData(PBID)))
  EndIf
  If flags & #Serializer_State
    SetXMLAttribute(oGadget, "state", Str(GetGadgetState(PBID)))
  EndIf
  If flags & #Serializer_Text
    If GadgetType(PBID) <> #PB_GadgetType_Editor
      oNode = CreateXMLNode(oGadget)
      SetXMLNodeName(oNode, "text")
      oNode = CreateXMLNode(oNode, 0, #PB_XML_CData)
      SetXMLNodeText(oNode, GetGadgetText(PBID))
    EndIf
  EndIf
EndProcedure

Procedure Serialize_StandardItems(PBID.l, oGadget.l, flags.l)

  Protected oItems.l, oNode.l, LineCounter.l, Count.l

  Count = CountGadgetItems(PBID) - 1

  If Count > -1

    oItems = CreateXMLNode(oGadget)
    SetXMLNodeName(oItems, "items")

    For LineCounter = 0 To Count

      oNode = CreateXMLNode(oItems)
      SetXMLNodeName(oNode, "item")

      If GadgetType(PBID) = #PB_GadgetType_Tree
        SetXMLAttribute(oNode, "item_sublevel", Str(GetGadgetItemAttribute(PBID, LineCounter, #PB_Tree_SubLevel)))
      EndIf
      If flags & #Serializer_ItemColor
        If GadgetType(PBID) = #PB_GadgetType_ListIcon Or GadgetType(PBID) = #PB_GadgetType_Tree
          SetXMLAttribute(oNode, "item_frontcolor", Str(GetGadgetItemColor(PBID, #PB_Gadget_FrontColor, LineCounter)))
          SetXMLAttribute(oNode, "item_backcolor", Str(GetGadgetItemColor(PBID, #PB_Gadget_BackColor, LineCounter)))
        EndIf
      EndIf
      If flags & #Serializer_ItemData
        SetXMLAttribute(oNode, "data", Str(GetGadgetItemData(PBID, LineCounter)))
      EndIf
      If flags & #Serializer_ItemState
        SetXMLAttribute(oNode, "state", Str(GetGadgetItemState(PBID, LineCounter)))
      EndIf
      If flags & #Serializer_ItemText
        oNode = CreateXMLNode(oNode)
        SetXMLNodeName(oNode, "text")
        oNode = CreateXMLNode(oNode, 0, #PB_XML_CData)
        SetXMLNodeText(oNode, GetGadgetItemText(PBID, LineCounter))
      EndIf

    Next ; LineCounter

  EndIf

EndProcedure

Procedure DeSerialize_Standard(PBID.l, oGadget.l, flags.l)

  Protected oNode.l

  If flags & #Serializer_X
    ResizeGadget(PBID, Val(Trim(GetXMLAttribute(oGadget, "x"))), #PB_Ignore, #PB_Ignore, #PB_Ignore)
  EndIf
  If flags & #Serializer_Y
    ResizeGadget(PBID, #PB_Ignore, Val(Trim(GetXMLAttribute(oGadget, "y"))), #PB_Ignore, #PB_Ignore)
  EndIf
  If flags & #Serializer_Width
    ResizeGadget(PBID, #PB_Ignore, #PB_Ignore, Val(Trim(GetXMLAttribute(oGadget, "width"))), #PB_Ignore)
  EndIf
  If flags & #Serializer_Height
    ResizeGadget(PBID, #PB_Ignore, #PB_Ignore, #PB_Ignore, Val(Trim(GetXMLAttribute(oGadget, "height"))))
  EndIf
  If flags & #Serializer_Style
    SetWindowLong_(GadgetID(PBID), #GWL_STYLE, Val(Trim(GetXMLAttribute(oGadget, "style"))))
  EndIf
  If flags & #Serializer_Attribut
    Select GadgetType(PBID)
      Case #PB_GadgetType_Calendar
        SetGadgetAttribute(PBID, #PB_Calendar_Minimum, Val(Trim(GetXMLAttribute(oGadget, "ca_minimum"))))
        SetGadgetAttribute(PBID, #PB_Calendar_Maximum, Val(Trim(GetXMLAttribute(oGadget, "ca_maximum"))))
      Case #PB_GadgetType_Date
        SetGadgetAttribute(PBID, #PB_Date_Minimum, Val(Trim(GetXMLAttribute(oGadget, "da_minimum"))))
        SetGadgetAttribute(PBID, #PB_Date_Maximum, Val(Trim(GetXMLAttribute(oGadget, "da_maximum"))))
      Case #PB_GadgetType_Editor
        SetGadgetAttribute(PBID, #PB_Editor_ReadOnly, Val(Trim(GetXMLAttribute(oGadget, "readonly"))))
      Case #PB_GadgetType_Panel
        ;this values readonly
      Case #PB_GadgetType_ProgressBar
        SetGadgetAttribute(PBID, #PB_ProgressBar_Minimum, Val(Trim(GetXMLAttribute(oGadget, "pr_minimum"))))
        SetGadgetAttribute(PBID, #PB_ProgressBar_Maximum, Val(Trim(GetXMLAttribute(oGadget, "pr_maximum"))))
      Case #PB_GadgetType_ScrollArea
        SetGadgetAttribute(PBID, #PB_ScrollArea_InnerWidth, Val(Trim(GetXMLAttribute(oGadget, "sc_innerwidth"))))
        SetGadgetAttribute(PBID, #PB_ScrollArea_InnerHeight, Val(Trim(GetXMLAttribute(oGadget, "sc_innerheight"))))
        SetGadgetAttribute(PBID, #PB_ScrollArea_X, Val(Trim(GetXMLAttribute(oGadget, "sc_x"))))
        SetGadgetAttribute(PBID, #PB_ScrollArea_Y, Val(Trim(GetXMLAttribute(oGadget, "sc_y"))))
      Case #PB_GadgetType_Spin
        SetGadgetAttribute(PBID, #PB_Spin_Minimum, Val(Trim(GetXMLAttribute(oGadget, "sp_minimum"))))
        SetGadgetAttribute(PBID, #PB_Spin_Maximum, Val(Trim(GetXMLAttribute(oGadget, "sp_maximum"))))
      Case #PB_GadgetType_Splitter
        SetGadgetAttribute(PBID, #PB_Splitter_FirstMinimumSize, Val(Trim(GetXMLAttribute(oGadget, "firstminimumsize"))))
        SetGadgetAttribute(PBID, #PB_Splitter_SecondMinimumSize, Val(Trim(GetXMLAttribute(oGadget, "secondminimumsize"))))
        SetGadgetAttribute(PBID, #PB_Splitter_FirstGadget, Val(Trim(GetXMLAttribute(oGadget, "firstgadget"))))
        SetGadgetAttribute(PBID, #PB_Splitter_SecondGadget, Val(Trim(GetXMLAttribute(oGadget, "secondgadget"))))
      Case #PB_GadgetType_TrackBar
        SetGadgetAttribute(PBID, #PB_TrackBar_Minimum, Val(Trim(GetXMLAttribute(oGadget, "tb_minimum"))))
        SetGadgetAttribute(PBID, #PB_TrackBar_Maximum, Val(Trim(GetXMLAttribute(oGadget, "tb_maximum"))))
    EndSelect
  EndIf
  If flags & #Serializer_Color
    Select GadgetType(PBID)
      Case #PB_GadgetType_Calendar, #PB_GadgetType_Date
        SetGadgetColor(PBID, #PB_Gadget_FrontColor, Val(Trim(GetXMLAttribute(oGadget, "frontcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_BackColor, Val(Trim(GetXMLAttribute(oGadget, "backcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_TitleBackColor, Val(Trim(GetXMLAttribute(oGadget, "titlebackcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_TitleFrontColor, Val(Trim(GetXMLAttribute(oGadget, "titlefrontcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_GrayTextColor, Val(Trim(GetXMLAttribute(oGadget, "graytextcolor"))))
      Case #PB_GadgetType_Container
        SetGadgetColor(PBID, #PB_Gadget_BackColor, Val(Trim(GetXMLAttribute(oGadget, "backcolor"))))
      Case #PB_GadgetType_Editor, #PB_GadgetType_ListView, #PB_GadgetType_ProgressBar, #PB_GadgetType_Spin, #PB_GadgetType_String, #PB_GadgetType_Text
        SetGadgetColor(PBID, #PB_Gadget_FrontColor, Val(Trim(GetXMLAttribute(oGadget, "frontcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_BackColor, Val(Trim(GetXMLAttribute(oGadget, "backcolor"))))
      Case #PB_GadgetType_ExplorerList, #PB_GadgetType_ExplorerTree, #PB_GadgetType_ListIcon
        SetGadgetColor(PBID, #PB_Gadget_FrontColor, Val(Trim(GetXMLAttribute(oGadget, "frontcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_BackColor, Val(Trim(GetXMLAttribute(oGadget, "backcolor"))))
        SetGadgetColor(PBID, #PB_Gadget_LineColor, Val(Trim(GetXMLAttribute(oGadget, "linecolor"))))
      Case #PB_GadgetType_HyperLink
        SetGadgetColor(PBID, #PB_Gadget_FrontColor, Val(Trim(GetXMLAttribute(oGadget, "frontcolor"))))
    EndSelect
  EndIf
  If flags & #Serializer_Data
    SetGadgetData(PBID, Val(Trim(GetXMLAttribute(oGadget, "data"))))
  EndIf
  If flags & #Serializer_State
    SetGadgetState(PBID, Val(Trim(GetXMLAttribute(oGadget, "state"))))
  EndIf
  If flags & #Serializer_Text
    oNode = XMLNodeFromPath(oGadget, "text/")
    If oNode
      oNode = ChildXMLNode(oNode) ; Das CData stellt ein Child unter der Ebene Text dar
      If oNode
        SetGadgetText(PBID, Trim(GetXMLNodeText(oNode)))
      EndIf
    EndIf
  EndIf

EndProcedure

Procedure DeSerialize_StandardItems(PBID.l, oGadget.l, flags.l)

  Protected oItem.l, oNode.l, NodeListCounter.l

  ClearGadgetItemList(PBID)

  Repeat

    NodeListCounter + 1

    oItem = XMLNodeFromPath(oGadget, "items/item[" + Str(NodeListCounter) + "]")

    If oItem = 0 : Break : EndIf

    ; Der Text muss zuerst eingetragen werden, damit die ItemColor, ItemData und ItemState gesetzt werden können
    If flags & #Serializer_ItemText

      oNode = XMLNodeFromPath(oItem, "text/")
      If oNode
        oNode = ChildXMLNode(oNode) ; Das CData stellt ein Child unter der Ebene Text dar
        If oNode
          If GadgetType(PBID) = #PB_GadgetType_Tree
            AddGadgetItem(PBID, NodeListCounter - 1, Trim(GetXMLNodeText(oNode)), 0, Val(Trim(GetXMLAttribute(oItem, "item_sublevel"))))
          Else
            AddGadgetItem(PBID, NodeListCounter - 1, Trim(GetXMLNodeText(oNode)))
          EndIf
        EndIf
      EndIf

    EndIf
    If flags & #Serializer_ItemColor
      If GadgetType(PBID) = #PB_GadgetType_ListIcon Or GadgetType(PBID) = #PB_GadgetType_Tree
        SetGadgetItemColor(PBID, NodeListCounter - 1, #PB_Gadget_FrontColor, Val(Trim(GetXMLAttribute(oItem, "item_frontcolor"))))
        SetGadgetItemColor(PBID, NodeListCounter - 1, #PB_Gadget_BackColor,  Val(Trim(GetXMLAttribute(oItem, "item_backcolor"))))
      EndIf
    EndIf
    If flags & #Serializer_ItemData
      SetGadgetItemData(PBID, NodeListCounter - 1, Val(Trim(GetXMLAttribute(oItem, "data"))))
    EndIf
    If flags & #Serializer_ItemState
      Select GadgetType(PBID)
        Case #PB_GadgetType_Calendar, #PB_GadgetType_ListView, #PB_GadgetType_ListIcon, #PB_GadgetType_Tree
          SetGadgetItemState(PBID, NodeListCounter - 1, Val(Trim(GetXMLAttribute(oItem, "state"))))
      EndSelect
    EndIf

  ForEver

EndProcedure

Procedure DeSerialize(Gadgets.Serializer_Struc(), FileName.s, flags.l = #Serializer_Defaults)

  Protected oXML.l, oRoot.l, oGadget.l, XML.s, NodeListCounter.l

  If FileSize(FileName) < 0
    Debug "File not found"
    ProcedureReturn #False
  EndIf

  oXML = LoadXML(#PB_Any, FileName)

  If Not oXML
    Debug "oXML is not initialized"
    ProcedureReturn #False
  EndIf

  If XMLStatus(oXML) <> #PB_XML_Success
    Debug "Error:    " + XMLError(oXML)
    Debug "Line:     " + Str(XMLErrorLine(oXML))
    Debug "Position: " + Str(XMLErrorPosition(oXML))
    ProcedureReturn #False
  EndIf

  FormatXML(oXML, #PB_XML_CutNewline | #PB_XML_ReIndent, 0)

  oRoot = RootXMLNode(oXML)

  ForEach Gadgets()

    NodeListCounter = 1

    Repeat

      oGadget = XMLNodeFromPath(oRoot, "gadgets/gadget[" + Str(NodeListCounter) + "]")
      If oGadget = 0 : Break : EndIf

      NodeListCounter + 1

      If oGadget
        If GetXMLAttribute(oGadget, "Ident") = Gadgets()\Ident

          If IsGadget(Gadgets()\PBID)
            DeSerialize_Standard(Gadgets()\PBID, oGadget, flags)

            Select GadgetType(Gadgets()\PBID)
              Case #PB_GadgetType_ComboBox      ; ComboBoxGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_Editor        ; EditorGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_ExplorerCombo ; ExplorerComboGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_ExplorerList  ; ExplorerListGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_ExplorerTree  ; ExplorerTreeGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_ListIcon      ; ListIconGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_ListView      ; ListViewGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_Panel         ; PanelGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
              Case #PB_GadgetType_Tree          ; TreeGadget()
                DeSerialize_StandardItems(Gadgets()\PBID, oGadget, flags)
            EndSelect
          EndIf
        EndIf
      EndIf
    ForEver

  Next

  ProcedureReturn #True

EndProcedure

Procedure Serialize(Gadgets.Serializer_Struc(), FileName.s, flags.l = #Serializer_Defaults)

  Protected oXML.l, oRoot.l, oGadgets.l, oGadget.l, XML.s

  oXML = CreateXML(#PB_Any)
  oRoot = RootXMLNode(oXML)
  oGadgets = CreateXMLNode(oRoot)
  SetXMLNodeName(oGadgets, "gadgets")

  ForEach Gadgets()

    oGadget = CreateXMLNode(oGadgets)
    If oGadget
      SetXMLNodeName(oGadget, "gadget")
      SetXMLAttribute(oGadget, "Ident", Gadgets()\Ident)

      Serialize_Standard(Gadgets()\PBID, oGadget, flags)

      Select GadgetType(Gadgets()\PBID)
        Case #PB_GadgetType_ComboBox      ; ComboBoxGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_Editor        ; EditorGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_ExplorerCombo ; ExplorerComboGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_ExplorerList  ; ExplorerListGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_ExplorerTree  ; ExplorerTreeGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_ListIcon      ; ListIconGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_ListView      ; ListViewGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_Panel         ; PanelGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
        Case #PB_GadgetType_Tree          ; TreeGadget()
          Serialize_StandardItems(Gadgets()\PBID, oGadget, flags)
      EndSelect
    EndIf

  Next

  FormatXML(oXML, #PB_XML_ReFormat)
  If FileName = ""
    XML = Space(ExportXMLSize(oXML))
    ExportXML(oXML, @XML, Len(XML))
    MessageRequester("", XML)
  Else
    SaveXML(oXML, FileName)
  EndIf
EndProcedure
Serialize(Gadgets.Serializer_Struc(), FileName.s, flags.l)
This save your settings
First parameter is a linklist with Serializer_Struc()
Second parameter is the filename to save
The last parameter is a combination of constants from the Enumeration ;Serializerflags

DeSerialize(Gadgets.Serializer_Struc(), FileName.s, flags.l)
the same to restore settings.

Images in the moment not supported!

For more info's see the examples in the next thread
Last edited by ts-soft on Fri Jun 08, 2007 10:11 pm, edited 4 times in total.
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Post by ts-soft »

Example 1:

Code: Select all

XIncludeFile "Serializer_Include.pbi"

#FileName = "pbserializer.xml"

Global NewList Serializer_Gadget.Serializer_Struc()

Procedure Serializer_Add(PBID.l, Ident.s)

  AddElement(Serializer_Gadget())
  Serializer_Gadget()\PBID  = PBID
  Serializer_Gadget()\Ident = Ident

EndProcedure

Enumeration ; Windows
  #frmMain
EndEnumeration
Enumeration ; Gadgets
  #frmMain_ListView
  #frmMain_StringGadget1
  #frmMain_StringGadget2
  #frmMain_ShowSerializedXml
EndEnumeration

Procedure.l Open_frmMain()

  Protected WindowFlags.l

  WindowFlags = #PB_Window_ScreenCentered
  WindowFlags | #PB_Window_SystemMenu

  If OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 300, 194, "PBSerializer-Demo", WindowFlags)

    If CreateGadgetList(WindowID(#frmMain))

      ListViewGadget(#frmMain_ListView, 5, 5, 290, 85)
      StringGadget(#frmMain_StringGadget1, 5, 100, 290, 20, "")
      StringGadget(#frmMain_StringGadget2, 5, 125, 290, 20, "")

      ButtonGadget(#frmMain_ShowSerializedXml, 195, 160, 100, 25, "Serialize")

      ProcedureReturn #True

    EndIf

  EndIf

EndProcedure
Procedure Main()

  If Not Open_frmMain() : End : EndIf

  Serializer_Add(#frmMain_ListView,        "myListView")
  Serializer_Add(#frmMain_StringGadget1,   "myStringGadget1")
  Serializer_Add(#frmMain_StringGadget2,   "myStringGadget2")

  If Not DeSerialize(Serializer_Gadget(), #FileName)

    ; Add some sample-data

    Protected LineCounter.l

    For LineCounter = 1 To 5
      AddGadgetItem(#frmMain_ListView, -1, "Line " + Str(LineCounter) + " of ListViewGadget")
    Next

    SetGadgetText(#frmMain_StringGadget1, "Content of StringGadget1")
    SetGadgetText(#frmMain_StringGadget2, "Content of StringGadget2")

  EndIf

  Protected WWE.l
  Protected Quit.l

  SetActiveGadget(#frmMain_ListView)

  Repeat

    WWE = WaitWindowEvent()

    Select WWE

      Case #PB_Event_Gadget

        If EventGadget()=#frmMain_ShowSerializedXml
          Serialize(Serializer_Gadget(), "", #Serializer_Color|#Serializer_ItemColor|#Serializer_Defaults|#Serializer_ItemState)
        EndIf

      Case #PB_Event_CloseWindow
        Quit = #True

    EndSelect

  Until Quit = #True

  Serialize(Serializer_Gadget(), #FileName, #Serializer_Color|#Serializer_ItemColor|#Serializer_Defaults|#Serializer_ItemState)

EndProcedure

Main()
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Post by ts-soft »

Example 2:

Code: Select all

XIncludeFile "Serializer_Include.pbi"

NewList myGadgets.Serializer_Struc()

AddElement(myGadgets())
myGadgets()\PBID = 0
myGadgets()\Ident = "Editor"


If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))

  EditorGadget(0, 8, 8, 306, 133)
  If Not DeSerialize(myGadgets(), "editor.xml")
    For a = 0 To 5
      AddGadgetItem(0, a, "Line "+Str(a))
    Next
  EndIf
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  
  Serialize(myGadgets(), "editor.xml")
EndIf

PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Post by ts-soft »

Example 3

Code: Select all

XIncludeFile "Serializer_Include.pbi"

NewList myGadgets.Serializer_Struc()

AddElement(myGadgets())
myGadgets()\PBID = 0
myGadgets()\Ident = "Tree0"

AddElement(myGadgets())
myGadgets()\PBID = 1
myGadgets()\Ident = "Tree1"

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget Standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines)  ; TreeGadget mit Checkboxen + ohne Linien
  If Not DeSerialize(myGadgets(), "tree.xml")
    For ID = 0 To 1
      For a = 0 To 10
        AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; wenn Sie ein Bild hinzufügen möchten, dann
        AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; benutzen Sie ImageID(x) als 4. Parameter
        AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1)     ; diese sind auf dem ersten Sublevel
        AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
        AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
        AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
        AddGadgetItem (ID, -1, "File "+Str(a), 0, 0)  ; hier wieder Sublevel 0
      Next
    Next
  EndIf
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

  Serialize(myGadgets(), "tree.xml")
EndIf

PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
milan1612
Addict
Addict
Posts: 894
Joined: Thu Apr 05, 2007 12:15 am
Location: Nuremberg, Germany
Contact:

Post by milan1612 »

Cool thanks, I tried that in VB.NET and failed after trying everything you can imagine :oops:
Windows 7 & PureBasic 4.4
JCV
Enthusiast
Enthusiast
Posts: 579
Joined: Fri Jun 30, 2006 4:30 pm
Location: Middle East

Post by JCV »

cool 8)

[Registered PB User since 2006]
[PureBasic 5.7][SpiderBasic 2.2] [Win 10 64bit]
[Intel i7 990x 4.20 Ghz] [18GB DDR3]
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Post by ts-soft »

has saved the text from editor twice, fixed
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
Fred
Administrator
Administrator
Posts: 16686
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

Interesting way for gadget persistency
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Post by ts-soft »

Fred wrote:Interesting way for gadget persistency
i think this is in some situations faster to implement than preferences :wink:
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Post by ts-soft »

fixed a small bug in Serialize_StandardItems Procedure
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
Post Reply