#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=config.ico
#AutoIt3Wrapper_Res_Comment=Config INI Viewer
#AutoIt3Wrapper_Res_Description=INI 파일 키-값 뷰어
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Array.au3>
; ================================================================
; Config.ini Viewer - INI 파일 키-값 검색 및 표시 프로그램
; ================================================================
Global $hGUI, $idListView, $idSearchInput, $idFileInput
Global $idBtnBrowse, $idBtnLoad, $idBtnSearch, $idBtnClear, $idBtnExport, $idBtnEdit, $idBtnRefresh
Global $idStatusLabel, $idChkCaseSensitive, $idComboSection
Global $sCurrentFile = ""
Global $aOriginalData[0][3] ; Section, Key, Value 저장
Global $iDataCount = 0
Main()
Func Main()
CreateGUI()
GUISetState(@SW_SHOW, $hGUI)
While 1
Local $nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitProgram()
Case $idBtnBrowse
BrowseFile()
Case $idBtnLoad
LoadINIFile()
Case $idBtnSearch
SearchData()
Case $idBtnClear
ClearSearch()
Case $idBtnExport
ExportToCSV()
Case $idBtnEdit
EditSelectedItem()
Case $idBtnRefresh
RefreshData()
Case $idComboSection
FilterBySection()
EndSwitch
WEnd
EndFunc
Func CreateGUI()
; 메인 윈도우 생성
$hGUI = GUICreate("Config.ini Viewer v1.0", 900, 600, -1, -1, $WS_OVERLAPPEDWINDOW)
; 파일 선택 영역
GUICtrlCreateGroup("INI 파일 선택", 10, 10, 880, 60)
GUICtrlCreateLabel("파일 경로:", 20, 30, 60, 20)
$idFileInput = GUICtrlCreateInput("", 85, 28, 650, 22, $ES_READONLY)
$idBtnBrowse = GUICtrlCreateButton("파일 선택", 745, 27, 70, 25)
$idBtnLoad = GUICtrlCreateButton("불러오기", 825, 27, 60, 25)
GUICtrlSetFont($idBtnLoad, 9, 600)
GUICtrlCreateGroup("", -99, -99, 1, 1)
; 검색 및 필터 영역
GUICtrlCreateGroup("검색 및 필터", 10, 80, 880, 60)
GUICtrlCreateLabel("검색:", 20, 105, 40, 20)
$idSearchInput = GUICtrlCreateInput("", 65, 102, 300, 22)
$idBtnSearch = GUICtrlCreateButton("검색", 375, 101, 60, 25)
$idBtnClear = GUICtrlCreateButton("초기화", 445, 101, 60, 25)
GUICtrlCreateLabel("섹션:", 530, 105, 40, 20)
$idComboSection = GUICtrlCreateCombo("", 575, 102, 150, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData($idComboSection, "전체 섹션")
GUICtrlSetState($idComboSection, $GUI_DISABLE)
$idChkCaseSensitive = GUICtrlCreateCheckbox("대소문자 구분", 740, 104, 100, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
; ListView 생성
GUICtrlCreateGroup("검색 결과", 10, 150, 880, 390)
$idListView = GUICtrlCreateListView("섹션|키|값", 20, 170, 860, 330, $LVS_REPORT + $LVS_GRIDLINES + $LVS_FULLROWSELECT, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)
; 컬럼 너비 설정
_GUICtrlListView_SetColumnWidth($idListView, 0, 200) ; 섹션
_GUICtrlListView_SetColumnWidth($idListView, 1, 250) ; 키
_GUICtrlListView_SetColumnWidth($idListView, 2, 400) ; 값
GUICtrlCreateGroup("", -99, -99, 1, 1)
; 하단 버튼 영역
$idBtnRefresh = GUICtrlCreateButton("새로고침", 20, 555, 80, 30)
$idBtnEdit = GUICtrlCreateButton("값 수정", 110, 555, 80, 30)
$idBtnExport = GUICtrlCreateButton("CSV 내보내기", 200, 555, 100, 30)
; 상태 표시
$idStatusLabel = GUICtrlCreateLabel("INI 파일을 선택하세요.", 320, 562, 550, 20)
GUICtrlSetColor($idStatusLabel, 0x0000FF)
; 더블클릭으로 값 수정
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "OnListViewDoubleClick")
EndFunc
Func BrowseFile()
Local $sFile = FileOpenDialog("INI 파일 선택", @ScriptDir, "INI 파일 (*.ini)|모든 파일 (*.*)", 1)
If Not @error And $sFile <> "" Then
GUICtrlSetData($idFileInput, $sFile)
$sCurrentFile = $sFile
UpdateStatus("파일이 선택되었습니다: " & $sFile)
EndIf
EndFunc
Func LoadINIFile()
Local $sFile = GUICtrlRead($idFileInput)
If $sFile = "" Then
MsgBox(48, "알림", "INI 파일을 먼저 선택해주세요.")
Return
EndIf
If Not FileExists($sFile) Then
MsgBox(16, "오류", "파일을 찾을 수 없습니다: " & $sFile)
Return
EndIf
; 기존 데이터 초기화
_GUICtrlListView_DeleteAllItems($idListView)
ReDim $aOriginalData[0][3]
$iDataCount = 0
UpdateStatus("파일을 읽는 중...")
; INI 파일 읽기
Local $aSections = IniReadSectionNames($sFile)
If @error Then
MsgBox(16, "오류", "INI 파일을 읽을 수 없습니다.")
UpdateStatus("오류: INI 파일을 읽을 수 없습니다.")
Return
EndIf
; 섹션 콤보박스 업데이트
GUICtrlSetData($idComboSection, "전체 섹션")
For $i = 1 To $aSections[0]
GUICtrlSetData($idComboSection, $aSections[$i])
Next
GUICtrlSetState($idComboSection, $GUI_ENABLE)
; 각 섹션별로 키-값 읽기
Local $iTotalItems = 0
For $i = 1 To $aSections[0]
Local $aKeys = IniReadSection($sFile, $aSections[$i])
If Not @error Then
For $j = 1 To $aKeys[0][0]
; 배열에 데이터 저장
ReDim $aOriginalData[$iDataCount + 1][3]
$aOriginalData[$iDataCount][0] = $aSections[$i]
$aOriginalData[$iDataCount][1] = $aKeys[$j][0]
$aOriginalData[$iDataCount][2] = $aKeys[$j][1]
$iDataCount += 1
; ListView에 추가
Local $iIndex = _GUICtrlListView_AddItem($idListView, $aSections[$i])
_GUICtrlListView_AddSubItem($idListView, $iIndex, $aKeys[$j][0], 1)
_GUICtrlListView_AddSubItem($idListView, $iIndex, $aKeys[$j][1], 2)
$iTotalItems += 1
Next
EndIf
Next
UpdateStatus("총 " & $iTotalItems & "개 항목을 불러왔습니다. (섹션: " & $aSections[0] & "개)")
; 검색 입력란 활성화
GUICtrlSetState($idSearchInput, $GUI_ENABLE)
GUICtrlSetState($idBtnSearch, $GUI_ENABLE)
EndFunc
Func SearchData()
Local $sSearchText = GUICtrlRead($idSearchInput)
Local $bCaseSensitive = (GUICtrlRead($idChkCaseSensitive) = $GUI_CHECKED)
If $sSearchText = "" Then
MsgBox(48, "알림", "검색할 텍스트를 입력하세요.")
Return
EndIf
; ListView 초기화
_GUICtrlListView_DeleteAllItems($idListView)
Local $iFoundCount = 0
; 원본 데이터에서 검색
For $i = 0 To $iDataCount - 1
Local $sSection = $aOriginalData[$i][0]
Local $sKey = $aOriginalData[$i][1]
Local $sValue = $aOriginalData[$i][2]
Local $bFound = False
If $bCaseSensitive Then
; 대소문자 구분
If StringInStr($sSection, $sSearchText) Or _
StringInStr($sKey, $sSearchText) Or _
StringInStr($sValue, $sSearchText) Then
$bFound = True
EndIf
Else
; 대소문자 무시
If StringInStr($sSection, $sSearchText, 0) Or _
StringInStr($sKey, $sSearchText, 0) Or _
StringInStr($sValue, $sSearchText, 0) Then
$bFound = True
EndIf
EndIf
If $bFound Then
Local $iIndex = _GUICtrlListView_AddItem($idListView, $sSection)
_GUICtrlListView_AddSubItem($idListView, $iIndex, $sKey, 1)
_GUICtrlListView_AddSubItem($idListView, $iIndex, $sValue, 2)
$iFoundCount += 1
EndIf
Next
If $iFoundCount > 0 Then
UpdateStatus($iFoundCount & "개 항목을 찾았습니다. (검색어: '" & $sSearchText & "')")
Else
UpdateStatus("검색 결과가 없습니다.")
MsgBox(64, "검색 결과", "'" & $sSearchText & "'에 대한 검색 결과가 없습니다.")
EndIf
EndFunc
Func ClearSearch()
; 검색 초기화 및 전체 데이터 표시
GUICtrlSetData($idSearchInput, "")
GUICtrlSetData($idComboSection, "전체 섹션")
_GUICtrlListView_DeleteAllItems($idListView)
; 전체 데이터 다시 표시
For $i = 0 To $iDataCount - 1
Local $iIndex = _GUICtrlListView_AddItem($idListView, $aOriginalData[$i][0])
_GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][1], 1)
_GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][2], 2)
Next
UpdateStatus("전체 " & $iDataCount & "개 항목을 표시합니다.")
EndFunc
Func FilterBySection()
Local $sSelectedSection = GUICtrlRead($idComboSection)
If $sSelectedSection = "전체 섹션" Or $sSelectedSection = "" Then
ClearSearch()
Return
EndIf
; ListView 초기화
_GUICtrlListView_DeleteAllItems($idListView)
Local $iFoundCount = 0
; 선택된 섹션만 표시
For $i = 0 To $iDataCount - 1
If $aOriginalData[$i][0] = $sSelectedSection Then
Local $iIndex = _GUICtrlListView_AddItem($idListView, $aOriginalData[$i][0])
_GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][1], 1)
_GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][2], 2)
$iFoundCount += 1
EndIf
Next
UpdateStatus("'" & $sSelectedSection & "' 섹션: " & $iFoundCount & "개 항목")
EndFunc
Func EditSelectedItem()
Local $iSelected = _GUICtrlListView_GetSelectedIndices($idListView)
If $iSelected = "" Then
MsgBox(48, "알림", "수정할 항목을 선택하세요.")
Return
EndIf
; 선택된 항목 정보 가져오기
Local $sSection = _GUICtrlListView_GetItemText($idListView, $iSelected, 0)
Local $sKey = _GUICtrlListView_GetItemText($idListView, $iSelected, 1)
Local $sValue = _GUICtrlListView_GetItemText($idListView, $iSelected, 2)
; 새 값 입력받기
Local $sNewValue = InputBox("값 수정", "새로운 값을 입력하세요:" & @CRLF & @CRLF & _
"섹션: " & $sSection & @CRLF & _
"키: " & $sKey, $sValue, "", 400, 200)
If @error Then Return
; INI 파일에 저장
If IniWrite($sCurrentFile, $sSection, $sKey, $sNewValue) Then
; ListView 업데이트
_GUICtrlListView_SetItemText($idListView, $iSelected, $sNewValue, 2)
; 원본 데이터 배열 업데이트
For $i = 0 To $iDataCount - 1
If $aOriginalData[$i][0] = $sSection And $aOriginalData[$i][1] = $sKey Then
$aOriginalData[$i][2] = $sNewValue
ExitLoop
EndIf
Next
UpdateStatus("값이 성공적으로 수정되었습니다.")
MsgBox(64, "성공", "값이 성공적으로 수정되었습니다.")
Else
MsgBox(16, "오류", "값을 수정하는데 실패했습니다.")
EndIf
EndFunc
Func RefreshData()
; 현재 파일 다시 불러오기
If $sCurrentFile <> "" And FileExists($sCurrentFile) Then
LoadINIFile()
UpdateStatus("데이터를 새로고침했습니다.")
Else
MsgBox(48, "알림", "불러온 파일이 없습니다.")
EndIf
EndFunc
Func ExportToCSV()
Local $iItemCount = _GUICtrlListView_GetItemCount($idListView)
If $iItemCount = 0 Then
MsgBox(48, "알림", "내보낼 데이터가 없습니다.")
Return
EndIf
Local $sFile = FileSaveDialog("CSV로 저장", @DesktopDir, "CSV 파일 (*.csv)", 16, "config_export.csv")
If @error Or $sFile = "" Then Return
; CSV 파일 생성
Local $hFile = FileOpen($sFile, 2) ; 덮어쓰기 모드
If $hFile = -1 Then
MsgBox(16, "오류", "파일을 생성할 수 없습니다.")
Return
EndIf
; 헤더 쓰기
FileWriteLine($hFile, "섹션,키,값")
; 데이터 쓰기
For $i = 0 To $iItemCount - 1
Local $sSection = _GUICtrlListView_GetItemText($idListView, $i, 0)
Local $sKey = _GUICtrlListView_GetItemText($idListView, $i, 1)
Local $sValue = _GUICtrlListView_GetItemText($idListView, $i, 2)
; CSV 형식으로 쓰기 (값에 쉼표가 있을 경우 따옴표로 감싸기)
If StringInStr($sValue, ",") Then
FileWriteLine($hFile, '"' & $sSection & '","' & $sKey & '","' & $sValue & '"')
Else
FileWriteLine($hFile, $sSection & "," & $sKey & "," & $sValue)
EndIf
Next
FileClose($hFile)
UpdateStatus($iItemCount & "개 항목을 CSV 파일로 저장했습니다: " & $sFile)
; 파일 열기 여부 확인
If MsgBox(36, "완료", "CSV 파일로 내보내기가 완료되었습니다." & @CRLF & @CRLF & "파일을 여시겠습니까?") = 6 Then
ShellExecute($sFile)
EndIf
EndFunc
Func OnListViewDoubleClick()
; ListView 더블클릭시 값 수정
If @GUI_CtrlId = $idListView Then
EditSelectedItem()
EndIf
EndFunc
Func UpdateStatus($sMessage)
GUICtrlSetData($idStatusLabel, $sMessage)
GUICtrlSetColor($idStatusLabel, 0x000000)
EndFunc
Func ExitProgram()
Exit
EndFunc
; 추가 유틸리티 함수들
Func CreateSampleINI()
; 샘플 INI 파일 생성 (테스트용)
Local $sSampleFile = @ScriptDir & "\sample_config.ini"
If FileExists($sSampleFile) Then Return $sSampleFile
IniWrite($sSampleFile, "Database", "Host", "localhost")
IniWrite($sSampleFile, "Database", "Port", "3306")
IniWrite($sSampleFile, "Database", "Username", "admin")
IniWrite($sSampleFile, "Database", "Password", "password123")
IniWrite($sSampleFile, "Application", "Version", "1.0.0")
IniWrite($sSampleFile, "Application", "Language", "Korean")
IniWrite($sSampleFile, "Application", "Theme", "Dark")
IniWrite($sSampleFile, "Paths", "DataDir", "C:\Data")
IniWrite($sSampleFile, "Paths", "LogDir", "C:\Logs")
IniWrite($sSampleFile, "Paths", "TempDir", "C:\Temp")
Return $sSampleFile
EndFunc
; 컨텍스트 메뉴 추가 (선택적)
Func CreateContextMenu()
Local $hMenu = GUICtrlCreateContextMenu($idListView)
GUICtrlCreateMenuItem("값 수정", $hMenu)
GUICtrlCreateMenuItem("행 복사", $hMenu)
GUICtrlCreateMenuItem("-", $hMenu)
GUICtrlCreateMenuItem("삭제", $hMenu)
EndFunc