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