home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / dbmsg / oledb / tablecopy / step4.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-12  |  22.2 KB  |  633 lines

  1. //-----------------------------------------------------------------------------
  2. // Microsoft OLE DB TABLECOPY Sample
  3. // Copyright (C) 1995-1998 Microsoft Corporation
  4. //
  5. // @doc
  6. //
  7. // @module STEP4.CPP
  8. //
  9. //-----------------------------------------------------------------------------
  10.  
  11. /////////////////////////////////////////////////////////////////////
  12. // Includes
  13. //
  14. /////////////////////////////////////////////////////////////////////
  15. #include "wizard.h"
  16. #include "common.h"
  17. #include "tablecopy.h"
  18. #include "table.h"
  19.  
  20.  
  21. /////////////////////////////////////////////////////////////////////
  22. // Defines
  23. //
  24. /////////////////////////////////////////////////////////////////////
  25. //Enum Type Header for the ListView controls
  26. enum COL_HEADERS
  27. {
  28.     //IDL_FROM_TYPES
  29.     //ID_TO_TYPES
  30.     COL_COLNAME            = 0,    //ColInfo.pwszName
  31.     COL_COLTYPENAME        = 1,    //TypeInfo.pwszTypeName
  32.     COL_COLTYPE            = 2,    //ColInfo.wType
  33.     COL_COLORDINAL        = 3,    //ColInfo.iOrdinal
  34.     COL_COLSIZE            = 4,    //ColInfo.ulColumnSize
  35.     COL_COLPREC            = 5,    //ColInfo.bPrecision
  36.     COL_COLSCALE        = 6,    //ColInfo.bScale
  37.     COL_COLISFIXED        = 7,    //ColInfo.dwFlags ISFIXEDLENGTH
  38.     COL_COLISLONG        = 8,    //ColInfo.dwFlags ISLONG
  39.     COL_COLISNULLABLE    = 9,    //ColInfo.dwFlags ISNULLABLE
  40.     COL_COLWRITE        =10,    //ColInfo.dwFlags WRITE
  41.     COL_COLISROWID        =11,    //ColInfo.dwFlags ISROWID
  42.     COL_COLISROWVER        =12,    //ColInfo.dwFlags ISROWVER
  43. };
  44.  
  45. enum EICON
  46. {
  47.     ICON_COLUMN            = 0,
  48.     ICON_READONLY        = 1,
  49.     ICON_LONG            = 2,
  50. };
  51.  
  52. /////////////////////////////////////////////////////////////////////
  53. // CS4Dialog::CS4Dialog
  54. //
  55. /////////////////////////////////////////////////////////////////////
  56. CS4Dialog::CS4Dialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
  57.     : CDialogBase(hWnd, hInst)
  58. {
  59.     ASSERT(pCTableCopy);
  60.     m_pCTableCopy = pCTableCopy;
  61. }
  62.  
  63.  
  64. /////////////////////////////////////////////////////////////////////
  65. // CS4Dialog::~CS4Dialog
  66. //
  67. /////////////////////////////////////////////////////////////////////
  68. CS4Dialog::~CS4Dialog()
  69. {
  70. }
  71.  
  72.  
  73. /////////////////////////////////////////////////////////////////////////////
  74. // ULONG CS4Dialog::Display
  75. //
  76. /////////////////////////////////////////////////////////////////////////////
  77. ULONG CS4Dialog::Display()
  78. {                              
  79.     return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_OPTIONS), NULL, DlgProc, (LPARAM)this);
  80. }
  81.  
  82.  
  83. /////////////////////////////////////////////////////////////////////
  84. // CS4Dialog::DlgProc
  85. //
  86. /////////////////////////////////////////////////////////////////////
  87. BOOL WINAPI CS4Dialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  88. {
  89.     switch(msg) 
  90.     {
  91.         case WM_INITDIALOG:
  92.         {
  93.             Busy();
  94.             //Store the "this" pointer, since this is a static method
  95.             CS4Dialog* pThis = (CS4Dialog*)lParam;
  96.             SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);
  97.             
  98.             //On INIT we know we have a valid hWnd to store
  99.             pThis->m_hWnd = hWnd;
  100.             
  101.             pThis->InitControls();
  102.             CenterDialog(hWnd);
  103.             pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_STEP4);
  104.             return HANDLED_MSG;
  105.         }
  106.  
  107.         case WM_COMMAND:
  108.         {
  109.             //Obtain the "this" pointer
  110.             CS4Dialog* pThis = (CS4Dialog*)GetWindowLong(hWnd, GWL_USERDATA);
  111.  
  112.             // All buttons are handled the same way
  113.             switch(GET_WM_COMMAND_ID(wParam, lParam)) 
  114.             {
  115.                 case IDX_COPY_TABLE:
  116.                 case IDX_COPY_INDEXES:
  117.                 case IDX_SHOW_SQL:
  118.  
  119.                 case IDR_ALL_ROWS:
  120.                 case IDR_ROW_COUNT:
  121.                 case IDR_PARAM_SETS:
  122.                 case IDR_INSERTROW_IMMEDIATE:
  123.                 case IDR_INSERTROW_BUFFERED:
  124.                 case IDR_BLOB_SIZE:
  125.                 case IDR_ISEQ_STREAM:
  126.                     Busy();
  127.                     pThis->RefreshControls();
  128.                     return HANDLED_MSG;
  129.  
  130.  
  131.                 case IDOK:
  132.                     Busy();
  133.                     if(!pThis->RefreshControls())
  134.                         return HANDLED_MSG;
  135.  
  136.                     pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_TYPES);
  137.                     return HANDLED_MSG;
  138.  
  139.                 case IDB_PREV:
  140.                     Busy();
  141.                     if(!pThis->RefreshControls())
  142.                         return HANDLED_MSG;
  143.  
  144.                     pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP3);
  145.                     return HANDLED_MSG;
  146.                 
  147.                 case IDCANCEL:
  148.                     Busy();
  149.                     EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
  150.                     return HANDLED_MSG;
  151.             }
  152.         }
  153.     }
  154.  
  155.     return UNHANDLED_MSG;
  156. }
  157.  
  158.  
  159. /////////////////////////////////////////////////////////////////////////////
  160. // BOOL CS4Dialog::InitControls
  161. //
  162. /////////////////////////////////////////////////////////////////////////////
  163. BOOL CS4Dialog::InitControls()
  164. {
  165.     CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
  166.     
  167.     //IDX_COPY_TABLE (default-checked)
  168.     EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_TABLE), pCToDataSource->m_pICommandText || pCToDataSource->m_pITableDefinition);
  169.     CheckDlgButton(m_hWnd, IDX_COPY_TABLE, m_pCTableCopy->m_fCopyTables);
  170.     wSetDlgItemText(m_hWnd, IDX_COPY_TABLE, pCToDataSource->m_pwszTableTerm);
  171.     
  172.     //IDX_COPY_INDEXES (default-checked)
  173.     EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_INDEXES), pCToDataSource->m_pICommandText || pCToDataSource->m_pIIndexDefinition);
  174.     CheckDlgButton(m_hWnd, IDX_COPY_INDEXES, m_pCTableCopy->m_fCopyIndexes);
  175.  
  176.     //IDX_COPY_PRIMARYKEYS (default-checked)
  177.     EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_PRIMARYKEYS), pCToDataSource->m_fPrimaryKeysSupported);
  178.     CheckDlgButton(m_hWnd, IDX_COPY_PRIMARYKEYS, m_pCTableCopy->m_fCopyPrimaryKeys);
  179.     
  180.     //IDX_SHOW_SQL (checked)
  181.     EnableWindow(GetDlgItem(m_hWnd, IDX_SHOW_SQL), pCToDataSource->m_pICommandText != NULL);
  182.     CheckDlgButton(m_hWnd, IDX_SHOW_SQL, m_pCTableCopy->m_fShowQuery);
  183.  
  184.     //IDR_ALL_ROWS (default)
  185.     //IDR_MAX_ROWS
  186.     CheckRadioButton(m_hWnd, IDR_ALL_ROWS, IDR_ROW_COUNT, m_pCTableCopy->m_dwRowOpt);
  187.     wSetDlgItemText(m_hWnd, IDE_ROW_COUNT, L"%lu", m_pCTableCopy->m_ulMaxRows);
  188.  
  189.     //IDR_PARAM_SETS (default)
  190.     //If multiple param sets are not supported by this driver, select only 1 set
  191.     if(!pCToDataSource->m_fMultipleParamSets)
  192.         m_pCTableCopy->m_ulParamSets = 1;
  193.     if (pCToDataSource->m_pICommandText == NULL)
  194.     {
  195.         m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_IMMEDIATE;
  196.         EnableWindow(GetDlgItem(m_hWnd, IDR_PARAM_SETS), FALSE);
  197.     }
  198.     CheckRadioButton(m_hWnd, IDR_PARAM_SETS, IDR_INSERTROW_BUFFERED, m_pCTableCopy->m_dwInsertOpt);
  199.     wSetDlgItemText(m_hWnd, IDE_PARAM_SETS, L"%lu", m_pCTableCopy->m_ulParamSets);
  200.  
  201.     //Enable IDR_INSERTROW_IMMEDIATE radio button if supported by the provider
  202.     EnableWindow(GetDlgItem(m_hWnd, IDR_INSERTROW_IMMEDIATE), pCToDataSource->m_fIRowsetChange);
  203.  
  204.     //Enable IDR_INSERTROW_BUFFERED radio button if supported by the provider
  205.     EnableWindow(GetDlgItem(m_hWnd, IDR_INSERTROW_BUFFERED), pCToDataSource->m_fIRowsetUpdate);
  206.  
  207.     //IDR_BLOB_SIZE    (default)
  208.     //IDR_ISEQ_STREAM 
  209.     EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), pCToDataSource->m_dwStorageObjects & DBPROPVAL_SS_ISEQUENTIALSTREAM);
  210.     CheckRadioButton(m_hWnd, IDR_BLOB_SIZE, IDR_ISEQ_STREAM, m_pCTableCopy->m_dwBlobOpt);
  211.     wSetDlgItemText(m_hWnd, IDE_BLOB_SIZE, L"%lu", m_pCTableCopy->m_ulBlobSize);
  212.  
  213.     //Limit the TextLength of the Edit Controls to 10 chars
  214.     SendDlgItemMessage(m_hWnd, IDE_ROW_COUNT, EM_LIMITTEXT, (WPARAM)10, 0L);
  215.     SendDlgItemMessage(m_hWnd, IDE_PARAM_SETS, EM_LIMITTEXT, (WPARAM)10, 0L);
  216.     SendDlgItemMessage(m_hWnd, IDE_BLOB_SIZE, EM_LIMITTEXT, (WPARAM)10, 0L);
  217.     
  218.     //Only allow "NEXT" button if Some form of INSERT is supported
  219.     EnableWindow(GetDlgItem(m_hWnd, IDOK), pCToDataSource->m_pICommandText || pCToDataSource->m_pITableDefinition);
  220.         
  221.     // Refresh the controls
  222.     RefreshControls();
  223.     return TRUE;
  224. }
  225.  
  226.  
  227.  
  228. /////////////////////////////////////////////////////////////////////////////
  229. // BOOL CS4Dialog::RefreshControls
  230. //
  231. /////////////////////////////////////////////////////////////////////////////
  232. BOOL CS4Dialog::RefreshControls()
  233. {
  234.     // IDE_ROW_COUNT Get the Copy options first so we can check the row count if given.
  235.     if(IsDlgButtonChecked(m_hWnd, IDR_ROW_COUNT)) 
  236.     {
  237.         m_pCTableCopy->m_dwRowOpt = IDR_ROW_COUNT;
  238.         EnableWindow(GetDlgItem(m_hWnd, IDE_ROW_COUNT), TRUE);
  239.     }
  240.     else
  241.     {
  242.         m_pCTableCopy->m_dwRowOpt = IDR_ALL_ROWS;
  243.         EnableWindow(GetDlgItem(m_hWnd, IDE_ROW_COUNT), FALSE);
  244.     }
  245.         
  246.     //Verify IDE_ROW_COUNT has legal value
  247.     if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_ROW_COUNT), 1, LONG_MAX, &m_pCTableCopy->m_ulMaxRows))
  248.         return FALSE;
  249.  
  250.     //IDE_PARAM_SETS Get the Insert ParamSets options
  251.     if(IsDlgButtonChecked(m_hWnd, IDR_PARAM_SETS))
  252.     {
  253.         m_pCTableCopy->m_dwInsertOpt = IDR_PARAM_SETS;
  254.         EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets);
  255.     }
  256.     else if(IsDlgButtonChecked(m_hWnd, IDR_INSERTROW_IMMEDIATE))
  257.     {
  258.         //IDR_INSERTROW_IMMEDIATE
  259.         m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_IMMEDIATE;
  260.         EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
  261.     }
  262.     else
  263.     {
  264.         //IDR_INSERTROW_IMMEDIATE
  265.         m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_BUFFERED;
  266.         EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
  267.     }
  268.  
  269.     //Verify IDE_PARAM_SETS has legal value
  270.     if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_PARAM_SETS), 1, LONG_MAX, &m_pCTableCopy->m_ulParamSets))
  271.         return FALSE;
  272.  
  273.     //IDE_BLOB_SIZE Get the Insert ParamSets options
  274.     if(IsDlgButtonChecked(m_hWnd, IDR_BLOB_SIZE))
  275.     {
  276.         m_pCTableCopy->m_dwBlobOpt = IDR_BLOB_SIZE;
  277.         EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), TRUE);
  278.     }
  279.     else
  280.     {
  281.         m_pCTableCopy->m_dwBlobOpt = IDR_ISEQ_STREAM;
  282.         EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), FALSE);
  283.     }
  284.     
  285.     //Verify IDE_BLOB_SIZE has legal value
  286.     if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), 1, MAX_COL_SIZE, &m_pCTableCopy->m_ulBlobSize))
  287.         return FALSE;
  288.  
  289.     // Get Create options
  290.     m_pCTableCopy->m_fCopyTables = IsDlgButtonChecked(m_hWnd, IDX_COPY_TABLE);
  291.     m_pCTableCopy->m_fCopyIndexes = IsDlgButtonChecked(m_hWnd, IDX_COPY_INDEXES);
  292.     m_pCTableCopy->m_fCopyPrimaryKeys = IsDlgButtonChecked(m_hWnd, IDX_COPY_PRIMARYKEYS);
  293.     
  294.     // Set other Options
  295.     m_pCTableCopy->m_fShowQuery = IsDlgButtonChecked(m_hWnd, IDX_SHOW_SQL);
  296.     return TRUE;
  297. }
  298.  
  299.  
  300. /////////////////////////////////////////////////////////////////////
  301. // CTypesDialog::CTypesDialog
  302. //
  303. /////////////////////////////////////////////////////////////////////
  304. CTypesDialog::CTypesDialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
  305.     : CDialogBase(hWnd, hInst)
  306. {
  307.     ASSERT(pCTableCopy);
  308.     m_pCTableCopy = pCTableCopy;
  309. }
  310.  
  311.  
  312. /////////////////////////////////////////////////////////////////////
  313. // CTypesDialog::~CTypesDialog
  314. //
  315. /////////////////////////////////////////////////////////////////////
  316. CTypesDialog::~CTypesDialog()
  317. {
  318. }
  319.  
  320.  
  321. /////////////////////////////////////////////////////////////////////////////
  322. // ULONG CTypesDialog::Display
  323. //
  324. /////////////////////////////////////////////////////////////////////////////
  325. ULONG CTypesDialog::Display()
  326. {
  327.     return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_DATA_TYPES), NULL, DlgProc, (LPARAM)this);
  328. }
  329.  
  330.  
  331. /////////////////////////////////////////////////////////////////////
  332. // CTypesDialog::DlgProc
  333. //
  334. /////////////////////////////////////////////////////////////////////
  335. BOOL WINAPI CTypesDialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  336. {
  337.      switch(msg) 
  338.     {
  339.         case WM_INITDIALOG:
  340.         {
  341.             Busy();
  342.             //Store the "this" pointer, since this is a static method
  343.             CTypesDialog* pThis = (CTypesDialog*)lParam;
  344.             SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);
  345.             
  346.             //On INIT we know we have a valid hWnd to store
  347.             CenterDialog(hWnd);
  348.             pThis->m_hWnd = hWnd;
  349.             
  350.             //Tell TableCopy to Map the Types from the Source->Target
  351.             //If MapTypes fails, start over, (ie: same as hitting OK)
  352.             if(FAILED(pThis->m_pCTableCopy->MapTypes()))
  353.             {
  354.                 EndDialog(hWnd, 0);
  355.                 return UNHANDLED_MSG;
  356.             }
  357.  
  358.             pThis->InitControls();
  359.             pThis->RefreshControls();
  360.  
  361.             // Now Display the lists of Mappings
  362.             pThis->ResetTypeLists();
  363.             pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_TYPES);
  364.             return HANDLED_MSG;
  365.         }
  366.  
  367.         // Now look for WM_NOTIFY messages
  368.         case WM_NOTIFY:
  369.         {
  370.             if(wParam == IDL_FROM_TYPES || wParam == IDL_TO_TYPES)
  371.             {
  372.                 //Obtain the "this" pointer
  373.                 CTypesDialog* pThis = (CTypesDialog*)GetWindowLong(hWnd, GWL_USERDATA);
  374.                 NM_LISTVIEW* pListView = (NM_LISTVIEW*)lParam;
  375.             
  376.                 switch(pListView->hdr.code)
  377.                 {
  378.                     case LVN_ITEMCHANGED:
  379.                     {
  380.                         if(pListView->uNewState & LVNI_FOCUSED &&
  381.                              pListView->uNewState & LVNI_SELECTED)
  382.                         {
  383.                             if(wParam == IDL_FROM_TYPES)
  384.                             {
  385.                                 Busy();
  386.                                 SyncSibling(GetDlgItem(hWnd,IDL_TO_TYPES), GetDlgItem(hWnd,IDL_FROM_TYPES));
  387.                                    return HANDLED_MSG;
  388.                             }
  389.  
  390.                             if(wParam == IDL_TO_TYPES)
  391.                             {
  392.                                 Busy();
  393.                                 SyncSibling(GetDlgItem(hWnd,IDL_FROM_TYPES), GetDlgItem(hWnd,IDL_TO_TYPES));
  394.                                 return HANDLED_MSG;
  395.                             }
  396.                             return UNHANDLED_MSG; //No return Value
  397.                         }
  398.                         return UNHANDLED_MSG;
  399.                     }//case LVN_ITEMCHANGED
  400.                 }
  401.                 return UNHANDLED_MSG;
  402.             }//IDL_TABLES
  403.             return UNHANDLED_MSG;
  404.         }//WM_NOTIFY
  405.  
  406.         case WM_COMMAND:
  407.         {
  408.             // All buttons are handled the same way
  409.  
  410.             //Obtain the "this" pointer
  411.             CTypesDialog* pThis = (CTypesDialog*)GetWindowLong(hWnd, GWL_USERDATA);
  412.             
  413.             switch(GET_WM_COMMAND_ID(wParam, lParam)) 
  414.             {
  415.                 case IDOK:
  416.                     //Now copy the Tables
  417.                     pThis->m_pCTableCopy->CopyTables();
  418.  
  419.                     Busy();
  420.                     pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP1);
  421.                     return HANDLED_MSG;
  422.                     
  423.                 case IDB_PREV:
  424.                     Busy();
  425.                     pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP4);
  426.                     return HANDLED_MSG;
  427.  
  428.                 case IDCANCEL:
  429.                     Busy();
  430.                     EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
  431.                     return HANDLED_MSG;    
  432.             }
  433.         }
  434.     }
  435.  
  436.     return UNHANDLED_MSG;
  437. }
  438.  
  439.  
  440. /////////////////////////////////////////////////////////////////////////////
  441. // BOOL CTypesDialog::InitControls
  442. //
  443. /////////////////////////////////////////////////////////////////////////////
  444. BOOL CTypesDialog::InitControls()
  445. {
  446.     HWND hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_TYPES);
  447.     HWND hWndTo = GetDlgItem(m_hWnd, IDL_TO_TYPES);
  448.  
  449.     CDataSource* pCFromDataSource = m_pCTableCopy->m_pCFromTable->m_pCDataSource;
  450.     CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
  451.     
  452.     //CONNECT_STRING
  453.     wSetDlgItemText(m_hWnd, IDT_FROM_CONNECT, wsz_TYPES_STRING_,
  454.         pCFromDataSource->m_pwszProviderName,
  455.         pCFromDataSource->m_pwszDataSource, 
  456.         pCFromDataSource->m_pwszTableTerm,
  457.         m_pCTableCopy->m_pCFromTable->m_wszQualTableName);
  458.  
  459.     //CONNECT_STRING
  460.     wSetDlgItemText(m_hWnd, IDT_TO_CONNECT, wsz_TYPES_STRING_,
  461.         pCToDataSource->m_pwszProviderName,
  462.         pCToDataSource->m_pwszDataSource, 
  463.         pCToDataSource->m_pwszTableTerm,
  464.         m_pCTableCopy->m_pCToTable->m_wszQualTableName);
  465.  
  466.     //Create the Col ImageList
  467.     HIMAGELIST hColImageList = ImageList_Create(16, 16, ILC_MASK, 1, 0 );
  468.  
  469.     //IDI_COLUMN - normal column icon
  470.     HICON hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMN));
  471.     ImageList_AddIcon(hColImageList, hIcon);
  472.     //IDI_COLUMNREAD - read-only column icon
  473.     hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMNREAD));
  474.     ImageList_AddIcon(hColImageList, hIcon);
  475.     //IDI_COLUMNLONG - long column icon
  476.     hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMNLONG));
  477.     ImageList_AddIcon(hColImageList, hIcon);
  478.  
  479.     //Set image list to the Table Window 
  480.     ListView_SetImageList(hWndFrom, hColImageList, LVSIL_SMALL);
  481.     ListView_SetImageList(hWndTo, hColImageList, LVSIL_SMALL);
  482.  
  483.     //Use Extended ListView Styles!
  484.     SendMessage(hWndFrom, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES);
  485.     SendMessage(hWndTo, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES);
  486.  
  487.     //Source ListView COLUMNS
  488.     LV_InsertColumn(hWndFrom,    COL_COLNAME,        "ColName");
  489.     LV_InsertColumn(hWndFrom,    COL_COLTYPENAME,    "TypeName");
  490.     LV_InsertColumn(hWndFrom,    COL_COLTYPE,        "Type");
  491.     LV_InsertColumn(hWndFrom,    COL_COLSIZE,        "Size");
  492.     LV_InsertColumn(hWndFrom,    COL_COLORDINAL,        "Ordinal");
  493.     LV_InsertColumn(hWndFrom,    COL_COLPREC,        "Precision");
  494.     LV_InsertColumn(hWndFrom,    COL_COLSCALE,        "Scale");
  495.     LV_InsertColumn(hWndFrom,    COL_COLISFIXED,        "ISFIXED");
  496.     LV_InsertColumn(hWndFrom,    COL_COLISLONG,        "ISLONG");
  497.     LV_InsertColumn(hWndFrom,    COL_COLISNULLABLE,    "ISNULLABLE");
  498.     LV_InsertColumn(hWndFrom,    COL_COLWRITE,        "WRITE");
  499.     LV_InsertColumn(hWndFrom,    COL_COLISROWID,        "ISROWID");
  500.     LV_InsertColumn(hWndFrom,    COL_COLISROWVER,    "ISROWVER");
  501.  
  502.     //Target ListView COLUMNS
  503.     LV_InsertColumn(hWndTo,        COL_COLNAME,        "ColName");
  504.     LV_InsertColumn(hWndTo,        COL_COLTYPENAME,    "TypeName");
  505.     LV_InsertColumn(hWndTo,        COL_COLTYPE,        "Type");
  506.     LV_InsertColumn(hWndTo,        COL_COLSIZE,        "Size");
  507.     LV_InsertColumn(hWndTo,        COL_COLORDINAL,        "Ordinal");
  508.     LV_InsertColumn(hWndTo,        COL_COLPREC,        "Precision");
  509.     LV_InsertColumn(hWndTo,        COL_COLSCALE,        "Scale");
  510.     LV_InsertColumn(hWndTo,        COL_COLISFIXED,        "ISFIXED");
  511.     LV_InsertColumn(hWndTo,        COL_COLISLONG,        "ISLONG");
  512.     LV_InsertColumn(hWndTo,        COL_COLISNULLABLE,    "ISNULLABLE");
  513.     LV_InsertColumn(hWndTo,        COL_COLWRITE,        "WRITE");
  514.     LV_InsertColumn(hWndTo,        COL_COLISROWID,        "ISROWID");
  515.     LV_InsertColumn(hWndTo,        COL_COLISROWVER,    "ISROWVER");
  516.  
  517.     //AutoSize all columns
  518.     for(ULONG i=0; i<=COL_COLISROWVER; i++)
  519.     {
  520.         SendMessage(hWndFrom, LVM_SETCOLUMNWIDTH, (WPARAM)i,        (LPARAM)LVSCW_AUTOSIZE_USEHEADER);
  521.         SendMessage(hWndTo, LVM_SETCOLUMNWIDTH, (WPARAM)i,        (LPARAM)LVSCW_AUTOSIZE_USEHEADER);
  522.     }
  523.     return TRUE;
  524. }
  525.  
  526. /////////////////////////////////////////////////////////////////////////////
  527. // BOOL CTypesDialog::RefreshControls
  528. //
  529. /////////////////////////////////////////////////////////////////////////////
  530. BOOL CTypesDialog::RefreshControls()
  531. {
  532.     return TRUE;
  533. }
  534.  
  535. /////////////////////////////////////////////////////////////////////////////
  536. // BOOL CTypesDialog::ResetTypeLists
  537. //
  538. /////////////////////////////////////////////////////////////////////////////
  539. BOOL CTypesDialog::ResetTypeLists()
  540. {
  541.     HWND        hWndFrom;                // From data types
  542.     HWND        hWndTo;                    // To data types
  543.     
  544.     WCHAR        wszBuffer[MAX_NAME_LEN];
  545.     CHAR        szBuffer[MAX_NAME_LEN];    
  546.  
  547.     CTable* pCFromTable = m_pCTableCopy->m_pCFromTable;
  548.     CTable* pCToTable = m_pCTableCopy->m_pCToTable;
  549.  
  550.     // Get window handles to speed up the population
  551.     hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_TYPES);
  552.     hWndTo     = GetDlgItem(m_hWnd, IDL_TO_TYPES);
  553.         
  554.     // Now populate each list
  555.     for(ULONG i=0;  i<pCFromTable->m_cColumns; i++) 
  556.     {
  557.         COLDESC* pCFromColDesc = &pCFromTable->m_rgColDesc[i];
  558.         COLDESC* pCToColDesc = &pCToTable->m_rgColDesc[i];
  559.         
  560.         //COLNAME (item)
  561.         ConvertToMBCS(pCFromColDesc->wszColName, szBuffer, MAX_NAME_LEN);
  562.         LV_InsertItem(hWndFrom, i, COL_COLNAME, szBuffer, 0, pCFromColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? ((pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG) ? ICON_LONG : ICON_COLUMN) : ICON_READONLY);
  563.         ConvertToMBCS(pCToColDesc->wszColName, szBuffer, MAX_NAME_LEN);
  564.         LV_InsertItem(hWndTo, i, COL_COLNAME, szBuffer, 0, pCToColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? ((pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG) ? ICON_LONG : ICON_COLUMN) : ICON_READONLY);
  565.  
  566.         //COLTYPENAME (subitem)
  567.         pCFromTable->GetTypeNameAndParams(i, wszBuffer);
  568.         ConvertToMBCS(wszBuffer, szBuffer, MAX_NAME_LEN);
  569.         LV_InsertItem(hWndFrom, i, COL_COLTYPENAME, szBuffer);
  570.         pCToTable->GetTypeNameAndParams(i, wszBuffer);
  571.         ConvertToMBCS(wszBuffer, szBuffer, MAX_NAME_LEN);
  572.         LV_InsertItem(hWndTo, i, COL_COLTYPENAME, szBuffer);
  573.  
  574.         //COLTYPE (subitem)
  575.         ConvertToMBCS(GetDBTypeName(pCFromColDesc->wType), szBuffer, MAX_NAME_LEN);
  576.         LV_InsertItem(hWndFrom, i, COL_COLTYPE, szBuffer);
  577.         ConvertToMBCS(GetDBTypeName(pCToColDesc->wType), szBuffer, MAX_NAME_LEN);
  578.         LV_InsertItem(hWndTo, i, COL_COLTYPE, szBuffer);
  579.  
  580.         //Ordinal (SubItem)
  581.         sprintf(szBuffer, "%d", pCFromColDesc->iOrdinal);
  582.         LV_InsertItem(hWndFrom, i, COL_COLORDINAL, szBuffer);
  583.         sprintf(szBuffer, "%d", pCToColDesc->iOrdinal);
  584.         LV_InsertItem(hWndTo, i, COL_COLORDINAL, szBuffer);
  585.  
  586.         //ColumnSize (SubItem)
  587.         sprintf(szBuffer, "%d", pCFromColDesc->ulColumnSize);
  588.         LV_InsertItem(hWndFrom, i, COL_COLSIZE, szBuffer);
  589.         sprintf(szBuffer, "%d", pCToColDesc->ulColumnSize);
  590.         LV_InsertItem(hWndTo, i, COL_COLSIZE, szBuffer);
  591.  
  592.         //Precision (SubItem)
  593.         sprintf(szBuffer, "%d", pCFromColDesc->bPrecision);
  594.         LV_InsertItem(hWndFrom, i, COL_COLPREC, szBuffer);
  595.         sprintf(szBuffer, "%d", pCToColDesc->bPrecision);
  596.         LV_InsertItem(hWndTo, i, COL_COLPREC, szBuffer);
  597.  
  598.         //Scale (SubItem)
  599.         sprintf(szBuffer, "%d", pCFromColDesc->bScale);
  600.         LV_InsertItem(hWndFrom, i, COL_COLSCALE, szBuffer);
  601.         sprintf(szBuffer, "%d", pCToColDesc->bScale);
  602.         LV_InsertItem(hWndTo, i, COL_COLSCALE, szBuffer);
  603.  
  604.         //ISFIXED (SubItem)
  605.         LV_InsertItem(hWndFrom, i, COL_COLISFIXED, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISFIXEDLENGTH ? "TRUE" : "FALSE");
  606.         LV_InsertItem(hWndTo, i, COL_COLISFIXED, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISFIXEDLENGTH ? "TRUE" : "FALSE");
  607.  
  608.         //ISLONG (SubItem)
  609.         LV_InsertItem(hWndFrom, i, COL_COLISLONG, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG ? "TRUE" : "FALSE");
  610.         LV_InsertItem(hWndTo, i, COL_COLISLONG, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG ? "TRUE" : "FALSE");
  611.         
  612.         //ISNULLABLE (SubItem)
  613.         LV_InsertItem(hWndFrom, i, COL_COLISNULLABLE, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISNULLABLE ? "TRUE" : "FALSE");
  614.         LV_InsertItem(hWndTo, i, COL_COLISNULLABLE, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISNULLABLE ? "TRUE" : "FALSE");
  615.  
  616.         //WRITE (SubItem)
  617.         LV_InsertItem(hWndFrom, i, COL_COLWRITE, pCFromColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? "TRUE" : "FALSE");
  618.         LV_InsertItem(hWndTo, i, COL_COLWRITE, pCToColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? "TRUE" : "FALSE");
  619.  
  620.         //ISROWID (SubItem)
  621.         LV_InsertItem(hWndFrom, i, COL_COLISROWID, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISROWID ? "TRUE" : "FALSE");
  622.         LV_InsertItem(hWndTo, i, COL_COLISROWID, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISROWID ? "TRUE" : "FALSE");
  623.  
  624.         //ISROWVER (SubItem)
  625.         LV_InsertItem(hWndFrom, i, COL_COLISROWVER, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISROWVER ? "TRUE" : "FALSE");
  626.         LV_InsertItem(hWndTo, i, COL_COLISROWVER, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISROWVER ? "TRUE" : "FALSE");
  627.     }
  628.  
  629.     return TRUE;
  630. }
  631.  
  632.  
  633.