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
'------------------------------------------------------------------------------