' Gambas class file

Public aElements As String[]
Public aStructure As String[][]
Public picRoot As Picture = Picture["icon:/22/record"]
Public picClient As Picture = Picture["icon:/22/linux"]
Public sDataPath As String = Application.Path &/ "export.dat"
Public mnuMenu As Menu

Public Sub Form_Open()
  
  FMain.Center()
  FMain.Resizable = False

' Wenn *keine* Daten-Datei (Daten-Export) existiert, dann wird die ListView mit Muster-Daten gefüllt
  If Not Exist(sDataPath) Then
     ListView1.Add("KX1", "X1-Element", picRoot, Null)
     ListView1.Add("KZ2", "Z2-Element", picClient, Null)
     ListView1.Add("KZ3", "Z3-Element", picClient, Null)
     ListView1.Add("KY2", "Y2-Element", picClient, Null)
     ListView1.Add("KZ1", "Z1-Element", picRoot, Null)
     ListView1.Add("KY3", "Y3-Element", picClient, Null)
     ListView1.Add("KY31", "Y31-Element", picClient, Null)
     ListView1.Add("KY1", "Y1-Element", picRoot, Null)
     ListView1.Add("KY32", "Y32-Element", picClient, Null)
     ListView1.Add("KZ4", "Z4-Element", picClient, Null)
     ListView1.Add("KZ5", "Z5-Element", picClient, Null)
     ListView1["KY31"].Selected = True ' Markierung Y31
  Else
     ListViewImport(sDataPath, ListView1) ' ListView mit den importierten Daten füllen
   ' Markierung des ersten Elementes - wenn mindestens 1 existiert
     If Not ListView1.MoveFirst() Then ListView1.Key = ListView1.Item.Key
  Endif
  
  ListView1.Sorted = False
  ListView1.Mode = Select.Single

End ' Form_Open()

Public Sub btnInsertElement_Click()
  
  If txbElementName.Text <> Null Then
     If Not ListView1.Exist("K" & txbElementName.Text) Then
        ListView1.MoveCurrent()
        ListView1.Add("K" & txbElementName.Text, txbElementName.Text, Picture["icon:/22/linux"], ListView1.Key)
     Else
        Message.Warning("Das Element '" & txbElementName.Text & "' existiert bereits!")
        txbElementName.Clear() 
        Return
     Endif 
     txbElementName.Clear() 
   ' Das neue Element wird markiert
     ListView1.Key = ListView1.Item.Key
  Endif
  
End ' btnInsertElement_Click()

Public Sub txbElementName_Activate()
  btnInsertElement_Click()
End ' txbElementName_Activate()

Public Sub btnRenameElement_Click()

  If Not ListView1.Key Then Return ' Gibt es kein markiertes Element, dann Abbruch ...   
  ListView1.MoveCurrent()
  ListView1.Current.Editable = True
  ListView1.Current.Rename() ' Markiertes Element interaktiv umbenennen

End ' btnRenameElement_Click()

Public Sub btnDeleteElement_Click()

  ' Nur ein markiertes Element darf gelöscht werden 
    If Not ListView1.Key Then Return
  ' Internen Cursor auf das markierte Element setzen (Start-Position)
    ListView1.MoveCurrent() 
  ' Internen Cursor auf den nächsten *sichtbaren* - oberhalb liegenden - Eintrag setzen
    ListView1.MoveAbove() ' ***
  ' Das markierte Element wird gelöscht
    ListView1.Remove(ListView1.Key)
  ' Der interne Cursor zeigt nach (***) auf das nach dem Löschen auszuwählende Element.
  ' Gibt es nach dem Löschen noch ein oberes Element, dann wird der externe Cursor darauf 
  ' gesetzt - es wird markiert.
    If ListView1.Item Then 
       ListView1.Key = ListView1.Item.Key
  ' Sonst wird der interne Cursor auf den ersten Eintrag gesetzt, 
  ' wenn der existiert und dann das oberste Element markiert.
    Else
       If Not ListView1.MoveFirst() Then ListView1.Key = ListView1.Item.Key
    Endif
    
End ' btnDeleteElement_Click()

Public Sub btnWalkList_Click()
  WalkList(ListView1)
End ' btnWalkList_Click()

 Private Sub WalkList(hListView As ListView)
   Dim sText As String

    If Not hListView.MoveFirst() Then ' Gibt es mindestens ein Element ...
      Repeat
         sText &= hListView.Item.Key & " | " & "'" & hListView.Item.Text & "'" & "\n"
      Until hListView.MoveBelow() ' ... bis das letzte Element erreicht ist      
      Print sText ' Key und Text aller Elemente formatiert ausgeben      
   Endif

 End ' WalkList(...)

