RecentFiles - Module

Share your advanced PureBasic knowledge/code with the community.
User avatar
StarBootics
Addict
Addict
Posts: 984
Joined: Sun Jul 07, 2013 11:35 am
Location: Canada

RecentFiles - Module

Post by StarBootics »

Hello everyone,

This is something I made for one of my project and I'm releasing here in hope it will be useful to someone else.

Best regards
StarBootics

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Module - V1.0.0 Beta
; Project name : RecentFiles - Module
; File name : RecentFiles - Module.pb
; File Version : 1.0.0
; Programmation : OK
; Programmed by : StarBootics
; Creation Date : 23-03-2019
; Last update : 23-03-2019
; Coded for PureBasic : V5.70 LTS
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

DeclareModule RecentFiles

  Declare.a GetHistoricSize()
  Declare.s GetFileNames()
  Declare SetHistoricSize(P_HistoricSize.a)
  Declare Initialize(P_HistoricSize.a)
  Declare Reset()
  Declare.l LinearSearchFileNames(P_FileNames.s, P_CaseSensitive.b = #True)
  Declare SelectFileNames(P_Index.l)
  Declare FirstFileNames()
  Declare LastFileNames()
  Declare PreviousFileNames()
  Declare NextFileNames()
  Declare ResetFileNames()
  Declare ClearFileNames()
  Declare FileNamesIndex()
  Declare FileNamesSize()
  Declare ReadPrefs(P_GroupName.s)
  Declare WritePrefs(P_GroupName.s)
  
  Declare InsertNewFile(P_NewFileName.s)
  
EndDeclareModule

Module RecentFiles

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Structure declaration <<<<<

  Structure Instance

    HistoricSize.a
    List FileNames.s()

  EndStructure

  Global Instance.Instance

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The observators <<<<<

  Procedure.a GetHistoricSize()

    ProcedureReturn Instance\HistoricSize
  EndProcedure

  Procedure.s GetFileNames()

    ProcedureReturn Instance\FileNames()
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The mutators <<<<<
  
  Procedure SetHistoricSize(P_HistoricSize.a)

    Instance\HistoricSize = P_HistoricSize
    
    While ListSize(Instance\FileNames()) > Instance\HistoricSize
      LastElement(Instance\FileNames())
      DeleteElement(Instance\FileNames())
    Wend
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Initialize operator <<<<<

  Procedure Initialize(P_HistoricSize.a)
    
    ; ClearStructure(Instance, Instance)
    ; InitializeStructure(Instance, Instance)
    
    Instance\HistoricSize = P_HistoricSize
    ClearList(Instance\FileNames())
    
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Reset operator <<<<<

  Procedure Reset()
    
    ; ResetStructure(Instance, Instance)
    
    Instance\HistoricSize = 0
    FreeList(Instance\FileNames())
    
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The linear search linked list operator(s) <<<<<

  Procedure.l LinearSearchFileNames(P_FileNames.s, P_CaseSensitive.b = #True)

    Protected IsFoundAtIndex.l = -1

    If P_CaseSensitive = #True

      ForEach Instance\FileNames()

        If UCase(Instance\FileNames()) = UCase(P_FileNames)
          IsFoundAtIndex = ListIndex(Instance\FileNames())
          Break
        EndIf

      Next

    Else

      ForEach Instance\FileNames()

        If Instance\FileNames() = P_FileNames
          IsFoundAtIndex = ListIndex(Instance\FileNames())
          Break
        EndIf

      Next

    EndIf

    ProcedureReturn IsFoundAtIndex
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Select in linked list operator(s) <<<<<

  Procedure SelectFileNames(P_Index.l)

    ProcedureReturn SelectElement(Instance\FileNames(), P_Index)
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The First element in linked list operator(s) <<<<<

  Procedure FirstFileNames()

    ProcedureReturn FirstElement(Instance\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Last element in linked list operator(s) <<<<<

  Procedure LastFileNames()

    ProcedureReturn LastElement(Instance\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Previous element in linked list operator(s) <<<<<

  Procedure PreviousFileNames()

    ProcedureReturn PreviousElement(Instance\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Next element in linked list operator(s) <<<<<

  Procedure NextFileNames()

    ProcedureReturn NextElement(Instance\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Reset linked list operator(s) <<<<<

  Procedure ResetFileNames()

    ResetList(Instance\FileNames())

  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Clear linked list operator(s) <<<<<

  Procedure ClearFileNames()

    ClearList(Instance\FileNames())

  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Index in the linked list operator(s) <<<<<

  Procedure FileNamesIndex()

    ProcedureReturn ListIndex(Instance\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Size of the linked list operator(s) <<<<<

  Procedure FileNamesSize()

    ProcedureReturn ListSize(Instance\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Read preferences group <<<<<

  Procedure ReadPrefs(P_GroupName.s)

    PreferenceGroup(P_GroupName)
    
    Instance\HistoricSize = ReadPreferenceLong("HistoricSize", Instance\HistoricSize)
   
    For FileNamesID = 0 To Instance\HistoricSize - 1
      AddElement(Instance\FileNames())
      Instance\FileNames() = ReadPreferenceString("FileNames_" + Str(FileNamesID), Instance\FileNames())
    Next
    
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Write preferences group <<<<<

  Procedure WritePrefs(P_GroupName.s)

    PreferenceGroup(P_GroupName)
    
    WritePreferenceLong("HistoricSize", Instance\HistoricSize)
    
    ForEach Instance\FileNames()
      WritePreferenceString("FileNames_" + Str(ListIndex(Instance\FileNames())), Instance\FileNames())
    Next
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The InsertNewFile operator <<<<<
  
  Procedure InsertNewFile(P_NewFileName.s)
   
    If LinearSearchFileNames(P_NewFileName) = -1
      
      ResetList(Instance\FileNames())
      AddElement(Instance\FileNames())
      Instance\FileNames() = P_NewFileName
      
    Else
      
      DeleteElement(Instance\FileNames())
      ResetList(Instance\FileNames())
      AddElement(Instance\FileNames())
      Instance\FileNames() = P_NewFileName
      
    EndIf
    
    If ListSize(Instance\FileNames()) > Instance\HistoricSize
      LastElement(Instance\FileNames())
      DeleteElement(Instance\FileNames())
    EndIf
    
  EndProcedure
  
EndModule

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.001 seconds (263000.00 lines/second) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

CompilerIf #PB_Compiler_IsMainFile
  
  RecentFiles::SetHistoricSize(5)
  
  For Index = 0 To 5
    RecentFiles::InsertNewFile("File " + Str(Index) + ".txt")
  Next
  
  RecentFiles::ResetFileNames()
  
  While RecentFiles::NextFileNames()
    Debug RecentFiles::GetFileNames()
  Wend
  
  RecentFiles::InsertNewFile("File " + Str(3) + ".txt")
  Debug ""
  RecentFiles::ResetFileNames()
  
  While RecentFiles::NextFileNames()
    Debug RecentFiles::GetFileNames()
  Wend
  
  RecentFiles::InsertNewFile("File " + Str(6) + ".txt")
  Debug ""
  
  If RecentFiles::FirstFileNames()
    
    Repeat 
      Debug RecentFiles::GetFileNames()
    Until RecentFiles::NextFileNames() = #Null
    
  EndIf
  
  RecentFiles::SetHistoricSize(3)
  
  Debug ""
  RecentFiles::ResetFileNames()
  
  While RecentFiles::NextFileNames()
    Debug RecentFiles::GetFileNames()
  Wend
  
CompilerEndIf

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
The Stone Age did not end due to a shortage of stones !
User avatar
StarBootics
Addict
Addict
Posts: 984
Joined: Sun Jul 07, 2013 11:35 am
Location: Canada

Re: RecentFiles - Module

Post by StarBootics »

Hello everyone,

Sorry to re-open an old thread. This is the OOP style of the original RecentFiles system.

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Object - V1.0.0 Beta
; Project name : RecentFiles Object
; File name : RecentFiles - OOP.pb
; File Version : 1.0.1
; Programmation : OK
; Programmed by : StarBootics
; Creation Date : 16-03-2020
; Last update : 29-10-2020
; Coded for PureBasic : V5.72 LTS Beta 2
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

DeclareModule RecentFiles
  
  Interface RecentFiles
    
    GetHistoricSize.a()
    GetFileNames.s()
    SetHistoricSize(P_HistoricSize.a)
    SetFileNames(P_FileNames.s)
    LinearSearchFileNames.l(P_FileNames.s)
    AddFileNames()
    SelectFileNames.i(P_Index.l)
    FirstFileNames.i()
    LastFileNames.i()
    PreviousFileNames.i()
    NextFileNames.i()
    DeleteFileNames()
    ResetFileNames()
    ClearFileNames()
    FileNamesIndex.l()
    FileNamesSize.l()
    ReadPrefs(P_GroupName.s)
    WritePrefs(P_GroupName.s)
    InsertNewFile(P_NewFileName.s)
    SanityCheck()
    Free()
    
  EndInterface
  
  Declare.i New(P_HistoricSize.a = 20)
  
EndDeclareModule

Module RecentFiles
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Structure declaration <<<<<

  Structure Private_Members
    
    VirtualTable.i
    HistoricSize.a
    List FileNames.s()
    
  EndStructure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The observators <<<<<

  Procedure.a GetHistoricSize(*This.Private_Members)
    
    ProcedureReturn *This\HistoricSize
  EndProcedure
  
  Procedure.s GetFileNames(*This.Private_Members)
    
    ProcedureReturn *This\FileNames()
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The mutators <<<<<

  Procedure SetHistoricSize(*This.Private_Members, P_HistoricSize.a)
    
    *This\HistoricSize = P_HistoricSize
    
    While ListSize(*This\FileNames()) > *This\HistoricSize
      LastElement(*This\FileNames())
      DeleteElement(*This\FileNames())
    Wend
    
  EndProcedure
  
  Procedure SetFileNames(*This.Private_Members, P_FileNames.s)
    
    *This\FileNames() = P_FileNames
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The linear search linked list operator(s) <<<<<

  Procedure.l LinearSearchFileNames(*This.Private_Members, P_FileNames.s)
    
    IsFoundAtIndex.l = -1
    
    ForEach *This\FileNames()
      
      If P_FileNames = *This\FileNames()
        IsFoundAtIndex = ListIndex(*This\FileNames())
        Break
      EndIf
      
    Next
    
    ProcedureReturn IsFoundAtIndex
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Add to linked list operator(s) <<<<<

  Procedure AddFileNames(*This.Private_Members)
    
    AddElement(*This\FileNames())
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Select in linked list operator(s) <<<<<

  Procedure.i SelectFileNames(*This.Private_Members, P_Index.l)
    
    ProcedureReturn SelectElement(*This\FileNames(), P_Index)
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The First element in linked list operator(s) <<<<<

  Procedure.i FirstFileNames(*This.Private_Members)
    
    ProcedureReturn FirstElement(*This\FileNames())
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Last element in linked list operator(s) <<<<<

  Procedure.i LastFileNames(*This.Private_Members)
    
    ProcedureReturn LastElement(*This\FileNames())
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Previous element in linked list operator(s) <<<<<

  Procedure.i PreviousFileNames(*This.Private_Members)
    
    ProcedureReturn PreviousElement(*This\FileNames())
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Next element in linked list operator(s) <<<<<

  Procedure.i NextFileNames(*This.Private_Members)
    
    ProcedureReturn NextElement(*This\FileNames())
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Delete element from linked list operator(s) <<<<<

  Procedure DeleteFileNames(*This.Private_Members)
    
    DeleteElement(*This\FileNames())
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Reset linked list operator(s) <<<<<

  Procedure ResetFileNames(*This.Private_Members)
    
    ResetList(*This\FileNames())
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Clear linked list operator(s) <<<<<

  Procedure ClearFileNames(*This.Private_Members)
    
    ClearList(*This\FileNames())
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Index in the linked list operator(s) <<<<<

  Procedure.l FileNamesIndex(*This.Private_Members)
    
    ProcedureReturn ListIndex(*This\FileNames())
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Size of the linked list operator(s) <<<<<

  Procedure.l FileNamesSize(*This.Private_Members)
    
    ProcedureReturn ListSize(*This\FileNames())
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Read preferences group <<<<<

  Procedure ReadPrefs(*This.Private_Members, P_GroupName.s)
    
    PreferenceGroup(P_GroupName)
    
    *This\HistoricSize = ReadPreferenceLong("HistoricSize", *This\HistoricSize)
    
    FileNames_Max = ReadPreferenceLong("FileNames_Max", 0) - 1
    
    For FileNamesID = 0 To FileNames_Max
      AddElement(*This\FileNames())
      *This\FileNames() = ReadPreferenceString("FileNames_" + Str(FileNamesID), *This\FileNames())
    Next
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Write preferences group <<<<<

  Procedure WritePrefs(*This.Private_Members, P_GroupName.s)
    
    PreferenceGroup(P_GroupName)
    
    WritePreferenceLong("HistoricSize", *This\HistoricSize)
    
    WritePreferenceLong("FileNames_Max", ListSize(*This\FileNames()))
    
    ForEach *This\FileNames()
      WritePreferenceString("FileNames_" + Str(ListIndex(*This\FileNames())), *This\FileNames())
    Next
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< InsertNewFile Operator <<<<<
  
  Procedure InsertNewFile(*This.Private_Members, P_NewFileName.s)
    
    If LinearSearchFileNames(*This, P_NewFileName) = -1
      
      ResetList(*This\FileNames())
      AddElement(*This\FileNames())
      *This\FileNames() = P_NewFileName
      
    Else
      
      DeleteElement(*This\FileNames())
      ResetList(*This\FileNames())
      AddElement(*This\FileNames())
      *This\FileNames() = P_NewFileName
      
    EndIf
    
    If ListSize(*This\FileNames()) > *This\HistoricSize
      LastElement(*This\FileNames())
      DeleteElement(*This\FileNames())
    EndIf 
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< SanityCheck Operator <<<<<
  
  Procedure SanityCheck(*This.Private_Members)
    
    ForEach *This\FileNames()
      
      If FileSize(*This\FileNames()) = -1
        DeleteElement(*This\FileNames(), 1)
      EndIf
      
    Next
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Destructor <<<<<

  Procedure Free(*This.Private_Members)
    
    FreeStructure(*This)
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Constructor <<<<<

  Procedure.i New(P_HistoricSize.a = 20)
    
    *This.Private_Members = AllocateStructure(Private_Members)
    *This\VirtualTable = ?START_METHODS
    
    *This\HistoricSize = P_HistoricSize
    
    ProcedureReturn *This
  EndProcedure
  
  DataSection
    START_METHODS:
    Data.i @GetHistoricSize()
    Data.i @GetFileNames()
    Data.i @SetHistoricSize()
    Data.i @SetFileNames()
    Data.i @LinearSearchFileNames()
    Data.i @AddFileNames()
    Data.i @SelectFileNames()
    Data.i @FirstFileNames()
    Data.i @LastFileNames()
    Data.i @PreviousFileNames()
    Data.i @NextFileNames()
    Data.i @DeleteFileNames()
    Data.i @ResetFileNames()
    Data.i @ClearFileNames()
    Data.i @FileNamesIndex()
    Data.i @FileNamesSize()
    Data.i @ReadPrefs()
    Data.i @WritePrefs()
    Data.i @InsertNewFile()
    Data.i @SanityCheck()
    Data.i @Free()
    END_METHODS:
  EndDataSection
  
EndModule

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.001 seconds (284000.00 lines/second) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

CompilerIf #PB_Compiler_IsMainFile
  
  RecentFiles.RecentFiles::RecentFiles = RecentFiles::New(5)
  
  For Index = 0 To 5
    
    If CreateFile(Index, "Fichier " + Str(Index) + ".txt")
      WriteString(Index, "Test file - Fichier test : " + Str(Index))
      CloseFile(Index)
      RecentFiles\InsertNewFile("Fichier " + Str(Index) + ".txt")
    EndIf
    
  Next
  
  RecentFiles\ResetFileNames()
  
  While RecentFiles\NextFileNames()
    Debug RecentFiles\GetFileNames()
  Wend
  
  RecentFiles\InsertNewFile("Fichier " + Str(3) + ".txt")
  Debug ""
  
  RecentFiles\ResetFileNames()
  
  While RecentFiles\NextFileNames()
    Debug RecentFiles\GetFileNames()
  Wend
  
  RecentFiles\InsertNewFile("Fichier " + Str(6) + ".txt")
  Debug ""
  
  If RecentFiles\FirstFileNames()
    
    Repeat 
      Debug RecentFiles\GetFileNames()
    Until RecentFiles\NextFileNames() = #Null
    
  EndIf
  
  RecentFiles\SetHistoricSize(4)
  
  Debug ""
  RecentFiles\ResetFileNames()
  
  While RecentFiles\NextFileNames()
    Debug RecentFiles\GetFileNames()
  Wend
  
  RecentFiles\SanityCheck()
  
  Debug ""
  RecentFiles\ResetFileNames()
  
  While RecentFiles\NextFileNames()
    Debug RecentFiles\GetFileNames()
  Wend
  
  For Index = 0 To 5
    DeleteFile("Fichier " + Str(Index) + ".txt")
  Next
  
  RecentFiles\Free()
  
CompilerEndIf

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Best regards
StarBootics
Last edited by StarBootics on Fri Oct 30, 2020 2:52 am, edited 2 times in total.
The Stone Age did not end due to a shortage of stones !
User avatar
StarBootics
Addict
Addict
Posts: 984
Joined: Sun Jul 07, 2013 11:35 am
Location: Canada

Re: RecentFiles - Module

Post by StarBootics »

Hello again,

This is the version 2.0.0 of the original Module :

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Module - V1.0.0 Beta
; Project name : Recent Files systems
; File name : RecentFiles - Module.pb
; File Version : 2.0.0
; Programmation : OK
; Programmed by : StarBootics
; Creation Date : 16-03-2020
; Last update : 16-03-2020
; Coded for PureBasic : V5.72 LTS Beta 2
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

DeclareModule RecentFiles

  Declare AddInstance(P_Key.s)
  Declare FindInstance(P_Key.s)
  Declare NextInstance()
  Declare DeleteInstance(P_Key.s)
  Declare ResetInstances()
  Declare ClearInstances()
  Declare.a GetHistoricSize()
  Declare.s GetFileNames()
  Declare SetHistoricSize(P_HistoricSize.a)
  Declare SetFileNames(P_FileNames.s)
  Declare Reset(P_Name.s)
  Declare.l LinearSearchFileNames(P_FileNames.s)
  Declare SelectFileNames(P_Index.l)
  Declare FirstFileNames()
  Declare LastFileNames()
  Declare PreviousFileNames()
  Declare NextFileNames()
  Declare ResetFileNames()
  Declare FileNamesIndex()
  Declare FileNamesSize()
  Declare ReadPrefs(P_GroupName.s)
  Declare WritePrefs(P_GroupName.s)
  Declare InsertNewFile(P_NewFileName.s)
  Declare SanityCheck()
  
EndDeclareModule

Module RecentFiles

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Structure declaration <<<<<

  Structure Instance

    HistoricSize.a
    List FileNames.s()

  EndStructure

  Global NewMap Instances.Instance()

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Multiple Instances Helper <<<<<

  Procedure AddInstance(P_Key.s)

    AddMapElement(Instances(), P_Key)

  EndProcedure

  Procedure FindInstance(P_Key.s)

    ProcedureReturn FindMapElement(Instances(), P_Key)
  EndProcedure

  Procedure NextInstance()

    ProcedureReturn NextMapElement(Instances())
  EndProcedure

  Procedure DeleteInstance(P_Key.s)

    DeleteMapElement(Instances(), P_Key)

  EndProcedure

  Procedure ResetInstances()

    ResetMap(Instances())

  EndProcedure

  Procedure ClearInstances()

    ClearMap(Instances())

  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The observators <<<<<

  Procedure.a GetHistoricSize()

    ProcedureReturn Instances()\HistoricSize
  EndProcedure

  Procedure.s GetFileNames()

    ProcedureReturn Instances()\FileNames()
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The mutators <<<<<

  Procedure SetHistoricSize(P_HistoricSize.a)

    Instances()\HistoricSize = P_HistoricSize
    
    While ListSize(Instances()\FileNames()) > Instances()\HistoricSize
      LastElement(Instances()\FileNames())
      DeleteElement(Instances()\FileNames())
    Wend
    
  EndProcedure

  Procedure SetFileNames(P_FileNames.s)

    Instances()\FileNames() = P_FileNames

  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Reset operator <<<<<

  Procedure Reset(P_Name.s)
    
    If P_Name = ""

      ForEach Instances()
        
        Instances()\HistoricSize = 0
    
        ForEach Instances()\FileNames()
          Instances()\FileNames() = ""
        Next

        FreeList(Instances()\FileNames())
        
      Next

      FreeMap(Instances())

    Else

      If FindMapElement(Instances(), P_Name)
        
        Instances()\HistoricSize = 0
    
        ForEach Instances()\FileNames()
          Instances()\FileNames() = ""
        Next

        FreeList(Instances()\FileNames())
        
        DeleteMapElement(Instances(), P_Name)

      EndIf

    EndIf

  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The linear search linked list operator(s) <<<<<
  
  Procedure.l LinearSearchFileNames(P_FileNames.s)
    
    Protected IsFoundAtIndex.l = -1
    
    ForEach Instances()\FileNames()
      
      If Instances()\FileNames() = P_FileNames
        IsFoundAtIndex = ListIndex(Instances()\FileNames())
        Break
      EndIf
      
    Next
    
    ProcedureReturn IsFoundAtIndex
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Select in linked list operator(s) <<<<<
  
  Procedure SelectFileNames(P_Index.l)

    ProcedureReturn SelectElement(Instances()\FileNames(), P_Index)
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The First element in linked list operator(s) <<<<<

  Procedure FirstFileNames()

    ProcedureReturn FirstElement(Instances()\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Last element in linked list operator(s) <<<<<

  Procedure LastFileNames()

    ProcedureReturn LastElement(Instances()\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Previous element in linked list operator(s) <<<<<

  Procedure PreviousFileNames()

    ProcedureReturn PreviousElement(Instances()\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Next element in linked list operator(s) <<<<<

  Procedure NextFileNames()

    ProcedureReturn NextElement(Instances()\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Reset linked list operator(s) <<<<<

  Procedure ResetFileNames()

    ResetList(Instances()\FileNames())

  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Index in the linked list operator(s) <<<<<
  
  Procedure FileNamesIndex()

    ProcedureReturn ListIndex(Instances()\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Size of the linked list operator(s) <<<<<

  Procedure FileNamesSize()

    ProcedureReturn ListSize(Instances()\FileNames())
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Read preferences group <<<<<
  
  Procedure ReadPrefs(P_GroupName.s)
    
    If FindMapElement(Instances(), P_GroupName)
      
      PreferenceGroup(P_GroupName)
      Instances()\HistoricSize = ReadPreferenceLong("HistoricSize", Instances()\HistoricSize)
      
      FileNames_Max = ReadPreferenceLong("FileNames_Max", 0) - 1
      
      For FileNamesID = 0 To FileNames_Max
        AddElement(Instances()\FileNames())
        Instances()\FileNames() = ReadPreferenceString("FileNames_" + Str(FileNamesID), Instances()\FileNames())
      Next
      
    EndIf
    
  EndProcedure

  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Write preferences group <<<<<
  
  Procedure WritePrefs(P_GroupName.s)
    
    If FindMapElement(Instances(), P_GroupName)
      
      PreferenceGroup(P_GroupName)
      
      WritePreferenceLong("HistoricSize", Instances()\HistoricSize)
      
      WritePreferenceLong("FileNames_Max", ListSize(Instances()\FileNames()))
      
      ForEach Instances()\FileNames()
        WritePreferenceString("FileNames_" + Str(ListIndex(Instances()\FileNames())), Instances()\FileNames())
      Next
      
    EndIf
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The InsertNewFile operator <<<<<
  
  Procedure InsertNewFile(P_NewFileName.s)
    
    If LinearSearchFileNames(P_NewFileName) = -1
      
      ResetList(Instances()\FileNames())
      AddElement(Instances()\FileNames())
      Instances()\FileNames() = P_NewFileName
      
    Else
      
      DeleteElement(Instances()\FileNames())
      ResetList(Instances()\FileNames())
      AddElement(Instances()\FileNames())
      Instances()\FileNames() = P_NewFileName
      
    EndIf
    
    If ListSize(Instances()\FileNames()) > Instances()\HistoricSize
      LastElement(Instances()\FileNames())
      DeleteElement(Instances()\FileNames())
    EndIf 
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The SanityCheck operator <<<<<
  
  Procedure SanityCheck()
    
    ForEach Instances()\FileNames()
      
      If FileSize(Instances()\FileNames()) = -1
        DeleteElement(Instances()\FileNames(), 1)
      EndIf
      
    Next
    
  EndProcedure
  
EndModule

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.001 seconds (358000.00 lines/second) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

CompilerIf #PB_Compiler_IsMainFile
 
  RecentFiles::AddInstance("RecentFiles")
  RecentFiles::SetHistoricSize(5)
  
  RecentFiles::AddInstance("RecentProjects")
  RecentFiles::SetHistoricSize(5)
  
  For Index = 0 To 5
    
    If RecentFiles::FindInstance("RecentFiles")
      If CreateFile(Index, "Fichier " + Str(Index) + ".txt")
        WriteString(Index, "Test file - Fichier test : " + Str(Index))
        CloseFile(Index)
        RecentFiles::InsertNewFile("Fichier " + Str(Index) + ".txt")
      EndIf
    EndIf
    
    If RecentFiles::FindInstance("RecentProjects")
      If CreateFile(Index, "Project " + Str(Index) + ".prj")
        WriteString(Index, "Test file - Fichier test : " + Str(Index))
        CloseFile(Index)
        RecentFiles::InsertNewFile("Project " + Str(Index) + ".prj")
      EndIf
    EndIf
    
  Next
  
  If RecentFiles::FindInstance("RecentFiles")
    
    Debug "RecentFiles"
    Debug ""
    
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
    RecentFiles::InsertNewFile("Fichier " + Str(3) + ".txt")
    Debug ""
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
    RecentFiles::InsertNewFile("Fichier " + Str(6) + ".txt")
    Debug ""
    
    If RecentFiles::FirstFileNames()
      
      Repeat 
        Debug RecentFiles::GetFileNames()
      Until RecentFiles::NextFileNames() = #Null
      
    EndIf
    
    RecentFiles::SetHistoricSize(4)
    
    Debug ""
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
    RecentFiles::SanityCheck()
    
    Debug ""
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
  EndIf
  
  If RecentFiles::FindInstance("RecentProjects")
    
    Debug ""
    Debug "RecentProjects"
    Debug ""
    
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
    RecentFiles::InsertNewFile("Project " + Str(3) + ".prj")
    Debug ""
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
    RecentFiles::InsertNewFile("Project " + Str(6) + ".prj")
    Debug ""
    
    If RecentFiles::FirstFileNames()
      
      Repeat 
        Debug RecentFiles::GetFileNames()
      Until RecentFiles::NextFileNames() = #Null
      
    EndIf
    
    RecentFiles::SetHistoricSize(4)
    
    Debug ""
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
    RecentFiles::SanityCheck()
    
    Debug ""
    RecentFiles::ResetFileNames()
    
    While RecentFiles::NextFileNames()
      Debug RecentFiles::GetFileNames()
    Wend
    
  EndIf
  
  For Index = 0 To 5
    DeleteFile("Fichier " + Str(Index) + ".txt")
    DeleteFile("Project " + Str(Index) + ".prj")
  Next
  
CompilerEndIf

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Best regards
StarBootics
The Stone Age did not end due to a shortage of stones !
Post Reply