home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / VISUAL_B / FERRAMEN / VB_MFILE / VBMFILE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-09  |  13.4 KB  |  570 lines

  1. #include "windows.h"
  2. #include "shellapi.h"
  3. #include "vbapi.h"
  4.  
  5. LONG FAR PASCAL _export MultSelWndProc( HCTL, HWND, USHORT, USHORT, LONG );
  6.  
  7. typedef struct {
  8.    long cArgs;
  9.    long hszItem;
  10.    long index;
  11. } LPPARAM;
  12.  
  13. typedef struct {
  14.    HSZ hszPattern;
  15.    HSZ hszPath;
  16.    int Archive, ReadOnly, System, Extend;
  17.    int CellWidth, Style, DragDrop;
  18. } MSEL;
  19.  
  20. #define DEREF(hctl)  ((MSEL far *)VBDerefControl(hctl))
  21.  
  22. HANDLE hmodDLL;
  23.  
  24. PROPINFO piExtend =
  25. {
  26.    "ExtendedSel",
  27.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  28.    0, 0, NULL, 0
  29. };
  30.  
  31. PROPINFO piListCount =
  32. {
  33.    "ListCount",
  34.    DT_SHORT | PF_fGetMsg | PF_fNoShow,
  35.    0, 0, NULL, 0
  36. };
  37.  
  38. PROPINFO piListIndex =
  39. {
  40.    "ListIndex",
  41.    DT_SHORT | PF_fGetMsg | PF_fSetMsg | PF_fPropArray | PF_fNoShow,
  42.    0, 0, NULL, 0
  43. };
  44.  
  45. PROPINFO piList =
  46. {
  47.    "List",
  48.    DT_HSZ | PF_fGetMsg | PF_fPropArray | PF_fNoShow,
  49.    0, 0, NULL, 0
  50. };
  51.  
  52. PROPINFO piPattern =
  53. {
  54.    "Pattern",
  55.    DT_HSZ | PF_fGetData | PF_fSetData | PF_fSetMsg | PF_fSaveData,
  56.    0, 0, NULL, 0
  57. };
  58.  
  59. PROPINFO piPath =
  60. {
  61.    "Path",
  62.    DT_HSZ | PF_fGetData | PF_fSetData | PF_fSetMsg | PF_fNoShow,
  63.    sizeof(HSZ), 0, NULL, 0
  64. };
  65.  
  66. PROPINFO piArchive =
  67. {
  68.    "Archive",
  69.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  70.    0, 0, NULL, 0
  71. };
  72.  
  73. PROPINFO piReadOnly =
  74. {
  75.    "ReadOnly",
  76.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  77.    0, 0, NULL, 0
  78. };
  79.  
  80. PROPINFO piSystem =
  81. {
  82.    "System",
  83.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  84.    0, 0, NULL, 0
  85. };
  86.  
  87. PROPINFO piVersion =
  88. {
  89.    "Version",
  90.    DT_SHORT | PF_fGetMsg,
  91.    0, 0, NULL, 0
  92. };
  93.  
  94. PROPINFO piDragDrop =
  95. {
  96.    "DragAccept",
  97.    DT_BOOL | PF_fGetMsg | PF_fSetMsg | PF_fSaveData | PF_fNoShow,
  98.    0, 0, NULL, 0
  99. };
  100.  
  101. PROPINFO piCellWidth =
  102. {
  103.    "CellWidth",
  104.    DT_SHORT | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  105.    0, 0, NULL, 0
  106. };
  107.  
  108. #define PROP_LISTCOUNT 23
  109. #define PROP_LISTINDEX 24
  110. #define PROP_LIST      25
  111. #define PROP_PATTERN   26
  112. #define PROP_ARCHIVE   27
  113. #define PROP_READONLY  28
  114. #define PROP_SYSTEM    29
  115. #define PROP_PATH      30
  116. #define PROP_VERSION   31
  117. #define PROP_DRAGDROP  32
  118. #define PROP_EXTEND    33
  119. #define PROP_CELLWIDTH 34
  120.  
  121. PPROPINFO proplistMSel[] =
  122. {
  123.    PPROPINFO_STD_CTLNAME,
  124.    PPROPINFO_STD_INDEX,
  125.    PPROPINFO_STD_PARENT,
  126.    PPROPINFO_STD_BACKCOLOR,
  127.    PPROPINFO_STD_BORDERSTYLEON,
  128.    PPROPINFO_STD_LEFT,
  129.    PPROPINFO_STD_TOP,
  130.    PPROPINFO_STD_WIDTH,
  131.    PPROPINFO_STD_HEIGHT,
  132.    PPROPINFO_STD_ENABLED,
  133.    PPROPINFO_STD_VISIBLE,
  134.    PPROPINFO_STD_FONTNAME,
  135.    PPROPINFO_STD_FONTSIZE,
  136.    PPROPINFO_STD_FONTBOLD,
  137.    PPROPINFO_STD_FONTITALIC,
  138.    PPROPINFO_STD_FONTSTRIKE,
  139.    PPROPINFO_STD_FONTUNDER,
  140.    PPROPINFO_STD_FORECOLOR,
  141.    PPROPINFO_STD_DRAGMODE,
  142.    PPROPINFO_STD_DRAGICON,
  143.    PPROPINFO_STD_TABINDEX,
  144.    PPROPINFO_STD_TABSTOP,
  145.    PPROPINFO_STD_TAG,
  146.    &piListCount,
  147.    &piListIndex,
  148.    &piList,
  149.    &piPattern,
  150.    &piArchive,
  151.    &piReadOnly,
  152.    &piSystem,
  153.    &piPath,
  154.    &piVersion,
  155.    &piDragDrop,
  156.    &piExtend,
  157.    NULL
  158. };
  159.  
  160. PPROPINFO proplistMCol[] =
  161. {
  162.    PPROPINFO_STD_CTLNAME,
  163.    PPROPINFO_STD_INDEX,
  164.    PPROPINFO_STD_PARENT,
  165.    PPROPINFO_STD_BACKCOLOR,
  166.    PPROPINFO_STD_BORDERSTYLEON,
  167.    PPROPINFO_STD_LEFT,
  168.    PPROPINFO_STD_TOP,
  169.    PPROPINFO_STD_WIDTH,
  170.    PPROPINFO_STD_HEIGHT,
  171.    PPROPINFO_STD_ENABLED,
  172.    PPROPINFO_STD_VISIBLE,
  173.    PPROPINFO_STD_FONTNAME,
  174.    PPROPINFO_STD_FONTSIZE,
  175.    PPROPINFO_STD_FONTBOLD,
  176.    PPROPINFO_STD_FONTITALIC,
  177.    PPROPINFO_STD_FONTSTRIKE,
  178.    PPROPINFO_STD_FONTUNDER,
  179.    PPROPINFO_STD_FORECOLOR,
  180.    PPROPINFO_STD_DRAGMODE,
  181.    PPROPINFO_STD_DRAGICON,
  182.    PPROPINFO_STD_TABINDEX,
  183.    PPROPINFO_STD_TABSTOP,
  184.    PPROPINFO_STD_TAG,
  185.    &piListCount,
  186.    &piListIndex,
  187.    &piList,
  188.    &piPattern,
  189.    &piArchive,
  190.    &piReadOnly,
  191.    &piSystem,
  192.    &piPath,
  193.    &piVersion,
  194.    &piDragDrop,
  195.    &piExtend,
  196.    &piCellWidth,
  197.    NULL
  198. };
  199.  
  200. PEVENTINFO eventlistMSel[] =
  201. {
  202.    PEVENTINFO_STD_CLICK,
  203.    PEVENTINFO_STD_DRAGDROP,
  204.    PEVENTINFO_STD_DRAGOVER,
  205.    PEVENTINFO_STD_GOTFOCUS,
  206.    PEVENTINFO_STD_LOSTFOCUS,
  207.    PEVENTINFO_STD_KEYDOWN,
  208.    PEVENTINFO_STD_KEYPRESS,
  209.    PEVENTINFO_STD_KEYUP,
  210.    NULL
  211. };
  212.  
  213. MODEL modelMSel =
  214. {
  215.    VB_VERSION,
  216.    MODEL_fFocusOk | MODEL_fArrows,
  217.    (PCTLPROC)MultSelWndProc,
  218.    NULL,
  219.    WS_CHILD | LBS_MULTIPLESEL | LBS_SORT | LBS_NOTIFY | LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL,
  220.    sizeof(MSEL),
  221.    8000,
  222.    "MFile",
  223.    "MFile",
  224.    "listbox",
  225.    proplistMSel,
  226.    eventlistMSel
  227. };
  228.  
  229. MODEL modelMCol =
  230. {
  231.    VB_VERSION,
  232.    MODEL_fFocusOk | MODEL_fArrows,
  233.    (PCTLPROC)MultSelWndProc,
  234.    NULL,
  235.    WS_CHILD | LBS_MULTIPLESEL | LBS_SORT | LBS_NOTIFY | LBS_STANDARD | LBS_MULTICOLUMN | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL,
  236.    sizeof(MSEL),
  237.    8010,
  238.    "MCFile",
  239.    "MCFile",
  240.    "listbox",
  241.    proplistMCol,
  242.    eventlistMSel
  243. };
  244.  
  245. BOOL FAR PASCAL LibMain( HANDLE hmod, HANDLE segDS, USHORT cbHeapSize )
  246. {
  247.    hmodDLL = hmod;
  248.    UnlockData( 0 );
  249.    return( TRUE );
  250. }
  251.  
  252.  
  253. BOOL FAR PASCAL _export VBINITCC( USHORT usVersion, BOOL fRunTime )
  254. {
  255.    if( ! VBRegisterModel( hmodDLL, &modelMSel ) )
  256.       return( FALSE );
  257.  
  258.    return( VBRegisterModel( hmodDLL, &modelMCol ) );
  259. }
  260.  
  261.  
  262. LONG FAR PASCAL _export MultSelWndProc( HCTL hCtl, HWND hWnd, USHORT msg, USHORT wParam, LONG lParam )
  263. {
  264.    switch( msg )
  265.    {
  266.       case WM_USER:
  267.       {
  268.          LPSTR lpStr;
  269.          WORD Attr;
  270.          HDC hDC;
  271.          MSEL far *Ms = DEREF( hCtl );
  272.          char str[ 128 ];
  273.  
  274.          SendMessage( hWnd, LB_RESETCONTENT, 0, NULL );
  275.  
  276.          hDC = GetDC( hWnd );
  277.          SendMessage( GetParent( hWnd ), WM_CTLCOLOR, hDC, MAKELONG( hWnd, hWnd ) );
  278.          ReleaseDC( hWnd, hDC );
  279.  
  280.          Attr = 0;
  281.          if( Ms->Archive )
  282.             Attr |= 0x20;
  283.          if( Ms->ReadOnly )
  284.             Attr |= 0x01;
  285.          if( Ms->System )
  286.             Attr |= 0x04;
  287.  
  288.          str[ 0 ] = '\0';
  289.          if( Ms->hszPath )
  290.          {
  291.             lpStr = VBDerefHsz( Ms->hszPath );
  292.             if( lpStr )
  293.             {
  294.                lstrcpy( str, lpStr );
  295.                if( str[ 3 ] != '\0' )
  296.                   lstrcat( str, "\\" );
  297.             }
  298.          }
  299.  
  300.          if( Ms->hszPattern )
  301.          {
  302.             lpStr = VBDerefHsz( Ms->hszPattern );
  303.             if( lpStr )
  304.             {
  305.                if( lstrlen( lpStr ) )
  306.                {
  307.                   lstrcat( str, lpStr );
  308.                   SendMessage( hWnd, LB_DIR, Attr, (LONG)str );
  309.                }
  310.                else
  311.                {
  312.                   lstrcat( str, "*.*" );
  313.                   SendMessage( hWnd, LB_DIR, Attr, (LONG)(LPSTR)str );
  314.                }
  315.             }
  316.             else
  317.                SendMessage( hWnd, LB_DIR, Attr, (LONG)(LPSTR)"*.*" );
  318.          }
  319.          else
  320.             SendMessage( hWnd, LB_DIR, Attr, (LONG)(LPSTR)"*.*" );
  321.  
  322.          break;
  323.       }
  324.  
  325.       case WM_CREATE:
  326.       {
  327.          MSEL far *Ms = DEREF( hCtl );
  328.          char str[ 40 ];
  329.  
  330.          if( ! Ms->CellWidth )
  331.             Ms->CellWidth = 80;
  332.  
  333.          VBGetControlName( hCtl, str );
  334.  
  335.          if( str[ 1 ] == 'C' )
  336.             Ms->Style = 1;
  337.          else
  338.             Ms->Style = 0;
  339.  
  340.          if( Ms->Style )
  341.             SendMessage( hWnd, LB_SETCOLUMNWIDTH, Ms->CellWidth, NULL );
  342.  
  343.          PostMessage( hWnd, WM_USER, 0, NULL );
  344.  
  345.          if( VBGetMode() != MODE_DESIGN )
  346.             DragAcceptFiles( hWnd, Ms->DragDrop );
  347.          else
  348.             Ms->DragDrop = 0;
  349.          break;
  350.       }
  351.  
  352.       case VBM_METHOD:
  353.          if( wParam == METH_ADDITEM )
  354.          {
  355.             LPPARAM far *lpParams;
  356.  
  357.             lpParams = (LPPARAM far *)lParam;
  358.             if( lpParams->cArgs < 2 )                                                             /*  If no string passed, exit  */
  359.                return( TRUE );
  360.  
  361.             if( lpParams->cArgs == 3 )                                                               /*  If index was passed...  */
  362.                SendMessage( hWnd, LB_INSERTSTRING, (int)lpParams->index, (LONG)VBLockHsz( (HSZ)lpParams->hszItem ) );
  363.             else
  364.                SendMessage( hWnd, LB_INSERTSTRING, 0, (LONG)VBLockHsz( (HSZ)lpParams->hszItem ) );
  365.  
  366.             VBUnlockHsz( (HSZ)lpParams->hszItem );
  367.             return( FALSE );
  368.          }
  369.  
  370.          if( wParam == METH_REMOVEITEM )
  371.          {
  372.             LPPARAM far *lpParams;
  373.  
  374.             lpParams = (LPPARAM far *)lParam;
  375.             if( lpParams->cArgs < 2 )
  376.                return( TRUE );
  377.  
  378.             SendMessage( hWnd, LB_DELETESTRING, (int)lpParams->hszItem, NULL );
  379.             return( FALSE );
  380.          }
  381.  
  382.          break;
  383.  
  384.       case VBM_GETPROPERTY:
  385.          if( wParam == PROP_LISTCOUNT )
  386.          {
  387.             int far *item;
  388.  
  389.             item = (int far *)lParam;
  390.             *item = SendMessage( hWnd, LB_GETCOUNT, 0, NULL );
  391.             return( FALSE );
  392.          }
  393.  
  394.          if( wParam == PROP_EXTEND )
  395.          {
  396.             MSEL far *Ms = DEREF( hCtl );
  397.  
  398.             *(WORD far *)lParam = Ms->Extend;
  399.             return( FALSE );
  400.          }
  401.  
  402.          if( wParam == PROP_LISTINDEX )
  403.          {
  404.             int far *item;
  405.             LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
  406.  
  407.             item = (int far *)lParam;
  408.             *item = SendMessage( hWnd, LB_GETSEL, lpDs->index[ 0 ].data, NULL );
  409.             if( *item )
  410.                *item = -1;
  411.             else
  412.                *item = 0;
  413.  
  414.             return( FALSE );
  415.          }
  416.  
  417.          if( wParam == PROP_LIST )
  418.          {
  419.             char str[ 256 ];
  420.             LONG i;
  421.             LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
  422.  
  423.             i = lpDs->index[ 0 ].data;
  424.             SendMessage( hWnd, LB_GETTEXT, (int)i, (LONG)(LPSTR)str );
  425.             lpDs->data = (LONG)VBCreateHsz( (_segment)hCtl, str );
  426.             return( FALSE );
  427.          }
  428.  
  429.          if( wParam == PROP_ARCHIVE )
  430.          {
  431.             MSEL far *Ms = DEREF( hCtl );
  432.  
  433.             *(WORD far *)lParam = Ms->Archive;
  434.             return( FALSE );
  435.          }
  436.  
  437.          if( wParam == PROP_READONLY )
  438.          {
  439.             MSEL far *Ms = DEREF( hCtl );
  440.  
  441.             *(WORD far *)lParam = Ms->ReadOnly;
  442.             return( FALSE );
  443.          }
  444.  
  445.          if( wParam == PROP_SYSTEM )
  446.          {
  447.             MSEL far *Ms = DEREF( hCtl );
  448.  
  449.             *(WORD far *)lParam = Ms->System;
  450.             return( FALSE );
  451.          }
  452.  
  453.          if( wParam == PROP_CELLWIDTH )
  454.          {
  455.             MSEL far *Ms = DEREF( hCtl );
  456.  
  457.             if( ! Ms->Style )
  458.                *(WORD far *)lParam = -1;
  459.             else
  460.                *(WORD far *)lParam = Ms->CellWidth;
  461.  
  462.             return( FALSE );
  463.          }
  464.  
  465.          if( wParam == PROP_VERSION )
  466.          {
  467.             MSEL far *Ms = DEREF( hCtl );
  468.  
  469.             *(WORD far *)lParam = 101;
  470.             return( FALSE );
  471.          }
  472.  
  473.          if( wParam == PROP_DRAGDROP )
  474.          {
  475.             MSEL far *Ms = DEREF( hCtl );
  476.  
  477.             *(WORD far *)lParam = Ms->DragDrop;
  478.             return( FALSE );
  479.          }
  480.          break;
  481.  
  482.       case VBM_SETPROPERTY:
  483.          if( wParam == PROP_EXTEND )
  484.          {
  485.             MODEL far *lpModel;
  486.             MSEL far *Ms = DEREF( hCtl );
  487.  
  488.             lpModel = VBGetControlModel( hCtl );
  489.  
  490.             Ms->Extend = LOWORD( lParam );
  491.  
  492.             if( Ms->Extend )
  493.                lpModel->flWndStyle |= LBS_EXTENDEDSEL;
  494.             else
  495.                lpModel->flWndStyle &= ~LBS_EXTENDEDSEL;
  496.  
  497.             VBRecreateControlHwnd( hCtl );
  498.             return( FALSE );
  499.          }
  500.  
  501.          if( wParam == PROP_LISTINDEX )
  502.          {
  503.             LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
  504.             WORD lPm;
  505.  
  506.             lPm = LOWORD( lpDs->data );
  507.  
  508.             if( lpDs->index[ 0 ].data == -1 )
  509.             {
  510.                SendMessage( hWnd, LB_SETSEL, lPm, lpDs->index[ 0 ].data );
  511.                return( FALSE );
  512.             }
  513.             SendMessage( hWnd, LB_SETSEL, lPm, (int)lpDs->index[ 0 ].data );
  514.  
  515.             InvalidateRect( hWnd, NULL, TRUE );
  516.             return( FALSE );
  517.          }
  518.  
  519.          if( wParam == PROP_PATTERN || wParam == PROP_PATH )
  520.          {
  521.             PostMessage( hWnd, WM_USER, 0, NULL );
  522.             return( FALSE );
  523.          }
  524.  
  525.          if( wParam == PROP_ARCHIVE || wParam == PROP_READONLY || wParam == PROP_SYSTEM )
  526.          {
  527.             MSEL far *Ms = DEREF( hCtl );
  528.             int i;
  529.  
  530.             if( wParam == PROP_ARCHIVE )
  531.                Ms->Archive = (BOOL)lParam;
  532.             if( wParam == PROP_READONLY )
  533.                Ms->ReadOnly = (BOOL)lParam;
  534.             if( wParam == PROP_SYSTEM )
  535.                Ms->System = (BOOL)lParam;
  536.  
  537.             PostMessage( hWnd, WM_USER, 0, NULL );
  538.             return( FALSE );
  539.          }
  540.  
  541.          if( wParam == PROP_DRAGDROP )
  542.          {
  543.             MSEL far *Ms = DEREF( hCtl );
  544.  
  545.             Ms->DragDrop = LOWORD( lParam );
  546.  
  547.             if( VBGetMode() != MODE_DESIGN )
  548.                DragAcceptFiles( hWnd, Ms->DragDrop );
  549.  
  550.             return( FALSE );
  551.          }
  552.  
  553.          if( wParam == PROP_CELLWIDTH )
  554.          {
  555.             MSEL far *Ms = DEREF( hCtl );
  556.  
  557.             if( ! Ms->Style )
  558.                return( FALSE );
  559.  
  560.             Ms->CellWidth = LOWORD( lParam );
  561.             SendMessage( hWnd, LB_SETCOLUMNWIDTH, LOWORD( lParam ), NULL );
  562.             InvalidateRect( hWnd, NULL, FALSE );
  563.             return( FALSE );
  564.          }
  565.          break;
  566.    }
  567.    return( VBDefControlProc( hCtl, hWnd, msg, wParam, lParam ) );
  568. }
  569.  
  570.