yes you can modify the source, just give me some props somewhere.
NOTE RJ: when opening LARGE INI files, and you have deleted some sections thereby shortening the ini length, the program will write from line 0 of the file until all INI sections are done,
and then will writestringn() until the end of the file to get rid of unneeded or no longer correct headings. it keeps the file about the same size. THIS ONLY applies toi HUGE ini files.
Code: Select all
Global currentfile$,theysaved
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- MenuBar Constants
;
Enumeration
#MenuBar_0
EndEnumeration
Enumeration
#MENU_1
#MENU_4
#MENU_5
#MENU_7
#MENU_8
#menu_9
#menu_10
EndEnumeration
;- Gadget Constants
;
#Tree_0=200
#Button_0=201
#Button_1=202
#String_1=203
#String_2=204
#Text_1=205
#Text_3=206
#Text_2=207
#Button_2=208
#Text_4=209
;- Fonts
;
Global FontID1
FontID1 = LoadFont(1, "Txt", 10, #PB_Font_Underline)
Global FontID2
FontID2 = LoadFont(2, "Times New Roman", 10)
Global FontID3
FontID3 = LoadFont(3, "Arial", 10)
Global FontID4
FontID4 = LoadFont(4, "Arial", 10, #PB_Font_Underline)
;- Structures and Lists
Structure info
key.l
section.l
value.s
EndStructure
Dim inilist.s(2000)
NewList elements.info()
;- Procedures
Procedure.l writeINI(section.s,key.s,value.s,inifile.s)
result=WritePrivateProfileString_(section,key,value,inifile)
ProcedureReturn result
EndProcedure
Procedure Callback(Window.l, message.l, wParam.l, lParam.l)
result = #PB_ProcessPureBasicEvents
If message = #WM_NOTIFY
*lp.NMHDR = lParam
Select *lp\code
Case #TVN_BEGINLABELEDIT
Case #TVN_ENDLABELEDIT
*pvdi.NMTVDISPINFO = lParam
If *pvdi\item\pszText <> #Null
Text.s = PeekS(*pvdi\item\pszText)
If Text = ""
result = #False
Else
result = #True
EndIf
EndIf
EndSelect
EndIf
ProcedureReturn result
EndProcedure
Procedure Open_Window_0()
If OpenWindow(#Window_0, 395, 142, 570, 456, #PB_Window_SystemMenu | #PB_Window_TitleBar|#PB_Window_WindowCentered , "PureINI Editor - By Localmotion34")
If CreateMenu(#MenuBar_0, WindowID())
MenuTitle("File")
MenuItem(#MENU_1, "New")
MenuItem(#MENU_4, "Open")
MenuBar()
MenuItem(#MENU_5, "Save")
MenuItem(#MENU_7, "Save As...")
MenuBar()
MenuItem(#MENU_8, "Exit")
MenuTitle("Edit")
MenuItem(#menu_10 ,"Select All")
MenuItem(#menu_9,"Copy")
EndIf
If CreateGadgetList(WindowID())
TreeGadget(#Tree_0, 1, 10, 130, 420,#PB_Tree_AlwaysShowSelection)
ButtonGadget(#Button_0, 140, 10, 120, 20, "New Section")
ButtonGadget(#Button_1, 140, 30, 120, 20, "New Key")
EditorGadget(#String_1, 140, 140, 420, 290)
StringGadget(#String_2, 140, 80, 120, 20, ""):DisableGadget(#String_2,1)
TextGadget(#Text_1, 140, 60, 120, 20, "Value", #PB_Text_Center)
SetGadgetFont(#Text_1, FontID4)
TextGadget(#Text_3, 310, 10, 120, 20, "Currently Editing Section:")
TextGadget(#Text_2, 310, 30, 120, 20, "", #PB_Text_Border|#PB_Text_Center)
ButtonGadget(#Button_2, 300, 60, 140, 40, "Test Output")
TextGadget(#Text_4, 180, 120, 320, 20, "Quick Output", #PB_Text_Center)
SetWindowLong_(GadgetID(#Tree_0),#GWL_STYLE,GetWindowLong_(GadgetID(#Tree_0),#GWL_STYLE) | #TVS_EDITLABELS)
EndIf
EndIf
SetWindowCallback(@Callback())
EndProcedure
Procedure updateINI()
SetGadgetText(#String_1,"")
selectedItem=0
Repeat
currentitem=GadgetItemID(#Tree_0,selectedItem)
If currentitem=#Null
Break
EndIf
message1=SendMessage_(GadgetID(#Tree_0),#TVM_GETNEXTITEM ,#TVGN_CHILD,currentitem)
If message1 =#Null
inilist(selectedItem)=GetGadgetItemText(#Tree_0,selectedItem,0)
AddGadgetItem(#String_1,-1, "["+inilist(selectedItem)+"]")
AddGadgetItem(#String_1,-1,"")
selectedItem=selectedItem+1
ElseIf message1 <> #Null
inilist(selectedItem)=GetGadgetItemText(#Tree_0,selectedItem,0)
AddGadgetItem(#String_1,-1, "["+inilist(selectedItem)+"]")
nodeitems=CountTreeGadgetNodeItems(#Tree_0, selectedItem)
For a=selectedItem+1 To selectedItem+nodeitems
inilist(a)=GetGadgetItemText(#Tree_0,a,0)
SelectElement(elements(),a)
AddGadgetItem(#String_1,-1,inilist(a)+"=" +elements()\value)
Next
AddGadgetItem(#String_1,-1,"")
selectedItem=selectedItem+nodeitems+1
EndIf
Until currentitem=0
EndProcedure
Procedure openINI(file$)
If file$=""
Else
currentfile$=file$
ClearList(elements())
ClearGadgetItemList(#Tree_0)
SetGadgetText(#String_1,"")
SetGadgetText(#String_2,"")
OpenFile(99, file$)
Repeat
currenttext$=ReadString()
If currenttext$=""
Else
If Asc(currenttext$)=91
Length=Len(currenttext$)
Result$ = Left(currenttext$, Length-1)
Length=Len(Result$)
Result1$ = Right(Result$, Length-1)
thisitem=AddGadgetItem(#Tree_0,-1,Result1$)
AddElement(elements())
ElseIf Asc(currenttext$)<>59
result2$=StringField(currenttext$,1,"=")
result3$=StringField(currenttext$,2,"=")
OpenTreeGadgetNode(#Tree_0)
AddGadgetItem(#Tree_0,-1,result2$)
AddElement(elements())
elements()\value=result3$
CloseTreeGadgetNode(#Tree_0)
EndIf
EndIf
Until Eof(99)
CloseFile(99)
theysaved=1
EndIf
EndProcedure
Procedure saveINI()
savedfile$=SaveFileRequester("Please Choose A File To Save","","INI Files|*.INI",0)
files$=GetExtensionPart(savedfile$)
If files$="ini"
savefile$=savedfile$
Else
savefile$=savedfile$ + ".ini"
EndIf
If savedfile$=""
Else
OpenFile(100,savefile$)
selectedItem=0
Repeat
currentitem=GadgetItemID(#Tree_0,selectedItem)
If currentitem=#Null
Break
EndIf
message1=SendMessage_(GadgetID(#Tree_0),#TVM_GETNEXTITEM ,#TVGN_CHILD,currentitem)
If message1 =#Null
inilist(selectedItem)=GetGadgetItemText(#Tree_0,selectedItem,0)
WriteStringN("["+inilist(selectedItem)+"]")
selectedItem=selectedItem+1
ElseIf message1 <> #Null
inilist(selectedItem)=GetGadgetItemText(#Tree_0,selectedItem,0)
WriteStringN("["+inilist(selectedItem)+"]")
nodeitems=CountTreeGadgetNodeItems(#Tree_0, selectedItem)
For a=selectedItem+1 To selectedItem+nodeitems
inilist(a)=GetGadgetItemText(#Tree_0,a,0)
SelectElement(elements(),a)
WriteStringN(inilist(a)+"=" +elements()\value)
Next
selectedItem=selectedItem+nodeitems+1
EndIf
Until currentitem=#Null
Repeat
WriteStringN("")
Until Eof(100)
CloseFile(100)
theysaved=1
currentfile$=savefile$
EndIf
EndProcedure
Procedure justsaveINI()
If OpenFile(100,currentfile$)
selectedItem=0
Repeat
currentitem=GadgetItemID(#Tree_0,selectedItem)
If currentitem=#Null
Break
EndIf
message1=SendMessage_(GadgetID(#Tree_0),#TVM_GETNEXTITEM ,#TVGN_CHILD,currentitem)
If message1 =#Null
inilist(selectedItem)=GetGadgetItemText(#Tree_0,selectedItem,0)
WriteStringN("["+inilist(selectedItem)+"]")
selectedItem=selectedItem+1
ElseIf message1 <> #Null
inilist(selectedItem)=GetGadgetItemText(#Tree_0,selectedItem,0)
WriteStringN("["+inilist(selectedItem)+"]")
nodeitems=CountTreeGadgetNodeItems(#Tree_0, selectedItem)
For a=selectedItem+1 To selectedItem+nodeitems
inilist(a)=GetGadgetItemText(#Tree_0,a,0)
SelectElement(elements(),a)
WriteStringN(inilist(a)+"=" +elements()\Value)
Next
selectedItem=selectedItem+nodeitems+1
EndIf
Until currentitem=#Null
Repeat
WriteStringN("")
Until Eof(100)
CloseFile(100)
EndIf
EndProcedure
theysaved=0
CreatePopupMenu(100)
MenuItem(100,"Remove Item")
MenuItem(101,"Expand All")
MenuItem(102,"Collapse All")
;- Program
Open_Window_0()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_EventMenu
MenuID = EventMenuID()
Select MenuID
Case #MENU_1
proceed=MessageRequester("Info","Are You Sure You Want To Proceed? All Unsaved Information Will Be Lost",#PB_MessageRequester_YesNo)
If proceed=6
ClearList(elements())
SetGadgetText(#String_1,"")
ClearGadgetItemList(#Tree_0)
theysaved=0
EndIf
Case #MENU_4
openedfile$=OpenFileRequester("Please Specify An INI File To Open","","INI File|*.ini",0)
openINI(openedfile$)
Case #MENU_5
If theysaved=0
saveINI()
ElseIf theysaved=1
justsaveINI()
EndIf
Case #MENU_8
End
Case 100
selectedentry=GetGadgetState(#Tree_0)
currentitem=GadgetItemID(#Tree_0,selectedentry)
message1=SendMessage_(GadgetID(#Tree_0),#TVM_GETNEXTITEM ,#TVGN_CHILD,currentitem)
If message1 =#Null
SelectElement(elements(),selectedentry)
DeleteElement(elements())
RemoveGadgetItem(#Tree_0,selectedentry)
ElseIf message1 <> #Null
nodenumber=CountTreeGadgetNodeItems(#Tree_0,selectedentry)
RemoveGadgetItem(#Tree_0,selectedentry)
For a=selectedentry To selectedentry+nodenumber
SelectElement(elements(),selectedentry)
DeleteElement(elements())
Next
EndIf
Case 101
For b=0 To CountGadgetItems(#Tree_0)-1
SetGadgetItemState(#Tree_0, b, #PB_Tree_Expanded )
Next
Case 102
For b=0 To CountGadgetItems(#Tree_0)-1
SetGadgetItemState(#Tree_0, b, #PB_Tree_Collapsed)
Next
Case #MENU_7
saveINI()
Case #menu_9
*Buffer = AllocateMemory(64000)
SendMessage_(GadgetID(#String_1), #EM_GETSELTEXT, 0, *Buffer)
TextCapture$ = PeekS(*Buffer)
SetClipboardText(TextCapture$)
FreeMemory(*Buffer)
Case #menu_10
SendMessage_(GadgetID(#String_1),#em_setsel,0,-1)
EndSelect
Case #PB_EventGadget
GadgetID = EventGadgetID()
Select GadgetID
Case #Tree_0
If EventType()=#PB_EventType_LeftDoubleClick
selectedItem=GetGadgetState(#Tree_0)
currentitem=GadgetItemID(#Tree_0,selectedItem)
SendMessage_(GadgetID(#Tree_0),#TVM_EDITLABEL,0,currentitem)
ElseIf EventType()=#PB_EventType_RightClick
DisplayPopupMenu(100,WindowID())
EndIf
selectedItem=GetGadgetState(#Tree_0)
currentitem=GadgetItemID(#Tree_0,selectedItem)
If SendMessage_(GadgetID(#Tree_0),#TVM_GETNEXTITEM ,#TVGN_PARENT,currentitem)<>#Null
DisableGadget(#String_2,0)
SelectElement(elements(),selectedItem)
SetGadgetText(#String_2,elements()\value)
Else
DisableGadget(#String_2,1)
SetGadgetText(#String_2,"")
SetGadgetText(#Text_2,GetGadgetItemText(#Tree_0,GetGadgetState(#Tree_0),0))
EndIf
Case #Button_0
LastElement(elements())
AddElement(elements())
current=ListIndex(elements())
AddGadgetItem(#Tree_0,-1,"New Section"+ " " + Str(current))
elements()\section=1
elements()\key=0
elements()\value=""
Case #Button_1
selectedItem=GetGadgetState(#Tree_0)
If selectedItem=-1
Else
currentitem=GadgetItemID(#Tree_0,selectedItem)
If SendMessage_(GadgetID(#Tree_0),#TVM_GETNEXTITEM ,#TVGN_PARENT,currentitem)=#Null
currentselection=GetGadgetState(#Tree_0)
currentitem=OpenTreeGadgetNode(#Tree_0,currentselection)
itemtoadd=CountTreeGadgetNodeItems(#Tree_0, currentselection)
AddGadgetItem(#Tree_0,currentselection+itemtoadd+1,"New Key")
CloseTreeGadgetNode(#Tree_0,currentselection)
SelectElement(elements(),GetGadgetState(#Tree_0)+itemtoadd)
AddElement(elements())
elements()\section=0
elements()\key=1
elements()\value=""
EndIf
EndIf
Case #Button_2
updateINI()
Case #String_2
If EventType()=#PB_EventType_Change
If CountGadgetItems(#Tree_0)=0
Else
SelectElement(elements(),GetGadgetState(#Tree_0))
elements()\value=GetGadgetText(#String_2)
EndIf
ElseIf EventType()=#PB_EventType_LostFocus
Debug "Hi"
EndIf
EndSelect
EndSelect
Until Event = #PB_EventCloseWindow
End