736 lines
24 KiB
C++
736 lines
24 KiB
C++
|
//#define __DEBUG
|
||
|
|
||
|
#include "compatadmin.h"
|
||
|
#include "customlayer.h"
|
||
|
|
||
|
BOOL CALLBACK CustomLayerProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
BOOL CALLBACK EditLayerProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
BOOL CheckExistingLayer(CSTRING & szNewLayerName);
|
||
|
|
||
|
PDBLAYER g_pLayer;
|
||
|
CCustomLayer * g_pCustomLayer;
|
||
|
|
||
|
BOOL CCustomLayer::AddCustomLayer(void)
|
||
|
{
|
||
|
g_pLayer = NULL;
|
||
|
g_pCustomLayer = this;
|
||
|
|
||
|
m_uMode = LAYERMODE_ADD;
|
||
|
|
||
|
if ( TRUE == DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_CUSTOMLAYER),g_theApp.m_hWnd,(DLGPROC)CustomLayerProc) )
|
||
|
return TRUE;
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CCustomLayer::EditCustomLayer(void)
|
||
|
{
|
||
|
g_pLayer = NULL;
|
||
|
|
||
|
/*
|
||
|
|
||
|
|
||
|
|
||
|
*/
|
||
|
|
||
|
g_pCustomLayer = this;
|
||
|
|
||
|
m_uMode = LAYERMODE_EDIT;
|
||
|
|
||
|
if ( TRUE == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_SELECTLAYER),g_theApp.m_hWnd,(DLGPROC)EditLayerProc,FALSE) ) {
|
||
|
if ( TRUE == DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_CUSTOMLAYER),g_theApp.m_hWnd,(DLGPROC)CustomLayerProc) )
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CCustomLayer::RemoveCustomLayer(void)
|
||
|
{
|
||
|
g_pLayer = NULL;
|
||
|
g_pCustomLayer = this;
|
||
|
|
||
|
m_uMode = LAYERMODE_REMOVE;
|
||
|
|
||
|
if ( TRUE == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_SELECTLAYER),g_theApp.m_hWnd,(DLGPROC)EditLayerProc,FALSE) ) {
|
||
|
PDBLAYER pWalk = g_theApp.GetDBLocal().m_pLayerList;
|
||
|
PDBLAYER pHold;
|
||
|
PDBRECORD pRec = g_theApp.GetDBLocal().m_pRecordHead;
|
||
|
|
||
|
// Validate the layer to remove.
|
||
|
|
||
|
//g_pLayer has been properly set in the EditLayerProc function. Now it's not NULL
|
||
|
|
||
|
while ( NULL != pRec ) {
|
||
|
BOOL bInUse = FALSE;
|
||
|
|
||
|
if ( (g_pLayer != NULL ) && (pRec->szLayerName == g_pLayer->szLayerName) ) //PREfast
|
||
|
bInUse = TRUE;
|
||
|
|
||
|
PDBRECORD pDups = pRec->pDup;
|
||
|
|
||
|
while ( NULL != pDups ) {
|
||
|
if ( (g_pLayer != NULL) && (pDups->szLayerName == g_pLayer->szLayerName) ) // PREfast !
|
||
|
bInUse = TRUE;
|
||
|
|
||
|
pDups = pDups->pDup;
|
||
|
}
|
||
|
|
||
|
if ( bInUse ) {
|
||
|
MessageBox(g_theApp.m_hWnd,TEXT("Cannot remove custom layer while it's in use"),TEXT("Unable to remove custom layer"),MB_OK);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
pRec = pRec->pNext;
|
||
|
}
|
||
|
|
||
|
while ( NULL != pWalk ) {
|
||
|
if ( g_pLayer == pWalk ) {
|
||
|
if ( pWalk == g_theApp.GetDBLocal().m_pLayerList )
|
||
|
g_theApp.GetDBLocal().m_pLayerList = pWalk->pNext;
|
||
|
else
|
||
|
pHold->pNext = pWalk->pNext;
|
||
|
|
||
|
delete pWalk;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
pHold = pWalk;
|
||
|
pWalk = pWalk->pNext;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void SyncList(HWND hDlg, UINT uMaster, UINT uSlave)
|
||
|
|
||
|
//For all those strings that appear in uMaster, remove them from uSlave
|
||
|
|
||
|
// For ADD: the params passed are IDC_LAYERLIST,IDC_SHIMLIST
|
||
|
//For REMOVE: SyncList(hDlg,IDC_SHIMLIST,IDC_LAYERLIST);
|
||
|
{
|
||
|
UINT uTotal = SendDlgItemMessage(hDlg,uMaster,LB_GETCOUNT,0,0);
|
||
|
UINT uCount;
|
||
|
TCHAR szText[1024];
|
||
|
|
||
|
for ( uCount=0; uCount<uTotal; ++uCount ) {
|
||
|
int nIndex;
|
||
|
|
||
|
SendDlgItemMessage(hDlg,uMaster,LB_GETTEXT,uCount,(LPARAM) szText);
|
||
|
|
||
|
nIndex = SendDlgItemMessage(hDlg,uSlave,LB_FINDSTRING,0,(LPARAM) szText);
|
||
|
|
||
|
|
||
|
//The DONE button might need to be disabled if there are no items in the IDC_LAYERLIST (2nd list box)
|
||
|
if ( LB_ERR != nIndex )
|
||
|
SendDlgItemMessage(hDlg,uSlave,LB_DELETESTRING,nIndex,0);
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
SendMessage(hDlg,WM_COMMAND,MAKELONG(IDC_NAME,EN_UPDATE),0);
|
||
|
}
|
||
|
|
||
|
BOOL CALLBACK CustomLayerProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
|
||
|
static BOOL bNameChanged = FALSE;// Did the user change the name of the layer
|
||
|
static CSTRING szPresentLayerName; // The IDC_NAME when the WM_INITDIALOG is called
|
||
|
|
||
|
/*
|
||
|
|
||
|
This is ued when we are editing a layer.
|
||
|
Suppose we change the name of the layer then, we have to make this name change in the DBRECORD::szLayerName
|
||
|
for all those EXEs which have this layer in the present database
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
With all the items in the Listbox IDC_SHIMLIST (The first list box), in the data section we have the
|
||
|
pointer to the corresponding SHIMDESC in the g_theApp.m_pShimList (The list of shims,populated from the sysmain.sdb
|
||
|
|
||
|
Only GENERAL shims are shown in the list.
|
||
|
*/
|
||
|
|
||
|
switch ( uMsg ) {
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
|
||
|
|
||
|
SendMessage(
|
||
|
GetDlgItem(hDlg,IDC_NAME), // handle to destination window
|
||
|
EM_LIMITTEXT, // message to send
|
||
|
(WPARAM) 150, // text length
|
||
|
(LPARAM) 0
|
||
|
);
|
||
|
|
||
|
|
||
|
if (g_pLayer != NULL ) {
|
||
|
|
||
|
szPresentLayerName = g_pLayer->szLayerName ;
|
||
|
|
||
|
}
|
||
|
else {
|
||
|
|
||
|
szPresentLayerName = NULL;
|
||
|
bNameChanged = FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
PSHIMDESC pWalk = g_theApp.GetDBGlobal().m_pShimList;
|
||
|
|
||
|
while ( NULL != pWalk ) {
|
||
|
if ( pWalk->bGeneral ) {
|
||
|
//int nItem = SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_ADDSTRING,0,(LPARAM) (LPSTR) (pWalk->szShimName));
|
||
|
int nItem = SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_ADDSTRING,0,(LPARAM) (pWalk->szShimName).pszString);
|
||
|
|
||
|
if ( LB_ERR != nItem )
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_SETITEMDATA,nItem,(LPARAM) pWalk);
|
||
|
}
|
||
|
|
||
|
pWalk = pWalk->pNext;
|
||
|
}
|
||
|
|
||
|
/*g_pLayer will be NULL when the Dialog box is invoked for adding a layer.
|
||
|
When the IDD_CUSTOMLAYER dilaog box is invoked after a EDIT or a REMOVE option, then
|
||
|
this variable will point to the layer selected.
|
||
|
*/
|
||
|
|
||
|
|
||
|
if ( NULL != g_pLayer ) {
|
||
|
PSHIMDESC pWalk = g_pLayer->pShimList;
|
||
|
|
||
|
// Turn off repaints
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,WM_SETREDRAW,FALSE,0);
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,WM_SETREDRAW,FALSE,0);
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_NAME,WM_SETTEXT,0,(LPARAM) (LPCTSTR) g_pLayer->szLayerName);
|
||
|
|
||
|
// Move the items over to the add side.
|
||
|
|
||
|
while ( NULL != pWalk ) {
|
||
|
int nIndex = SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_FINDSTRING,0,(LPARAM)(LPCTSTR) pWalk->szShimName);
|
||
|
|
||
|
if ( LB_ERR != nIndex ) {
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_SETSEL,TRUE,nIndex);
|
||
|
|
||
|
SendMessage(hDlg,WM_COMMAND,IDC_ADD,0);
|
||
|
}
|
||
|
|
||
|
pWalk = pWalk->pNext;
|
||
|
}
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,WM_SETREDRAW,TRUE,0);
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,WM_SETREDRAW,TRUE,0);
|
||
|
|
||
|
InvalidateRect(GetDlgItem(hDlg,IDC_SHIMLIST),NULL,TRUE);
|
||
|
UpdateWindow(GetDlgItem(hDlg,IDC_SHIMLIST));
|
||
|
InvalidateRect(GetDlgItem(hDlg,IDC_LAYERLIST),NULL,TRUE);
|
||
|
UpdateWindow(GetDlgItem(hDlg,IDC_LAYERLIST));
|
||
|
}//if (NULL != g_pLayer)
|
||
|
|
||
|
SendMessage(hDlg,WM_COMMAND,MAKELONG(IDC_NAME,EN_UPDATE),0);
|
||
|
|
||
|
SetFocus( GetDlgItem(hDlg, IDC_NAME) );
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch ( LOWORD(wParam) ) {
|
||
|
case IDC_NAME:
|
||
|
{
|
||
|
|
||
|
/*The DONE button will be enabled only if the IDC_NAME, text box is non-empty and the
|
||
|
the number of elements in the IDC_LAYERLIST is > 0
|
||
|
*/
|
||
|
|
||
|
|
||
|
if ( EN_UPDATE == HIWORD(wParam) ) {
|
||
|
|
||
|
if ( g_pLayer != NULL ) bNameChanged = TRUE; // The existing name has been changed.
|
||
|
|
||
|
|
||
|
TCHAR szText[MAX_PATH_BUFFSIZE];
|
||
|
UINT uTotal = SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_GETCOUNT,0,0);
|
||
|
BOOL bEnable = TRUE;
|
||
|
|
||
|
if ( 0 == uTotal || uTotal == LB_ERR )
|
||
|
bEnable = FALSE;
|
||
|
|
||
|
GetWindowText(GetDlgItem(hDlg,IDC_NAME),szText,MAX_PATH);
|
||
|
|
||
|
|
||
|
if ( CSTRING::Trim(szText) == 0 ) bEnable = FALSE;
|
||
|
|
||
|
|
||
|
|
||
|
EnableWindow(GetDlgItem(hDlg,IDOK),bEnable ? TRUE:FALSE);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_REMOVEALL:
|
||
|
{
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,WM_SETREDRAW,FALSE,0);
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,WM_SETREDRAW,FALSE,0);
|
||
|
|
||
|
int nCount;
|
||
|
|
||
|
do {
|
||
|
nCount = SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_GETCOUNT,0,0);
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_SETSEL,TRUE,0);
|
||
|
|
||
|
SendMessage(hDlg,WM_COMMAND,IDC_REMOVE,0);
|
||
|
}
|
||
|
while ( 0 != nCount );
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,WM_SETREDRAW,TRUE,0);
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,WM_SETREDRAW,TRUE,0);
|
||
|
|
||
|
InvalidateRect(GetDlgItem(hDlg,IDC_SHIMLIST),NULL,TRUE);
|
||
|
UpdateWindow(GetDlgItem(hDlg,IDC_SHIMLIST));
|
||
|
InvalidateRect(GetDlgItem(hDlg,IDC_LAYERLIST),NULL,TRUE);
|
||
|
UpdateWindow(GetDlgItem(hDlg,IDC_LAYERLIST));
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_COPY:
|
||
|
{
|
||
|
PDBLAYER pHold = g_pLayer;
|
||
|
|
||
|
g_pCustomLayer->m_uMode = LAYERMODE_COPY;
|
||
|
|
||
|
HWND hwndFocus = GetFocus();
|
||
|
|
||
|
//The parameter TRUE in "DialogBoxParam" means load the list of global layers and the cutomr layers, FALSE means load the
|
||
|
//lsit of custom layers. The names of the layers are obatained from g_theApp.pLayerList.
|
||
|
|
||
|
if ( TRUE == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_SELECTLAYER),g_theApp.m_hWnd,(DLGPROC)EditLayerProc,TRUE) ) {
|
||
|
//Now g_pLayer points to the layer which the user has selected.
|
||
|
PDBLAYER pCopy = g_pLayer;
|
||
|
|
||
|
//Now g_pLayer again reveerts back to its old value ! Perhaps this can be NULL as well
|
||
|
g_pLayer = pHold;
|
||
|
|
||
|
// Remove everything.
|
||
|
|
||
|
//SendMessage(hDlg,WM_COMMAND,IDC_REMOVEALL,0);
|
||
|
|
||
|
if ( NULL != pCopy ) {
|
||
|
PSHIMDESC pWalk = pCopy->pShimList;
|
||
|
|
||
|
// Turn off repaints
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,WM_SETREDRAW,FALSE,0);
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,WM_SETREDRAW,FALSE,0);
|
||
|
|
||
|
// Move the items over to the add side.
|
||
|
|
||
|
while ( NULL != pWalk ) {
|
||
|
int nIndex = SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_FINDSTRING,0,(LPARAM)(LPCTSTR) pWalk->szShimName);
|
||
|
|
||
|
if ( LB_ERR != nIndex ) {
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_SETSEL,TRUE,nIndex);
|
||
|
|
||
|
SendMessage(hDlg,WM_COMMAND,IDC_ADD,0);
|
||
|
}
|
||
|
|
||
|
pWalk = pWalk->pNext;
|
||
|
}
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,WM_SETREDRAW,TRUE,0);
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,WM_SETREDRAW,TRUE,0);
|
||
|
|
||
|
InvalidateRect(GetDlgItem(hDlg,IDC_SHIMLIST),NULL,TRUE);
|
||
|
UpdateWindow(GetDlgItem(hDlg,IDC_SHIMLIST));
|
||
|
InvalidateRect(GetDlgItem(hDlg,IDC_LAYERLIST),NULL,TRUE);
|
||
|
UpdateWindow(GetDlgItem(hDlg,IDC_LAYERLIST));
|
||
|
}
|
||
|
}//if (TRUE == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_SELECTLAYER),g_theApp.m_hWnd,EditLayerProc,TRUE))
|
||
|
|
||
|
SetFocus( hwndFocus );
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_ADD:
|
||
|
{
|
||
|
|
||
|
// PB. Remember #shims should not become more than this !!!
|
||
|
int nItems[1024];
|
||
|
int nCount;
|
||
|
int nTotal;
|
||
|
|
||
|
// Enumerate all the selected items and add them to the layer list
|
||
|
|
||
|
nTotal = SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_GETSELITEMS,sizeof(nItems)/sizeof(int),(LPARAM) &nItems);
|
||
|
|
||
|
for ( nCount=0; nCount < nTotal; ++nCount ) {
|
||
|
PSHIMDESC pShim = (PSHIMDESC) SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_GETITEMDATA,nItems[nCount],0);
|
||
|
int nIndex;
|
||
|
|
||
|
nIndex = SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) pShim->szShimName);
|
||
|
|
||
|
if ( LB_ERR != nIndex )
|
||
|
SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_SETITEMDATA,nIndex,(LPARAM) pShim);
|
||
|
}
|
||
|
|
||
|
SyncList(hDlg,IDC_LAYERLIST,IDC_SHIMLIST);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_REMOVE:
|
||
|
{
|
||
|
int nItems[1024];
|
||
|
int nCount;
|
||
|
int nTotal;
|
||
|
|
||
|
// Enumerate all the selected items and add them to the shim list
|
||
|
|
||
|
nTotal = SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_GETSELITEMS,sizeof(nItems)/sizeof(int),(LPARAM) &nItems);
|
||
|
|
||
|
for ( nCount=0; nCount < nTotal; ++nCount ) {
|
||
|
PSHIMDESC pShim = (PSHIMDESC) SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_GETITEMDATA,nItems[nCount],0);
|
||
|
int nIndex;
|
||
|
|
||
|
nIndex = SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_ADDSTRING,0,(LPARAM)(LPCTSTR) pShim->szShimName);
|
||
|
|
||
|
if ( LB_ERR != nIndex )
|
||
|
SendDlgItemMessage(hDlg,IDC_SHIMLIST,LB_SETITEMDATA,nIndex,(LPARAM) pShim);
|
||
|
}
|
||
|
|
||
|
SyncList(hDlg,IDC_SHIMLIST,IDC_LAYERLIST);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDOK://DONE Button
|
||
|
{
|
||
|
PDBLAYER pLayer;
|
||
|
|
||
|
// Creating a new layer list.
|
||
|
|
||
|
|
||
|
TCHAR szText[MAX_PATH_BUFFSIZE];
|
||
|
SendDlgItemMessage(hDlg,IDC_NAME,WM_GETTEXT,MAX_PATH,(LPARAM) szText);
|
||
|
CSTRING strLayerName = szText;
|
||
|
strLayerName.Trim();
|
||
|
|
||
|
//
|
||
|
//Check if the new name already exists, if yes give error.
|
||
|
//
|
||
|
|
||
|
|
||
|
if ( ( g_pLayer == NULL && CheckExistingLayer(strLayerName))
|
||
|
||
|
||
|
(g_pLayer != NULL && g_pLayer->szLayerName != strLayerName && CheckExistingLayer(strLayerName) )
|
||
|
|
||
|
)
|
||
|
|
||
|
|
||
|
{
|
||
|
MessageBox(hDlg,
|
||
|
TEXT("A layer with the specified name already exists."),
|
||
|
TEXT("Duplicate Layer"),
|
||
|
MB_ICONWARNING
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if ( NULL == g_pLayer )
|
||
|
pLayer = new DBLAYER;
|
||
|
else {
|
||
|
|
||
|
/*
|
||
|
This will be called when this CustomLayerProc() has been called
|
||
|
beause the user chose Edit or Remove Custom layer.
|
||
|
In the member functions :
|
||
|
|
||
|
1. EditCustomLayer
|
||
|
2. RemoveCustomLayer
|
||
|
|
||
|
g_pLayer is made NULL
|
||
|
|
||
|
In EditLayerProc, The g_pLayer is set to the particular PDBLAYER entry in the linked list
|
||
|
headed by g_theApp.pLayerList, which has the same name as the selectd layer
|
||
|
|
||
|
*/
|
||
|
pLayer = g_pLayer;
|
||
|
|
||
|
// Clear all the shims.
|
||
|
|
||
|
while ( NULL != pLayer->pShimList ) {
|
||
|
PSHIMDESC pHold = pLayer->pShimList->pNext;
|
||
|
|
||
|
if ( pLayer->pShimList != NULL )
|
||
|
delete pLayer->pShimList;
|
||
|
|
||
|
pLayer->pShimList = pHold;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( NULL != pLayer ) {
|
||
|
|
||
|
|
||
|
|
||
|
int nCount;
|
||
|
int nTotal;
|
||
|
|
||
|
if ( NULL == g_pLayer )
|
||
|
ZeroMemory(pLayer,sizeof(DBLAYER));
|
||
|
|
||
|
SendDlgItemMessage(hDlg,IDC_NAME,WM_GETTEXT,MAX_PATH,(LPARAM) szText);
|
||
|
|
||
|
|
||
|
|
||
|
TCHAR *pStart = szText,
|
||
|
*pEnd = szText + lstrlen(szText) - 1,
|
||
|
szNewText[MAX_PATH_BUFFSIZE];
|
||
|
|
||
|
while ( *pStart== TEXT(' ') ) ++pStart;
|
||
|
|
||
|
while ( (pEnd >= pStart) && ( *pEnd == TEXT(' ') ) ) --pEnd;
|
||
|
|
||
|
*( pEnd + 1) = TEXT('\0');//Keep it safe
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
if ( *pStart == TEXT('\0') ) {
|
||
|
//This is just for protection, DONE will be disabled if the "Name " Text field is blank or has all spaces
|
||
|
MessageBox(NULL,TEXT("Please give a valid name for the layer"),TEXT("Invalid layer name"),MB_ICONWARNING);
|
||
|
}
|
||
|
|
||
|
|
||
|
else {
|
||
|
lstrcpyn(szNewText,pStart, MAX_PATH);
|
||
|
|
||
|
if ( lstrcmpi(szText,szNewText) != 0 ) {
|
||
|
SetWindowText(GetDlgItem(hDlg,IDC_NAME), szNewText);
|
||
|
|
||
|
lstrcpyn(szText,szNewText,MAX_PATH);
|
||
|
}
|
||
|
}//else
|
||
|
|
||
|
|
||
|
pLayer->szLayerName = szText;
|
||
|
|
||
|
nTotal = SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_GETCOUNT,0,0);
|
||
|
|
||
|
// Enumerate all the shims listed and add to the layer.
|
||
|
|
||
|
for ( nCount=0; nCount < nTotal; ++nCount ) {
|
||
|
PSHIMDESC pShim = (PSHIMDESC) SendDlgItemMessage(hDlg,IDC_LAYERLIST,LB_GETITEMDATA,nCount,0);
|
||
|
PSHIMDESC pNew = new SHIMDESC;
|
||
|
|
||
|
if ( NULL == pNew ) {
|
||
|
MEM_ERR;
|
||
|
break;
|
||
|
//continue;
|
||
|
}
|
||
|
|
||
|
|
||
|
*pNew = *pShim;
|
||
|
/*
|
||
|
pNew->szShimName = pShim->szShimName;
|
||
|
pNew->szShimDLLName = pShim->szShimDLLName;
|
||
|
pNew->szShimCommandLine = pShim->szShimCommandLine;
|
||
|
pNew->szShimDesc = pShim->szShimDesc;
|
||
|
pNew->bShim = pNew->bShim;
|
||
|
pNew->bPermanent = pNew->bPermanent;
|
||
|
*/
|
||
|
pNew->pNext = pLayer->pShimList;
|
||
|
|
||
|
pLayer->pShimList = pNew;
|
||
|
}
|
||
|
|
||
|
if ( NULL == g_pLayer )
|
||
|
//CORRECTIT: That means this is a add option, better to check the mode of the class
|
||
|
{
|
||
|
pLayer->bPermanent = FALSE;
|
||
|
pLayer->pNext = g_theApp.GetDBLocal().m_pLayerList;
|
||
|
g_theApp.GetDBLocal().m_pLayerList = pLayer;
|
||
|
}
|
||
|
else if ( bNameChanged) {
|
||
|
//
|
||
|
//Replace the existing name in the DBRECORDs with the new name.
|
||
|
//
|
||
|
|
||
|
PDBRECORD pRecordApps = g_theApp.GetDBLocal().m_pRecordHead;
|
||
|
|
||
|
while (pRecordApps) {
|
||
|
|
||
|
PDBRECORD pRecordExe = pRecordApps;
|
||
|
while (pRecordExe) {
|
||
|
|
||
|
if (pRecordExe->szLayerName == szPresentLayerName) {
|
||
|
pRecordExe->szLayerName = szText; // New name
|
||
|
}
|
||
|
|
||
|
pRecordExe = pRecordExe->pDup;
|
||
|
|
||
|
}// while (pRecordExe)
|
||
|
|
||
|
pRecordApps = pRecordApps->pNext;
|
||
|
|
||
|
}//while (pRecordApps)
|
||
|
|
||
|
}//else if ( bChanged)
|
||
|
}
|
||
|
|
||
|
EndDialog(hDlg,TRUE);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
{
|
||
|
EndDialog(hDlg,FALSE);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CALLBACK EditLayerProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch ( uMsg ) {
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
|
||
|
|
||
|
|
||
|
switch ( g_pCustomLayer->m_uMode ) {
|
||
|
case LAYERMODE_COPY:
|
||
|
{
|
||
|
SetWindowText(hDlg,TEXT("Select Mode To Copy"));
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case LAYERMODE_EDIT:
|
||
|
{
|
||
|
SetWindowText(hDlg,TEXT("Edit Compatibility Mode"));
|
||
|
}
|
||
|
break;
|
||
|
case LAYERMODE_REMOVE:
|
||
|
{
|
||
|
SetWindowText(hDlg,TEXT("Remove Compatibility Mode"));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
PDBLAYER pWalk = g_theApp.GetDBGlobal().m_pLayerList;
|
||
|
|
||
|
for( int iLoop = 0; iLoop <= 1; ++ iLoop){
|
||
|
|
||
|
while ( NULL != pWalk ) {
|
||
|
|
||
|
//Add if this is a local/custom layer or we we want to show the layers(Permanent and custom),
|
||
|
//because we are in copy layer option.
|
||
|
|
||
|
if ( !pWalk->bPermanent || TRUE == lParam ) {
|
||
|
int nIndex = SendDlgItemMessage(hDlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)pWalk->szLayerName);
|
||
|
|
||
|
if ( LB_ERR != nIndex )
|
||
|
SendDlgItemMessage(hDlg,IDC_LIST,LB_SETITEMDATA,nIndex,(LPARAM) pWalk);
|
||
|
}
|
||
|
|
||
|
pWalk = pWalk->pNext;
|
||
|
}
|
||
|
pWalk = g_theApp.GetDBLocal().m_pLayerList;
|
||
|
}//for
|
||
|
|
||
|
|
||
|
// Force button update/ Make it disabled basically
|
||
|
|
||
|
//SendMessage(hDlg,WM_COMMAND,IDC_LIST,0);
|
||
|
|
||
|
//
|
||
|
//Select the first item of the list box
|
||
|
//
|
||
|
|
||
|
SendMessage(
|
||
|
(HWND) GetDlgItem(hDlg,IDC_LIST), // handle to destination window
|
||
|
LB_SETCURSEL, // message to send
|
||
|
(WPARAM) 0, // item index
|
||
|
(LPARAM) 0 // not used; must be zero
|
||
|
);
|
||
|
|
||
|
SetFocus( GetDlgItem (hDlg, IDC_LIST) );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
{
|
||
|
switch ( LOWORD(wParam) ) {
|
||
|
case IDC_LIST:
|
||
|
{
|
||
|
if ( LB_ERR == SendMessage(GetDlgItem(hDlg,IDC_LIST),LB_GETCURSEL,0,0) )
|
||
|
EnableWindow(GetDlgItem(hDlg,IDOK),FALSE);
|
||
|
else
|
||
|
EnableWindow(GetDlgItem(hDlg,IDOK),TRUE);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDOK:
|
||
|
{
|
||
|
int nIndex = SendMessage(GetDlgItem(hDlg,IDC_LIST),LB_GETCURSEL,0,0);
|
||
|
|
||
|
//Make g_pLayer point to the selected layer.
|
||
|
|
||
|
g_pLayer = (PDBLAYER) SendDlgItemMessage(hDlg,IDC_LIST,LB_GETITEMDATA,nIndex,0);
|
||
|
|
||
|
EndDialog(hDlg,1);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hDlg,0);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CheckExistingLayer(CSTRING & szNewLayerName)
|
||
|
{
|
||
|
PDBLAYER pLayer = g_theApp.GetDBLocal().m_pLayerList;
|
||
|
|
||
|
|
||
|
|
||
|
while (pLayer != NULL) {
|
||
|
if ( pLayer->szLayerName == szNewLayerName ) break;
|
||
|
else pLayer = pLayer->pNext;
|
||
|
}
|
||
|
|
||
|
if (pLayer != NULL) return TRUE;
|
||
|
|
||
|
pLayer = g_theApp.GetDBGlobal().m_pLayerList;
|
||
|
|
||
|
while (pLayer != NULL) {
|
||
|
if ( pLayer->szLayerName == szNewLayerName ) break;
|
||
|
else pLayer = pLayer->pNext;
|
||
|
}
|
||
|
|
||
|
if (pLayer != NULL) return TRUE;
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}//CheckExistingLayer(CSTRING &)
|