File "Folder Icon Autoset.bas"
Path: /Folder Icon Autoset/Folder Icon Autoset.bas
File size: 27.01 KB
MIME-type:
Charset: utf-8
#COMPILE EXE "Folder Icon Autoset.exe"
#INCLUDE ONCE "Win32Api.inc"
#INCLUDE ONCE "inc\MyMsgBox.inc"
#INCLUDE ONCE "inc\Exe2Unix.inc"
#RESOURCE "FAI.pbr"
$VER = "1.2"
' CHANGELOG:
' v1.2 (2026-01-21) fix for Wine 11.0 breaking 'start.exe' retrocompatibility
' v1.1 (2025-12-02) now support linux
' v1.0 (2024-02-22) initial release
$pvFile = "fia_preview.txt"
$Label2 = " folder(s) + subfolder(s) detected."
$Label3 = " icon(s) ready to use for customization."
$Label4 = " icon(s) already assigned (no action needed)."
$Label5 = " folder(s) in conflict (different icon)."
'------------------------------------------------------------------------------
' ** Globals **
'------------------------------------------------------------------------------
GLOBAL g_hDlg AS DWORD
GLOBAL g_hIcon AS DWORD
GLOBAL g_RootPath AS STRING
GLOBAL g_icoSrc() AS STRING
GLOBAL g_icoTgt() AS STRING
GLOBAL g_icoIso() AS STRING
GLOBAL g_recursLvl AS LONG
GLOBAL g_nFolder AS LONG
GLOBAL g_nUsable AS LONG
GLOBAL g_nConflict AS LONG
GLOBAL g_nNochange AS LONG
GLOBAL g_nDoneA AS LONG
GLOBAL g_nDoneU AS LONG
GLOBAL g_Stoppin AS LONG
GLOBAL g_OnUnix AS LONG
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Constants **
'------------------------------------------------------------------------------
%ID_TIMER1 = %WM_USER + 400
%ID_TIMER2 = %WM_USER + 401
%IDC_TEXTBOX1 = 1001
%IDC_BUTTON0 = 1002
%IDC_BUTTON2 = 1003
%IDC_BUTTON3 = 1004
%IDC_BUTTON4 = 1005
%IDC_FRAME1 = 1006
%IDC_LABEL2 = 1007
%IDC_LABEL3 = 1008
%IDC_LABEL4 = 1009
%IDC_LABEL5 = 1010
%IDC_LABEL1 = 1011
%IDC_COMBOBOX1 = 1012
%IDC_IMAGE = 1013
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Macros **
'------------------------------------------------------------------------------
MACRO XSHL = LEFT$(EXE.FULL$, -3) + "sh"
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
MACRO M_REFRESH_LABELS
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, FORMAT$(g_nFolder) + $Label2 ' X detected
CONTROL SET TEXT CB.HNDL, %IDC_LABEL3, FORMAT$(g_nUsable) + $Label3 ' X ready for use
CONTROL SET TEXT CB.HNDL, %IDC_LABEL4, FORMAT$(g_nNochange) + $Label4 ' X already assigned
CONTROL SET TEXT CB.HNDL, %IDC_LABEL5, FORMAT$(g_nConflict) + $Label5 ' X in conflict
END MACRO
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
MACRO M_RESET_SCAN_DATA
ERASE g_icoSrc(), g_icoTgt(), g_icoIso()
g_nFolder = 0
g_nUsable = 0
g_nConflict = 0
g_nNochange = 0
g_nDoneA = 0
g_nDoneU = 0
END MACRO
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
MACRO M_RESET_UI
CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, $SPC + g_RootPath
CONTROL SET TEXT CB.HNDL, %IDC_BUTTON2, "SCAN !"
CONTROL DISABLE CB.HNDL, %IDC_BUTTON3 ' PREVIEW / TUNE
CONTROL DISABLE CB.HNDL, %IDC_BUTTON4 ' AUTOSET ICONS
CONTROL ENABLE CB.HNDL, %IDC_BUTTON0 ' [...]
CONTROL ENABLE CB.HNDL, %IDC_COMBOBOX1
M_RESET_SCAN_DATA
M_REFRESH_LABELS
DisplayAnim "F00"
END MACRO
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
MACRO M_NOTHING_TO_DO
MyMsgBox g_hDlg, "No icon detected in any folder."+$CR+$CR _
+"No customization possible.",EXE.NAME$,%MB_ICONINFORMATION
EXIT SUB
END MACRO
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Functions **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
' Create exe icon in Unix dock and Unix file explorer
Me2Unix 1, 1 ' askConfirmation=%TRUE, showInAppMenu=%TRUE
g_OnUnix = IsOnUnix()
' Show main dialog
ShowMain 0
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION GetAssignedIcon(folder AS STRING) AS STRING
IF g_OnUnix THEN EXIT FUNCTION
LOCAL a AS ASCIIZ * %MAX_PATH
LOCAL s AS STRING
GetPrivateProfileString ".ShellClassInfo", "IconResource", "", a, _
%MAX_PATH, RTRIM$(folder, "\") + "\desktop.ini"
s = TRIM$(a)
IF INSTR(s, $DQ) > 0 THEN s = TRIM$(s, $DQ)
IF RIGHT$(s, 2) = ",0" THEN s = LEFT$(s, -2)
FUNCTION = s
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION AssignedIconDetail(folder AS STRING) AS STRING
IF g_OnUnix THEN EXIT FUNCTION
LOCAL ico AS STRING
LOCAL ff, icoSiz AS LONG
ico = GetAssignedIcon(folder)
REPLACE ".\" WITH RTRIM$(folder, "\") + "\" IN ico
IF ISFILE(ico) THEN
ff = FREEFILE
OPEN ico FOR BINARY ACCESS READ LOCK SHARED AS #ff
icoSiz = LOF(#ff)
CLOSE #ff
FUNCTION = ico + "|" + FORMAT$(icoSiz)
END IF
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION GetFirstIcon(folder AS STRING) AS STRING
LOCAL s, s2 AS STRING
s = DIR$(RTRIM$(folder, "\") + "\*.ico") : DIR$ CLOSE
IF g_OnUnix THEN
s2 = DIR$(RTRIM$(folder, "\") + "\" + LEFT$(s,-3) + "png") : DIR$ CLOSE
IF LEN(s2) THEN
s = s2
ELSE
s2 = DIR$(RTRIM$(folder, "\") + "\*.png") : DIR$ CLOSE
IF LEN(s2) THEN s = s2
END IF
END IF
FUNCTION = s
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION FirstIconDetail(folder AS STRING) AS STRING
LOCAL ico AS STRING
LOCAL ff, icoSiz AS LONG
ico = RTRIM$(folder, "\") + "\" + GetFirstIcon(folder)
IF ISFILE(ico) THEN
ff = FREEFILE
OPEN ico FOR BINARY ACCESS READ LOCK SHARED AS #ff
icoSiz = LOF(#ff)
CLOSE #ff
FUNCTION = ico + "|" + FORMAT$(icoSiz)
END IF
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB Add2XShell(BYVAL cmd AS STRING)
' Add a command the Unix shell script (Unix only)
LOCAL ff AS LONG
ff = FREEFILE
IF EXISTS(XSHL) THEN cmd = $LF + cmd
OPEN XSHL FOR BINARY AS #ff
SEEK #ff, LOF(#ff) + 1
PUT$ #ff, cmd
CLOSE #ff
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB AnalyzeThis(folder AS STRING)
LOCAL e, folder() AS STRING
LOCAL ico0, ico1 AS STRING
LOCAL n AS LONG
' User asked to stop analysis?
IF ISTRUE g_Stoppin THEN EXIT SUB
' Folder beyond recursive level? -> if yes give up
IF TALLY(folder, "\") > g_recursLvl + 1 THEN EXIT SUB
INCR g_nFolder ' else increase number of detected folders
' Analyze current folder icons
ico0 = AssignedIconDetail(folder)
ico1 = FirstIconDetail(folder)
IF ico1 <> "" AND ico0 <> ico1 THEN ' new or different icon available
IF ISFALSE ARRAYATTR(g_icoSrc(), 0) THEN ' array not yet dimensioned
DIM g_icoSrc(0) : g_icoSrc(0) = ico0
DIM g_icoTgt(0) : g_icoTgt(0) = ico1
ELSE
n = UBOUND(g_icoSrc) + 1
REDIM PRESERVE g_icoSrc(n) : g_icoSrc(n) = ico0
REDIM PRESERVE g_icoTgt(n) : g_icoTgt(n) = ico1
END IF
INCR g_nUsable ' increase number of usable icon
IF ico0 <> "" THEN INCR g_nConflict
ELSEIF ico1 <> "" AND ico0 = ico1 THEN ' icon already assigned
IF ISFALSE ARRAYATTR(g_icoIso(), 0) THEN ' array not yet dimensioned
DIM g_icoIso(0)
g_icoIso(0) = ico0
ELSE
n = UBOUND(g_icoIso) + 1
REDIM PRESERVE g_icoIso(n)
g_icoIso(n) = ico0
END IF
INCR g_nNochange
END IF
' List subfolders ...
e = DIR$(folder, ONLY %SUBDIR)
IF e = "" THEN DIR$ CLOSE : EXIT SUB ' no subfolder
DIM folder(0) : folder(0) = RTRIM$(folder, "\") + "\" + e + "\"
DO
IF ISTRUE g_Stoppin THEN EXIT SUB
e = DIR$(NEXT)
IF e <> "" THEN
n = UBOUND(folder) + 1
REDIM PRESERVE folder(n)
folder(n) = RTRIM$(folder, "\") + "\" + e + "\"
END IF
LOOP UNTIL e = ""
DIR$ CLOSE
' ... and Analyze them recursively
FOR n = 0 TO UBOUND(folder)
IF ISTRUE g_Stoppin THEN EXIT SUB
AnalyzeThis folder(n)
NEXT
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
THREAD FUNCTION AnalyzeThat(BYVAL param AS LONG) AS LONG
IF g_OnUnix THEN
KILL XSHL
Add2XShell "#!/bin/bash"
END IF
KILL EXE.PATH$ + $pvFile
AnalyzeThis g_RootPath
FUNCTION = 1
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB PreviewChanges()
LOCAL i, j, ff AS LONG
LOCAL ico0, ico1, folder AS STRING
IF g_nUsable + g_nNochange = 0 THEN
M_NOTHING_TO_DO
END IF
ff = FREEFILE
OPEN EXE.PATH$ + $pvFile FOR OUTPUT AS #ff
PRINT #ff, STRING$(80, "#")
PRINT #ff, "## FOLDER ICON AUTOSET"
PRINT #ff, "## Analyzing " + $DQ + g_RootPath + $DQ
PRINT #ff, "## " + RIGHT$(DATE$,4) + "-" + LEFT$(DATE$,2) + MID$(DATE$,3,3) + " at " + TIME$
PRINT #ff, STRING$(80, "#")
PRINT #ff, ""
IF g_nConflict <> 0 THEN
PRINT #ff, STRING$(80, "#")
PRINT #ff, "## Folders in conflict (a different icon is already assigned)"
PRINT #ff, STRING$(80, "#")
PRINT #ff, ""
PRINT #ff, STRING$(65, ">")
PRINT #ff, ">> Remove the folders that you do NOT want to customize:"
PRINT #ff, ">> (do not forget to save your changes to this file)"
PRINT #ff, STRING$(65, ">")
PRINT #ff, ""
FOR i = 0 TO UBOUND(g_icoSrc)
IF g_icoSrc(i) <> "" THEN
ico0 = REMOVE$(g_icoSrc(i), g_RootPath) + " bytes)"
REPLACE "|" WITH $DQ + " (" IN ico0
j = INSTR(-1, ico0, "\")
folder = LEFT$(ico0, j)
IF folder = "" THEN folder = "\"
ico0 = $DQ + MID$(ico0, j+1)
ico1 = REMOVE$(g_icoTgt(i), g_RootPath) + " bytes)"
REPLACE "|" WITH $DQ + " (" IN ico1
ico1 = $DQ + MID$(ico1, j+1)
PRINT #ff, "- " + $DQ + folder + $DQ + " :"
PRINT #ff, " Currently customized with " + ico0
PRINT #ff, " Will be replaced with " + ico1
PRINT #ff, ""
END IF
NEXT
END IF
IF g_nUsable <> g_nConflict THEN
PRINT #ff, STRING$(80, "#")
PRINT #ff, "## Folders ready to be customized (new icon has been detected)"
PRINT #ff, STRING$(80, "#")
PRINT #ff, ""
PRINT #ff, STRING$(65, ">")
PRINT #ff, ">> Remove the folders that you do NOT want to customize:"
PRINT #ff, ">> (do not forget to save your changes to this file)"
PRINT #ff, STRING$(65, ">")
PRINT #ff, ""
FOR i = 0 TO UBOUND(g_icoSrc)
IF g_icoSrc(i) = "" THEN
ico1 = REMOVE$(g_icoTgt(i), g_RootPath) + " bytes)"
REPLACE "|" WITH $DQ + " (" IN ico1
j = INSTR(-1, ico1, "\")
folder = LEFT$(ico1, j)
IF folder = "" THEN folder = "\"
ico1 = $DQ + MID$(ico1, j+1)
PRINT #ff, "- " + $DQ + folder + $DQ + " :"
PRINT #ff, " Ready to be customized with " + ico1
PRINT #ff, ""
END IF
NEXT
END IF
IF g_nNochange <> 0 THEN
PRINT #ff, STRING$(80, "#")
PRINT #ff, "## Folders already customized"
PRINT #ff, STRING$(80, "#")
PRINT #ff, ""
PRINT #ff, STRING$(65, ">")
PRINT #ff, ">> You can move these folders to the next 'UNASSIGN' section:"
PRINT #ff, ">> This will clear their icon customization..."
PRINT #ff, ">> (do not forget to save your changes to this file)"
PRINT #ff, STRING$(65, ">")
PRINT #ff, ""
FOR i = 0 TO UBOUND(g_icoIso)
ico0 = REMOVE$(g_icoIso(i), g_RootPath) + " bytes)"
REPLACE "|" WITH $DQ + " (" IN ico0
j = INSTR(-1, ico0, "\")
folder = LEFT$(ico0, j)
IF folder = "" THEN folder = "\"
ico0 = $DQ + MID$(ico0, j+1)
PRINT #ff, "- " + $DQ + folder + $DQ + " :"
PRINT #ff, " Already customized with " + ico0
PRINT #ff, ""
NEXT
PRINT #ff, STRING$(80, "#")
PRINT #ff, "## UNASSIGN - Clear folder icon customization"
PRINT #ff, STRING$(80, "#")
PRINT #ff, ""
PRINT #ff, STRING$(65, ">")
PRINT #ff, ">> Cut+Paste the folders from the previous section here:"
PRINT #ff, ">> This will clear their icon customization..."
PRINT #ff, ">> (do not forget to save your changes to this file)"
PRINT #ff, STRING$(65, ">")
PRINT #ff, ""
END IF
CLOSE #ff
ShellExecute 0, "open", EXE.PATH$ + $pvFile + $NUL, $NUL, BYVAL 0&, %SW_SHOWNORMAL
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB CreateDesktopIni(folder AS STRING)
WritePrivateProfileString ".ShellClassInfo", "InfoTip", _
"Customized by Folder Icon Autoset (web:mougino.free.fr)", _
RTRIM$(folder, "\") + "\desktop.ini"
SetFileAttributes RTRIM$(folder, "\") + "\desktop.ini", _
%FILE_ATTRIBUTE_SYSTEM + %FILE_ATTRIBUTE_HIDDEN
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION gio_set(BYVAL src AS STRING, BYVAL ico AS STRING) AS STRING
LOCAL xec AS STRING
src = UnixPath(src)
REPLACE "'" WITH "''" IN src
ico = UnixPath(ico)
REPLACE "'" WITH "''" IN ico
xec = "/bin/gio set -t 'string' '" + src + "' "
xec += "'metadata::custom-icon' "
xec += "'file://" + ico + "'"
FUNCTION = xec
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION gio_unset(BYVAL src AS STRING) AS STRING
LOCAL xec AS STRING
src = UnixPath(src)
REPLACE "'" WITH "''" IN src
xec = "/bin/gio set -t 'unset' '" + src + "' "
xec += "'metadata::custom-icon'"
FUNCTION = xec
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB AutosetIcons()
LOCAL i, j, tuned, unassign AS LONG
LOCAL pview, ico, folder AS STRING
g_nDoneA = 0
IF g_nUsable + g_nNochange = 0 THEN
M_NOTHING_TO_DO
END IF
' Did user activate the preview/tune option?
IF ISFILE(EXE.PATH$ + $pvFile) THEN
i = FREEFILE
OPEN EXE.PATH$ + $pvFile FOR BINARY ACCESS READ LOCK SHARED AS #i
GET$ #i, LOF(#i), pview
CLOSE #i
tuned = 1
END IF
' Handle new icons and replacement icons
FOR i = 0 TO UBOUND(g_icoTgt)
ico = g_icoTgt(i)
j = INSTR(ico, "|")
ico = LEFT$(ico, j - 1)
j = INSTR(-1, ico, "\")
folder = LEFT$(ico, j)
IF folder = g_RootPath THEN folder += "\"
ico = MID$(ico, j + 1)
IF ISTRUE tuned THEN ' folder customization removed by user?
IF 0 = INSTR(pview, $DQ + REMOVE$(folder, g_RootPath) + $DQ) THEN ITERATE FOR
END IF
IF RIGHT$(folder, 2) = "\\" THEN folder = LEFT$(folder, -1)
' Unix!
IF g_OnUnix THEN
Add2XShell gio_set(folder, folder + ico)
' Windows!
ELSE
IF NOT ISFILE(folder + "desktop.ini") THEN CreateDesktopIni(folder)
WritePrivateProfileString ".ShellClassInfo", "IconResource", _
".\" + ico + ",0" , folder + "desktop.ini"
END IF
INCR g_nDoneA
NEXT
' Handle icon unassignments
IF ISFALSE tuned THEN EXIT SUB ' only in preview/tune mode
unassign = INSTR(pview, "## UNASSIGN - ")
IF unassign = 0 THEN EXIT SUB ' in case user removed the section
FOR i = 0 TO UBOUND(g_icoIso)
ico = g_icoIso(i)
j = INSTR(ico, "|")
ico = LEFT$(ico, j-1)
j = INSTR(-1, ico, "\")
folder = LEFT$(ico, j)
IF folder = g_RootPath THEN folder += "\"
IF INSTR(pview, $DQ + REMOVE$(folder, g_RootPath) + $DQ) > unassign THEN
IF RIGHT$(folder, 2) = "\\" THEN folder = LEFT$(folder, -1)
' Unix!
IF g_OnUnix THEN
Add2XShell gio_unset(folder)
' Windows!
ELSE
SetFileAttributes folder + "desktop.ini", %FILE_ATTRIBUTE_NORMAL
KILL folder + "desktop.ini"
END IF
INCR g_nDoneU
END IF
NEXT
' Execute Unix script!
IF g_OnUnix THEN
Add2XShell "echo done"
SHELL "start /exec /bin/chmod +x " + $DQ + UnixPath(XSHL) + $DQ, 0
SLEEP 100
SHELL "start /exec /bin/bash " + $DQ + UnixPath(XSHL) + $DQ, 0
END IF
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB DisplayAnim(BYVAL srcIco AS STRING)
' Display an icon in the %IDC_IMAGE control
IF g_hIcon <> 0 THEN DestroyIcon g_hIcon
g_hIcon = LoadImage(GetModuleHandle(BYVAL 0&), (srcIco), %IMAGE_ICON, 125, 126, BYVAL 0&)
CONTROL SEND g_hDlg, %IDC_IMAGE, %STM_SETIMAGE, %IMAGE_ICON, g_hIcon
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB ExplorerRefresh()
IF g_OnUnix THEN EXIT SUB
SHELL "ie4uinit.exe -ClearIconCache"
SHELL "ie4uinit.exe -show"
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ProcMain()
STATIC hThread AS DWORD
STATIC idEvent1, idEvent2 AS LONG
STATIC anim AS LONG
LOCAL lRes AS LONG
LOCAL e AS STRING
SELECT CASE AS LONG CB.MSG
CASE %WM_INITDIALOG
' Initialization handler
g_RootPath = EXE.PATH$
M_RESET_UI
' CallBack Message is a Timer event
CASE %WM_TIMER
IF CB.WPARAM = %ID_TIMER1 THEN
' 500ms timer to refresh labels
M_REFRESH_LABELS
THREAD STATUS hThread TO lRes
IF lRes <> 0 AND lRes <> &H103 THEN ' Thread finished
IF idEvent1 THEN KillTimer CB.HNDL, idEvent1 : idEvent1 = 0
IF idEvent2 THEN KillTimer CB.HNDL, idEvent2 : idEvent2 = 0
THREAD CLOSE hThread TO lRes : hThread = 0
CONTROL SET TEXT CB.HNDL, %IDC_BUTTON2, "SCAN !"
CONTROL ENABLE CB.HNDL, %IDC_BUTTON3 ' PREVIEW / TUNE
CONTROL ENABLE CB.HNDL, %IDC_BUTTON4 ' AUTOSET ICONS
CONTROL ENABLE CB.HNDL, %IDC_BUTTON0 ' [...]
CONTROL ENABLE CB.HNDL, %IDC_COMBOBOX1
DisplayAnim "F00"
END IF
ELSEIF CB.WPARAM = %ID_TIMER2 THEN
' 42ms timer to refresh animation
anim = (anim + 1) MOD 39
DisplayAnim "F"+FORMAT$(anim,"00")
END IF
CASE %WM_COMMAND
' Process control notifications
SELECT CASE AS LONG CB.CTL
CASE %IDC_BUTTON0 ' [...]
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
DISPLAY BROWSE CB.HNDL, 40, -10, "Folder Icon Autoset" _
+ $CR + "Pick a folder for analysis :", "", _
%BIF_RETURNONLYFSDIRS + %BIF_NONEWFOLDERBUTTON TO e
IF e <> "" THEN
g_RootPath = RTRIM$(e, "\") + "\"
M_RESET_UI
END IF
END IF
CASE %IDC_BUTTON2 ' SCAN ! / STOP SCAN
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
CONTROL GET TEXT CB.HNDL, %IDC_BUTTON2 TO e
IF e = "SCAN !" THEN
COMBOBOX GET SELECT CB.HNDL, %IDC_COMBOBOX1 TO g_recursLvl
IF g_recursLvl = 1 THEN g_recursLvl = 999999 ELSE DECR g_recursLvl
CONTROL DISABLE CB.HNDL, %IDC_BUTTON0 ' [...]
CONTROL DISABLE CB.HNDL, %IDC_COMBOBOX1
CONTROL DISABLE CB.HNDL, %IDC_BUTTON3 ' PREVIEW / TUNE
CONTROL DISABLE CB.HNDL, %IDC_BUTTON4 ' AUTOSET ICONS
CONTROL SET TEXT CB.HNDL, %IDC_BUTTON2, "STOP SCAN"
' Start scanning thread
M_RESET_SCAN_DATA
THREAD CREATE AnalyzeThat(0) TO hThread
' Start timers to refresh labels and show animation
idEvent1 = SetTimer(CB.HNDL, %ID_TIMER1, 500, BYVAL 0&)
idEvent2 = SetTimer(CB.HNDL, %ID_TIMER2, 60, BYVAL 0&)
ELSE ' STOP SCAN
g_Stoppin = %True
ERASE g_icoSrc()
ERASE g_icoTgt()
ERASE g_icoIso()
g_nFolder = 0
g_nUsable = 0
g_nConflict = 0
g_nNochange = 0
g_nDoneA = 0
g_nDoneU = 0
END IF
END IF
CASE %IDC_BUTTON3 ' PREVIEW / TUNE
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
PreviewChanges()
END IF
CASE %IDC_BUTTON4 ' AUTOSET ICONS
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
AutosetIcons()
ExplorerRefresh()
e = FORMAT$(g_nDoneA)+" folder(s) successfully customized !"
IF g_nDoneU > 0 THEN
e += $CR+$CR+FORMAT$(g_nDoneU)+" folder(s) correctly unassigned !"
END IF
MyMsgBox CB.HNDL,(e),EXE.NAME$,%MB_ICONINFORMATION
END IF
END SELECT
END SELECT
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowMain(BYVAL hParent AS DWORD) AS LONG
LOCAL lRes AS LONG
DIALOG NEW PIXELS, hParent, "Folder Icon Autoset "+$VER, , , 416, 256, %WS_POPUP _
OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _
%WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _
%DS_SETFONT OR %WS_CAPTION OR %WS_MINIMIZEBOX, %WS_EX_WINDOWEDGE OR _
%WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
%WS_EX_RIGHTSCROLLBAR, TO g_hDlg
DIALOG SET ICON g_hDlg, "A"
CONTROL ADD LABEL, g_hDlg, %IDC_TEXTBOX1, EXE.PATH$, 8, 8, 360, 18, _
%WS_CHILD OR %WS_VISIBLE OR %WS_BORDER OR %SS_LEFT, %WS_EX_LEFT OR _
%WS_EX_LTRREADING
CONTROL SET COLOR g_hDlg, %IDC_TEXTBOX1, -1, %WHITE
CONTROL ADD BUTTON, g_hDlg, %IDC_BUTTON0, "...", 368, 7, 32, 20
CONTROL ADD LABEL, g_hDlg, %IDC_LABEL1, "Stop analysis at this folder " + _
"recursion level : (0 = infinite)", 8, 34, 256, 16
CONTROL ADD COMBOBOX, g_hDlg, %IDC_COMBOBOX1, , 272, 32, 30 + IIF(g_OnUnix,10,0), 24, %WS_CHILD _
OR %WS_VISIBLE OR %WS_TABSTOP OR %CBS_DROPDOWNLIST, %WS_EX_LEFT OR _
%WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
FOR lRes = 0 TO 9
COMBOBOX ADD g_hDlg, %IDC_COMBOBOX1, FORMAT$(lRes)
NEXT
COMBOBOX SELECT g_hDlg, %IDC_COMBOBOX1, 1
CONTROL ADD FRAME, g_hDlg, %IDC_FRAME1, " Scan results ", 8, 64, 400, 136
CONTROL ADD LABEL, g_hDlg, %IDC_LABEL2, FORMAT$(0) + $Label2, 14, 95, 252, 24
CONTROL SET COLOR g_hDlg, %IDC_LABEL2, %BLUE, -1
CONTROL ADD LABEL, g_hDlg, %IDC_LABEL3, FORMAT$(0) + $Label3, 14, 120, 252, 24
CONTROL SET COLOR g_hDlg, %IDC_LABEL3, RGB(0, 128, 0), -1
CONTROL ADD LABEL, g_hDlg, %IDC_LABEL4, FORMAT$(0) + $Label4, 14, 145, 252, 24
CONTROL SET COLOR g_hDlg, %IDC_LABEL4, RGB(40, 40, 40), -1
CONTROL ADD LABEL, g_hDlg, %IDC_LABEL5, FORMAT$(0) + $Label5, 14, 170, 252, 24
CONTROL SET COLOR g_hDlg, %IDC_LABEL5, RGB(128, 0, 0), -1
CONTROL ADD IMAGE, g_hDlg, %IDC_IMAGE, "F00", 267, 72, 125, 126
CONTROL ADD BUTTON, g_hDlg, %IDC_BUTTON2, "SCAN !", 8, 208, 128, 40
CONTROL ADD BUTTON, g_hDlg, %IDC_BUTTON3, "PREVIEW / TUNE", 144, 208, 128, 40
CONTROL ADD BUTTON, g_hDlg, %IDC_BUTTON4, "AUTOSET ICONS", 280, 208, 128, 40
DIALOG SHOW MODAL g_hDlg, CALL ProcMain TO lRes
FUNCTION = lRes
END FUNCTION
'------------------------------------------------------------------------------