Private Sub ListViewImport(Path As String, hListView As ListView)
  
  Dim cJSONCollection As JSONCollection
  Dim cCollection As JSONCollection
  Dim sKey, sText As String
  Dim picPicture As Picture

  hListView.Clear  
  cJSONCollection = JSON.Decode(File.Load(Path), True)
  
  For Each cCollection In cJSONCollection
    sKey = cCollection["KEY"]
    sText = cCollection["TEXT"]
    picPicture = Picture[cCollection["PICTURE"]]
    hListView.Add(sKey, sText, picPicture, Null)
  Next  
  
End ' ListViewDataExport(...)
 
Public Sub btnListViewDataImport_Click()

 ListViewImport(sDataPath, ListView1)
 If Not ListView1.MoveFirst() Then ListView1.Key = ListView1.Item.Key
  
End ' btnListViewImport_Click()

Private Sub ListViewExport(Path As String, hListView As ListView)
   
  Dim i As Integer
  Dim sPicture As String
  Dim picPicture As Picture
  Dim cJSONCollection As JSONCollection
  Dim cJSON As JSONCollection

  cJSON = New JSONCollection ' Eine neue JSONCollection anlegen 

  If Not hListView.MoveFirst() Then ' Existiert mindestens ein Element ...
     Repeat
       cJSONCollection = New JSONCollection ' Eine neue JSONCollection anlegen 
       cJSONCollection["KEY"] = hListView.Item.Key ' Key erfassen
       cJSONCollection["TEXT"] = hListView.Item.Text ' Text erfassen
       picPicture = hListView.Item.Picture
       If picPicture = picRoot Then sPicture = "icon:/22/record"
       If picPicture = picClient Then sPicture = "icon:/22/linux"
       cJSONCollection["PICTURE"] = sPicture ' Bild-Text erfassen
       Inc i
       cJSON["RECORD_" & Str(i)] = cJSONCollection ' In die JSONCollection cJSON eine JSONCollection als Element einfügen
    Until hListView.MoveBelow() ' ... das letzte Element in der ListView erreicht ist
       Print JSON.Encode(cJSON)
       File.Save(Path, JSON.Encode(cJSON)) ' Den JSONText in einer Datei speichern
  Endif

End ' ListViewDataExport(...)
 
Public Sub btnListViewDataExport_Click()
   ListViewExport(sDataPath, ListView1)   
End ' btnListViewExport_Click()

Public Sub btnUnSelect_Click()
    ListView1.UnselectAll()
End ' btnUnSelect_Click()

Public Sub btnDeleteAllElements_Click()

  ListView1.MoveTo(ListView1.Key)
  ListView1[ListView1.Key].Clear() ' Fehler bis Gambas 3.8.4 in der Klasse _TreeView_Item
  
' Alternativer Quelltext zu den o.a. zwei Zeilen: ' Fehler bis Gambas 3.8.4 in der Klasse _TreeView_Item
' ListView1.MoveCurrent()
' ListView1.Current.Clear() 

End ' btnDeleteAllChildren_Click()

Public Sub ckboxModus_Click()

 Select ckboxModus.Value
    Case ckboxModus.True
      ListView1.Mode = Select.Single
    Case ckboxModus.False
      ListView1.Mode = Select.Multiple
  End Select

End ' ckboxModus_Click()

Public Sub ckBoxSorted_Click()

  Select ckboxSorted.Value
    Case ckboxSorted.True
      ListView1.Sorted = True
    Case ckboxSorted.False
      ListView1.Sorted = False
  End Select

End ' ckBoxSorted_Click()


Public Sub ListView1_Select()

  Dim sInformation, sPicture As String
  Dim picPicture As Picture
  
  picPicture = ListView1.Current.Picture
  If picPicture = picRoot Then sPicture = "icon:/22/record"
  If picPicture = picClient Then sPicture = "icon:/22/linux"  
  sInformation = "Key = " & ListView1.Current.Key
  sInformation &= " | Text = " & ListView1.Current.Text
  sInformation &= " | Bild-Pfad = " & sPicture
  Print sInformation
  
  ListView1.MoveCurrent()

End ' ListView1_Select()

Public Sub btnSearchText_Click()

  If ListView1.MoveFirst() Then Return ' Existiert kein Element, dann Return
  If Not ListView1.MoveFirst() Then ListView1.Key = ListView1.Item.Key
  
  Repeat 
    If ListView1.Item.Text = txbSearchText.Text Then
       ListView1[ListView1.Item.Key].Selected = True
       Break ' Abbruch, wenn das Element gefunden wurde
    Endif
  Until ListView1.MoveNext()

End ' btnSearchText_Click()

Public Sub btnClose_Click()
  FMain.Close()
End ' btnClose_Click()

