' Gambas class file

Private $hTmp As Watch
Private $aSubdirs As New Watch[]
Private $hScript As ExternalScript

Public Sub Form_Open()

  Dim sFile As String = Temp$()
  Dim sDir As String = Temp$()

  FMain.Resizable = False
  TextArea1.ReadOnly = True

  $hTmp = New Watch(File.Dir(sFile)) As "Tmp"
' Das Skript muss ein Task sein, weil die Events so nah wie möglich
' zu der Zeit empfangen wollen, zu der sie ausgelöst werden. Wenn das
' Skript in diesem Prozess ausgeführt würde, erhielten Sie die Events
' gesammelt, nachdem das komplette Skript durchgelaufen ist. So könnten
' Sie z.B. keine Ereignisse in den zur Laufzeit erstellten Unterverzeichnissen abfangen.
  $hScript = New ExternalScript(sFile, sDir) As "ExternalScript"
  Spinner1.Start()
End ' Form_Open()

Public Sub ExternalScript_Read(Data As String)
  If Trim$(Data) <> "Fertig" Then Return
  $hScript.Stop() ' Stopt den Task als Hintergrund-Prozess
  TextArea1.Insert(gb.NewLine & "*** Externes Skript beendet. ***")
End ' ExternalScript_Done()

Public Sub Tmp_Read()
  Note("Lesen")
End ' Tmp_Read()

Public Sub Tmp_Create()

  Dim hSubdir As Watch

' Füge rekursiv neue Verzeichnisse hinzu, wenn sie erstellt werden ~~~~~~~~~~~~~~~~~~~~~~~ >> stimmt das so?
  If Watch.IsDir Then
' Das Try ist hier, um eine 'race condition' abzufangen: Das Unterverzeichnis
' könnte erstellt und schon wieder gelöscht worden sein, bevor dieser
' Event-Handler aufgerufen wurde. Das New Watch(..) könnte fehlschlagen, weil
' Sie ein Create-Event bearbeiten, dessen Subjekt schon wieder gelöscht wurde.
  Try hSubdir = New Watch(Last.Path &/ Watch.Name) As "Subdir"
  If Not Error Then
     Note("Neues Unterverzeichnis")
     $aSubdirs.Add(hSubdir)
  Endif
  Else
    Note("Erstellen", "initialer Modus " & Stat(Last.Path &/ Watch.Name).Auth)
  Endif
End ' Tmp_Create()

Public Sub Tmp_Open()
  Note("Öffnen")
End ' Tmp_Open()

Public Sub Tmp_Close()
  Note("Schließen")
End ' Tmp_Close()

Public Sub Tmp_Write()
  Note("Schreiben")
End ' Tmp_Write()

Public Sub Tmp_Move()
  Note("Umbenennen")
End ' Tmp_Move()

Public Sub Tmp_MoveFrom()
  'Note(Subst$("Umbenennen [ Quelle ] (Cookie &1)", Watch.Cookie))
  Note("Umbenennen", "[Quelle]", Subst$(" (Cookie &1)", Watch.Cookie))
End ' Tmp_MoveFrom()

Public Sub Subdir_MoveTo()
  'Note(Subst$("Umbenennen [ Ziel ] (Cookie &1)", Watch.Cookie))
  Note("Umbenennen", "[Ziel]", Subst$(" (Cookie &1)", Watch.Cookie))
End ' Subdir_MoveTo()

Public Sub Tmp_Delete()
  Note("Löschen")
End ' Tmp_Delete()

Public Sub Subdir_Delete()
  Note(Subst$("Löschen &1Unterverzeichnis", IIf(Watch.Name, "in ", "")))
  If Not Watch.Name Then $aSubdirs.Remove($aSubdirs.Find(Last))
End ' Subdir_Delete()

Public Sub Tmp_Stat()
  With Stat(Last.Path &/ Watch.Name)
    Note("Datenabfrage", Subst$("Modus &1, letzter Zugriff &2", .Auth, .LastAccess))
  End With

  Catch
    ' Last.Path &/ Watch.Name könnte nicht mehr existieren und Stat könnte deshalb fehlschlagen.
End ' Tmp_Stat()

Private Sub Note(sWhat As String, ...)
  
  Dim sArg As String

  TextArea1.Insert(sWhat & "       " & Last.Path &/ Watch.Name)
  For Each sArg In Param
    TextArea1.Insert(" " & sArg)
  Next
  TextArea1.Insert(gb.NewLine)
  TextArea1.Pos = Len(TextArea1.Text)
  Print Param.Count
  
End ' Note(sWhat As String, ...)

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

Public Sub Form_Close()
  If $hScript.Running Then $hScript.Stop
  $hTmp = Null
  $aSubdirs.Clear()
  Spinner1.Stop
  Wait 1
End ' Form_Close()

