I am going to add separate windows for people to add/edit/delete or totally overwrite their title replacement characters and measure translations and in order to do it properly, I had to a: 
  Develop a system using preference files rather than database as we need these settings to be local to the user and not to the database because people will swap databases and we don't want our settings saved to theirs and b: 
  Totally write the concept as a separate program to prove that I can get this to work in the main program when it is finished.
Don't know if the code is of use to anyone but here it is anyway.
When I get some time, I will add this into the main recipes program. Just another thing I needed and it actually worked without bugs for a change.
Code: Select all
UsePNGImageDecoder()
Define EventID,  MenuID,  GadgetID,  WindowID
Enumeration 1
  #Window_Measures
  #Window_Data
EndEnumeration
#WindowIndex = #PB_Compiler_EnumerationValue
Enumeration 1
  ; Window_Measures
  #Gadget_Measures_cMeasures
  #Gadget_Measures_MeasuresList
  #Gadget_Measures_cControl
  #Gadget_Measures_Save
  #Gadget_Measures_Load
  #Gadget_Measures_fSeparator1
  #Gadget_Measures_Add
  #Gadget_Measures_Delete
  #Gadget_Measures_Edit
  #Gadget_Measures_fSeparator2
  #Gadget_Measures_Help
  #Gadget_Measures_fSeparator3
  #Gadget_Measures_Logo
  #Gadget_Measures_fSeparator4
  #Gadget_Measures_Exit
  #Gadget_Measures_lControl1
  ; Window_Data
  #Gadget_Data_cData
  #Gadget_Data_lAbbreviation
  #Gadget_Data_Abbreviation
  #Gadget_Data_lMeaning
  #Gadget_Data_Meaning
  #Gadget_Data_cControl
  #Gadget_Data_Save
  #Gadget_Data_fSeparator1
  #Gadget_Data_Logo
  #Gadget_Data_fSeparator2
  #Gadget_Data_Exit
  #Gadget_Data_lControl1
EndEnumeration
#GadgetIndex = #PB_Compiler_EnumerationValue
Enumeration 1
  #Image_Measures_Save
  #Image_Measures_Load
  #Image_Measures_Add
  #Image_Measures_Delete
  #Image_Measures_Edit
  #Image_Measures_Help
  #Image_Measures_Logo
  #Image_Measures_Exit
  #Image_Data_Save
  #Image_Data_Logo
  #Image_Data_Exit
