633 lines
25 KiB
C++
633 lines
25 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Microsoft OLE DB TABLECOPY Sample
|
|
// Copyright (C) 1991-2000 Microsoft Corporation
|
|
//
|
|
// @doc
|
|
//
|
|
// @module STEP4.CPP
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
#include "wizard.h"
|
|
#include "common.h"
|
|
#include "tablecopy.h"
|
|
#include "table.h"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Defines
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
//Enum Type Header for the ListView controls
|
|
enum COL_HEADERS
|
|
{
|
|
//IDL_FROM_TYPES
|
|
//ID_TO_TYPES
|
|
COL_COLNAME = 0, //ColInfo.pwszName
|
|
COL_COLTYPENAME = 1, //TypeInfo.pwszTypeName
|
|
COL_COLTYPE = 2, //ColInfo.wType
|
|
COL_COLORDINAL = 3, //ColInfo.iOrdinal
|
|
COL_COLSIZE = 4, //ColInfo.ulColumnSize
|
|
COL_COLPREC = 5, //ColInfo.bPrecision
|
|
COL_COLSCALE = 6, //ColInfo.bScale
|
|
COL_COLISFIXED = 7, //ColInfo.dwFlags ISFIXEDLENGTH
|
|
COL_COLISLONG = 8, //ColInfo.dwFlags ISLONG
|
|
COL_COLISNULLABLE = 9, //ColInfo.dwFlags ISNULLABLE
|
|
COL_COLWRITE =10, //ColInfo.dwFlags WRITE
|
|
COL_COLISROWID =11, //ColInfo.dwFlags ISROWID
|
|
COL_COLISROWVER =12, //ColInfo.dwFlags ISROWVER
|
|
};
|
|
|
|
enum EICON
|
|
{
|
|
ICON_COLUMN = 0,
|
|
ICON_READONLY = 1,
|
|
ICON_LONG = 2,
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CS4Dialog::CS4Dialog
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
CS4Dialog::CS4Dialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
|
|
: CDialogBase(hWnd, hInst)
|
|
{
|
|
ASSERT(pCTableCopy);
|
|
m_pCTableCopy = pCTableCopy;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CS4Dialog::~CS4Dialog
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
CS4Dialog::~CS4Dialog()
|
|
{
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ULONG CS4Dialog::Display
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
INT_PTR CS4Dialog::Display()
|
|
{
|
|
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_OPTIONS), NULL, (DLGPROC)DlgProc, (LPARAM)this);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CS4Dialog::DlgProc
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
BOOL WINAPI CS4Dialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(msg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
Busy();
|
|
//Store the "this" pointer, since this is a static method
|
|
CS4Dialog* pThis = (CS4Dialog*)lParam;
|
|
SetWindowLongPtrA(hWnd, GWLP_USERDATA, (LONG_PTR)pThis);
|
|
|
|
//On INIT we know we have a valid hWnd to store
|
|
pThis->m_hWnd = hWnd;
|
|
|
|
pThis->InitControls();
|
|
CenterDialog(hWnd);
|
|
pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_STEP4);
|
|
return HANDLED_MSG;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
//Obtain the "this" pointer
|
|
CS4Dialog* pThis = (CS4Dialog*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
|
|
|
|
// All buttons are handled the same way
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam))
|
|
{
|
|
case IDX_COPY_TABLE:
|
|
case IDX_COPY_INDEXES:
|
|
case IDX_SHOW_SQL:
|
|
|
|
case IDR_ALL_ROWS:
|
|
case IDR_ROW_COUNT:
|
|
case IDR_PARAM_SETS:
|
|
case IDR_INSERTROW_IMMEDIATE:
|
|
case IDR_INSERTROW_BUFFERED:
|
|
case IDR_BLOB_SIZE:
|
|
case IDR_ISEQ_STREAM:
|
|
Busy();
|
|
pThis->RefreshControls();
|
|
return HANDLED_MSG;
|
|
|
|
|
|
case IDOK:
|
|
Busy();
|
|
if(!pThis->RefreshControls())
|
|
return HANDLED_MSG;
|
|
|
|
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_TYPES);
|
|
return HANDLED_MSG;
|
|
|
|
case IDB_PREV:
|
|
Busy();
|
|
if(!pThis->RefreshControls())
|
|
return HANDLED_MSG;
|
|
|
|
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP3);
|
|
return HANDLED_MSG;
|
|
|
|
case IDCANCEL:
|
|
Busy();
|
|
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
|
|
return HANDLED_MSG;
|
|
}
|
|
}
|
|
}
|
|
|
|
return UNHANDLED_MSG;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BOOL CS4Dialog::InitControls
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CS4Dialog::InitControls()
|
|
{
|
|
CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
|
|
|
|
//IDX_COPY_TABLE (default-checked)
|
|
EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_TABLE), pCToDataSource->m_pICommandText || pCToDataSource->m_pITableDefinition);
|
|
CheckDlgButton(m_hWnd, IDX_COPY_TABLE, m_pCTableCopy->m_fCopyTables);
|
|
wSetDlgItemText(m_hWnd, IDX_COPY_TABLE, pCToDataSource->m_pwszTableTerm);
|
|
|
|
//IDX_COPY_INDEXES (default-checked)
|
|
EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_INDEXES), pCToDataSource->m_pICommandText || pCToDataSource->m_pIIndexDefinition);
|
|
CheckDlgButton(m_hWnd, IDX_COPY_INDEXES, m_pCTableCopy->m_fCopyIndexes);
|
|
|
|
//IDX_COPY_PRIMARYKEYS (default-checked)
|
|
EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_PRIMARYKEYS), pCToDataSource->m_fPrimaryKeysSupported);
|
|
CheckDlgButton(m_hWnd, IDX_COPY_PRIMARYKEYS, m_pCTableCopy->m_fCopyPrimaryKeys);
|
|
|
|
//IDX_SHOW_SQL (checked)
|
|
EnableWindow(GetDlgItem(m_hWnd, IDX_SHOW_SQL), pCToDataSource->m_pICommandText != NULL);
|
|
CheckDlgButton(m_hWnd, IDX_SHOW_SQL, m_pCTableCopy->m_fShowQuery);
|
|
|
|
//IDR_ALL_ROWS (default)
|
|
//IDR_MAX_ROWS
|
|
CheckRadioButton(m_hWnd, IDR_ALL_ROWS, IDR_ROW_COUNT, m_pCTableCopy->m_dwRowOpt);
|
|
wSetDlgItemText(m_hWnd, IDE_ROW_COUNT, L"%lu", m_pCTableCopy->m_ulMaxRows);
|
|
|
|
//IDR_PARAM_SETS (default)
|
|
//If multiple param sets are not supported by this driver, select only 1 set
|
|
if(!pCToDataSource->m_fMultipleParamSets)
|
|
m_pCTableCopy->m_ulParamSets = 1;
|
|
if (pCToDataSource->m_pICommandText == NULL)
|
|
{
|
|
m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_IMMEDIATE;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDR_PARAM_SETS), FALSE);
|
|
}
|
|
CheckRadioButton(m_hWnd, IDR_PARAM_SETS, IDR_INSERTROW_BUFFERED, m_pCTableCopy->m_dwInsertOpt);
|
|
wSetDlgItemText(m_hWnd, IDE_PARAM_SETS, L"%lu", m_pCTableCopy->m_ulParamSets);
|
|
|
|
//Enable IDR_INSERTROW_IMMEDIATE radio button if supported by the provider
|
|
EnableWindow(GetDlgItem(m_hWnd, IDR_INSERTROW_IMMEDIATE), pCToDataSource->m_fIRowsetChange);
|
|
|
|
//Enable IDR_INSERTROW_BUFFERED radio button if supported by the provider
|
|
EnableWindow(GetDlgItem(m_hWnd, IDR_INSERTROW_BUFFERED), pCToDataSource->m_fIRowsetUpdate);
|
|
|
|
//IDR_BLOB_SIZE (default)
|
|
//IDR_ISEQ_STREAM
|
|
EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), pCToDataSource->m_dwStorageObjects & DBPROPVAL_SS_ISEQUENTIALSTREAM);
|
|
CheckRadioButton(m_hWnd, IDR_BLOB_SIZE, IDR_ISEQ_STREAM, m_pCTableCopy->m_dwBlobOpt);
|
|
wSetDlgItemText(m_hWnd, IDE_BLOB_SIZE, L"%lu", m_pCTableCopy->m_ulBlobSize);
|
|
|
|
//Limit the TextLength of the Edit Controls to 10 chars
|
|
SendDlgItemMessage(m_hWnd, IDE_ROW_COUNT, EM_LIMITTEXT, (WPARAM)10, 0L);
|
|
SendDlgItemMessage(m_hWnd, IDE_PARAM_SETS, EM_LIMITTEXT, (WPARAM)10, 0L);
|
|
SendDlgItemMessage(m_hWnd, IDE_BLOB_SIZE, EM_LIMITTEXT, (WPARAM)10, 0L);
|
|
|
|
//Only allow "NEXT" button if Some form of INSERT is supported
|
|
EnableWindow(GetDlgItem(m_hWnd, IDOK), pCToDataSource->m_pICommandText || pCToDataSource->m_pITableDefinition);
|
|
|
|
// Refresh the controls
|
|
RefreshControls();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BOOL CS4Dialog::RefreshControls
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CS4Dialog::RefreshControls()
|
|
{
|
|
// IDE_ROW_COUNT Get the Copy options first so we can check the row count if given.
|
|
if(IsDlgButtonChecked(m_hWnd, IDR_ROW_COUNT))
|
|
{
|
|
m_pCTableCopy->m_dwRowOpt = IDR_ROW_COUNT;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_ROW_COUNT), TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_pCTableCopy->m_dwRowOpt = IDR_ALL_ROWS;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_ROW_COUNT), FALSE);
|
|
}
|
|
|
|
//Verify IDE_ROW_COUNT has legal value
|
|
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_ROW_COUNT), 1, LONG_MAX, &m_pCTableCopy->m_ulMaxRows))
|
|
return FALSE;
|
|
|
|
//IDE_PARAM_SETS Get the Insert ParamSets options
|
|
if(IsDlgButtonChecked(m_hWnd, IDR_PARAM_SETS))
|
|
{
|
|
m_pCTableCopy->m_dwInsertOpt = IDR_PARAM_SETS;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets);
|
|
}
|
|
else if(IsDlgButtonChecked(m_hWnd, IDR_INSERTROW_IMMEDIATE))
|
|
{
|
|
//IDR_INSERTROW_IMMEDIATE
|
|
m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_IMMEDIATE;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
|
|
}
|
|
else
|
|
{
|
|
//IDR_INSERTROW_IMMEDIATE
|
|
m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_BUFFERED;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
|
|
}
|
|
|
|
//Verify IDE_PARAM_SETS has legal value
|
|
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_PARAM_SETS), 1, LONG_MAX, &m_pCTableCopy->m_ulParamSets))
|
|
return FALSE;
|
|
|
|
//IDE_BLOB_SIZE Get the Insert ParamSets options
|
|
if(IsDlgButtonChecked(m_hWnd, IDR_BLOB_SIZE))
|
|
{
|
|
m_pCTableCopy->m_dwBlobOpt = IDR_BLOB_SIZE;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_pCTableCopy->m_dwBlobOpt = IDR_ISEQ_STREAM;
|
|
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), FALSE);
|
|
}
|
|
|
|
//Verify IDE_BLOB_SIZE has legal value
|
|
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), 1, MAX_COL_SIZE, &m_pCTableCopy->m_ulBlobSize))
|
|
return FALSE;
|
|
|
|
// Get Create options
|
|
m_pCTableCopy->m_fCopyTables = IsDlgButtonChecked(m_hWnd, IDX_COPY_TABLE);
|
|
m_pCTableCopy->m_fCopyIndexes = IsDlgButtonChecked(m_hWnd, IDX_COPY_INDEXES);
|
|
m_pCTableCopy->m_fCopyPrimaryKeys = IsDlgButtonChecked(m_hWnd, IDX_COPY_PRIMARYKEYS);
|
|
|
|
// Set other Options
|
|
m_pCTableCopy->m_fShowQuery = IsDlgButtonChecked(m_hWnd, IDX_SHOW_SQL);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CTypesDialog::CTypesDialog
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
CTypesDialog::CTypesDialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
|
|
: CDialogBase(hWnd, hInst)
|
|
{
|
|
ASSERT(pCTableCopy);
|
|
m_pCTableCopy = pCTableCopy;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CTypesDialog::~CTypesDialog
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
CTypesDialog::~CTypesDialog()
|
|
{
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ULONG CTypesDialog::Display
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
INT_PTR CTypesDialog::Display()
|
|
{
|
|
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_DATA_TYPES), NULL, (DLGPROC)DlgProc, (LPARAM)this);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CTypesDialog::DlgProc
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
BOOL WINAPI CTypesDialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(msg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
Busy();
|
|
//Store the "this" pointer, since this is a static method
|
|
CTypesDialog* pThis = (CTypesDialog*)lParam;
|
|
SetWindowLongPtrA(hWnd, GWLP_USERDATA, (LONG_PTR)pThis);
|
|
|
|
//On INIT we know we have a valid hWnd to store
|
|
CenterDialog(hWnd);
|
|
pThis->m_hWnd = hWnd;
|
|
|
|
//Tell TableCopy to Map the Types from the Source->Target
|
|
//If MapTypes fails, start over, (ie: same as hitting OK)
|
|
if(FAILED(pThis->m_pCTableCopy->MapTypes()))
|
|
{
|
|
EndDialog(hWnd, 0);
|
|
return UNHANDLED_MSG;
|
|
}
|
|
|
|
pThis->InitControls();
|
|
pThis->RefreshControls();
|
|
|
|
// Now Display the lists of Mappings
|
|
pThis->ResetTypeLists();
|
|
pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_TYPES);
|
|
return HANDLED_MSG;
|
|
}
|
|
|
|
// Now look for WM_NOTIFY messages
|
|
case WM_NOTIFY:
|
|
{
|
|
if(wParam == IDL_FROM_TYPES || wParam == IDL_TO_TYPES)
|
|
{
|
|
//Obtain the "this" pointer
|
|
CTypesDialog* pThis = (CTypesDialog*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
|
|
NM_LISTVIEW* pListView = (NM_LISTVIEW*)lParam;
|
|
|
|
switch(pListView->hdr.code)
|
|
{
|
|
case LVN_ITEMCHANGED:
|
|
{
|
|
if(pListView->uNewState & LVNI_FOCUSED &&
|
|
pListView->uNewState & LVNI_SELECTED)
|
|
{
|
|
if(wParam == IDL_FROM_TYPES)
|
|
{
|
|
Busy();
|
|
SyncSibling(GetDlgItem(hWnd,IDL_TO_TYPES), GetDlgItem(hWnd,IDL_FROM_TYPES));
|
|
return HANDLED_MSG;
|
|
}
|
|
|
|
if(wParam == IDL_TO_TYPES)
|
|
{
|
|
Busy();
|
|
SyncSibling(GetDlgItem(hWnd,IDL_FROM_TYPES), GetDlgItem(hWnd,IDL_TO_TYPES));
|
|
return HANDLED_MSG;
|
|
}
|
|
return UNHANDLED_MSG; //No return Value
|
|
}
|
|
return UNHANDLED_MSG;
|
|
}//case LVN_ITEMCHANGED
|
|
}
|
|
return UNHANDLED_MSG;
|
|
}//IDL_TABLES
|
|
return UNHANDLED_MSG;
|
|
}//WM_NOTIFY
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
// All buttons are handled the same way
|
|
|
|
//Obtain the "this" pointer
|
|
CTypesDialog* pThis = (CTypesDialog*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
|
|
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam))
|
|
{
|
|
case IDOK:
|
|
//Now copy the Tables
|
|
pThis->m_pCTableCopy->CopyTables();
|
|
|
|
Busy();
|
|
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP1);
|
|
return HANDLED_MSG;
|
|
|
|
case IDB_PREV:
|
|
Busy();
|
|
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP4);
|
|
return HANDLED_MSG;
|
|
|
|
case IDCANCEL:
|
|
Busy();
|
|
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
|
|
return HANDLED_MSG;
|
|
}
|
|
}
|
|
}
|
|
|
|
return UNHANDLED_MSG;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BOOL CTypesDialog::InitControls
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CTypesDialog::InitControls()
|
|
{
|
|
HWND hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_TYPES);
|
|
HWND hWndTo = GetDlgItem(m_hWnd, IDL_TO_TYPES);
|
|
|
|
CDataSource* pCFromDataSource = m_pCTableCopy->m_pCFromTable->m_pCDataSource;
|
|
CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
|
|
|
|
//CONNECT_STRING
|
|
wSetDlgItemText(m_hWnd, IDT_FROM_CONNECT, wsz_TYPES_STRING_,
|
|
pCFromDataSource->m_pwszProviderName,
|
|
pCFromDataSource->m_pwszDataSource,
|
|
pCFromDataSource->m_pwszTableTerm,
|
|
m_pCTableCopy->m_pCFromTable->m_wszQualTableName);
|
|
|
|
//CONNECT_STRING
|
|
wSetDlgItemText(m_hWnd, IDT_TO_CONNECT, wsz_TYPES_STRING_,
|
|
pCToDataSource->m_pwszProviderName,
|
|
pCToDataSource->m_pwszDataSource,
|
|
pCToDataSource->m_pwszTableTerm,
|
|
m_pCTableCopy->m_pCToTable->m_wszQualTableName);
|
|
|
|
//Create the Col ImageList
|
|
HIMAGELIST hColImageList = ImageList_Create(16, 16, ILC_MASK, 1, 0 );
|
|
|
|
//IDI_COLUMN - normal column icon
|
|
HICON hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMN));
|
|
ImageList_AddIcon(hColImageList, hIcon);
|
|
//IDI_COLUMNREAD - read-only column icon
|
|
hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMNREAD));
|
|
ImageList_AddIcon(hColImageList, hIcon);
|
|
//IDI_COLUMNLONG - long column icon
|
|
hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMNLONG));
|
|
ImageList_AddIcon(hColImageList, hIcon);
|
|
|
|
//Set image list to the Table Window
|
|
ListView_SetImageList(hWndFrom, hColImageList, LVSIL_SMALL);
|
|
ListView_SetImageList(hWndTo, hColImageList, LVSIL_SMALL);
|
|
|
|
//Use Extended ListView Styles!
|
|
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);
|
|
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);
|
|
|
|
//Source ListView COLUMNS
|
|
LV_InsertColumn(hWndFrom, COL_COLNAME, "ColName");
|
|
LV_InsertColumn(hWndFrom, COL_COLTYPENAME, "TypeName");
|
|
LV_InsertColumn(hWndFrom, COL_COLTYPE, "Type");
|
|
LV_InsertColumn(hWndFrom, COL_COLSIZE, "Size");
|
|
LV_InsertColumn(hWndFrom, COL_COLORDINAL, "Ordinal");
|
|
LV_InsertColumn(hWndFrom, COL_COLPREC, "Precision");
|
|
LV_InsertColumn(hWndFrom, COL_COLSCALE, "Scale");
|
|
LV_InsertColumn(hWndFrom, COL_COLISFIXED, "ISFIXED");
|
|
LV_InsertColumn(hWndFrom, COL_COLISLONG, "ISLONG");
|
|
LV_InsertColumn(hWndFrom, COL_COLISNULLABLE, "ISNULLABLE");
|
|
LV_InsertColumn(hWndFrom, COL_COLWRITE, "WRITE");
|
|
LV_InsertColumn(hWndFrom, COL_COLISROWID, "ISROWID");
|
|
LV_InsertColumn(hWndFrom, COL_COLISROWVER, "ISROWVER");
|
|
|
|
//Target ListView COLUMNS
|
|
LV_InsertColumn(hWndTo, COL_COLNAME, "ColName");
|
|
LV_InsertColumn(hWndTo, COL_COLTYPENAME, "TypeName");
|
|
LV_InsertColumn(hWndTo, COL_COLTYPE, "Type");
|
|
LV_InsertColumn(hWndTo, COL_COLSIZE, "Size");
|
|
LV_InsertColumn(hWndTo, COL_COLORDINAL, "Ordinal");
|
|
LV_InsertColumn(hWndTo, COL_COLPREC, "Precision");
|
|
LV_InsertColumn(hWndTo, COL_COLSCALE, "Scale");
|
|
LV_InsertColumn(hWndTo, COL_COLISFIXED, "ISFIXED");
|
|
LV_InsertColumn(hWndTo, COL_COLISLONG, "ISLONG");
|
|
LV_InsertColumn(hWndTo, COL_COLISNULLABLE, "ISNULLABLE");
|
|
LV_InsertColumn(hWndTo, COL_COLWRITE, "WRITE");
|
|
LV_InsertColumn(hWndTo, COL_COLISROWID, "ISROWID");
|
|
LV_InsertColumn(hWndTo, COL_COLISROWVER, "ISROWVER");
|
|
|
|
//AutoSize all columns
|
|
for(ULONG i=0; i<=COL_COLISROWVER; i++)
|
|
{
|
|
SendMessage(hWndFrom, LVM_SETCOLUMNWIDTH, (WPARAM)i, (LPARAM)LVSCW_AUTOSIZE_USEHEADER);
|
|
SendMessage(hWndTo, LVM_SETCOLUMNWIDTH, (WPARAM)i, (LPARAM)LVSCW_AUTOSIZE_USEHEADER);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BOOL CTypesDialog::RefreshControls
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CTypesDialog::RefreshControls()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BOOL CTypesDialog::ResetTypeLists
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CTypesDialog::ResetTypeLists()
|
|
{
|
|
HWND hWndFrom; // From data types
|
|
HWND hWndTo; // To data types
|
|
|
|
WCHAR wszBuffer[MAX_NAME_LEN];
|
|
CHAR szBuffer[MAX_NAME_LEN];
|
|
|
|
CTable* pCFromTable = m_pCTableCopy->m_pCFromTable;
|
|
CTable* pCToTable = m_pCTableCopy->m_pCToTable;
|
|
|
|
// Get window handles to speed up the population
|
|
hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_TYPES);
|
|
hWndTo = GetDlgItem(m_hWnd, IDL_TO_TYPES);
|
|
|
|
// Now populate each list
|
|
for(ULONG i=0; i<pCFromTable->m_cColumns; i++)
|
|
{
|
|
COLDESC* pCFromColDesc = &pCFromTable->m_rgColDesc[i];
|
|
COLDESC* pCToColDesc = &pCToTable->m_rgColDesc[i];
|
|
|
|
//COLNAME (item)
|
|
ConvertToMBCS(pCFromColDesc->wszColName, szBuffer, MAX_NAME_LEN);
|
|
LV_InsertItem(hWndFrom, i, COL_COLNAME, szBuffer, 0, pCFromColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? ((pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG) ? ICON_LONG : ICON_COLUMN) : ICON_READONLY);
|
|
ConvertToMBCS(pCToColDesc->wszColName, szBuffer, MAX_NAME_LEN);
|
|
LV_InsertItem(hWndTo, i, COL_COLNAME, szBuffer, 0, pCToColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? ((pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG) ? ICON_LONG : ICON_COLUMN) : ICON_READONLY);
|
|
|
|
//COLTYPENAME (subitem)
|
|
pCFromTable->GetTypeNameAndParams(i, wszBuffer, sizeof(wszBuffer)/sizeof(WCHAR));
|
|
ConvertToMBCS(wszBuffer, szBuffer, MAX_NAME_LEN);
|
|
LV_InsertItem(hWndFrom, i, COL_COLTYPENAME, szBuffer);
|
|
pCToTable->GetTypeNameAndParams(i, wszBuffer, sizeof(wszBuffer)/sizeof(WCHAR));
|
|
ConvertToMBCS(wszBuffer, szBuffer, MAX_NAME_LEN);
|
|
LV_InsertItem(hWndTo, i, COL_COLTYPENAME, szBuffer);
|
|
|
|
//COLTYPE (subitem)
|
|
ConvertToMBCS(GetDBTypeName(pCFromColDesc->wType), szBuffer, MAX_NAME_LEN);
|
|
LV_InsertItem(hWndFrom, i, COL_COLTYPE, szBuffer);
|
|
ConvertToMBCS(GetDBTypeName(pCToColDesc->wType), szBuffer, MAX_NAME_LEN);
|
|
LV_InsertItem(hWndTo, i, COL_COLTYPE, szBuffer);
|
|
|
|
//Ordinal (SubItem)
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->iOrdinal);
|
|
LV_InsertItem(hWndFrom, i, COL_COLORDINAL, szBuffer);
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->iOrdinal);
|
|
LV_InsertItem(hWndTo, i, COL_COLORDINAL, szBuffer);
|
|
|
|
//ColumnSize (SubItem)
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->ulColumnSize);
|
|
LV_InsertItem(hWndFrom, i, COL_COLSIZE, szBuffer);
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->ulColumnSize);
|
|
LV_InsertItem(hWndTo, i, COL_COLSIZE, szBuffer);
|
|
|
|
//Precision (SubItem)
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->bPrecision);
|
|
LV_InsertItem(hWndFrom, i, COL_COLPREC, szBuffer);
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->bPrecision);
|
|
LV_InsertItem(hWndTo, i, COL_COLPREC, szBuffer);
|
|
|
|
//Scale (SubItem)
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->bScale);
|
|
LV_InsertItem(hWndFrom, i, COL_COLSCALE, szBuffer);
|
|
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->bScale);
|
|
LV_InsertItem(hWndTo, i, COL_COLSCALE, szBuffer);
|
|
|
|
//ISFIXED (SubItem)
|
|
LV_InsertItem(hWndFrom, i, COL_COLISFIXED, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISFIXEDLENGTH ? "TRUE" : "FALSE");
|
|
LV_InsertItem(hWndTo, i, COL_COLISFIXED, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISFIXEDLENGTH ? "TRUE" : "FALSE");
|
|
|
|
//ISLONG (SubItem)
|
|
LV_InsertItem(hWndFrom, i, COL_COLISLONG, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG ? "TRUE" : "FALSE");
|
|
LV_InsertItem(hWndTo, i, COL_COLISLONG, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG ? "TRUE" : "FALSE");
|
|
|
|
//ISNULLABLE (SubItem)
|
|
LV_InsertItem(hWndFrom, i, COL_COLISNULLABLE, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISNULLABLE ? "TRUE" : "FALSE");
|
|
LV_InsertItem(hWndTo, i, COL_COLISNULLABLE, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISNULLABLE ? "TRUE" : "FALSE");
|
|
|
|
//WRITE (SubItem)
|
|
LV_InsertItem(hWndFrom, i, COL_COLWRITE, pCFromColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? "TRUE" : "FALSE");
|
|
LV_InsertItem(hWndTo, i, COL_COLWRITE, pCToColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? "TRUE" : "FALSE");
|
|
|
|
//ISROWID (SubItem)
|
|
LV_InsertItem(hWndFrom, i, COL_COLISROWID, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISROWID ? "TRUE" : "FALSE");
|
|
LV_InsertItem(hWndTo, i, COL_COLISROWID, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISROWID ? "TRUE" : "FALSE");
|
|
|
|
//ISROWVER (SubItem)
|
|
LV_InsertItem(hWndFrom, i, COL_COLISROWVER, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISROWVER ? "TRUE" : "FALSE");
|
|
LV_InsertItem(hWndTo, i, COL_COLISROWVER, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISROWVER ? "TRUE" : "FALSE");
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|