File "ComicDir2Cbr.bas"

Path: /ComicDir2Cbr/ComicDir2Cbr.bas
File size: 8.14 KB
MIME-type:
Charset: utf-8

#COMPILE EXE "ComicDir2Cbr.exe"

' [X] handle drag & drop (in idle mode only)
' [X] add help icon + link to online manual
' [X] n CBR already existing : Replace All ? (Click 'No' to skip them)

#INCLUDE ONCE "Windows.inc"
#INCLUDE ONCE "inc\ComicDir2Cbr.inc"
#INCLUDE ONCE "inc\TextProgressBar.inc"
#INCLUDE ONCE "inc\CenterMsgbox.inc"
#INCLUDE ONCE "inc\Resource.inc"
#INCLUDE ONCE "inc\RunCmd.inc"
#INCLUDE ONCE "inc\Rar.inc"

#RESOURCE "res\comic2cbr.pbr"

%WM_STEP_NOTIFY = %WM_USER + 199
%WM_RAR_END     = %WM_USER + 200
%WM_RAR_ERR     = %WM_USER + 201

GLOBAL comicdir() AS STRING
GLOBAL ndir, replaceAll AS LONG

'-------------------------------------------------------------------------------------
FUNCTION ListComicDirs(src AS STRING) AS LONG
' Fill global string array 'comicdir()' with the folders candidate to convert to CBR
' Fills global long 'ndir' with the total number of candidate folders
' Return number of already existing CBRs
    LOCAL rep, t AS STRING
    LOCAL i, j AS LONG

    ndir = 1
    replaceAll = 0

    IF src <> "" THEN rep = RTRIM$(src,"\") + "\"
    IF INSTR(rep, EXE.PATH$) = 1 THEN rep = MID$(rep, LEN(EXE.PATH$) + 1)
    comicdir(ndir) = DIR$(rep + "*.*", ONLY 16) 'search for subfolders only
    WHILE comicdir(ndir) <> ""
'        t += left$(comicdir(ndir),30) + $cr
        comicdir(ndir) = rep + comicdir(ndir) ' prepend root folder
        INCR ndir
        comicdir(ndir) = DIR$(NEXT)
    WEND
    DIR$ CLOSE
    DECR ndir ' last one is empty
'    t = format$(ndir) + " raw dirs - list:"+$cr+t+$cr

    ' Only keep comic folders (containing at least 2 jpgs or 2 pngs)
    FOR i = ndir TO 1 STEP -1
        IF NOT HasPngs(comicdir(i)) AND NOT HasJpgs(comicdir(ndir)) THEN
            FOR j = ndir-1 TO i STEP -1
                comicdir(j) = comicdir(j+1)
            NEXT
            DECR ndir
        END IF
    NEXT

'    t += FORMAT$(ndir) + " comic dirs - list:" + $cr
'    FOR i = 1 to ndir
'        t += left$(comicdir(i),30) + $cr
'    NEXT
'    ?t,,exe.name$

    ' List already existing CBRs
    j = 0
    FOR i = 1 TO ndir
        IF EXIST(comicdir(i) + ".cbr") THEN INCR j
    NEXT i
    FUNCTION = j
END FUNCTION
'-------------------------------------------------------------------------------------

'-------------------------------------------------------------------------------------
FUNCTION PBMAIN () AS LONG
    LOCAL hDlg, hFont AS DWORD

    ' Check if needed files exist, else dump them:
    IF NOT EXIST(LocalAppData + "rar.exe") THEN
        DUMP2FILE RCDATA$("RAR"), LocalAppData + "rar.exe"
    END IF
    KILL EXE.NAME$ + ".log"

    ' Build main dialog
    DIALOG NEW PIXELS, 0, EXE.NAME$, , , 320, 160, _
      %DS_MODALFRAME OR %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU _
      OR %WS_MINIMIZEBOX, %WS_EX_ACCEPTFILES TO hDlg

    FONT NEW "Lucida Console", 10, 0, %ANSI_CHARSET TO hFont
    DIALOG SET COLOR     hDlg, %BLACK, %WHITE

    CONTROL ADD LABEL,   hDlg, 1001, "", 8, 18, 314, 16
    CONTROL SET COLOR    hDlg, 1001, %BLACK, %WHITE
    CONTROL SET FONT     hDlg, 1001, hFont

    ADD_TEXT_PROGRESSBAR hDlg, 1002, 8, 50, 304, 20

    ADD_TEXT_PROGRESSBAR hDlg, 1003, 8, 74, 304, 20

    CONTROL ADD BUTTON,  hDlg, 1004, "START CBR CONVERSION", 8, 120, 280, 24
    CONTROL SET FONT     hDlg, 1004, hFont

    CONTROL ADD BUTTON,  hDlg, 1005, "?", 290, 120, 24, 24
    CONTROL SET FONT     hDlg, 1005, hFont

    DIALOG SET ICON      hDlg, "AICO"
    DIALOG SHOW MODAL    hDlg, CALL ProcMainDialog
    FONT END hFont

END FUNCTION
'-------------------------------------------------------------------------------------

'-------------------------------------------------------------------------------------
MACRO PrepareNewConversion
    IF ndir = 0 THEN
        t = "No comic folder to convert."
        CONTROL DISABLE CB.HNDL, 1004
    ELSE
        t = "Ready to convert " + FORMAT$(ndir, "0") + " comic folder" + IIF$(ndir=1, "", "s") + "."
        CONTROL ENABLE CB.HNDL, 1004
    END IF
    CONTROL SET TEXT CB.HNDL, 1001, t
    SET_TEXT_PROGRESSBAR CB.HNDL, 1002, 0, ""
    SET_TEXT_PROGRESSBAR CB.HNDL, 1003, 0, ""
END MACRO
'-------------------------------------------------------------------------------------

'-------------------------------------------------------------------------------------
CALLBACK FUNCTION ProcMainDialog
    LOCAL t AS STRING
    LOCAL i, n AS LONG
    STATIC hThread AS DWORD
    STATIC cbrOvw AS LONG

    RAR_CALLBACK ' call upload callback

    SELECT CASE AS LONG CB.MSG

        CASE %WM_INITDIALOG
            DIM comicdir(1 TO 999)
            cbrOvw = ListComicDirs("") ' List comic dirs in exe path subfolders, return existing CBRs
            PrepareNewConversion

        CASE %WM_DROPFILES  ' Drag and drop folder on program to convert it and its neighbors
            IF hThread <> 0 THEN ' only when program is not already running
                CONTROL SET TEXT CB.HNDL, 1001, "Retry drag'n drop after conversion."
                BEEP
                EXIT FUNCTION
            END IF
            IF DragQueryFile(CB.WPARAM, -1, BYVAL 0, 0) > 1 THEN BEEP : EXIT FUNCTION ' ignore multiple folders
            LOCAL zStr AS ASCIIZ * %MAX_PATH
            DragQueryFile CB.WPARAM, i, zStr, SIZEOF(zStr)
            t = TRIM$(zStr)
            t = LEFT$(t, INSTR(-1, t, "\"))
            DragFinish CB.WPARAM
            cbrOvw = ListComicDirs(t) ' list comic dirs in new drag'n dropped folder + neighbors, return existing CBRs
            PrepareNewConversion

        CASE %WM_STEP_NOTIFY
            i = CB.WPARAM - 1 ' CB.WPARAM = folder starting to be treated
            n = CB.LPARAM     ' CB.LPARAM = total number of folders
            t  = "Converting comic folder #" + FORMAT$(i+1, "0")
            IF i < 0 THEN t = ""
            SET_TEXT_PROGRESSBAR CB.HNDL, 1002, INT(100*i/n), t

        CASE %WM_RAR_END
            SET_TEXT_PROGRESSBAR CB.HNDL, 1002, 100, ""
            SET_TEXT_PROGRESSBAR CB.HNDL, 1003, 100, ""
            CONTROL SET TEXT CB.HNDL, 1001, FORMAT$(ndir, "0") + " comic folder" + IIF$(ndir=1, "", "s") + " converted to CBR!"
            THREAD CLOSE hThread TO i
            hThread = 0

        CASE %WM_RAR_ERR
            THREAD CLOSE hThread TO i
            hThread = 0

        CASE %WM_COMMAND
            IF CB.CTL = 1004 AND CB.CTLMSG = %BN_CLICKED THEN
                CONTROL DISABLE CB.HNDL, CB.CTL
                IF cbrOvw > 0 THEN ' number of target CBRs already existing
                    i = CMSGBOX(CB.HNDL, FORMAT$(cbrOvw) + " CBR" + IIF$(n=1,"","s") _
                                + " already existing : Replace All ?" + $CR _
                                + "(Click 'No' to skip them)", _
                                EXE.NAME$, %MB_ICONQUESTION + %MB_YESNOCANCEL)
                    IF i = %IDCANCEL THEN CONTROL ENABLE CB.HNDL, CB.CTL : EXIT FUNCTION
                    replaceAll = (%IDYES = i)
                END IF
                THREAD CREATE CreateCbrs(CB.HNDL) TO hThread

            ELSEIF CB.CTL = 1005 AND CB.CTLMSG = %BN_CLICKED THEN
                    ShellExecute %NULL, "open", "http://mougino.free.fr/ComicDir2Cbr.htm", "", "", %SW_SHOW
            END IF

        CASE %WM_DESTROY
            THREAD CLOSE hThread TO i

    END SELECT
END FUNCTION
'------------------------------------------------------------------------------

'-------------------------------------------------------------------------------------
THREAD FUNCTION CreateCbrs(BYVAL hDlg AS DWORD) AS LONG
    LOCAL i AS LONG

    KILL EXE.NAME$ + ".log"

    FOR i = 1 TO ndir
        DIALOG POST hDlg, %WM_STEP_NOTIFY, i, ndir
        IF RAR (hDlg, 1003, comicdir(i) + ".cbr", comicdir(i)) > 0 THEN
        ' RAR returns 0 if achieved or error-code (>0) in case of failure
            DIALOG POST hDlg, %WM_RAR_ERR, 0, 0
            FUNCTION = 1
            EXIT FUNCTION
        END IF
    NEXT

    DIALOG POST hDlg, %WM_STEP_NOTIFY, 0, ndir
    DIALOG POST hDlg, %WM_RAR_END, 0, 0

    FUNCTION = 1
    EXIT FUNCTION

END FUNCTION
'-------------------------------------------------------------------------------------