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