EndEnumeration
#ImageIndex = #PB_Compiler_EnumerationValue
CatchImage(#Image_Measures_Save,     ?_SMEGMeasures_Save)
CatchImage(#Image_Measures_Load,     ?_SMEGMeasures_Load)
CatchImage(#Image_Measures_Add,      ?_SMEGMeasures_Add)
CatchImage(#Image_Measures_Delete,   ?_SMEGMeasures_Delete)
CatchImage(#Image_Measures_Edit,     ?_SMEGMeasures_Edit)
CatchImage(#Image_Measures_Help,     ?_SMEGMeasures_Help)
CatchImage(#Image_Measures_Logo,     ?_SMEGMeasures_Logo)
CatchImage(#Image_Measures_Exit,     ?_SMEGMeasures_Exit)
CatchImage(#Image_Data_Save,         ?_SMEGMeasures_Save)
CatchImage(#Image_Data_Logo,         ?_SMEGMeasures_Logo)
CatchImage(#Image_Data_Exit,         ?_SMEGMeasures_Exit)
DataSection
  _SMEGMeasures_Save:   :   IncludeBinary "Images\_54x54\Save.png"
  _SMEGMeasures_Load:   :   IncludeBinary "Images\_54x54\Open.png"
  _SMEGMeasures_Add:    :   IncludeBinary "Images\_54x54\Add.png"
  _SMEGMeasures_Delete: :   IncludeBinary "Images\_54x54\Delete.png"
  _SMEGMeasures_Edit:   :   IncludeBinary "Images\_54x54\Edit.png"
  _SMEGMeasures_Help:   :   IncludeBinary "Images\_54x54\Help.png"
  _SMEGMeasures_Logo:   :   IncludeBinary "Images\_Other\Banner1.png"
  _SMEGMeasures_Exit:   :   IncludeBinary "Images\_54x54\Exit.png"
EndDataSection
Procedure.i Window_Measures()
  If OpenWindow(#Window_Measures, 161, 106, 620, 650, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
      SetWindowColor(#Window_Measures, $FFFFFF)
      ContainerGadget(#Gadget_Measures_cMeasures, 5, 5, 610, 550, #PB_Container_Flat|#PB_Container_BorderLess)
        SetGadgetColor(#Gadget_Measures_cMeasures, #PB_Gadget_BackColor, $FFFFFF)
      ListIconGadget(#Gadget_Measures_MeasuresList, 0, 0, 610, 548, "Search for this string in measure", 290, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
        SetGadgetColor(#Gadget_Measures_MeasuresList, #PB_Gadget_BackColor, $F2F2F2)
        AddGadgetColumn(#Gadget_Measures_MeasuresList, 1, "Recplace this string in measure", 290)
        SetGadgetFont(#Gadget_Measures_MeasuresList, LoadFont(#Gadget_Measures_MeasuresList, "Comic Sans MS", 10, 0))
      CloseGadgetList()
      ContainerGadget(#Gadget_Measures_cControl, 5, 557, 610, 85, #PB_Container_Flat|#PB_Container_BorderLess)
        SetGadgetColor(#Gadget_Measures_cControl, #PB_Gadget_BackColor, $FFFFFF)
      ImageGadget(#Gadget_Measures_Save, 5, 5, 54, 54, ImageID(#Image_Measures_Save))
      ImageGadget(#Gadget_Measures_Load, 65, 5, 54, 54, ImageID(#Image_Measures_Load))
      FrameGadget(#Gadget_Measures_fSeparator1, 130, 5, 5, 55, "", #PB_Frame_Double)
      ImageGadget(#Gadget_Measures_Add, 140, 5, 54, 54, ImageID(#Image_Measures_Add))
      ImageGadget(#Gadget_Measures_Delete, 200, 5, 54, 54, ImageID(#Image_Measures_Delete))
      ImageGadget(#Gadget_Measures_Edit, 260, 5, 54, 54, ImageID(#Image_Measures_Edit))
      FrameGadget(#Gadget_Measures_fSeparator2, 320, 5, 5, 55, "", #PB_Frame_Double)
      ImageGadget(#Gadget_Measures_Help, 330, 5, 54, 54, ImageID(#Image_Measures_Help))
      FrameGadget(#Gadget_Measures_fSeparator3, 390, 5, 5, 55, "", #PB_Frame_Double)
      ImageGadget(#Gadget_Measures_Logo, 405, 0, 124, 64, ImageID(#Image_Measures_Logo))
      ResizeGadget(#Gadget_Measures_Logo, 405, 0, 124, 64)
      ResizeImage(#Image_Measures_Logo, 124, 64)
      SetGadgetState(#Gadget_Measures_Logo, ImageID(#Image_Measures_Logo))
      FrameGadget(#Gadget_Measures_fSeparator4, 535, 5, 5, 55, "", #PB_Frame_Double)
      ImageGadget(#Gadget_Measures_Exit, 545, 5, 54, 54, ImageID(#Image_Measures_Exit))
      TextGadget(#Gadget_Measures_lControl1, 0, 65, 605, 15, "      Save            Load                  Add          Delete            Edit                Help                                                                Exit")
        SetGadgetColor(#Gadget_Measures_lControl1, #PB_Gadget_BackColor, $FFFFFF)
        SetGadgetFont(#Gadget_Measures_lControl1, LoadFont(#Gadget_Measures_lControl1, "Comic Sans MS", 8, 0))
      CloseGadgetList()
      HideWindow(#Window_Measures, 0)
    ProcedureReturn WindowID(#Window_Measures)
  EndIf
EndProcedure
Procedure.i Window_Data()
  If OpenWindow(#Window_Data, 382, 239, 455, 180, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible, WindowID(#Window_Measures))
      SetWindowColor(#Window_Data, $FFFFFF)
      ContainerGadget(#Gadget_Data_cData, 5, 5, 445, 80, #PB_Container_Flat|#PB_Container_BorderLess)
        SetGadgetColor(#Gadget_Data_cData, #PB_Gadget_BackColor, $FFFFFF)
      TextGadget(#Gadget_Data_lAbbreviation, 10, 10, 95, 25, "Abbreviation", #PB_Text_Center)
        SetGadgetColor(#Gadget_Data_lAbbreviation, #PB_Gadget_BackColor, $FFFFFF)
        SetGadgetFont(#Gadget_Data_lAbbreviation, LoadFont(#Gadget_Data_lAbbreviation, "Comic Sans MS", 10, 0))
      StringGadget(#Gadget_Data_Abbreviation, 110, 10, 325, 25, "", #PB_String_BorderLess)
        SetGadgetColor(#Gadget_Data_Abbreviation, #PB_Gadget_BackColor, $F2F2F2)
        SetGadgetFont(#Gadget_Data_Abbreviation, LoadFont(#Gadget_Data_Abbreviation, "Comic Sans MS", 10, 0))
      TextGadget(#Gadget_Data_lMeaning, 10, 40, 95, 25, "Meaning", #PB_Text_Center)
        SetGadgetColor(#Gadget_Data_lMeaning, #PB_Gadget_BackColor, $FFFFFF)
        SetGadgetFont(#Gadget_Data_lMeaning, LoadFont(#Gadget_Data_lMeaning, "Comic Sans MS", 10, 0))
      StringGadget(#Gadget_Data_Meaning, 110, 40, 325, 25, "", #PB_String_BorderLess)
        SetGadgetColor(#Gadget_Data_Meaning, #PB_Gadget_BackColor, $F2F2F2)
        SetGadgetFont(#Gadget_Data_Meaning, LoadFont(#Gadget_Data_Meaning, "Comic Sans MS", 10, 0))
      CloseGadgetList()
      ContainerGadget(#Gadget_Data_cControl, 5, 90, 445, 85, #PB_Container_Flat|#PB_Container_BorderLess)
        SetGadgetColor(#Gadget_Data_cControl, #PB_Gadget_BackColor, $FFFFFF)
      ImageGadget(#Gadget_Data_Save, 5, 5, 54, 54, ImageID(#Image_Data_Save))
      FrameGadget(#Gadget_Data_fSeparator1, 65, 5, 5, 55, "", #PB_Frame_Double)
      ImageGadget(#Gadget_Data_Logo, 230, 0, 124, 64, ImageID(#Image_Data_Logo))
      ResizeGadget(#Gadget_Data_Logo, 230, 0, 124, 64)
      ResizeImage(#Image_Data_Logo, 124, 64)
      SetGadgetState(#Gadget_Data_Logo, ImageID(#Image_Data_Logo))
      FrameGadget(#Gadget_Data_fSeparator2, 370, 5, 5, 55, "", #PB_Frame_Double)
      ImageGadget(#Gadget_Data_Exit, 380, 5, 54, 54, ImageID(#Image_Data_Exit))
      TextGadget(#Gadget_Data_lControl1, 0, 65, 443, 15, "      Save                                                                                                                     Exit")
        SetGadgetColor(#Gadget_Data_lControl1, #PB_Gadget_BackColor, $FFFFFF)
        SetGadgetFont(#Gadget_Data_lControl1, LoadFont(#Gadget_Data_lControl1, "Comic Sans MS", 8, 0))
      CloseGadgetList()
      HideWindow(#Window_Data, 0)
    ProcedureReturn WindowID(#Window_Data)
  EndIf
EndProcedure
Declare   MakePreferences()
Declare   ListPreferences()
Declare   AddMEasure()
Declare   DeleteMeasure()
Declare   EditMeasure()
Declare   SaveMeasure()
Declare   SavePreferencesToFile()
Declare   LoadPreferencesFromFile()
#MeasuresListCharacterColumn  = 0                                                                     ;
#MeasuresListReplaceColumn    = 1                                                                     ;
#AtTheEndOfTheList            = -1                                                                    ; 
#FileDoesNotExist             = -1                                                                    ; 
#NoFileHandle                 = 0                                                                     ; 
#EmptyString                  = ""                                                                    ; 
#NothingSelected              = -1                                                                    ; 
#NoItems                      = 0                                                                     ; 
Structure ProgramData
  QuitValue.i                                                                                         ; 
  LastWindow.s                                                                                        ; 
  WindowMutex.i                                                                                       ; 
  
  CurrentLine.i                                                                                       ; 
  CurrentDirectory.s                                                                                  ; 
  
  PreferencesFile.s                                                                                   ; 
  
  OldSearchWord.s                                                                                     ; 
  OldReplaceWord.s                                                                                    ; 
EndStructure
Structure MeasuresListData
  SearchWord.s                                                                                        ; 
  ReplaceWord.s                                                                                       ; 
  RecordNumber.s                                                                                      ; 
EndStructure
Global Program.ProgramData                                                                            ; 
Global NewList MeasuresList.MeasuresListData()                                                       ; 
Program\CurrentDirectory = GetCurrentDirectory()                                                      ; 
Program\PreferencesFile  = Program\CurrentDirectory  + "Measures.prefs"                               ; 
DataSection
  
  BeginMeasures:
  
  Data.s "sl",              "Slice"
  Data.s "c",               "Cup"
  Data.s "g",               "Gram"
  Data.s "gms",             "Grams"
  Data.s "kg",              "Kilogram"
  Data.s "kil",             "Kilogram"
  Data.s "l",               "Litre"
  Data.s "lb",              "Pound"
  Data.s "ml",              "Millilitre"
  Data.s "oz",              "Ounce"
  Data.s "pt",              "Pint"
  Data.s "pn",              "Pinch"
  Data.s "ts",              "Teaspoon"
  Data.s "tbsp",            "Tablespoon"
  Data.s "cl",              "Clove"
  Data.s "lg",              "Large"
  Data.s "bn",              "Bunch"
  Data.s "ds",              "Dash"
  Data.s "tb",              "Tub"
  Data.s "doz",             "Dozen"
  Data.s "gal",             "Gallons"
  Data.s "pkg",             "Package"
  Data.s "pk",              "Packet"
  Data.s "pkt",             "Packet"
  Data.s "qt",              "Quart"
  Data.s "sm",              "Small"
  Data.s  "_EndMeasures_",  "_EndMeasures_"
  
EndDataSection
; These are the default preferences created at program start
Procedure MakePreferences()
  CreatePreferences(Program\PreferencesFile, #PB_Preference_GroupSeparator)
  PreferenceComment(#EmptyString)
  PreferenceGroup("Measure correction")
  PreferenceComment(#EmptyString)
  Restore BeginMeasures
  While StringToFind.s <> "_EndMeasures_"  And StringToReplace.s <> "_EndMeasures_"
    Read.s StringToFind.s
    Read.s StringToReplace.s
    If StringToFind.s <> "_EndMeasures_"  And StringToReplace.s <> "_EndMeasures_"
      WritePreferenceString(StringToFind.s, StringToReplace.s)
      AddGadgetItem(#Gadget_Measures_MeasuresList, #AtTheEndOfTheList, StringToFind.s + #LF$ +  StringToReplace.s)
    EndIf
  Wend
  StringToFind.s = "<>"
EndProcedure
; 
Procedure ListPreferences()
  OpenPreferences(Program\PreferencesFile)
  PreferenceGroup("Measure correction")
  ExaminePreferenceKeys()
  While  NextPreferenceKey()
    AddGadgetItem(#Gadget_Measures_MeasuresList, #AtTheEndOfTheList, PreferenceKeyName() + #LF$ +  PreferenceKeyValue())
  Wend
  ClosePreferences()
EndProcedure
; 
Procedure AddMeasure()
  If Program\WindowMutex  <> #True
    Program\WindowMutex  = #True
    If Window_Data()
      Program\LastWindow = "Add"
      SetActiveGadget(#Gadget_Data_Abbreviation)
    Else
      ; Cannot open the program window
    EndIf
  Else
    ; Another window is open and must be closed first
  EndIf
EndProcedure
; 
Procedure DeleteMeasure()
  If Program\CurrentLine  <> #NothingSelected
    OldSearchWord.s   = GetGadgetItemText(#Gadget_Measures_MeasuresList, Program\CurrentLine, #MeasuresListCharacterColumn)
    OldReplaceWord.s  = GetGadgetItemText(#Gadget_Measures_MeasuresList, Program\CurrentLine, #MeasuresListReplaceColumn)
    OpenPreferences(Program\PreferencesFile)
    PreferenceGroup("Measure correction")
    RemovePreferenceKey(OldSearchWord.s)
    ClosePreferences()
 Else
    ; Nothing to do as there is no current line selected
  EndIf
EndProcedure
; 
Procedure EditMeasure()
  Program\CurrentLine = GetGadgetState(#Gadget_Measures_MeasuresList)
  If Program\CurrentLine  <> #NothingSelected
    If Program\WindowMutex  <> #True
      Program\WindowMutex  = #True
      If Window_Data()
        Program\LastWindow = "Edit"
        Program\OldSearchWord   = GetGadgetItemText(#Gadget_Measures_MeasuresList, Program\CurrentLine, #MeasuresListCharacterColumn)
        Program\OldReplaceWord  = GetGadgetItemText(#Gadget_Measures_MeasuresList, Program\CurrentLine, #MeasuresListReplaceColumn)
        SetGadgetText(#Gadget_Data_Abbreviation,  Program\OldSearchWord)
        SetGadgetText(#Gadget_Data_Meaning,       Program\OldReplaceWord)
      Else
        ; Cannot open the program window
      EndIf
    Else
      ; Another window is open and must be closed first
    EndIf
  Else
    ; Nothing to do as there is no current line selected
  EndIf
EndProcedure
; 
Procedure SaveMeasure()
  SearchWord.s  = GetGadgetText(#Gadget_Data_Abbreviation)
  ReplaceWord.s = GetGadgetText(#Gadget_Data_Meaning)
  Select Program\LastWindow
    Case "Add"
      OpenPreferences(Program\PreferencesFile)
      PreferenceGroup("Measure correction")
      WritePreferenceString(SearchWord.s,  ReplaceWord.s)
      ClosePreferences()
    Case  "Edit"
      OpenPreferences(Program\PreferencesFile)
      PreferenceGroup("Measure correction")
      If SearchWord.s <> Program\OldSearchWord
        RemovePreferenceKey(Program\OldSearchWord)
        WritePreferenceString(SearchWord.s,  ReplaceWord.s)
      Else
        WritePreferenceString(SearchWord.s,  ReplaceWord.s)
      EndIf
      ClosePreferences()
  EndSelect
  SetGadgetItemText(#Gadget_Measures_MeasuresList, Program\CurrentLine, SearchWord.s, #MeasuresListCharacterColumn)
  SetGadgetItemText(#Gadget_Measures_MeasuresList, Program\CurrentLine, ReplaceWord.s, #MeasuresListReplaceColumn)
  CloseWindow(#Window_Data)
  Program\WindowMutex = #False
  Program\LastWindow = #EmptyString
EndProcedure
; 
Procedure LoadPreferencesFromFile()
  If MessageRequester("Load preferences", "Overwrite from file?", #PB_MessageRequester_YesNo)  = #PB_MessageRequester_Yes
    PreferencesFileName.s = OpenFileRequester("Import Measures", "", "Text (*.txt)|*.txt", 0)
    If PreferencesFileName.s  <> #EmptyString
      PreferencesFileHandle.i = ReadFile(#PB_Any, PreferencesFileName.s)
      If PreferencesFileHandle.i  <> #NoFileHandle
        OpenPreferences(Program\PreferencesFile)
        PreferenceGroup("Measure correction")
        ExaminePreferenceKeys()
        While  NextPreferenceKey()
          RemovePreferenceKey(PreferenceKeyName())
        Wend
        While Eof(PreferencesFileHandle.i)  = #NotEndOfFile
          PreferenceString.s   = ReadString(PreferencesFileHandle.i, #PB_UTF8)
          StringToFind.s    = StringField(PreferenceString.s, 1, ",")
          StringToReplace.s = StringField(PreferenceString.s, 1, ",")
          AddGadgetItem(#Gadget_Measures_MeasuresList, #AtTheEndOfTheLine, StringToFind.s + #LF$  + StringToReplace.s)
          WritePreferenceString(StringToFind.s, StringToReplace.s)
        Wend
        CloseFile(PreferencesFileHandle.i)
        ClosePreferences()        
      Else
        ; Could not create a file on disk, file I/O error
      EndIf
    Else
      ;  No file to export as user cancelled the process
    EndIf
  Else
    ; Nothing to do as user cancelled the process
  EndIf
EndProcedure  
; 
Procedure SavePreferencesToFile()
  NumberOfItems.i = CountGadgetItems(#Gadget_Measures_MeasuresList)
  If NumberOfItems.i <> #NoItems
    PreferencesFileName.s = SaveFileRequester("Export Measures", "", "Text (*.txt)|*.txt", 0)
    If PreferencesFileName.s  <> #EmptyString
      If LCase(GetExtensionPart(PreferencesFileName.s))  <>  "txt"
        PreferencesFileName.s + ".Txt"
      EndIf
      PreferencesFileHandle.i = CreateFile(#PB_Any, PreferencesFileName.s)
      If PreferencesFileHandle.i  <> #NoFileHandle
        For GetPreferenceItems.i = 0 To NumberOfItems.i - 1
          SearchWord.s   = GetGadgetItemText(#Gadget_Measures_MeasuresList, GetPreferenceItems.i, #MeasuresListCharacterColumn)  + ","
          ReplaceWord.s  = GetGadgetItemText(#Gadget_Measures_MeasuresList, GetPreferenceItems.i, #MeasuresListReplaceColumn)
          WriteStringN(PreferencesFileHandle.i, SearchWord.s  + ReplaceWord.s, #PB_UTF8)
        Next GetPreferenceItems.i
        CloseFile(PreferencesFileHandle.i)
      Else
        ; Could not create a file on disk, file I/O error
      EndIf
    Else
      ;  No file to export as user cancelled the process
    EndIf
  Else
    ; No items in the list to process
  EndIf
EndProcedure
If Window_Measures()
  ; 
  
  Program\QuitValue = #False
  
  ; 
  If FileSize(PreferencesFile.s) = #FileDoesNotExist
    MakePreferences()
  Else
    ListPreferences()
  EndIf  
  
  ; 
  
  Repeat
    EventID  = WaitWindowEvent()
    MenuID   = EventMenu()
    GadgetID = EventGadget()
    WindowID = EventWindow()
    Select EventID
      Case #PB_Event_CloseWindow
        Select WindowID
          Case #Window_Measures                     : Program\QuitValue = #True
          Case #Window_Data                         : CloseWindow(#Window_Data) : Program\WindowMutex = #False  : Program\LastWindow = #EmptyString
        EndSelect
      Case #PB_Event_Gadget
        Select GadgetID
          ; 
          Case #Gadget_Measures_MeasuresList
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    : EditMeasure()
              Case #PB_EventType_RightDoubleClick   : AddMeasure()
            EndSelect
            ; 
          Case #Gadget_Measures_Save
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    : SavePreferencesToFile()
            EndSelect
          Case #Gadget_Measures_Load
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    : LoadPreferencesFromFile()
            EndSelect
            ; 
          Case #Gadget_Measures_Add
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    : AddMeasure()
            EndSelect
          Case #Gadget_Measures_Delete
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    : DeleteMeasure() 
            EndSelect
          Case #Gadget_Measures_Edit
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    : EditMeasure() 
            EndSelect
            ; 
          Case #Gadget_Data_Save
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    :  SaveMeasure()
            EndSelect
            ; 
          Case #Gadget_Data_Exit
            Select EventType()
              Case #PB_EventType_LeftDoubleClick    :  CloseWindow(#Window_Data) : Program\WindowMutex = #False  : Program\LastWindow = #EmptyString
            EndSelect
            ; 
        EndSelect
    EndSelect
  Until Program\QuitValue = #True
  CloseWindow(#Window_Measures)
EndIf
End