updatelb.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:13k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /* updatelb.c module of WizUnzip.
  2.  * Author: Robert A. Heath
  3.  * I, Robert Heath, place this source code module in the public domain.
  4.  *
  5.  * Modifications: 1995, 1996 Mike White.
  6.  *  - Modified for WiZ
  7.  */
  8. #include <stdio.h>
  9. #include <windows.h>
  10. #include <string.h>
  11. #include "wiz.h"
  12. #include "unzipwindlldecs.h"
  13. #ifdef WIN32
  14. int iColumn = 0; /* Set externally to indicate which column is being sorted on
  15.                     Should always be reset to zero after doing a sort!!!
  16.                   */
  17. #endif
  18. /* Update Buttons is called when an event possibly modifies the
  19.  * number of selected items in the listbox.
  20.  * The function reads the number of selected items.
  21.  * A non-zero value enables relevant buttons and menu items.
  22.  * A zero value disables them.
  23.  */
  24. void UpdateButtons(void)
  25. {
  26. int mf;
  27. static BOOL fButtonState = FALSE;
  28. if (lpumb->szFileName[0] &&
  29. #ifndef WIN32
  30.    SendMessage(hWndList, LB_GETSELCOUNT, 0, 0L)) /* anything selected ? */
  31. #else
  32.    ListView_GetSelectedCount(hWndList))
  33. #endif
  34.    {
  35.    fButtonState = TRUE;
  36.    }
  37. else
  38.    {
  39.    fButtonState = FALSE;
  40.    }
  41. WinAssert(hExtract);
  42. EnableWindow(hExtract, fButtonState);
  43. #ifdef MAX_BUTTONS
  44. WinAssert(hDisplay);
  45. EnableWindow(hDisplay, fButtonState);
  46. WinAssert(hTest);
  47. EnableWindow(hTest, fButtonState);
  48. WinAssert(hZipInfo);
  49. EnableWindow(hZipInfo, fButtonState);
  50. WinAssert(hShowComment);
  51. EnableWindow(hShowComment, (BOOL)(fButtonState && lpUserFunctions->cchComment ? TRUE : FALSE));
  52. WinAssert(hCopyArchive);
  53. EnableWindow(hCopyArchive, fButtonState);
  54. WinAssert(hMoveArchive);
  55. EnableWindow(hMoveArchive, fButtonState);
  56. WinAssert(hRenameArchive);
  57. EnableWindow(hRenameArchive, fButtonState);
  58. #endif
  59. WinAssert(hDeleteArchive);
  60. EnableWindow(hDeleteArchive, fButtonState);
  61. EnableMenuItem(hMenu, IDM_GET_ZIPINFO, (fButtonState ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND);
  62. EnableMenuItem(hMenu, IDM_EXTRACT, (fButtonState ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND);
  63. EnableMenuItem(hMenu, IDM_DISPLAY, (fButtonState ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND);
  64. EnableMenuItem(hMenu, IDM_TEST, (fButtonState ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND);
  65. EnableMenuItem(hMenu, IDM_SHOW_COMMENT,
  66.    (BOOL)(fButtonState && lpUserFunctions->cchComment ? MF_ENABLED : MF_DISABLED|MF_GRAYED)|MF_BYCOMMAND);
  67. if (lpumb->szFileName[0] != '')
  68.    mf = MF_ENABLED|MF_BYCOMMAND;
  69. else
  70.    mf = MF_DISABLED | MF_GRAYED | MF_BYCOMMAND;
  71. EnableMenuItem(hMenu, IDM_COPY_ARCHIVE,       mf);
  72. EnableMenuItem(hMenu, IDM_MOVE_ARCHIVE,       mf);
  73. EnableMenuItem(hMenu, IDM_DELETE_ARCHIVE,     mf);
  74. EnableMenuItem(hMenu, IDM_RENAME_ARCHIVE,     mf);
  75. EnableMenuItem(hMenu, IDM_UPDATE_ZIP,         mf);
  76. EnableMenuItem(hMenu, IDM_ZIP_DELETE_ENTRIES, mf);
  77. EnableMenuItem(hMenu, IDM_ZIP_STATS,          mf);
  78. }
  79. /* UpdateListBox fills in the listbox (or ListView), and sorts it
  80.  * depending on what the column number is.
  81.  *
  82.  * Note that iColumn determines the data the sort is done on.
  83.  */
  84. void UpdateListBox(void)
  85. {
  86. #ifndef WIN32
  87. SendMessage(hWndList, LB_RESETCONTENT, 0, 0L);
  88. #else
  89. ListView_DeleteAllItems(hWndList);
  90. #endif
  91. UpdateWindow( hWndList );
  92. cZippedFiles = 0;
  93. if (lpumb->szFileName[0])       /* file selected? */
  94.    {
  95.         /* if so -- stuff list box              */
  96.    SendMessage(hWndList, WM_SETREDRAW, FALSE, 0L);
  97.    /* Call here when a file has been initially selected */
  98.    lpDCL->ncflag = 0;
  99.    lpDCL->ntflag = 0;
  100.    lpDCL->nvflag = (int)(!uf.fFormatLong ? 1 : 2);
  101.    lpDCL->nUflag = 1;
  102.    lpDCL->nzflag = 0;
  103.    lpDCL->ndflag = 0;
  104.    lpDCL->noflag = 0;
  105.    lpDCL->naflag = 0;
  106.    argc   = 0;
  107.    lpDCL->lpszZipFN = lpumb->szFileName;
  108.    argv = NULL;
  109.    lpDCL->lpszExtractDir = NULL;
  110.    Unz_SingleEntryPoint(argc, argv, 0, NULL, lpDCL, lpUserFunctions);
  111.    SendMessage(hWndList, WM_SETREDRAW, TRUE, 0L);
  112.    InvalidateRect(hWndList, NULL, TRUE);   /* force redraw */
  113. #ifndef WIN32
  114.    cZippedFiles = (WORD)SendMessage(hWndList, LB_GETCOUNT, 0, 0L);
  115. #else
  116.    cZippedFiles = (WORD)ListView_GetItemCount(hWndList);
  117. #endif
  118.    WinAssert((int)cZippedFiles != LB_ERR);
  119.    if (cZippedFiles)   /* if anything went into listbox set to top */
  120. #ifndef WIN32
  121.       SendMessage(hWndList, LB_SETTOPINDEX, 0, 0L);
  122. #else
  123.       ListView_EnsureVisible(hWndList, 0, FALSE);
  124. #endif
  125.    }
  126. }
  127. #ifndef WIN32
  128. #ifdef __BORLANDC__
  129. #pragma argsused
  130. #endif
  131. void WINAPI ReceiveDllMessage(unsigned long ucsize,unsigned long csiz,
  132.    ush cfactor, ush mo, ush dy, ush yr, ush hh, ush mm,
  133.    char c, char *filename, char *methbuf, unsigned long crc, char fCrypt)
  134. {
  135. char psLBEntry[PATH_MAX];
  136. char LongHdrStats[] =
  137.      "%7lu  %7lu %4s  %02u-%02u-%02u  %02u:%02u %c%s";
  138. char ShortHdrStats[] = "%7lu  %02u-%02u-%02u  %02u:%02u %c%s";
  139. char CompFactorStr[] = "%c%d%%";
  140. char CompFactor100[] = "100%%";
  141. char szCompFactor[10];
  142. char sgn;
  143. extern BOOL fScanning;
  144. extern char SearchPattern[PATH_MAX];
  145. if (fScanning)
  146.    {
  147. #ifndef __BORLANDC__
  148.    _strlwr(SearchPattern); /* convert filename to lower case */
  149. #else
  150.    strlwr(SearchPattern); /* convert filename to lower case */
  151. #endif
  152.    /* Use UnZip's match() function                  */
  153.    if (UzpMatch(filename, SearchPattern, TRUE))
  154.       BufferOut("Found match: %sn", filename);
  155.    return;
  156.    }
  157. if (csiz > ucsize)
  158.    sgn = '-';
  159. else
  160.    sgn = ' ';
  161. if (cfactor == 100)
  162.    lstrcpy(szCompFactor, CompFactor100);
  163. else
  164.    sprintf(szCompFactor, CompFactorStr, sgn, cfactor);
  165. if (uf.fFormatLong)
  166.    wsprintf(psLBEntry, LongHdrStats,
  167.        ucsize, csiz, szCompFactor, mo, dy, yr, hh, mm, c, filename);
  168. else
  169.    wsprintf(psLBEntry, ShortHdrStats,
  170.        ucsize, mo, dy, yr, hh, mm, c, filename);
  171. SendMessage(hWndList, LB_ADDSTRING, 0,(LPARAM)(LPSTR)psLBEntry);
  172. }
  173. #else /* ?WIN32 */
  174. #ifdef __BORLANDC__
  175. #pragma argsused
  176. #endif
  177. void WINAPI ReceiveDllMessage(unsigned long ucsize,unsigned long csiz,
  178.    ush cfactor, ush mo, ush dy, ush yr, ush hh, ush mm,
  179.    char c, char *filename, char *methbuf, unsigned long crc, char fCrypt)
  180. {
  181. LV_ITEM lvi;
  182. char Length[9];
  183. char Size[9];
  184. char Ratio[5];
  185. char Date[9];
  186. char Time[6];
  187. char Name[PATH_MAX];
  188. char CompFactorStr[] = "%c%d%%";
  189. char CompFactor100[] = "100%%";
  190. char szCompFactor[10];
  191. char sgn;
  192. extern BOOL fScanning;
  193. extern char SearchPattern[PATH_MAX];
  194. if (fScanning)
  195.    {
  196. #ifndef __BORLANDC__
  197.    _strlwr(SearchPattern); /* convert filename to lower case */
  198. #else
  199.    strlwr(SearchPattern); /* convert filename to lower case */
  200. #endif
  201.    /* Use UnZip's match() function                  */
  202.    if (UzpMatch(filename, SearchPattern, TRUE))
  203.       BufferOut("Found match: %sn", filename);
  204.    return;
  205.    }
  206. if (csiz > ucsize)
  207.    sgn = '-';
  208. else
  209.    sgn = ' ';
  210. if (cfactor == 100)
  211.    lstrcpy(szCompFactor, CompFactor100);
  212. else
  213.    sprintf(szCompFactor, CompFactorStr, sgn, cfactor);
  214. wsprintf(Length, "%7lu", ucsize);
  215. wsprintf(Size, "%7lu", csiz);
  216. wsprintf(Ratio, "%4s", szCompFactor);
  217. wsprintf(Date, "%02u-%02u-%02u", mo, dy, yr);
  218. wsprintf(Time, "%02u:%02u", hh, mm);
  219. wsprintf(Name, "%c%s", c, filename);
  220. lvi.mask        = LVIF_TEXT;
  221. lvi.state       = 0;
  222. lvi.stateMask   = LVIS_STATEIMAGEMASK;
  223. lvi.iItem       = 0;
  224. lvi.iSubItem    = 0;
  225. lvi.cchTextMax  = 9;
  226. lvi.iImage      = 0;
  227. switch (iColumn)
  228.    {
  229.    case 0:
  230.       lvi.pszText = Name;                                          /* sub-item 0 */
  231.       lvi.iItem = ListView_InsertItem(hWndList, &lvi);
  232.       ListView_SetItemText(hWndList, lvi.iItem, 1, (LPSTR) Length);/* sub-item 1 */
  233.       ListView_SetItemText(hWndList, lvi.iItem, 2, (LPSTR) Size);  /* sub-item 2 */
  234.       ListView_SetItemText(hWndList, lvi.iItem, 3, (LPSTR) Ratio); /* sub-item 3 */
  235.       ListView_SetItemText(hWndList, lvi.iItem, 4, (LPSTR) Date);  /* sub-item 4 */
  236.       ListView_SetItemText(hWndList, lvi.iItem, 5, (LPSTR) Time);  /* sub-item 5 */
  237.       break;
  238.    case 1:
  239.       lvi.pszText = Length;                                        /* sub-item 0 */
  240.       lvi.iItem = ListView_InsertItem(hWndList, &lvi);
  241.       ListView_SetItemText(hWndList, lvi.iItem, 1, (LPSTR) Name);/* sub-item 0 */
  242.       ListView_SetItemText(hWndList, lvi.iItem, 2, (LPSTR) Size);  /* sub-item 2 */
  243.       ListView_SetItemText(hWndList, lvi.iItem, 3, (LPSTR) Ratio); /* sub-item 3 */
  244.       ListView_SetItemText(hWndList, lvi.iItem, 4, (LPSTR) Date);  /* sub-item 4 */
  245.       ListView_SetItemText(hWndList, lvi.iItem, 5, (LPSTR) Time);  /* sub-item 5 */
  246.       break;
  247.    case 2:
  248.       lvi.pszText = Size;                                          /* sub-item 0 */
  249.       lvi.iItem = ListView_InsertItem(hWndList, &lvi);
  250.       ListView_SetItemText(hWndList, lvi.iItem, 1, (LPSTR) Length);/* sub-item 1 */
  251.       ListView_SetItemText(hWndList, lvi.iItem, 2, (LPSTR) Name);  /* sub-item 0 */
  252.       ListView_SetItemText(hWndList, lvi.iItem, 3, (LPSTR) Ratio); /* sub-item 3 */
  253.       ListView_SetItemText(hWndList, lvi.iItem, 4, (LPSTR) Date);  /* sub-item 4 */
  254.       ListView_SetItemText(hWndList, lvi.iItem, 5, (LPSTR) Time);  /* sub-item 5 */
  255.       break;
  256.    case 3:
  257.       lvi.pszText = Ratio;                                          /* sub-item 0 */
  258.       lvi.iItem = ListView_InsertItem(hWndList, &lvi);
  259.       ListView_SetItemText(hWndList, lvi.iItem, 1, (LPSTR) Length);/* sub-item 1 */
  260.       ListView_SetItemText(hWndList, lvi.iItem, 2, (LPSTR) Size);  /* sub-item 2 */
  261.       ListView_SetItemText(hWndList, lvi.iItem, 3, (LPSTR) Name);  /* sub-item 0 */
  262.       ListView_SetItemText(hWndList, lvi.iItem, 4, (LPSTR) Date);  /* sub-item 4 */
  263.       ListView_SetItemText(hWndList, lvi.iItem, 5, (LPSTR) Time);  /* sub-item 5 */
  264.       break;
  265.    case 4:
  266.       lvi.pszText = Date;                                          /* sub-item 0 */
  267.       lvi.iItem = ListView_InsertItem(hWndList, &lvi);
  268.       ListView_SetItemText(hWndList, lvi.iItem, 1, (LPSTR) Length);/* sub-item 1 */
  269.       ListView_SetItemText(hWndList, lvi.iItem, 2, (LPSTR) Size);  /* sub-item 2 */
  270.       ListView_SetItemText(hWndList, lvi.iItem, 3, (LPSTR) Ratio); /* sub-item 3 */
  271.       ListView_SetItemText(hWndList, lvi.iItem, 4, (LPSTR) Name);  /* sub-item 0 */
  272.       ListView_SetItemText(hWndList, lvi.iItem, 5, (LPSTR) Time);  /* sub-item 5 */
  273.       break;
  274.    case 5:
  275.       lvi.pszText = Time;                                          /* sub-item 0 */
  276.       lvi.iItem = ListView_InsertItem(hWndList, &lvi);
  277.       ListView_SetItemText(hWndList, lvi.iItem, 1, (LPSTR) Length);/* sub-item 1 */
  278.       ListView_SetItemText(hWndList, lvi.iItem, 2, (LPSTR) Size);  /* sub-item 2 */
  279.       ListView_SetItemText(hWndList, lvi.iItem, 3, (LPSTR) Ratio); /* sub-item 3 */
  280.       ListView_SetItemText(hWndList, lvi.iItem, 4, (LPSTR) Date);  /* sub-item 4 */
  281.       ListView_SetItemText(hWndList, lvi.iItem, 5, (LPSTR) Name);  /* sub-item 0 */
  282.       break;
  283.    }
  284. }
  285. /* All this does is force a selection of the item number passed in */
  286. void ListViewSetSel(int item, BOOL b)
  287. {
  288. /* Sure is a pain to force a selection within a program */
  289. LV_ITEM lvi;
  290. lvi.mask      = LVIF_STATE;
  291. lvi.stateMask = LVIS_SELECTED;
  292. lvi.iItem     = item;
  293. lvi.iSubItem  = 0;
  294. ListView_GetItem(hWndList, &lvi);
  295. if (b)
  296.     lvi.state = LVIS_SELECTED;
  297. else
  298.     lvi.state = 0;
  299. SendMessage(hWndList, LVM_SETITEMSTATE, (WPARAM)item,
  300.          (LPARAM)&lvi);
  301. }
  302. void ListViewSortOnColumns(int iCol)
  303. {
  304. int i, j;
  305. LPTSTR lpStr1, lpStr2;
  306. HANDLE hMem1, hMem2;
  307. iColumn = iCol;
  308. UpdateListBox();
  309. /* Restore the ListView to the appropriate columns */
  310. hMem1 = GlobalAlloc( GPTR, (PATH_MAX * 2));
  311. if (!hMem1)
  312.    return;
  313. hMem2 = GlobalAlloc( GPTR, (PATH_MAX * 2));
  314. if (!hMem2)
  315.    {
  316.    GlobalFree(hMem1);
  317.    return;
  318.    }
  319. lpStr1 = (LPSTR)GlobalLock(hMem1);
  320. if (!lpStr1)
  321.    {
  322.    GlobalFree(hMem1);
  323.    GlobalFree(hMem2);
  324.    return;
  325.    }
  326. lpStr2 = (LPSTR)GlobalLock(hMem2);
  327. if (!lpStr2)
  328.    {
  329.    GlobalUnlock(lpStr1);
  330.    GlobalFree(hMem1);
  331.    GlobalFree(hMem2);
  332.    return;
  333.    }
  334. j = ListView_GetItemCount(hWndList);
  335. for (i = 0; i < j; i++)
  336.     {
  337.     switch (iColumn)
  338.        {
  339.        case 1: /* Swap subitem 0 and 1 */
  340.           ListView_GetItemText(hWndList, i, 0, lpStr1, PATH_MAX);
  341.           ListView_GetItemText(hWndList, i, 1, lpStr2, PATH_MAX);
  342.           ListView_SetItemText(hWndList, i, 0, lpStr2);
  343.           ListView_SetItemText(hWndList, i, 1, lpStr1);
  344.           break;
  345.        case 2: /* Swap subitem 0 and 2 */
  346.           ListView_GetItemText(hWndList, i, 0, lpStr1, PATH_MAX);
  347.           ListView_GetItemText(hWndList, i, 2, lpStr2, PATH_MAX);
  348.           ListView_SetItemText(hWndList, i, 0, lpStr2);
  349.           ListView_SetItemText(hWndList, i, 2, lpStr1);
  350.           break;
  351.        case 3: /* Swap subitem 0 and 3 */
  352.           ListView_GetItemText(hWndList, i, 0, lpStr1, PATH_MAX);
  353.           ListView_GetItemText(hWndList, i, 3, lpStr2, PATH_MAX);
  354.           ListView_SetItemText(hWndList, i, 0, lpStr2);
  355.           ListView_SetItemText(hWndList, i, 3, lpStr1);
  356.           break;
  357.        case 4: /* Swap subitem 0 and 4 */
  358.           ListView_GetItemText(hWndList, i, 0, lpStr1, PATH_MAX);
  359.           ListView_GetItemText(hWndList, i, 4, lpStr2, PATH_MAX);
  360.           ListView_SetItemText(hWndList, i, 0, lpStr2);
  361.           ListView_SetItemText(hWndList, i, 4, lpStr1);
  362.           break;
  363.        case 5: /* Swap subitem 0 and 5 */
  364.           ListView_GetItemText(hWndList, i, 0, lpStr1, PATH_MAX);
  365.           ListView_GetItemText(hWndList, i, 5, lpStr2, PATH_MAX);
  366.           ListView_SetItemText(hWndList, i, 0, lpStr2);
  367.           ListView_SetItemText(hWndList, i, 5, lpStr1);
  368.           break;
  369.        }
  370.     }
  371. iColumn = 0; /* restore back to default of filename */
  372. GlobalUnlock(lpStr1);
  373. GlobalUnlock(lpStr2);
  374. GlobalFree(hMem1);
  375. GlobalFree(hMem2);
  376. }
  377. #endif /* ?WIN32 */