What this program does is allow me to enter raw data per line in the form of #Variable name, Short menu text, Long menu text (For tooltips, menus etc), the user visible keystrokes and the actual shortcut keycode and then output the lot neatly formatted for whatever project they were made for.
I am dumping the code and example raw file and output file here to see if it is of any interest. No dependancies anywhere except the pb version perhaps.
Code: Select all
Define EventID, MenuID, GadgetID, WindowID
;- Window Constants
Enumeration 1
#Window_Keytext
#Window_Keyform
EndEnumeration
#WindowIndex = #PB_Compiler_EnumerationValue
;- Gadget Constants
Enumeration 1
; Window_Keytext
#Gadget_Keytext_Keylist
#Gadget_Keytext_cControl
#Gadget_Keytext_Add
#Gadget_Keytext_Delete
#Gadget_Keytext_Edit
#Gadget_Keytext_fSeparator1
#Gadget_Keytext_Addsection
#Gadget_Keytext_Editsection
#Gadget_Keytext_fSeparator2
#Gadget_Keytext_Load
#Gadget_Keytext_Save
#Gadget_Keytext_fSeparator3
#Gadget_Keytext_Export
#Gadget_Keytext_fSeparator4
#Gadget_Keytext_ClearKeys
#Gadget_Keytext_Counter
#Gadget_Keytext_fSeparator5
#Gadget_Keytext_Exit
#Gadget_Keytext_Messages
; Window_Keyform
#Gadget_Keyform_fBoundary
#Gadget_Keyform_lVariablename
#Gadget_Keyform_Variablename
#Gadget_Keyform_lShorttext
#Gadget_Keyform_Shorttext
#Gadget_Keyform_lLongtext
#Gadget_Keyform_Longtext
#Gadget_Keyform_lShortcut
#Gadget_Keyform_Shortcut
#Gadget_Keyform_cControl
#Gadget_Keyform_Save
#Gadget_Keyform_Exit
#Gadget_Keyform_Messages
EndEnumeration
#GadgetIndex = #PB_Compiler_EnumerationValue
Procedure.i Window_Keytext()
If OpenWindow(#Window_Keytext,97,92,1320,795,"Shortcut text and key editor",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
SetWindowColor(#Window_Keytext,$FFFFFF)
ListIconGadget(#Gadget_Keytext_Keylist,0,0,1320,730,"Variable name",250,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
SetGadgetColor(#Gadget_Keytext_Keylist,#PB_Gadget_BackColor,$FFFFFF)
AddGadgetColumn(#Gadget_Keytext_Keylist,1,"Short text description",270)
AddGadgetColumn(#Gadget_Keytext_Keylist,2,"Long text description",568)
AddGadgetColumn(#Gadget_Keytext_Keylist,3,"Keyboard shortcut",200)
AddGadgetColumn(#Gadget_Keytext_Keylist,4,"Shortcut value",0)
SetGadgetFont(#Gadget_Keytext_Keylist,LoadFont(#Gadget_Keytext_Keylist,"Segoe Print",10,0))
ContainerGadget(#Gadget_Keytext_cControl,0,730,1320,40,#PB_Container_BorderLess)
SetGadgetColor(#Gadget_Keytext_cControl,#PB_Gadget_BackColor,$FFFFFF)
ButtonGadget(#Gadget_Keytext_Add,5,5,100,30,"Add item")
SetGadgetFont(#Gadget_Keytext_Add,LoadFont(#Gadget_Keytext_Add,"Segoe Print",10,0))
ButtonGadget(#Gadget_Keytext_Delete,105,5,100,30,"Delete item")
SetGadgetFont(#Gadget_Keytext_Delete,LoadFont(#Gadget_Keytext_Delete,"Segoe Print",10,0))
ButtonGadget(#Gadget_Keytext_Edit,205,5,100,30,"Edit item")
SetGadgetFont(#Gadget_Keytext_Edit,LoadFont(#Gadget_Keytext_Edit,"Segoe Print",10,0))
FrameGadget(#Gadget_Keytext_fSeparator1,310,5,5,30,"",#PB_Frame_Double)
ButtonGadget(#Gadget_Keytext_Addsection,320,5,100,30,"Add heading")
SetGadgetFont(#Gadget_Keytext_Addsection,LoadFont(#Gadget_Keytext_Addsection,"Segoe Print",10,0))
ButtonGadget(#Gadget_Keytext_Editsection,420,5,100,30,"Edit heading")
SetGadgetFont(#Gadget_Keytext_Editsection,LoadFont(#Gadget_Keytext_Editsection,"Segoe Print",10,0))
FrameGadget(#Gadget_Keytext_fSeparator2,525,5,5,30,"",#PB_Frame_Double)
ButtonGadget(#Gadget_Keytext_Load,535,5,100,30,"Load file")
SetGadgetFont(#Gadget_Keytext_Load,LoadFont(#Gadget_Keytext_Load,"Segoe Print",10,0))
ButtonGadget(#Gadget_Keytext_Save,635,5,100,30,"Save file")
SetGadgetFont(#Gadget_Keytext_Save,LoadFont(#Gadget_Keytext_Save,"Segoe Print",10,0))
FrameGadget(#Gadget_Keytext_fSeparator3,740,5,5,30,"",#PB_Frame_Double)
ButtonGadget(#Gadget_Keytext_Export,750,5,100,30,"Export files")
SetGadgetFont(#Gadget_Keytext_Export,LoadFont(#Gadget_Keytext_Export,"Segoe Print",10,0))
FrameGadget(#Gadget_Keytext_fSeparator4,855,5,5,30,"",#PB_Frame_Double)
ButtonGadget(#Gadget_Keytext_ClearKeys,865,5,100,30,"Clear keys")
SetGadgetFont(#Gadget_Keytext_ClearKeys,LoadFont(#Gadget_Keytext_ClearKeys,"Segoe Print",10,0))
StringGadget(#Gadget_Keytext_Counter,1065,5,130,30,"",#PB_String_ReadOnly)
SetGadgetColor(#Gadget_Keytext_Counter,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keytext_Counter,LoadFont(#Gadget_Keytext_Counter,"Segoe Print",10,0))
FrameGadget(#Gadget_Keytext_fSeparator5,1200,5,5,30,"",#PB_Frame_Double)
ButtonGadget(#Gadget_Keytext_Exit,1210,5,100,30,"Exit program")
SetGadgetFont(#Gadget_Keytext_Exit,LoadFont(#Gadget_Keytext_Exit,"Segoe Print",10,0))
CloseGadgetList()
StringGadget(#Gadget_Keytext_Messages,0,775,1320,20,"",#PB_String_ReadOnly|#PB_String_BorderLess)
SetGadgetColor(#Gadget_Keytext_Messages,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keytext_Messages,LoadFont(#Gadget_Keytext_Messages,"Segoe Print",10,0))
HideWindow(#Window_Keytext,0)
ProcedureReturn WindowID(#Window_Keytext)
EndIf
EndProcedure
Procedure.i Window_Keyform()
If OpenWindow(#Window_Keyform,97,92,353,446,"Keyboard data editor form",#PB_Window_ScreenCentered|#PB_Window_Invisible,WindowID(#Window_Keytext))
SetWindowColor(#Window_Keyform,$FFFFFF)
FrameGadget(#Gadget_Keyform_fBoundary,10,10,335,350,"",#PB_Frame_Flat)
TextGadget(#Gadget_Keyform_lVariablename,20,25,316,25,"Variable name")
SetGadgetColor(#Gadget_Keyform_lVariablename,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_lVariablename,LoadFont(#Gadget_Keyform_lVariablename,"Segoe Print",10,0))
StringGadget(#Gadget_Keyform_Variablename,20,55,316,30,"")
SetGadgetColor(#Gadget_Keyform_Variablename,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_Variablename,LoadFont(#Gadget_Keyform_Variablename,"Segoe Print",10,0))
TextGadget(#Gadget_Keyform_lShorttext,20,95,316,25,"Short text description")
SetGadgetColor(#Gadget_Keyform_lShorttext,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_lShorttext,LoadFont(#Gadget_Keyform_lShorttext,"Segoe Print",10,0))
StringGadget(#Gadget_Keyform_Shorttext,20,125,316,30,"")
SetGadgetColor(#Gadget_Keyform_Shorttext,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_Shorttext,LoadFont(#Gadget_Keyform_Shorttext,"Segoe Print",10,0))
TextGadget(#Gadget_Keyform_lLongtext,20,165,316,25,"Long text description")
SetGadgetColor(#Gadget_Keyform_lLongtext,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_lLongtext,LoadFont(#Gadget_Keyform_lLongtext,"Segoe Print",10,0))
EditorGadget(#Gadget_Keyform_Longtext,20,195,316,80,#PB_Editor_WordWrap)
SetGadgetColor(#Gadget_Keyform_Longtext,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_Longtext,LoadFont(#Gadget_Keyform_Longtext,"Segoe Print",10,0))
TextGadget(#Gadget_Keyform_lShortcut,20,285,316,25,"Keyboard shortcut combination")
SetGadgetColor(#Gadget_Keyform_lShortcut,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_lShortcut,LoadFont(#Gadget_Keyform_lShortcut,"Segoe Print",10,0))
ShortcutGadget(#Gadget_Keyform_Shortcut,20,315,316,30,0)
SetGadgetColor(#Gadget_Keyform_Shortcut,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_Shortcut,LoadFont(#Gadget_Keyform_Shortcut,"Segoe Print",10,0))
ContainerGadget(#Gadget_Keyform_cControl,10,365,335,40,#PB_Container_BorderLess)
SetGadgetColor(#Gadget_Keyform_cControl,#PB_Gadget_BackColor,$FFFFFF)
ButtonGadget(#Gadget_Keyform_Save,0,5,100,30,"Save key")
SetGadgetFont(#Gadget_Keyform_Save,LoadFont(#Gadget_Keyform_Save,"Segoe Print",10,0))
ButtonGadget(#Gadget_Keyform_Exit,235,5,100,30,"Exit form")
SetGadgetFont(#Gadget_Keyform_Exit,LoadFont(#Gadget_Keyform_Exit,"Segoe Print",10,0))
CloseGadgetList()
StringGadget(#Gadget_Keyform_Messages,10,410,336,25,"",#PB_String_BorderLess)
SetGadgetColor(#Gadget_Keyform_Messages,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetFont(#Gadget_Keyform_Messages,LoadFont(#Gadget_Keyform_Messages,"Segoe Print",10,0))
HideWindow(#Window_Keyform,0)
ProcedureReturn WindowID(#Window_Keyform)
EndIf
EndProcedure
; Third party additions (TI994A)
Declare SetStringGadgetSelection(GadgetID.i, Start.i, Length.i = 0) ; Set the caret to the chosen position in the string
Declare.i GetCaretPosition(GadgetID.i) ; Get the current caret position in the string
Declare RestrictChars(*pchr.Ascii, slen) ; Restrict the characters that can be typed in the string
Declare StringFilter() ; Character restriction procedure
; Generic, re-useable modules
Declare.s GetShortcutText(Constant.i) ; Get the text of the associated shortcut constant
; Custom work modules
Declare ListIconGadgetMove(GadgetId.i, Source.i, Destination.i) ; Move lines of text around in a singleListIconGadget
Declare ListIconGadgetNumberOfColumns(GadgetId.i) ; Return the number of columns in a listicongadget
Declare ShortcutDuplicateCheck() ; Check for duplicate shortcut being assigned by the user
; Main form procedures called from buttons
Declare AddKeyData() ; Add a new key and associated data
Declare AddKeySection() ; Add a new section heading to the form
Declare DeleteKeyData() ; Delete the selected key data
Declare EditkeyData() ; Edit the selected key data
; Key data editor form modules
Declare SaveKeyData() ; Save new or edited key data from the form
; Loading and saving raw key data files
Declare LoadKeyDataFromFile(DirectoryName.s = #Empty$) ; Load a raw key data from default or user requested file name
Declare SaveKeyDataToFile(DirectoryName.s = #Empty$) ; Save the raw key data to a default file or user requested file name
; Exporting key data to project files
Declare ExportKeyDataToProject() ; Export the raw key data to PB includeable files on disk
; My personal constants to help make code more readable
#AtTheEndOfTheList = -1 ;
#NoItemsInList = 0 ;
#NoLineSelected = -1 ;
#VariableNameColumn = 0 ;
#ShortTextColumn = 1 ;
#LongTextColumn = 2 ;
#ShortcutColumn = 3 ;
#ShortcutValueColumn = 4
#FileNotFound = -1 ;
#FileIsDirectory = -2 ;
#FileNotRead = 0 ;
#FileNotAtEnd = 0 ;
#FileNotCreated = 0 ;
Structure ProgramData ;
QuitValue.i ;
WindowOpen.i ;
WindowMode.s ;
CurrentLine.i ;
CurrentDirectory.s ;
CurrentKeyFile.s ;
EndStructure ;
Global Program.ProgramData ;
Program\CurrentDirectory.s = GetCurrentDirectory() ;
Program\CurrentKeyFile.s = Program\CurrentDirectory.s + "Default.Keys" ;
; Third party additions (TI994A)
; Set the caret to the chosen position in the string
Procedure SetStringGadgetSelection(GadgetID.i, Start.i, Length.i = 0)
SetActiveGadget(GadgetID.i)
SendMessage_(GadgetID(GadgetID.i), #EM_SETSEL, Start - 1, Start - 1)
EndProcedure
; Get the current caret position in the string
Procedure.i GetCaretPosition(GadgetID.i)
Protected Start.i = 0, Stop.i = 0
SendMessage_(GadgetID(GadgetID.i), #EM_GETSEL, @Start.i, @Stop.i)
ProcedureReturn Stop + 1
EndProcedure
; Restrict the characters that can be typed in the string
Procedure RestrictChars(*pchr.Ascii, slen)
Static newWord = 1
If slen
*pout.Ascii = *pchr
For i = 1 To slen
Select *pchr\a
Case '0' To '9', 'a' To 'z', 'A' To 'Z'
If newWord
changed = i
newWord = 0
EndIf
*pchr + SizeOf(Character)
*pout + SizeOf(Character)
Case '#':
hexcnt + 1
If hexcnt = 1 And i = 1
*pchr + SizeOf(Character)
*pout + SizeOf(Character)
Else
Goto BadChar
EndIf
Case ' ':
newWord = 1
Goto BadChar
Default :
BadChar:
*pchr + SizeOf(Character)
changed = -1
EndSelect
*pout\a = *pchr\a
Next
Else
newWord = 1
EndIf
ProcedureReturn changed
EndProcedure
; Character restriction procedure
Procedure StringFilter()
Static Changing.i
TheGadgetId = EventGadget()
If Not Changing.i
Changing.i = 1
sTxt$ = GetGadgetText(TheGadgetId)
lastcaretpos = GetCaretPosition(TheGadgetId)
currentCharPos = RestrictChars(@sTxt$, Len(sTxt$))
If currentCharPos = -1
SetGadgetText(TheGadgetId, sTxt$)
SetStringGadgetSelection(TheGadgetId, lastcaretpos - 1)
ElseIf currentCharPos > 0
If currentCharPos = 1
prefix$ = "#"
EndIf
sTxt$ = prefix$ + Left(sTxt$, Len(sTxt$) - 1) + UCase(Right(sTxt$, 1))
SetGadgetText(TheGadgetId, sTxt$)
SetStringGadgetSelection(TheGadgetId, lastcaretpos + 1)
EndIf
Changing.i = 0
EndIf
EndProcedure
; Generic, re-useable modules
; Get the text of the associated shortcut constant
Procedure.s GetShortcutText(Constant.i)
; NetMaestro 2009. NetMaestro code modded by Sroddy code ; Unused mod$, ctrl$, shift$, alt$
Protected KeyLocale, VirtualKey, KeyString.s, ResultString.s
If Constant.i & #PB_Shortcut_Control
ResultString.s = "Ctrl + "
EndIf
If Constant.i & #PB_Shortcut_Shift
ResultString.s + "Shift + "
EndIf
If Constant.i & #PB_Shortcut_Alt
ResultString.s + "Alt + "
EndIf
KeyLocale = GetKeyboardLayout_(GetCurrentThreadId_())
KeyString.s = Space(100)
; Virtual key
VirtualKey = MapVirtualKeyEx_(Constant.i & $FF, 0, KeyLocale) << 16
If Constant.i >> 8 & #HOTKEYF_EXT Or (Constant.i & $FF >= #PB_Shortcut_PageUp And Constant.i & $FF <= #PB_Shortcut_Down)
VirtualKey | (1 << 24) ; Set the extended key bit
EndIf
GetKeyNameText_(VirtualKey, @KeyString, 100)
ResultString.s + KeyString.s
If ResultString.s = #Empty$
ResultString.s = "None"
EndIf
ProcedureReturn ResultString.s
EndProcedure
; Custom work modules
; Move lines of text around in a singleListIconGadget
Procedure ListIconGadgetMove(GadgetId.i, Source.i, Destination.i)
NumberOfColumns.i = ListIconGadgetNumberOfColumns(GadgetId) - 1
For ColumnsToMove.i = 0 To NumberOfColumns.i
Source$ = GetGadgetItemText(GadgetId, Source, ColumnsToMove.i)
If Source < Destination
For i = Source To Destination - 1
ColumnString.s = GetGadgetItemText(GadgetId, i + 1, ColumnsToMove.i)
SetGadgetItemText(GadgetId, i, ColumnString.s, ColumnsToMove.i)
Next i
Else
For i = Source To Destination + 1 Step - 1
ColumnString.s = GetGadgetItemText(GadgetId, i - 1, ColumnsToMove.i)
SetGadgetItemText(GadgetId, i, ColumnString.s, ColumnsToMove.i)
Next i
EndIf
SetGadgetItemText(GadgetId, i, Source$, ColumnsToMove.i)
Next ColumnsToMove.i
EndProcedure
; Count the number of columns that a ListIconGadget has
Procedure ListIconGadgetNumberOfColumns(GadgetId.i)
ColumnCount.i = 0
While GetGadgetItemAttribute(GadgetId.i, 0, #PB_ListIcon_ColumnWidth, ColumnCount.i) > 0
ColumnCount.i + 1
Wend
ProcedureReturn ColumnCount.i
EndProcedure
; Count the number of columns that a ListIconGadget has
Procedure ListIconGadgetNumberOfColumns(GadgetId.i)
ColumnCount.i = 0
While GetGadgetItemAttribute(GadgetId.i, 0, #PB_ListIcon_ColumnWidth, ColumnCount.i) > 0
ColumnCount.i + 1
Wend
ProcedureReturn ColumnCount.i
EndProcedure
; Main form procedures called from buttons
Procedure AddKeyData()
If Program\WindowOpen.i = #False
If Window_Keyform()
Program\WindowMode.s = "Add"
BindGadgetEvent(#Gadget_Keyform_Variablename, @StringFilter(), #PB_EventType_Change)
BindGadgetEvent(#Gadget_Keyform_Shortcut, @ShortcutDuplicateCheck()); , #PB_EventType_Change) ; No change event in shortcutgadget
SetActiveGadget(#Gadget_Keyform_Variablename)
Else
; Could not open the key data editing window
EndIf
Else
; Another program window is already open
EndIf
EndProcedure
Procedure DeleteKeyData()
CurrentLine.i = GetGadgetState(#Gadget_Keytext_Keylist)
If CurrentLine.i <> #NoLineSelected
RemoveGadgetItem(#Gadget_Keytext_Keylist, CurrentLine.i)
Else
; No current line selected for deletion
EndIf
EndProcedure
Procedure EditKeyData()
Program\CurrentLine.i = GetGadgetState(#Gadget_Keytext_Keylist)
Variablename.s = GetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, #VariableNameColumn) ; Variable name
If Left(Variablename.s, 5) = "-->> "
ProcedureReturn
EndIf
If Program\CurrentLine.i <> #NoLineSelected
If Program\WindowOpen.i = #False
If Window_Keyform()
Program\WindowMode.s = "Edit"
BindGadgetEvent(#Gadget_Keyform_Variablename, @StringFilter(), #PB_EventType_Change)
BindGadgetEvent(#Gadget_Keyform_Shortcut, @ShortcutDuplicateCheck()) ; , #PB_EventType_Change) ; No change event in shortcutgadget
;Variablename.s = GetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, #VariableNameColumn) ; Variable name
Shorttext.s = GetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, #ShortTextColumn) ; Short key text description
Longtext.s = GetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, #LongTextColumn) ; Long key text description
Shortcut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, #ShortcutColumn) ; Shortcut keystrokes
KeyValue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, #ShortcutValueColumn) ; Keyboard shortcut integer value
SetGadgetText(#Gadget_Keyform_Variablename, Variablename.s)
SetGadgetText(#Gadget_Keyform_Shorttext, Shorttext.s)
SetGadgetText(#Gadget_Keyform_Longtext, Longtext.s)
;SetGadgetText(#Gadget_Keyform_Longtext, Shortcut.s)
SetGadgetState(#Gadget_Keyform_Shortcut, Val(KeyValue.s))
SetActiveGadget(#Gadget_Keyform_Variablename)
Else
; Could not open the keyform data editor window
EndIf
Else
; Another program window is already open
EndIf
Else
; No current line selected for editing
EndIf
EndProcedure
Procedure AddKeySection()
CurrentLine.i = GetGadgetState(#Gadget_Keytext_Keylist)
NumberOfItems.i = CountGadgetItems(#Gadget_Keytext_Keylist)
If NumberOfItems.i = 0
HeadingString.s = InputRequester("Add heading", "Add a section heading", #Empty$)
If HeadingString.s <> #Empty$
HeadingString.s = UCase(Left(HeadingString.s, 1)) + Mid(HeadingString.s, 2, Len(HeadingString.s) -1)
AddGadgetItem(#Gadget_Keytext_Keylist, #AtTheEndOfTheList, "-->> " + HeadingString.s + " <<--" + #LF$ + #Empty$ + #LF$ + #Empty$ + #LF$ + #Empty$)
Else
; Heading string was empty to we will do nothing
EndIf
Else
If CurrentLine.i <> #NoLineSelected
HeadingString.s = InputRequester("Add heading", "Add a section heading", #Empty$)
If HeadingString.s <> #Empty$
HeadingString.s = UCase(Left(HeadingString.s, 1)) + Mid(HeadingString.s, 2, Len(HeadingString.s) -1)
AddGadgetItem(#Gadget_Keytext_Keylist, CurrentLine.i, "-->> " + HeadingString.s + " <<--" + #LF$ + #Empty$ + #LF$ + #Empty$ + #LF$ + #Empty$)
Else
; Heading string was empty to we will do nothing
EndIf
Else
; No line selected so nowhere to insert the heading
EndIf
EndIf
EndProcedure
;
Procedure EditKeySection()
CurrentLine.i = GetGadgetState(#Gadget_Keytext_Keylist)
HeadingString.s = GetGadgetItemText(#Gadget_Keytext_Keylist, CurrentLine.i, #VariableNameColumn)
If Left(HeadingString.s, 5) <> "-->> "
ProcedureReturn
EndIf
HeadingString.s = RemoveString(HeadingString.s, "-->> ", #PB_String_NoCase)
HeadingString.s = RemoveString(HeadingString.s, " <<--", #PB_String_NoCase)
HeadingString.s = InputRequester("Edit heading", "Edit selected section heading", HeadingString.s)
If HeadingString.s <> #Empty$
HeadingString.s = UCase(Left(HeadingString.s, 1)) + Mid(HeadingString.s, 2, Len(HeadingString.s) -1)
SetGadgetItemText(#Gadget_Keytext_Keylist, CurrentLine.i, "-->> " + HeadingString.s + " <<--", #VariableNameColumn)
Else
; Heading string was empty to we will do nothing
EndIf
EndProcedure
; Key data editor form modules
; Save the new or changed key data
Procedure SaveKeyData()
Variablename.s = GetGadgetText(#Gadget_Keyform_Variablename) ;: Debug Variablename.s
Variablename.s = ReplaceString(Variablename.s, "#", #Empty$, #PB_String_NoCase)
Shorttext.s = GetGadgetText(#Gadget_Keyform_Shorttext) ;: Debug Shorttext.s
Shorttext.s = UCase(Left(Shorttext.s, 1)) + Mid(Shorttext.s, 2, Len(Shorttext.s) -1)
Longtext.s = GetGadgetText(#Gadget_Keyform_Longtext) ;: Debug Longtext.s
Shortcut.s = GetShortcutText(GetGadgetState(#Gadget_Keyform_Shortcut)) ;: Debug Shortcut.s
Keyvalue.s = Str(GetGadgetState(#Gadget_Keyform_Shortcut)) ;: Debug Str(Keyvalue.i)
Select Program\WindowMode.s
Case "Add"
AddGadgetItem(#Gadget_Keytext_Keylist, #AtTheEndOfTheList, "#" + Variablename.s + #LF$ + Shorttext.s + #LF$ + Longtext.s + #LF$ + Shortcut.s + #LF$ + Keyvalue.s)
Case "Edit"
SetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, "#" + Variablename.s, #VariableNameColumn)
SetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, Shorttext.s, #ShortTextColumn)
SetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, Longtext.s, #LongTextColumn)
SetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, Shortcut.s, #ShortcutColumn)
SetGadgetItemText(#Gadget_Keytext_Keylist, Program\CurrentLine.i, KeyValue.s, #ShortcutValueColumn)
EndSelect
Program\CurrentLine.i = #NoLineSelected
Program\WindowMode.s = #Empty$
CloseWindow(#Window_Keyform)
EndProcedure
; Loading and saving raw key data files
; Load a raw key data from default or user requested file name
Procedure LoadKeyDataFromFile(DirectoryName.s = #Empty$)
If DirectoryName.s = #Empty$
DirectoryName.s = OpenFileRequester("Key file name", Program\CurrentKeyFile, "Keyfile (*.Keyfile)|*.Keyfile", 0)
EndIf
KeyFileHandle.i = ReadFile(#PB_Any, DirectoryName.s)
If KeyFileHandle.i <> #FileNotRead
ClearGadgetItems(#Gadget_Keytext_Keylist)
While Eof(KeyFileHandle.i) = #FileNotAtEnd
CurrentString.s = ReadString(KeyFileHandle.i)
VariableName.s = StringField(CurrentString.s, 1, "|")
If Left(VariableName.s, 1) = "/"
VariableName.s = RemoveString(VariableName.s, "/")
AddGadgetItem(#Gadget_Keytext_Keylist, #AtTheEndOfTheList, "-->> " + VariableName + " <<--" + #LF$ + #Empty$ + #LF$ + #Empty$ + #LF$ + #Empty$ + #LF$ + #Empty$)
Else
ShortText.s = StringField(CurrentString.s, 2, "|")
LongText.s = StringField(CurrentString.s, 3, "|")
ShortCut.s = StringField(CurrentString.s, 4, "|")
Keyvalue.s = StringField(CurrentString.s, 5, "|")
AddGadgetItem(#Gadget_Keytext_Keylist, #AtTheEndOfTheList, VariableName.s + #LF$ + ShortText.s + #LF$ + LongText.s + #LF$ + Shortcut.s + #LF$ + Keyvalue.s)
EndIf
Wend
CloseFile(KeyFileHandle.i)
Else
; Could not open the specified file to be read
EndIf
EndProcedure
; Save the raw key data to a default file or user requested file name
Procedure SaveKeyDataToFile(DirectoryName.s = #Empty$)
NumberOfItems.i = CountGadgetItems(#Gadget_Keytext_Keylist)
If NumberOfItems.i <> #NoItemsInList
If DirectoryName.s = #Empty$
DirectoryName.s = SaveFileRequester("Key file name", Program\CurrentKeyFile, "Keyfile (*.Keyfile)|*.Keyfile", 0)
EndIf
KeyFileHandle.i = CreateFile(#PB_Any, DirectoryName.s)
If KeyFileHandle.i <> #FileNotCreated
For ReadItemLoop.i = 0 To NumberOfItems.i -1
VariableName.s = GetGadgetItemText(#Gadget_Keytext_Keylist, ReadItemLoop.i, #VariableNameColumn)
If Left(VariableName.s, 5) = "-->> "
VariableName.s = RemoveString(VariableName.s, "-->> ")
VariableName.s = RemoveString(VariableName.s, " <<--")
WriteStringN(KeyFileHandle.i, "/" + VariableName.s)
Else
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, ReadItemLoop.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, ReadItemLoop.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, ReadItemLoop.i, #ShortcutColumn)
Keyvalue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, ReadItemLoop.i, #ShortcutValueColumn)
WriteString(KeyFileHandle.i, VariableName.s + "|") ;: Debug VariableName.s
WriteString(KeyFileHandle.i, ShortText.s + "|") ;: Debug ShortText.s
WriteString(KeyFileHandle.i, LongText.s + "|") ;: Debug LongText.s
WriteString(KeyFileHandle.i, ShortCut.s + "|") ;: Debug ShortCut.s
WriteStringN(KeyFileHandle.i, Keyvalue.s) ;: Debug Str(ShortCut.i)
EndIf
Next ReadItemLoop.i
CloseFile(KeyFileHandle.i)
Else
; Could not create the new key file for reading
EndIf
Else
; No items in the list to be saved
EndIf
EndProcedure
; Exporting key data to project files
; Export the raw key data to PB includeable files on disk
Procedure ExportKeyDataToProject()
Macro WritePageHeading(Heading)
WriteStringN(ExportFileHandle.i, #Empty$)
WriteStringN(ExportFileHandle.i, ";==============================================================================================================================================================================")
WriteStringN(ExportFileHandle.i, "; " + Heading)
WriteStringN(ExportFileHandle.i, ";==============================================================================================================================================================================")
WriteStringN(ExportFileHandle.i, #Empty$)
EndMacro
Macro WriteSectionHeading(Heading)
WriteStringN(ExportFileHandle.i, #Empty$)
WriteStringN(ExportFileHandle.i, " ;-----------------------------------------------")
WriteStringN(ExportFileHandle.i, " ; " + Heading)
WriteStringN(ExportFileHandle.i, " ;-----------------------------------------------")
WriteStringN(ExportFileHandle.i, #Empty$)
EndMacro
ExportFile.s = SaveFileRequester("PB file name", "Default_Myconstants.pb", "(*.pb)|*.pb", 0)
If ExportFile.s <> #Empty$
ExportFileHandle.i = CreateFile(#PB_Any, ExportFile.s)
If ExportFileHandle.i <> #FileNotCreated
NumberOfItems.i = CountGadgetItems(#Gadget_Keytext_Keylist)
If NumberOfItems.i <> #NoItemsInList
;// Write out the Menu keys structure for short and long text
WritePageHeading("Menu keys structure for short and long text")
WriteStringN(ExportFileHandle.i, "Structure MenuKeys")
For WriteMenuKeys.i = 0 To NumberofItems.i - 1
Variable.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #VariableNameColumn)
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutColumn)
KeyValue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutValueColumn)
If Left(Variable.s, 5) = "-->> "
WriteSectionHeading(Variable.s)
Else
Variable.s = RemoveString(Variable.s, "#", #PB_String_NoCase)
WriteStringN(ExportFileHandle.i, " " + Variable.s + ".s")
EndIf
Next WriteMenuKeys.i
WriteStringN(ExportFileHandle.i, "EndStructure")
;// Write out the Shortcut keys structure, integers
WritePageHeading("Shortcut keys structure, integers")
WriteStringN(ExportFileHandle.i, "Structure ShortcutKeys")
For WriteMenuKeys.i = 0 To NumberofItems.i - 1
Variable.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #VariableNameColumn)
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutColumn)
KeyValue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutValueColumn)
If Left(Variable.s, 5) = "-->> "
WriteSectionHeading(Variable.s)
Else
Variable.s = RemoveString(Variable.s, "#", #PB_String_NoCase)
WriteStringN(ExportFileHandle.i, " " + Variable.s + ".i")
EndIf
Next WriteMenuKeys.i
WriteStringN(ExportFileHandle.i, "EndStructure")
;// Write out global reference to menu structures
WritePageHeading("Global reference to menu structures")
WriteStringN(ExportFileHandle.i, "Global ShortText.MenuText")
WriteStringN(ExportFileHandle.i, "Global LongText.MenuText")
WriteStringN(ExportFileHandle.i, "Global Shortcut.ShortcutKeys")
;// Write out short menu text definitions
WritePageHeading("Short menu text definitions")
For WriteMenuKeys.i = 0 To NumberofItems.i - 1
Variable.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #VariableNameColumn)
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutColumn)
KeyValue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutValueColumn)
If Left(Variable.s, 5) = "-->> "
WriteSectionHeading(Variable.s)
Else
Variable.s = RemoveString(Variable.s, "#", #PB_String_NoCase)
WriteStringN(ExportFileHandle.i, LSet("ShortText\" + Variable.s + ".s", 35, " ") + " = " + #DQUOTE$ + ShortText.s + #DQUOTE$)
EndIf
Next WriteMenuKeys.i
;// Write out long menu text definitions
WritePageHeading("Long menu text definitions")
For WriteMenuKeys.i = 0 To NumberofItems.i - 1
Variable.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #VariableNameColumn)
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutColumn)
KeyValue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutValueColumn)
If Left(Variable.s, 5) = "-->> "
WriteSectionHeading(Variable.s)
Else
Variable.s = RemoveString(Variable.s, "#", #PB_String_NoCase)
WriteStringN(ExportFileHandle.i, LSet("LongText\" + Variable.s + ".s", 35, " ") + " = " + #DQUOTE$ + LongText.s + #DQUOTE$)
EndIf
Next WriteMenuKeys.i
;// Write out keyboard shortcut values
WritePageHeading("Keyboard shortcut values")
For WriteMenuKeys.i = 0 To NumberofItems.i - 1
Variable.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #VariableNameColumn)
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutColumn)
KeyValue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutValueColumn)
If Left(Variable.s, 5) = "-->> "
WriteSectionHeading(Variable.s)
Else
Variable.s = RemoveString(Variable.s, "#", #PB_String_NoCase)
ShortCut.s = RemoveString(ShortCut.s, #Empty$, #PB_String_NoCase)
Delimiters.i = CountString(ShortCut.s, "+")
For TestLoop.i = 1 To Delimiters.i + 1
CurrentString.s = Trim(StringField(ShortCut.s, TestLoop.i, "+"))
Select CurrentString
Case "Ctrl" : OutputString.s + "#PB_Shortcut_Control " + "| "
Case "Shift" : OutputString.s + "#PB_Shortcut_Shift " + "| "
Case "Alt" : OutputString.s + "#PB_Shortcut_Alt " + "| "
Default : OutputString.s + "#PB_Shortcut_" + CurrentString
EndSelect
Next TestLoop.i
WriteStringN(ExportFileHandle.i, LSet("Shortcut\" + Variable.s, 35, " ") + " = " + OutputString.s)
OutputString.s = #Empty$
EndIf
Next WriteMenuKeys.i
;// Write out the datasection shortcut keys
WritePageHeading("Enumeration section for keyboard shortcut constants")
WriteStringN(ExportFileHandle.i, "Enumeration #GadgetIndex") ; #GadgetIndex follows on from previous eumerations
For WriteMenuKeys.i = 0 To NumberofItems.i - 1
Variable.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #VariableNameColumn)
ShortText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortTextColumn)
LongText.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #LongTextColumn)
ShortCut.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutColumn)
Keyvalue.s = GetGadgetItemText(#Gadget_Keytext_Keylist, WriteMenuKeys.i, #ShortcutValueColumn)
If Left(Variable.s, 5) = "-->> "
WriteSectionHeading(Variable.s)
Else
Variable.s = RemoveString(Variable.s, "#", #PB_String_NoCase)
WriteStringN(ExportFileHandle.i, " #Shortcut" + Variable.s)
EndIf
Next WriteMenuKeys.i
WriteStringN(ExportFileHandle.i, "EndEnumeration")
;//
Else
; No items in the list to be processed
EndIf
CloseFile(ExportFileHandle.i)
Else
; Export file handle could not be created
EndIf
Else
; Export filename was empty, nothing to do
EndIf
EndProcedure
; Main program event handler
If Window_Keytext()
Program\QuitValue.i = #False
EnableGadgetDrop(#Gadget_Keytext_Keylist, #PB_Drop_Private, #PB_Drag_Move, 1)
DragItem.i = -1
LoadKeyDataFromFile(Program\CurrentKeyFile.s)
Repeat
EventID = WaitWindowEvent()
MenuID = EventMenu()
GadgetID = EventGadget()
WindowID = EventWindow()
Select EventID
Case #PB_Event_CloseWindow
Select WindowID
Case #Window_Keytext : Program\QuitValue.i = #True
Case #Window_Keyform : CloseWindow(#Window_Keyform)
EndSelect
Case #PB_Event_GadgetDrop
Select GadgetID
Case #Gadget_Keytext_Keylist
Select EventDropType()
Case #PB_Drop_Private
Select EventDropPrivate()
Case 1 : TargetItem = GetGadgetState(GadgetID) : ListIconGadgetMove(GadgetID, DragItem.i, TargetItem)
EndSelect
EndSelect
EndSelect
Case #PB_Event_Gadget
Select GadgetID
Case #Gadget_Keytext_Keylist
Select EventType()
Case #PB_EventType_LeftDoubleClick : EditKeyData()
Case #PB_EventType_RightDoubleClick : EditKeySection()
Case #PB_EventType_DragStart : DragItem.i = GetGadgetState(GadgetID) : DragPrivate(1, #PB_Drag_Move)
EndSelect
Case #Gadget_Keytext_Add : AddKeyData()
Case #Gadget_Keytext_Delete : DeleteKeyData()
Case #Gadget_Keytext_Edit : EditKeyData()
Case #Gadget_Keytext_Addsection : AddKeySection()
Case #Gadget_Keytext_Editsection : EditKeySection()
Case #Gadget_Keytext_Load : LoadKeyDataFromFile()
Case #Gadget_Keytext_Save : SaveKeyDataToFile()
Case #Gadget_Keytext_Export : ExportKeyDataToProject()
Case #Gadget_Keytext_Exit : Program\QuitValue.i = #True
Case #Gadget_Keyform_Exit : CloseWindow(#Window_Keyform)
Case #Gadget_Keyform_Save : SaveKeyData()
EndSelect
EndSelect
Until Program\QuitValue.i = #True
SaveKeyDataToFile(Program\CurrentKeyFile)
CloseWindow(#Window_Keytext)
EndIf
End