File "Folder Icon Autoset.bas"

Path: /Folder Icon Autoset/Folder Icon Autoset.bas
File size: 23.17 KB
MIME-type:
Charset: utf-8


#COMPILE EXE "Folder Icon Autoset.exe"
#DIM ALL

$VER    = "1.0"
$Label2 = " folder(s) + subfolder(s) detected."
$Label3 = " icon(s) ready to use for customization."
$Label4 = " icon(s) already assigned to a folder (no action needed)."
$Label5 = " folder(s) in conflict - customized with a different icon."
$pvFile = "fia_preview.txt"

'------------------------------------------------------------------------------
'   ** Resources **
'------------------------------------------------------------------------------
#RESOURCE MANIFEST  1, "XPTheme.xml"
#RESOURCE ICON,     A, "icon.ico"
#RESOURCE VERSIONINFO
#RESOURCE FILEVERSION 1,0,0,0
#RESOURCE STRINGINFO "0409", "0000"
#RESOURCE VERSION$ "CompanyName",      "mougino software"
#RESOURCE VERSION$ "LegalCopyright",   "(c) 2019 mougino"
#RESOURCE VERSION$ "ProductName",      "Folder Icon Autoset"
#RESOURCE VERSION$ "ProductVersion",   "1.0"
#RESOURCE VERSION$ "FileDescription",  "http://mougino.free.fr"
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Includes **
'------------------------------------------------------------------------------
#INCLUDE ONCE "WIN32API.INC"
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Globals **
'------------------------------------------------------------------------------
GLOBAL hDlg      AS DWORD
GLOBAL rootPath  AS STRING
GLOBAL icoSrc()  AS STRING
GLOBAL icoTgt()  AS STRING
GLOBAL icoIso()  AS STRING
GLOBAL recursLvl AS LONG
GLOBAL nFolder   AS LONG
GLOBAL nUsable   AS LONG
GLOBAL nConflict AS LONG
GLOBAL nNochange AS LONG
GLOBAL nDoneA    AS LONG
GLOBAL nDoneU    AS LONG
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
%ID_TIMER      = %WM_USER + 400
%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
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Functions **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
    ShowMain %HWND_DESKTOP
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION GetAssignedIcon(folder AS STRING) AS STRING
    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
    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 + "|" + TRIM$(icoSiz)
    END IF
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION GetFirstIcon(folder AS STRING) AS STRING
    LOCAL s AS STRING
    s = DIR$(RTRIM$(folder, "\") + "\*.ico")
    DIR$ CLOSE
    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 + "|" + TRIM$(icoSiz)
    END IF
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB AnalyzeThis(folder AS STRING)
    LOCAL e, folder() AS STRING
    LOCAL ico0, ico1 AS STRING
    LOCAL n AS LONG

    ' Folder beyond recursive level? -> if yes give up
    IF TALLY(folder, "\") > recursLvl + 1 THEN EXIT SUB
    INCR 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(icoSrc(), 0) THEN ' array not yet dimensioned
            DIM icoSrc(0) : icoSrc(0) = ico0
            DIM icoTgt(0) : icoTgt(0) = ico1
        ELSE
            n = UBOUND(icoSrc) + 1
            REDIM PRESERVE icoSrc(n) : icoSrc(n) = ico0
            REDIM PRESERVE icoTgt(n) : icoTgt(n) = ico1
        END IF
        INCR nUsable ' increase number of usable icon
        IF ico0 <> "" THEN INCR nConflict

    ELSEIF ico1 <> "" AND ico0 = ico1 THEN ' icon already assigned
        IF ISFALSE ARRAYATTR(icoIso(), 0) THEN ' array not yet dimensioned
            DIM icoIso(0)
            icoIso(0) = ico0
        ELSE
            n = UBOUND(icoIso) + 1
            REDIM PRESERVE icoIso(n)
            icoIso(n) = ico0
        END IF
        INCR 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
        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 AnalyzeTh[em] recursively
    FOR n = 0 TO UBOUND(folder)
        AnalyzeThis folder(n)
    NEXT

END SUB
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
THREAD FUNCTION Analyze(BYVAL param AS LONG) AS LONG
    KILL EXE.PATH$ + $pvFile
    AnalyzeThis rootPath
    FUNCTION = 1
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
MACRO NOTHING_TO_DO
    MessageBox hDlg, "No icon detected in any folder."+$CR+$CR _
    +"No customization possible.",EXE.NAME$,%MB_ICONINFORMATION
    EXIT SUB
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB PreviewChanges()
    LOCAL i, j, ff AS LONG
    LOCAL ico0, ico1, folder AS STRING

    IF nUsable + nNochange = 0 THEN
        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 + rootPath + $DQ
    PRINT #ff, "## " + RIGHT$(DATE$,4) + "-" + LEFT$(DATE$,2) + MID$(DATE$,3,3) + " at " + TIME$
    PRINT #ff, STRING$(80, "#")
    PRINT #ff, ""

    IF 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(icoSrc)
            IF icoSrc(i) <> "" THEN
                ico0 = REMOVE$(icoSrc(i), 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$(icoTgt(i), 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 nUsable <> 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(icoSrc)
            IF icoSrc(i) = "" THEN
                ico1 = REMOVE$(icoTgt(i), 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 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(icoIso)
            ico0 = REMOVE$(icoIso(i), 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
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB AutosetIcons()
    LOCAL i, j, tuned, unassign AS LONG
    LOCAL pview, ico, folder AS STRING

    nDoneA = 0

    IF nUsable + nNochange = 0 THEN
        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(icoTgt)
        ico = icoTgt(i)
        j = INSTR(ico, "|")
        ico = LEFT$(ico, j - 1)
        j = INSTR(-1, ico, "\")
        folder = LEFT$(ico, j)
        IF folder = rootPath THEN folder += "\"
        ico = MID$(ico, j + 1)
        IF ISTRUE tuned THEN ' folder customization removed by user?
            IF 0 = INSTR(pview, $DQ + REMOVE$(folder, rootPath) + $DQ) THEN ITERATE FOR
        END IF
        IF RIGHT$(folder, 2) = "\\" THEN folder = LEFT$(folder, -1)
        IF NOT ISFILE(folder + "desktop.ini") THEN CreateDesktopIni(folder)
        WritePrivateProfileString ".ShellClassInfo", "IconResource", _
            ".\" + ico + ",0" , folder + "desktop.ini"
        INCR 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(icoIso)
        ico = icoIso(i)
        j = INSTR(ico, "|")
        ico = LEFT$(ico, j-1)
        j = INSTR(-1, ico, "\")
        folder = LEFT$(ico, j)
        IF folder = rootPath THEN folder += "\"
        IF INSTR(pview, $DQ + REMOVE$(folder, rootPath) + $DQ) > unassign THEN
            IF RIGHT$(folder, 2) = "\\" THEN folder = LEFT$(folder, -1)
            SetFileAttributes folder + "desktop.ini", %FILE_ATTRIBUTE_NORMAL
            KILL folder + "desktop.ini"
            INCR nDoneU
        END IF
    NEXT

END SUB
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB ExplorerRefresh()
    SHELL "ie4uinit.exe -ClearIconCache"
    SHELL "ie4uinit.exe -show"
END SUB
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
MACRO REFRESH_LABELS
    CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, TRIM$(nFolder) + $Label2 ' X detected
    CONTROL SET TEXT CB.HNDL, %IDC_LABEL3, TRIM$(nUsable) + $Label3 ' X ready for use
    CONTROL SET TEXT CB.HNDL, %IDC_LABEL4, TRIM$(nNochange) + $Label4 ' X already assigned
    CONTROL SET TEXT CB.HNDL, %IDC_LABEL5, TRIM$(nConflict) + $Label5 ' X in conflict
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
MACRO RESET_SCAN_DATA
    ERASE icoSrc(), icoTgt(), icoIso()
    nFolder   = 0
    nUsable   = 0
    nConflict = 0
    nNochange = 0
    nDoneA    = 0
    nDoneU    = 0
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
MACRO RESET_UI
    CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, $SPC + 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
    RESET_SCAN_DATA
    REFRESH_LABELS
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ProcMain()
    STATIC hThread AS DWORD
    LOCAL lRes, idEvent AS LONG
    LOCAL e AS STRING

    SELECT CASE AS LONG CB.MSG
        CASE %WM_INITDIALOG
            ' Initialization handler
            rootPath = EXE.PATH$
            RESET_UI

        ' CallBack Message is a Timer event
        CASE %WM_TIMER
            REFRESH_LABELS
            THREAD STATUS hThread TO lRes
            IF lRes <> 0 AND lRes <> &H103 THEN ' Thread finished
                IF idEvent THEN KillTimer CB.HNDL, idEvent
                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
            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
                            rootPath = RTRIM$(e, "\") + "\"
                            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 recursLvl
                            IF recursLvl = 1 THEN recursLvl = 999999 ELSE DECR 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
                            RESET_SCAN_DATA
                            THREAD CREATE Analyze(0) TO hThread
                            ' Start timer to refresh labels
                            idEvent = SetTimer(CB.HNDL, %ID_TIMER, 500, BYVAL 0&)
                            DIALOG POST CB.HNDL, %WM_TIMER, %ID_TIMER, 0
                        ELSE ' STOP SCAN
                            ' Kill timer to refresh labels
                            IF idEvent THEN KillTimer CB.HNDL, idEvent
                            ' Kill scanning thread
                            IF hThread THEN
                                THREAD SUSPEND hThread TO lRes
                                THREAD CLOSE hThread TO lRes
                                hThread = 0
                            END IF
                            RESET_UI
                        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 = TRIM$(nDoneA)+" folder(s) successfully customized !"
                        IF nDoneU > 0 THEN
                            e += $CR+$CR+TRIM$(nDoneU)+" folder(s) correctly unassigned !"
                        END IF
                        MessageBox 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 hDlg
    DIALOG SET ICON       hDlg, "A"

    CONTROL ADD LABEL,    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     hDlg, %IDC_TEXTBOX1, -1, %WHITE
    CONTROL ADD BUTTON,   hDlg, %IDC_BUTTON0, "...", 368, 7, 32, 20

    CONTROL ADD LABEL,    hDlg, %IDC_LABEL1, "Stop analysis at this folder " + _
        "recursion level : (0 = infinite)", 8, 34, 256, 16
    CONTROL ADD COMBOBOX, hDlg, %IDC_COMBOBOX1, , 272, 32, 30, 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      hDlg, %IDC_COMBOBOX1, TRIM$(lRes)
    NEXT
    COMBOBOX SELECT       hDlg, %IDC_COMBOBOX1, 1

    CONTROL ADD FRAME,    hDlg, %IDC_FRAME1, "Scan results", 8, 64, 400, 136
    CONTROL ADD LABEL,    hDlg, %IDC_LABEL2, TRIM$(0) + $Label2, 24, 95, 368, 24
    CONTROL SET COLOR     hDlg, %IDC_LABEL2, %BLUE, -1
    CONTROL ADD LABEL,    hDlg, %IDC_LABEL3, TRIM$(0) + $Label3, 24, 120, 368, 24
    CONTROL SET COLOR     hDlg, %IDC_LABEL3, RGB(0, 128, 0), -1
    CONTROL ADD LABEL,    hDlg, %IDC_LABEL4, TRIM$(0) + $Label4, 24, 145, 368, 24
    CONTROL SET COLOR     hDlg, %IDC_LABEL4, RGB(40, 40, 40), -1
    CONTROL ADD LABEL,    hDlg, %IDC_LABEL5, TRIM$(0) + $Label5, 24, 170, 368, 24
    CONTROL SET COLOR     hDlg, %IDC_LABEL5, RGB(128, 0, 0), -1

    CONTROL ADD BUTTON,   hDlg, %IDC_BUTTON2, "SCAN !", 8, 208, 128, 40
    CONTROL ADD BUTTON,   hDlg, %IDC_BUTTON3, "PREVIEW / TUNE", 144, 208, 128, 40
    CONTROL ADD BUTTON,   hDlg, %IDC_BUTTON4, "AUTOSET ICONS", 280, 208, 128, 40

    DIALOG SHOW MODAL hDlg, CALL ProcMain TO lRes

    FUNCTION = lRes
END FUNCTION
'------------------------------------------------------------------------------