reman3/Rayman_X/cpa/Appli/MngData5/Src/DlgMain.cpp

2354 lines
66 KiB
C++
Raw Blame History

/*
=======================================================================================
Name :DlgMain.cpp
Author :vincent lhullier Date :18/07/97
Description :main dialog box , implementation file
=======================================================================================
Modification -> Author : Date :
Description :
=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "shlobj.h"
#include <io.h>
#include "MngData5.h"
#include "DlgMain.h"
#include "DlgModif.h"
#include "DlgFile.h"
#include "DlgUpdOp.h"
#include "DlgAbout.h"
#include "DlgObtai.h"
#include "HelpId.h"
#include "constant.h"
#include "LogFile.h"
#include "SaveMngr.h"
#include "MajData.h"
#include "Vss5_fct.h"
#include "Error.h"
#include "Constant.h"
#include "ProgBar.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
GLOBALS
=======================================================================================
*/
/*
* Color for line in Rich edit ctrl
*/
static COLORREF gs_a_xColor[3] = { RGB( 0, 255,255), RGB( 0,255,64), RGB(255,128,128) };
/*
=======================================================================================
MACROS
=======================================================================================
*/
#define M_DisplayInfoLine( _szInfo )\
{\
m_fn_Result_vAddLine( _szInfo, C_Result_cInfoLine );\
m_fn_vPause();\
m_oProgress.StepIt();\
}
/*
=======================================================================================
CMngDataDlg class
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
constructor
---------------------------------------------------------------------------------------
*/
CMngDataDlg::CMngDataDlg(CWnd* pParent /*=NULL*/) : CDialog(CMngDataDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMngDataDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
// init cheat code string
memset( m_szCheat, 0, 6);
m_lCheatFlag = 0;
// init work status
m_bWorkInProgress = FALSE;
m_bRequestToStop = FALSE;
m_bBatchObtain = FALSE;
m_bInitOK = FALSE;
m_bBaseStatusTimerOn = FALSE;
// Init Vss database (OLE Server)
OLE_fn_bInitVss( );
// init random number list
srand( (unsigned) time ( NULL ) );
// init list of controls
m_a_uiEditControl[0] = IDC_EDIT_LOCALPATH;
m_a_uiEditControl[1] = IDC_EDIT_VSSPATH;
m_a_uiEditControl[2] = IDC_EDIT_INUPDATE;
m_a_uiEditControl[3] = IDC_EDIT_INOBTAIN;
m_a_uiEditControl[4] = IDC_EDIT_MODIFFILE;
m_a_uiEditControl[5] = IDC_EDIT_MODIFICATION;
m_a_uiEditControl[6] = IDC_EDIT_OBTAINTIME;
m_cNbEditBox = 7;
m_a_uiRightAlignedButton[0] = IDC_BUTTON_BROWSE;
m_a_uiRightAlignedButton[1] = IDC_BUTTON_VSSFILES;
m_a_uiRightAlignedButton[2] = IDC_BUTTON_LOOKUPDATE;
m_a_uiRightAlignedButton[3] = IDC_BUTTON_LOOKOBTAIN;
m_a_uiRightAlignedButton[4] = IDC_BUTTON_CLEARMODIF;
m_a_uiRightAlignedButton[5] = IDC_BUTTON_VIEWMODIF;
m_cNbRightButtons = 6;
m_a_uiBottomButton[0] = IDC_BUTTON_REFRESH;
m_a_uiBottomButton[1] = IDC_CHECK_OBTAINMENU;
m_a_uiBottomButton[2] = IDC_CHECK_UPDATE;
m_a_uiBottomButton[3] = IDCANCEL;
m_a_uiBottomButton[4] = IDC_CHECK_HELP;
m_cNbBottomButtons = 5;
m_bQuitFromSysCommand = FALSE;
}
/*
---------------------------------------------------------------------------------------
On command
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (HIWORD(wParam) == 0)
{
switch (LOWORD(wParam))
{
/* display about box */
case IDM_ABOUTBOX:
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
break;
}
/* display help file */
case IDM_SHOWHELPFILE:
::WinHelp( this->GetSafeHwnd(), C_szHelpFile, HELP_CONTEXT, IDH_J_SUMMARY);
break;
/* update */
case IDM_UPDATE:
if (AfxMessageBox( "Are you sure you want to\nUpdate data ?", MB_YESNO | MB_ICONQUESTION) == IDYES)
{
if (m_fn_bOnCommandUpdate())
{
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lObtainAfter )
{
BOOL bObtain = TRUE;
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lConfirmObtainAfter )
bObtain = AfxMessageBox("Do you want to obtain data now ?\r\n(it is recommended)", MB_YESNO | MB_ICONQUESTION ) == IDYES;
if (bObtain)
m_fn_vOnCommandObtain();
}
}
}
break;
/* show update history */
case IDM_UPDATEHISTORY:
{
CUpdateHistoryDlg dlgHistory( this );
dlgHistory.DoModal();
}
break;
/* show update options dialog */
case IDM_UPDATEOPTIONS:
{
CUpdateOptionsDlg dlgOptions( this );
dlgOptions.DoModal();
}
break;
/* show update history */
case IDM_UPDATEWITHCONFIG:
{
CUpdateFileListDlg dlgFileList;
dlgFileList.m_fn_vSetFileDialog( &m_oFileDlg );
if (dlgFileList.DoModal() == IDOK)
{
m_fn_bOnCommandUpdateWithConfig();
}
}
break;
/* obtain */
case IDM_OBTAINNOW:
{
if (AfxMessageBox( "Are you sure you want to\nObtain data ?", MB_YESNO | MB_ICONQUESTION) == IDYES)
m_fn_vOnCommandObtain();
}
break;
/* batch obtain */
case IDM_OBTAIN:
{
if (g_lNumberOfFatherModifs != 0)
{
AfxMessageBox( "To do a batch obtain there must be no more modification in list\r\nclean modif list and try again", MB_OK | MB_ICONINFORMATION);
}
else
{
CBatchObtainDlg dlgObtain;
m_fn_vKillTimerForBaseStatus();
dlgObtain.DoModal();
m_fn_vSetTimerForBaseStatus();
if (dlgObtain.fn_bDoObtain())
{
m_bBatchObtain = TRUE;
m_fn_vOnCommandObtain();
fn_bEndObtaining();
m_bBatchObtain = FALSE;
}
}
}
}
}
return CDialog::OnCommand(wParam, lParam);
}
/*
---------------------------------------------------------------------------------------
message map
---------------------------------------------------------------------------------------
*/
BEGIN_MESSAGE_MAP(CMngDataDlg, CDialog)
//{{AFX_MSG_MAP(CMngDataDlg)
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CHECK_OBTAINMENU, OnCheckObtainMenu)
ON_BN_CLICKED(IDC_BUTTON_VIEWMODIF, OnButtonViewmodif)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh)
ON_BN_CLICKED(IDC_BUTTON_LOOKOBTAIN, OnButtonLookobtain)
ON_BN_CLICKED(IDC_BUTTON_LOOKUPDATE, OnButtonLookupdate)
ON_BN_CLICKED(IDC_BUTTON_VSSFILES, OnButtonVssfiles)
ON_WM_SIZE()
ON_WM_SIZING()
ON_WM_SYSCOMMAND()
ON_BN_CLICKED(IDC_CHECK_HELP, OnCheckHelp)
ON_BN_CLICKED(IDC_BUTTON_CLEARMODIF, OnButtonClearmodif)
ON_BN_CLICKED(IDC_CHECK_UPDATE, OnCheckUpdate)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_WM_HELPINFO()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_CHANGEMODIF, OnButtonChangemodif)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
=======================================================================================
specific functions
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
enable/disable all the buttons
swap between running display (bEnable = FALSE : progress bar and no buttons)
and waiting display (bEnable = TRUE : no progress bad, buttons are visible )
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vEnableButton( BOOL bEnable )
{
/*
* bEnable = TRUE -> show/enable buttons, else Hide/disable them
*/
GetDlgItem( IDC_BUTTON_BROWSE )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON_VSSFILES )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON_LOOKOBTAIN )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON_LOOKUPDATE )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON_CLEARMODIF )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON_VIEWMODIF )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON_REFRESH )->ShowWindow( bEnable );
GetDlgItem( IDC_CHECK_OBTAINMENU )->ShowWindow( bEnable );
GetDlgItem( IDC_CHECK_UPDATE )->ShowWindow( bEnable );
GetDlgItem( IDCANCEL )->ShowWindow( bEnable );
GetDlgItem( IDC_CHECK_HELP )->ShowWindow( bEnable );
/*
* bEnable = TRUE -> Hide progress bar, else Show it
*/
GetDlgItem( IDC_PROGRESS )->ShowWindow( !bEnable );
GetDlgItem( IDC_BUTTON_STOP )->ShowWindow( !bEnable );
GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( TRUE );
}
/*
---------------------------------------------------------------------------------------
display program information in Edit box
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vDisplayProgramData( void )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szString[100];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* write obtaining time in a string */
m_fn_vGetObtainingTimeString( szString );
GetDlgItem( IDC_EDIT_OBTAINTIME )->SetWindowText( szString );
/* write local path */
GetDlgItem( IDC_EDIT_LOCALPATH ) ->SetWindowText( g_stIniData.szLocalPath );
/* obtaining data : vss path & config */
sprintf
(
szString,
"%s (Config : %s)",
g_stIniData.szVssPath,
*g_stIniData.stObtainConfig.szName == 0 ? "None" : g_stIniData.stObtainConfig.szName
);
GetDlgItem( IDC_EDIT_VSSPATH ) ->SetWindowText( szString );
/* semaphore & modif file */
GetDlgItem( IDC_EDIT_INUPDATE ) ->SetWindowText( g_stIniData.szInUpdateSem );
GetDlgItem( IDC_EDIT_INOBTAIN ) ->SetWindowText( g_stIniData.szInObtainSem );
GetDlgItem( IDC_EDIT_MODIFFILE ) ->SetWindowText( g_stIniData.szModifFile );
/* number of modifs */
GetDlgItem( IDC_EDIT_MODIFICATION)->SetWindowText( itoa( g_lNumberOfFatherModifs, szString, 10) );
GetDlgItem( IDC_BUTTON_VIEWMODIF )->EnableWindow( g_lNumberOfFatherModifs != 0 );
GetDlgItem( IDC_BUTTON_CLEARMODIF )->EnableWindow( g_lNumberOfFatherModifs != 0 );
}
/*
---------------------------------------------------------------------------------------
* make a pause
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vPause( void )
{
if (m_lCheatFlag & C_lCheatPause)
{
char szString[50];
sprintf(szString, "Progress : %d <-- %d --> %d", m_oProgress.m_iStart, m_oProgress.OffsetPos(0), m_oProgress.m_iEnd );
MessageBox( szString, "A little pause", MB_ICONSTOP );
}
}
/*
---------------------------------------------------------------------------------------
* convert obtaining time into a string
* szString -> buffer where time string is written must be at least 20 octets long
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vGetObtainingTimeString( char *szString )
{
if (g_stIniData.p_oObtainingTime->GetYear() == 100)
strcpy( szString, "None");
else
strcpy( szString, (char *) (LPCTSTR) g_stIniData.p_oObtainingTime->Format() );
}
/*
---------------------------------------------------------------------------------------
Display a fatal error and post WM_QUIT message
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vFatalError( char *_szMessage )
{
MessageBox(_szMessage, "MngData5 - Fatal Error", MB_ICONSTOP );
OLE_g_oDatabase.ReleaseDispatch();
PostQuitMessage( -1 );
}
/*
----------------------------------------------------------------------------------------
Description : add a line in RichEdit box for result
szLine -> line to add
cLineType -> type of line (info, ok, error)
----------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_Result_vAddLine( char *szLine, char cLineType )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lOldLength;
long lNewLength;
long lSize;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
m_stCharFormat.crTextColor = gs_a_xColor[ cLineType ];
m_stCharFormat.dwEffects = 0;
lOldLength = m_oRichEdit.GetTextLength();
lNewLength = lOldLength + strlen( szLine );
lSize = m_oRichEdit.GetLimitText();
if (lNewLength > lSize)
{
lSize += 10000;
m_oRichEdit.LimitText( lSize );
}
m_oRichEdit.ReplaceSel( szLine );
m_oRichEdit.SetSel( lOldLength, -1 );
m_oRichEdit.SetSelectionCharFormat( m_stCharFormat );
m_oRichEdit.SetSel( lNewLength, lNewLength );
}
/*
----------------------------------------------------------------------------------------
Description : delete content of result window
----------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_Result_vResetContent( void )
{
m_oRichEdit.SetWindowText( "" );
}
/*
---------------------------------------------------------------------------------------
Display content off result window into log file
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vWriteResultToLogFile( char *szString )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szTemp[200];
CString oStr;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
sprintf( szTemp, "********************\n %s\n********************\n", szString );
LOG_fn_lWriteInLogFile( szTemp );
m_oRichEdit.GetWindowText( oStr );
LOG_fn_lWriteInLogFile( (char *) (LPCTSTR) oStr );
}
/*
----------------------------------------------------------------------------------------
Description : init progress bar
----------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vInitProgessBar( int _iStart, int _iEnd )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
tdstProgressBarDrawingData stPBDD;
char cCol;
int a_iCol[9];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
m_oProgress.m_fn_vSetRange( _iStart, _iEnd );
m_oProgress.m_fn_vReinit();
srand( (unsigned)time( NULL ) );
switch (rand() & 7)
{
case 0:
stPBDD.uiAnimBitmap = IDB_BITMAP_ANIM1;
stPBDD.cAnimNbFrames = 8;
stPBDD.cAnimFrameWidth = 16;
break;
case 1:
stPBDD.uiAnimBitmap = IDB_BITMAP_ANIM2;
stPBDD.cAnimNbFrames = 10;
stPBDD.cAnimFrameWidth = 8;
break;
case 2:
stPBDD.uiAnimBitmap = IDB_BITMAP_ANIM4;
stPBDD.cAnimNbFrames = 24;
stPBDD.cAnimFrameWidth = 9;
break;
default:
stPBDD.cAnimNbFrames = 0;
}
for (cCol = 0; cCol < 6; cCol ++ )
a_iCol[ cCol ] = 128 + (rand() & 0x7F);
for (cCol = 0; cCol < 3; cCol ++ )
a_iCol[ 6 + cCol] = 255 - (a_iCol[ cCol ] + a_iCol[ cCol + 3 ]) / 2;
stPBDD.xBackColor = 0;
stPBDD.xHeadColor = RGB(a_iCol[0], a_iCol[1], a_iCol[2]);
stPBDD.xTailColor = RGB(a_iCol[3], a_iCol[4], a_iCol[5]);
stPBDD.xTextColor = RGB(a_iCol[6], a_iCol[7], a_iCol[8]);
switch( rand() & 7 )
{
case 0:
strcpy( stPBDD.szText, "Ca va t'y comme vous voulez ?" );
break;
case 1:
strcpy( stPBDD.szText, "Vive la Bretagne libre !" );
break;
case 2:
sprintf( stPBDD.szText, "Salut %s", g_stIniData.szVssUserName );
break;
case 3:
strcpy( stPBDD.szText, "A la sant<6E> des Normands" );
break;
case 4:
strcpy( stPBDD.szText, "Boire un petit coup c'est..." );
break;
case 5:
strcpy( stPBDD.szText, "Baissons les yeux devant Serge" );
break;
default:
*stPBDD.szText = 0;
}
m_oProgress.m_fn_vInitDrawing( &stPBDD );
}
/*
=======================================================================================
Functions for New update function
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : do a modif that consist on deleting a file
_p_stModif -> current modif
Returns (char ) -1 if fails, 0 if OK
----------------------------------------------------------------------------------------
*/
char CMngDataDlg::m_fn_cDoModifFileDelete( tdstModif *_p_stModif )
{
COleDateTime oDate;
BOOL bContinue = TRUE;
if (m_bLocalExist)
{
// warning a faire
}
if (m_cVssStatus != VSSFILE_NOTFOUND)
{
if (OLE_fn_bGetItemLastVersionDate( g_szVssFileName, &oDate ))
{
if ( oDate > *g_stIniData.p_oObtainingTime )
{
bContinue = FALSE;
OLE_fn_bGetItemLastVersionUserName( g_szVssFileName );
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lForce )
{
bContinue = TRUE;
if (g_stWinPref.lUpdateFlags & C_UpdateOption_lConfirmForce )
{
sprintf (m_szMessage, "There's a conflict for %s file\nOverwrite previous modification done by %s ?", _p_stModif->szName, g_a_szUserName[0] );
bContinue = AfxMessageBox( m_szMessage, MB_YESNO | MB_ICONQUESTION ) == IDYES;
}
}
}
}
if (bContinue)
{
if ( !OLE_fn_bDeleteFile( g_szVssFileName ) )
{
Error_fn_vSetFmt( Error_eCantDeleteFile, "%s -> Error (can't delete vss file)\r\n", _p_stModif->szName );
return -1;
}
}
else
{
Error_fn_vSetFmt( Error_eVssFileNewer, "%s -> Error (%s updated data before you)\r\n", _p_stModif->szName, g_a_szUserName[0] );
return -1;
}
}
return 0;
}
/*
----------------------------------------------------------------------------------------
Description : do a modif that consist on modifying a file
_p_stModif -> current modif
_bForFile -> indicate if it's a file modification or for a section modif
Returns (char ) -1 if fails, 0 if OK, 1 : ok and file was added
----------------------------------------------------------------------------------------
*/
char CMngDataDlg::m_fn_cDoModifFileModif( tdstModif *_p_stModif, BOOL _bForFile )
{
BOOL bContinue = TRUE;
COleDateTime oDate;
int cChoice;
if (!m_bLocalExist)
{
Error_fn_vSetFmt( Error_eLocalFileNotFound, "%s -> Error : Local file not found\r\n", g_stSource.szFullName );
return -1;
}
if (m_cVssStatus == VSSFILE_NOTFOUND)
{
if (g_cAddModifiedFile == 0)
{
CYesNoAllDlg oQuestion;
sprintf( m_szMessage, "Apparently you have modified %s file\nthat doesn't exist in vss database\n--------------------------\nAdd it ?", g_szVssFileName );
oQuestion.fn_vSetMessage( m_szMessage );
oQuestion.DoModal();
cChoice = oQuestion.fn_cGetChoice();
switch( cChoice )
{
case C_CHOICE_cYesAll:
g_cAddModifiedFile = cChoice;
cChoice = C_CHOICE_cYes;
break;
case C_CHOICE_cNoAll:
g_cAddModifiedFile = cChoice;
cChoice = C_CHOICE_cNo;
break;
}
}
else
{
cChoice = (g_cAddModifiedFile == C_CHOICE_cYesAll) ? C_CHOICE_cYes : C_CHOICE_cNo;
}
if (cChoice == C_CHOICE_cYes)
{
return (m_fn_cDoModifFileAdd( _p_stModif ) == -1) ? -1 : 1;
}
else
{
Error_fn_vSetFmt( Error_eVssFileNotFound, "%s -> Error : Vss file not found\r\n", g_stSource.szFullName );
return -1;
}
}
if (!_bForFile)
return 0;
if (!OLE_fn_bGetItemLastVersionDate( g_szVssFileName, &oDate ))
oDate = COleDateTime::GetCurrentTime();
if ( oDate > *g_stIniData.p_oObtainingTime )
{
OLE_fn_bGetItemLastVersionUserName( g_szVssFileName );
/*
* check if last updater is the same as current one
*/
if ( stricmp( g_a_szUserName[0], g_stIniData.szVssUserName ) != 0 )
{
bContinue = FALSE;
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lForce )
{
bContinue = TRUE;
if (g_stWinPref.lUpdateFlags & C_UpdateOption_lConfirmForce )
{
sprintf (m_szMessage, "There's a conflict for %s file\nOverwrite previous modification done by %s ?", _p_stModif->szName, g_a_szUserName[0] );
bContinue = AfxMessageBox( m_szMessage, MB_YESNO | MB_ICONQUESTION ) == IDYES;
}
}
}
}
if (bContinue)
{
OLE_fn_bCheckoutFile( g_szVssFileName, g_stTarget.szFullName, VSSFLAG_REPREPLACE );
CopyFile( g_stSource.szFullName, g_stTarget.szFullName, FALSE );
OLE_fn_bCheckinFile( g_szVssFileName, g_stTarget.szFullName, VSSFLAG_DELYES );
return 0;
}
else
{
Error_fn_vSetFmt( Error_eVssFileNewer, "%s -> Error (%s updated data before you)\r\n", _p_stModif->szName, g_a_szUserName[0] );
return -1;
}
}
/*
----------------------------------------------------------------------------------------
Description : do a modif that consist on adding a file
_p_stModif -> current modif
Returns (char ) -1 if fails, 0 if OK
----------------------------------------------------------------------------------------
*/
char CMngDataDlg::m_fn_cDoModifFileAdd( tdstModif *_p_stModif )
{
BOOL bAdd;
int cChoice;
if (!m_bLocalExist)
{
Error_fn_vSetFmt( Error_eLocalFileNotFound, "%s -> Error : Local file not found\n", g_stSource.szFullName );
return -1;
}
if (m_cVssStatus == VSSFILE_NOTFOUND)
{
sprintf( m_szMessage, "%s -> Vss file doesn't exist add it\n", g_szVssFileName );
m_fn_Result_vAddLine( m_szMessage, C_Result_cInfoLine );
char *p_szBeginFile = strrchr( g_szVssFileName,'\\' );
*p_szBeginFile = 0;
bAdd = OLE_fn_bAddFile( g_szVssFileName, g_stSource.szFullName );
*p_szBeginFile = '\\';
//_p_stModif->cType = C_ModifType_cModif;
return bAdd ? 0 : -1;
}
if (g_cDeleteSectionModif == 0)
{
CYesNoAllDlg oQuestion;
char szMessage[1024], *p_szMessage = szMessage;
p_szMessage += sprintf( p_szMessage, "Warning : %s file\n", _p_stModif->szName );
p_szMessage += sprintf( p_szMessage, "was created in your local directory but already exist in vss data\n");
p_szMessage += sprintf( p_szMessage, "-------------------------------------\n" );
p_szMessage += sprintf( p_szMessage, "Do you want I delete this file modification and \n");
p_szMessage += sprintf( p_szMessage, "take care of file section modification ?");
oQuestion.fn_vSetMessage( szMessage );
oQuestion.DoModal();
cChoice = oQuestion.fn_cGetChoice();
switch( cChoice )
{
case C_CHOICE_cYesAll:
g_cDeleteSectionModif = cChoice;
cChoice = C_CHOICE_cYes;
break;
case C_CHOICE_cNoAll:
g_cDeleteSectionModif = cChoice;
cChoice = C_CHOICE_cNo;
break;
}
}
else
{
cChoice = (g_cDeleteSectionModif == C_CHOICE_cYesAll) ? C_CHOICE_cYes : C_CHOICE_cNo;
}
if (cChoice == C_CHOICE_cNo)
{
Error_fn_vSet( Error_eVssSectionAlreadyCreated, "Created local file already exist in vss database\n" );
return -1;
}
else
{
fn_vRestoreSubModif( _p_stModif );
return 0;
}
}
/*
---------------------------------------------------------------------------------------
update all modifications
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::m_fn_bUpdate( void )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szFileName[MAX_PATH];
char szShortFileName[MAX_PATH];
tdstModif *p_stCurModif = g_p_stFirstModif;
BOOL bModifEntireFile;
BOOL bErrorOnCurrent;
long lNumberOfErrors = 0;
long lStart;
char cResult;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
while (1)
{
/*
* get next not marqued modification
*/
if (( p_stCurModif = fn_p_stGetFirstNotMarkedModif() ) == NULL)
break;
/*
* mark current modif
*/
p_stCurModif->bConflict = TRUE;
bErrorOnCurrent = TRUE;
/*
* get filename and short filename from modified section name
*/
bModifEntireFile = fn_bGetModifiedFile( p_stCurModif, szFileName, szShortFileName );
/*
* check validity of filename
*/
if (*szShortFileName == 0)
{
Error_fn_vSetFmt( Error_eInvalidFileName, "%s -> Error : Invalid File Name\r\n", szFileName );
cResult = -1;
}
else
{
/*
* build vss filename, extracting temp file, and local file
*/
sprintf(g_szVssFileName , "%s\\%s", g_stIniData.szVssPath, szFileName );
sprintf(g_stTarget.szFullName, "%s\\%s", g_stIniData.szTempPath, szShortFileName );
sprintf(g_stSource.szFullName, "%s\\%s", g_stIniData.szLocalPath, szFileName );
m_bLocalExist = (_access( g_stSource.szFullName, 0 ) == 0);
m_cVssStatus = OLE_fn_cGetVssFileStatus(g_szVssFileName);
if ( (m_cVssStatus == VSSFILE_CHECKEDOUT_ME) || (m_cVssStatus == VSSFILE_CHECKEDOUT) )
{
lNumberOfErrors ++;
Error_fn_vSetFmt( Error_eFileAlreadyCheckOut, "%s -> Error vss file is already checked out by %s; see admin\r\n", g_szVssFileName, g_a_szUserName[0] );
m_oProgress.OffsetPos(fn_iMarkAllModifForAFile( szFileName ));
m_fn_Result_vAddLine( Error_fn_p_szGetMessage(), C_Result_cErrorLine );
p_stCurModif = NULL;
}
else
{
if (bModifEntireFile)
{
switch (p_stCurModif->cType)
{
case C_ModifType_cDelete:
cResult = m_fn_cDoModifFileDelete( p_stCurModif );
break;
case C_ModifType_cRebuild:
case C_ModifType_cModif:
cResult = m_fn_cDoModifFileModif( p_stCurModif, TRUE );
break;
case C_ModifType_cAdd:
cResult = m_fn_cDoModifFileAdd( p_stCurModif );
break;
}
}
else
{
cResult = m_fn_cDoModifFileModif( p_stCurModif, FALSE );
if (cResult == 0)
{
if ( !OLE_fn_bCheckoutFile( g_szVssFileName, g_stTarget.szFullName, VSSFLAG_REPREPLACE ))
{
cResult = -1;
sprintf( m_szMessage, "%s -> Error ( %s )\r\n", p_stCurModif->szName, Error_fn_p_szGetMessage() );
Error_fn_vSet( Error_fn_eGet(), m_szMessage );
}
else
{
SCR_fn_v_RdL0_OpenFile( g_stTarget.szFullName );
g_stTarget.p_stFile = SCR_fnp_st_RdL0_GetOpenFile( g_stTarget.szFullName );
SCR_fn_v_RdL0_OpenFile( g_stSource.szFullName );
g_stSource.p_stFile = SCR_fnp_st_RdL0_GetOpenFile( g_stSource.szFullName );
do
{
m_fn_vPause();
p_stCurModif->bConflict = TRUE;
sprintf (m_szMessage, "%s -> ", p_stCurModif->szName);
lStart = m_oRichEdit.GetTextLength( );
m_fn_Result_vAddLine( m_szMessage, C_Result_cInfoLine );
m_oRichEdit.SetSel( lStart, -1 );
m_oProgress.StepIt();
/* doing current modif */
if (fn_bDoModif( p_stCurModif ))
{
sprintf( m_szMessage, "%s -> OK\r\n", p_stCurModif->szName );
m_oProgress.OffsetPos( fn_lDeleteModif( p_stCurModif, TRUE ) - 1 );
m_fn_Result_vAddLine( m_szMessage, C_Result_cOkLine );
}
else
{
strcpy( m_szMessage, Error_fn_p_szGetMessage() );
Error_fn_vSetFmt( Error_eCantUpdateModification, "%s -> Error ( %s )\r\n", p_stCurModif->szName, m_szMessage );
lNumberOfErrors ++;
m_fn_Result_vAddLine( Error_fn_p_szGetMessage(), C_Result_cErrorLine );
m_oProgress.OffsetPos( fn_lNumberOfChildModif( p_stCurModif ) );
}
/* search for modif in same file */
p_stCurModif = fnp_stGetModifInFile( szFileName, FALSE, FALSE );
} while (p_stCurModif != NULL );
/* deleting opened script file */
SCR_fn_v_RdL0_DelOpenFile( g_stTarget.szFullName, SCR_CDR_c_RdL0_Match);
SCR_fn_v_RdL0_DelOpenFile( g_stSource.szFullName, SCR_CDR_c_RdL0_Match);
SCR_fn_v_SvL1_UpdateAllNotify();
/* archiving file */
m_fn_vPause();
OLE_fn_bCheckinFile( g_szVssFileName, g_stTarget.szFullName, VSSFLAG_DELYES );
}
}
}
}
}
if (p_stCurModif != NULL)
{
if (cResult == -1)
{
lNumberOfErrors ++;
m_oProgress.OffsetPos( fn_lNumberOfChildModif( p_stCurModif ) + 1);
m_fn_Result_vAddLine( Error_fn_p_szGetMessage(), C_Result_cErrorLine );
}
else
{
if (cResult == 0)
{
sprintf (m_szMessage, "%s -> OK\r\n", p_stCurModif->szName);
m_oProgress.OffsetPos( fn_lDeleteModif( p_stCurModif, TRUE ));
}
else /* cResult = 1*/
{
sprintf( m_szMessage, "%s -> OK\r\n", szFileName );
m_oProgress.OffsetPos( fn_iDeleteAllModifForAFile( szFileName ) );
}
m_fn_Result_vAddLine( m_szMessage, C_Result_cOkLine );
}
}
}
if (lNumberOfErrors != 0)
{
sprintf( m_szMessage, "######## %d Error%s detected ########\r\n", lNumberOfErrors, (lNumberOfErrors == 1)?"":"s" );
m_fn_Result_vAddLine( m_szMessage, C_Result_cErrorLine );
}
return TRUE;
}
/*
---------------------------------------------------------------------------------------
main function for updating operation
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::m_fn_bOnCommandUpdate( )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL bResult = FALSE;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* init display
*/
m_fn_vKillTimerForBaseStatus();
m_fn_vInitProgessBar( 0, g_lNumberOfModifs + 5 );
m_fn_Result_vResetContent();
m_fn_vEnableButton(FALSE);
GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( FALSE );
g_cDeleteSectionModif = 0;
g_cAddModifiedFile = 0;
m_bWorkInProgress = TRUE;
m_bRequestToStop = FALSE;
/*
* look if someone is obtaining data
*/
M_DisplayInfoLine( "-> Look if someone's obtaining data\r\n" );
if (fn_bSomeoneObtain( TRUE ))
{
if (g_cNbUsers)
Error_fn_vSetFmt( Error_eSomeoneObtain, "Can't update cause %s is obtaining\r\n", g_a_szUserName[0] );
else
Error_fn_vSet( Error_eCantAccessServer, "Can't access Server\r\n" );
}
else
{
/*
* look if someone is updating data
*/
M_DisplayInfoLine( "-> Look if someone's updating data\r\n" );
if (fn_bSomeoneUpdate(TRUE, TRUE))
{
if (g_cNbUsers)
Error_fn_vSetFmt( Error_eSomeoneUpdate, "Can't update cause %s is obtaining\r\n", g_a_szUserName[0] );
else
Error_fn_vSet( Error_eCantAccessServer, "Can't access Server\r\n" );
}
else
{
/*
* synchronisation with time server
*/
M_DisplayInfoLine( "-> Synchronizing time with server\r\n" );
if (!fn_bSynchronizeTime( TRUE ))
Error_fn_vSet( Error_eCantAccessTimeServer, "Time server doesn't respond !" );
else
{
fn_vInitUpdateTime();
sprintf( m_szMessage, "%s\r\n", g_szUpdateTimeString );
m_fn_Result_vAddLine( m_szMessage, C_Result_cOkLine );
m_fn_vPause();
M_DisplayInfoLine( "-> Beginning updating\r\n" );
if (!fn_bBeginUpdating() )
Error_fn_vSet( Error_eCantAccessServer, "Can't access Server\r\n" );
else
{
m_fn_bUpdate();
M_DisplayInfoLine( "-> Update's done\r\n");
fn_bEndUpdating();
fn_vUpdateModifFile();
OnButtonRefresh();
bResult = TRUE;
}
}
}
}
/*
* Display error if something happends
*/
if (!bResult)
m_fn_Result_vAddLine( Error_fn_p_szGetMessage() , C_Result_cErrorLine );
/*
* LOG FILE
*/
m_fn_vWriteResultToLogFile( "Updating result" );
m_oProgress.SetPos( m_oProgress.m_iEnd );
m_bWorkInProgress = FALSE;
m_fn_vEnableButton(TRUE);
OnButtonRefresh();
m_fn_vSetTimerForBaseStatus();
return bResult;
}
/*
=======================================================================================
Function for updating a list file of file / project
this functiosn replace vss file with local file without verification
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
update all file that are in config
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::m_fn_bUpdateWithConfig( long _lNumberOfFiles, char **d_szFile )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char cResult;
long lNumberOfErrors = 0;
long lStart;
long lFile;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
for (lFile = 0; lFile < _lNumberOfFiles; lFile++)
{
/*
* get filename and short filename from modified section name
*/
sprintf (m_szMessage, "%s -> ", d_szFile[ lFile ] + 3);
lStart = m_oRichEdit.GetTextLength( );
m_fn_Result_vAddLine( m_szMessage, C_Result_cInfoLine );
//m_oRichEdit.SetSel( lStart, -1 );
m_oProgress.StepIt();
cResult = fn_cUpdateFile( d_szFile[ lFile ] + 3);
switch (cResult)
{
case C_Vss_cUpdateError:
strcpy( m_szMessage, Error_fn_p_szGetMessage() );
Error_fn_vSetFmt( Error_eCantUpdateModification, "Error ( %s )\n", m_szMessage );
lNumberOfErrors ++;
m_fn_Result_vAddLine( Error_fn_p_szGetMessage(), C_Result_cErrorLine );
break;
case C_Vss_cUpdateNothing:
m_oRichEdit.SetSel( lStart, -1);
m_fn_Result_vAddLine( "", C_Result_cInfoLine );
break;
case C_Vss_cUpdateAdd:
m_fn_Result_vAddLine( "Added\n", C_Result_cOkLine );
break;
case C_Vss_cUpdateModify:
m_fn_Result_vAddLine( "Updated\n", C_Result_cOkLine );
break;
}
}
if (lNumberOfErrors != 0)
{
sprintf( m_szMessage, "######## %d Error%s detected ########\r\n", lNumberOfErrors, (lNumberOfErrors == 1)?"":"s" );
m_fn_Result_vAddLine( m_szMessage, C_Result_cErrorLine );
}
return TRUE;
}
/*
---------------------------------------------------------------------------------------
main function for updating operation
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::m_fn_bOnCommandUpdateWithConfig( )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL bResult = FALSE;
tdstFileListConfig *p_stConfig = &g_stIniData.stUpdateConfig;
long lNbFiles;
char **d_szFile;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* get all files that are to update
*/
if (g_p_stLocalRootProject == NULL)
{
fn_Tree_bBuildFromDisk( &g_p_stLocalRootProject, g_stIniData.szLocalPath );
fn_Tree_vRefreshWithFileList( g_p_stLocalRootProject, &g_stIniData.stUpdateConfig );
}
lNbFiles = fn_TREE_lBuildListOfFilesToGet( g_p_stLocalRootProject, &d_szFile );
if ( lNbFiles == 0)
return TRUE;
/*
* init display
*/
m_fn_vKillTimerForBaseStatus();
m_fn_vInitProgessBar( 0, lNbFiles + 4 );
m_fn_Result_vResetContent();
m_fn_vEnableButton(FALSE);
GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( TRUE );
m_bWorkInProgress = TRUE;
m_bRequestToStop = FALSE;
/*
* look if someone is obtaining data
*/
M_DisplayInfoLine( "-> Look if someone's obtaining data\r\n" );
if (fn_bSomeoneObtain( TRUE ))
{
if (g_cNbUsers)
Error_fn_vSetFmt( Error_eSomeoneObtain, "Can't update cause %s is obtaining\r\n", g_a_szUserName[0] );
else
Error_fn_vSet( Error_eCantAccessServer, "Can't access Server\r\n" );
}
else
{
/*
* look if someone is updating data
*/
M_DisplayInfoLine( "-> Look if someone's updating data\r\n" );
if (fn_bSomeoneUpdate(TRUE, TRUE))
{
if (g_cNbUsers)
Error_fn_vSetFmt( Error_eSomeoneUpdate, "Can't update cause %s is obtaining\r\n", g_a_szUserName[0] );
else
Error_fn_vSet( Error_eCantAccessServer, "Can't access Server\r\n" );
}
else
{
M_DisplayInfoLine( "-> Beginning updating\r\n" );
if (!fn_bBeginUpdating() )
Error_fn_vSet( Error_eCantAccessServer, "Can't access Server\r\n" );
else
{
m_fn_bUpdateWithConfig( lNbFiles, d_szFile );
M_DisplayInfoLine( "-> Update's done\r\n");
fn_bEndUpdating();
bResult = TRUE;
}
}
}
/*
* Display error if something happends
*/
if (!bResult)
m_fn_Result_vAddLine( Error_fn_p_szGetMessage() , C_Result_cErrorLine );
/*
* free list of files
*/
fn_TREE_vFreeListOfFilesToGet( lNbFiles, d_szFile );
/*
* LOG FILE
*/
m_fn_vWriteResultToLogFile( "Updating with config result" );
m_oProgress.SetPos( m_oProgress.m_iEnd );
m_bWorkInProgress = FALSE;
m_fn_vEnableButton(TRUE);
//OnButtonRefresh();
m_fn_vSetTimerForBaseStatus();
return bResult;
}
/*
=======================================================================================
Function for obtaining
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
Obtain command : main function for obtaining operation
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vOnCommandObtain()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL bDeleteModifFile = TRUE;
BOOL bContinue = TRUE;
BOOL bObtain;
long lTextStart, lTextEnd;
MSG stMessage;
int iResult;
long lNbFiles, lFile;
char **d_szFile = NULL;
char szTemp[256];
char *p_szTemp;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* build file list that are to be obtained
*/
lFile = 0;
fn_Tree_vGetNumberOfFilesToGet( g_p_stVssRootProject, &lFile, FALSE );
if ( lFile == 0)
return;
/* init display */
m_fn_vKillTimerForBaseStatus();
//m_fn_vInitProgessBar( 0, 7 + g_stIniData.lNumberOfFilesToObtain );
m_fn_vInitProgessBar( 0, 7 + lFile );
m_fn_Result_vResetContent();
m_fn_vEnableButton(FALSE);
m_bWorkInProgress = TRUE;
m_bRequestToStop = FALSE;
/*
* stop immediatly if there's still modifications and if it's a batch obtain
*/
if ( (g_lNumberOfFatherModifs != 0) && !m_bBatchObtain )
{
sprintf( m_szMessage, "there is still %d modif in file\r\nDelete all modif ?", g_lNumberOfFatherModifs );
iResult = MessageBox( m_szMessage, "Warning", MB_ICONQUESTION | MB_YESNOCANCEL );
bContinue = iResult != IDCANCEL;
bDeleteModifFile = (iResult == IDYES);
}
if (bContinue && !m_bRequestToStop )
{
M_DisplayInfoLine( "-> Look if someone's updating data\n" );
if (fn_bSomeoneUpdate(FALSE, !m_bBatchObtain))
{
if (g_cNbUsers)
{
sprintf( m_szMessage, "Can't obtain cause %s is updating\n", g_a_szUserName[0] );
m_fn_Result_vAddLine( m_szMessage, C_Result_cErrorLine );
}
else
m_fn_Result_vAddLine( "Can't access server", C_Result_cErrorLine );
}
else if (!m_bRequestToStop)
{
if ( bDeleteModifFile && (g_lNumberOfFatherModifs != 0) )
{
m_fn_Result_vAddLine( "-> Deleting modification file\n", C_Result_cInfoLine );
fn_bDeleteModifFile();
OnButtonRefresh();
if (g_lNumberOfFatherModifs != 0)
{
m_fn_Result_vAddLine( "Can't delete modification file\n", C_Result_cErrorLine );
bContinue = FALSE;
}
}
m_oProgress.StepIt();
if (bContinue && !m_bRequestToStop)
{
m_fn_Result_vAddLine( "-> Synchronizing time with server\n", C_Result_cInfoLine );
m_oProgress.StepIt();
if (!fn_bSynchronizeTime( !m_bBatchObtain ))
{
m_fn_Result_vAddLine( "Error with time server\n", C_Result_cErrorLine );
}
else if (!m_bRequestToStop)
{
fn_vFormatDateTime( 0, szTemp );
strcat( szTemp, "\r\n");
m_fn_Result_vAddLine( szTemp, C_Result_cOkLine );
m_fn_Result_vAddLine( "-> Beginning obtaining\n", C_Result_cInfoLine );
m_oProgress.StepIt();
if (!fn_bBeginObtaining() )
{
m_fn_Result_vAddLine( "Can't access server", C_Result_cErrorLine );
}
else if (!m_bRequestToStop)
{
/*
* refresh file list that are to obtain
*/
M_DisplayInfoLine( "-> Refresh vss data tree\n" );
fn_vRefreshVssTreeAndFilesToObtainList();
lNbFiles = fn_TREE_lBuildListOfFilesToGet( g_p_stVssRootProject, &d_szFile );
if (lNbFiles != lFile)
{
m_fn_Result_vAddLine(" Number of file to obtain has changed : resizing progress bar\n", C_Result_cInfoLine );
m_oProgress.m_fn_vSetRange( 0, 7 + lNbFiles );
}
sprintf( m_szMessage, " obtaining %d files\n", lNbFiles );
m_fn_Result_vAddLine(m_szMessage, C_Result_cInfoLine );
/*
* Save obtaining info and init result display
*/
fn_IniD_vSaveObtainingInfo( );
m_oRichEdit.GetSel( lTextStart, lTextEnd );
p_szTemp = szTemp + sprintf( szTemp, " Obtaining " );
for (lFile = 0; lFile < lNbFiles; lFile ++)
{
//strcpy( p_szTemp, g_stIniData.d_szFileToObtain[iFile] );
strcpy( p_szTemp, d_szFile[lFile] );
m_oRichEdit.SetSel( lTextStart, -1 );
m_fn_Result_vAddLine( szTemp, C_Result_cInfoLine );
//if (!fn_bObtainFile( g_stIniData.d_szFileToObtain[iFile], &bObtain ))
if (!fn_bObtainFile( d_szFile[lFile], &bObtain ))
{
m_fn_Result_vAddLine( "\nObtaining aborted\n", C_Result_cInfoLine );
m_fn_Result_vAddLine( Error_fn_p_szGetMessage(), C_Result_cErrorLine );
break;
}
if (bObtain)
{
m_fn_Result_vAddLine( "\n", C_Result_cInfoLine );
m_oRichEdit.GetSel( lTextStart, lTextEnd );
}
m_oProgress.StepIt();
if ( PeekMessage( &stMessage, NULL, 0, 0, PM_REMOVE ) )
DispatchMessage( &stMessage );
if (m_bRequestToStop)
{
if (AfxMessageBox( "Stopping obtaining operation could invalidate data\non your local disk\n---------------------\nDo you want to abort anyway ?", MB_YESNO | MB_ICONSTOP ) == IDYES)
{
m_fn_Result_vAddLine( "\nObtaining aborted by user\n", C_Result_cErrorLine );
break;
}
else
m_bRequestToStop = FALSE;
}
}
//if (lFile == g_stIniData.lNumberOfFilesToObtain)
if (lFile == lNbFiles)
{
if (!bObtain)
{
m_oRichEdit.SetSel( lTextStart, -1);
m_fn_Result_vAddLine( "", C_Result_cInfoLine );
}
m_fn_Result_vAddLine( "-> Obtain's done\n", C_Result_cInfoLine );
m_oProgress.StepIt();
m_fn_Result_vAddLine("-> Deleting old security saved directory\n" , C_Result_cInfoLine );
SAVE_fn_bDeleteAllVersions();
m_oProgress.StepIt();
}
if (!fn_bEndObtaining())
m_fn_Result_vAddLine( "Can't access server\nContact administrator", C_Result_cErrorLine );
/*
* free list of file to obtain
*/
fn_TREE_vFreeListOfFilesToGet( lNbFiles, d_szFile );
}
}
}
}
}
m_oProgress.SetPos( m_oProgress.m_iEnd );
m_bWorkInProgress = FALSE;
m_fn_vEnableButton(TRUE);
OnButtonRefresh();
m_fn_vSetTimerForBaseStatus();
/*
* LOG FILE
*/
m_fn_vWriteResultToLogFile( "obtaining" );
}
/*
=======================================================================================
Functions for base status
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : display base status
----------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vDisplayBaseStatus( void )
{
fn_bGetUpdateStatus( m_szMessage );
GetDlgItem( IDC_EDIT_INUPDATE )->SetWindowText( m_szMessage );
fn_bGetObtainStatus( m_szMessage );
GetDlgItem( IDC_EDIT_INOBTAIN )->SetWindowText( m_szMessage );
}
/*
----------------------------------------------------------------------------------------
Description : create timer to display base status sometimes
----------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vSetTimerForBaseStatus( void )
{
if (!m_bBaseStatusTimerOn)
{
m_uiBaseStatusTimer = SetTimer( C_uiBaseStatusTimer, 10000, NULL );
m_bBaseStatusTimerOn = TRUE;
}
}
/*
----------------------------------------------------------------------------------------
Description : kill timer created to display base status
----------------------------------------------------------------------------------------
*/
void CMngDataDlg::m_fn_vKillTimerForBaseStatus( void )
{
if (m_bBaseStatusTimerOn)
{
KillTimer( m_uiBaseStatusTimer );
m_bBaseStatusTimerOn = FALSE;
}
}
/*
=======================================================================================
Message handlers
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
call back for wait dialog
---------------------------------------------------------------------------------------
*/
BOOL CALLBACK fn_bWaitDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
static UINT uiTimer;
static char cInit;
BOOL bResult;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
switch (uMsg)
{
case WM_INITDIALOG:
SetWindowText(hwndDlg, "Loading Vss Tree" );
cInit = 1;
return TRUE;
case WM_SHOWWINDOW:
if (cInit)
{
cInit = 0;
uiTimer = SetTimer( hwndDlg, 1, 100, NULL );
}
break;
case WM_TIMER:
KillTimer( hwndDlg, uiTimer );
bResult = OLE_fn_bGetVssProjectTree( FALSE, GetDlgItem( hwndDlg, IDC_STATIC_PROJECT ) );
//bResult = OLE_fn_bGetVssProjectTree( TRUE, GetDlgItem( hwndDlg, IDC_STATIC_PROJECT ) );
EndDialog( hwndDlg, bResult?1:0 );
break;
}
return FALSE;
}
/*
---------------------------------------------------------------------------------------
WM_INITDIALOG
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::OnInitDialog()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
RECT stRect;
RECT stDlgRect;
long lDlgWidth;
long lDlgHeight;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CDialog::OnInitDialog();
/*
* append about entry in system menu
*/
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, "About ...");
/*
* Set icons
*/
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
/*
* Get ini Data
*/
fn_IniD_vGetAllFromIniFile( TRUE );
/*
* Init script module
*/
Mmg_fn_vFirstInitMmgModule(1);
SCR_fn_v_RdL0_Init();
/*
* OLE initialisation : opening the database
*/
if (!OLE_fn_bVssLogin( NULL ) )
{
m_fn_vFatalError("Can't log to vss database" );
return FALSE;
}
/*
* getting tree project
*/
int iResult = DialogBox( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDD_DIALOG_WAIT ), ::GetDesktopWindow(), fn_bWaitDialogProc );
if ( iResult != 1)
{
m_fn_vFatalError("Can't access vss database" );
return FALSE;
}
/*
* set getting state of vss tree and build list of all files that are to obtain
*/
fn_Tree_vRefreshWithFileList( g_p_stVssRootProject, &g_stIniData.stObtainConfig );
//fn_vUpdateFilesToObtainList();
/*
* read modification list
*/
fn_iReadModificationFile();
/*
* display data in window
*/
m_fn_vDisplayProgramData();
/*
* init progression bar
*/
m_oProgress.SubclassDlgItem( IDC_PROGRESS, this );
m_oProgress.SetStep( 1 );
/*
* init LOG FILE
*/
LOG_fn_vInitLogFile();
/*
* get current posistion of all control in window for resizing operation
*/
GetClientRect( &stDlgRect );
lDlgWidth = stDlgRect.right - stDlgRect.left + 1;
lDlgHeight = stDlgRect.bottom - stDlgRect.top + 1;
for (int iEdit = 0; iEdit < m_cNbEditBox; iEdit ++)
{
GetDlgItem(m_a_uiEditControl[iEdit])->GetWindowRect( &stRect );
m_a_iSizeLeft[iEdit] = lDlgWidth - (stRect.right - stRect.left + 1);
}
GetDlgItem( IDC_STATIC_FORRICHEDIT)->GetWindowRect( &stRect );
m_iHeightLeft = lDlgHeight - (stRect.bottom - stRect.top + 1);
/*
* Create RichEditControl
*/
m_oRichEdit.Create
(
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | ES_AUTOHSCROLL | ES_READONLY,
stRect,
this,
IDC_RICHEDIT_RESULT
);
m_oRichEdit.SetBackgroundColor( FALSE, 0 );
m_oRichEdit.GetDefaultCharFormat( m_stCharFormat );
m_stCharFormat.dwEffects = 0;
m_stCharFormat.crTextColor = RGB(255,255,255);
strcpy ( m_stCharFormat.szFaceName, "Arial" );
m_stCharFormat.dwMask = CFM_COLOR | CFM_BOLD | CFM_FACE;
m_oRichEdit.SetDefaultCharFormat( m_stCharFormat );
/*
* Set timer for base status on
*/
m_fn_vSetTimerForBaseStatus();
/*
* change size of window according to preference
*/
MoveWindow( &g_stWinPref.stMainPos );
m_bInitOK = TRUE;
return TRUE; // return TRUE unless you set the focus to a control
}
/*
---------------------------------------------------------------------------------------
WM_SYSCOMMAND
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
if (nID == SC_CLOSE)
{
if (m_bWorkInProgress)
return;
if (AfxMessageBox( "Are you sure you want to Quit ?", MB_YESNO | MB_ICONQUESTION) == IDNO)
return;
m_bQuitFromSysCommand = TRUE;
}
CDialog::OnSysCommand(nID, lParam);
}
}
/*
---------------------------------------------------------------------------------------
WM_DESTROY
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnDestroy()
{
WinHelp(0L, HELP_QUIT);
fn_vDeleteAllModifs();
fn_Tree_vFreeProjectTree(g_p_stVssRootProject, TRUE );
fn_Tree_vFreeProjectTree(g_p_stLocalRootProject, TRUE );
fn_IniD_vFreeFileList( &g_stIniData.stObtainConfig );
fn_IniD_vFreeFileList( &g_stIniData.stUpdateConfig );
//fn_IniD_vFreeObtainedFileList();
//fn_IniD_vFreeFileListToObtain();
m_fn_vKillTimerForBaseStatus();
/*
* save new position and size
*/
if (m_bInitOK)
{
GetWindowRect( &g_stWinPref.stMainPos );
fn_IniD_vWriteWindowPreference();
}
SCR_fn_v_RdL0_Close();
Mmg_fn_vStopMmgModule();
CDialog::OnDestroy();
}
/*
---------------------------------------------------------------------------------------
WM_PAINT
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
CBitmap oBitmap;
oBitmap.LoadBitmap( IDB_BITMAP_LENNON );
dc.DrawState( CPoint( 5, 5), CSize(50,100), &oBitmap, DST_BITMAP );
oBitmap.DeleteObject();
}
}
/*
---------------------------------------------------------------------------------------
WM_QUERYDRAGICON
---------------------------------------------------------------------------------------
*/
HCURSOR CMngDataDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/*
---------------------------------------------------------------------------------------
WM_TIMER
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == C_uiBaseStatusTimer )
{
m_fn_vDisplayBaseStatus();
}
CDialog::OnTimer(nIDEvent);
}
/*
---------------------------------------------------------------------------------------
BN_CLIKED on IDC_Check_OBTAINMENU
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnCheckObtainMenu()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CButton *p_oCheck = ((CButton *) GetDlgItem (IDC_CHECK_OBTAINMENU));
RECT stRect;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( p_oCheck->GetCheck() == 1 )
{
CMenu oMenu;
oMenu.CreatePopupMenu();
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_OBTAINNOW, "Obtain now");
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_OBTAIN, "Batch obtain");
//oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_OBTAINOPTIONS, "Options...");
p_oCheck->GetWindowRect(&stRect);
oMenu.TrackPopupMenu( TPM_LEFTBUTTON, stRect.left, stRect.bottom, this );
oMenu.DestroyMenu();
p_oCheck->SetCheck( 0 );
}
}
/*
---------------------------------------------------------------------------------------
BN_CLIKED on IDC_BUTTON_VIEWMODIF
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonViewmodif()
{
CModifListDialog oDlgModif;
oDlgModif.DoModal();
}
/*
---------------------------------------------------------------------------------------
BN_CLIKED on IDC_BUTTON_CLEARMODIF
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonClearmodif()
{
if (AfxMessageBox( "Are you sure you want to\nDelete modification list ?", MB_YESNO | MB_ICONQUESTION) == IDYES)
{
if ( !fn_bDeleteModifFile())
{
AfxMessageBox( "Error : Can't delete modification file", MB_ICONSTOP | MB_OK );
}
OnButtonRefresh();
}
}
/*
---------------------------------------------------------------------------------------
BN_CLIKED on IDC_BUTTON_CHANGEMODIF
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonChangemodif()
{
static char BASED_CODE szFilter[] = "Modif list file(*.txt)|*.txt||";
char szFileName[ _MAX_PATH ];
char *p_szShortName;
DWORD dwFlags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
char szDir[ _MAX_PATH ];
CFileDialog oFD( TRUE, "txt", g_stIniData.szModifFile, dwFlags, szFilter, this);
GetCurrentDirectory( _MAX_PATH, szDir );
if (SetCurrentDirectory( g_stIniData.szLocalPath ))
{
if (oFD.DoModal() == IDOK)
{
strcpy ( szFileName, (char *) (LPCTSTR) oFD.GetPathName() );
if (strnicmp( szFileName, g_stIniData.szLocalPath, strlen( g_stIniData.szLocalPath )) == 0)
{
p_szShortName = szFileName + strlen( g_stIniData.szLocalPath );
if (*p_szShortName == '\\' )
p_szShortName++;
fn_IniD_vSetModifListFile( p_szShortName );
OnButtonRefresh();
}
else
{
sprintf( m_szMessage,"Error : Modif list file must be in local path\n(%s)", g_stIniData.szLocalPath );
AfxMessageBox( m_szMessage, MB_OK | MB_ICONSTOP );
}
}
SetCurrentDirectory( szDir );
}
else
{
sprintf( m_szMessage,"Error : Can't find local path (%s)", g_stIniData.szLocalPath );
AfxMessageBox( m_szMessage, MB_OK | MB_ICONSTOP );
}
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_BUTTON_BROWSE
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonBrowse()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BROWSEINFO stBI;
ITEMIDLIST *p_stItem;
char szDisplayName[ MAX_PATH ];
char szPath[ MAX_PATH ];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
stBI.hwndOwner = this->GetSafeHwnd();
stBI.pidlRoot = NULL;
stBI.pszDisplayName = szDisplayName;
stBI.lpszTitle = "Choose Target Path";
stBI.ulFlags = 0;
stBI.lpfn = NULL;
if ((p_stItem = SHBrowseForFolder( &stBI )) != NULL)
{
SHGetPathFromIDList( p_stItem, szPath );
fn_IniD_vSetLocalPath( szPath );
OnButtonRefresh();
}
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_BUTTON_REFRESH
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonRefresh()
{
fn_IniD_vGetAllFromIniFile( FALSE );
fn_iReadModificationFile();
m_fn_vDisplayProgramData();
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_BUTTON_LOOKOBTAIN
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonLookobtain()
{
if (!fn_bSomeoneObtain( TRUE ))
MessageBox( "Nobody is obtaining", "Info", MB_ICONASTERISK );
else
{
char szMessage[1024];
char cUser;
char *p_szCur = szMessage;
for (cUser = 0; cUser < g_cNbUsers; cUser ++)
p_szCur += sprintf (p_szCur, "%s\r\n", g_a_szUserName[cUser] );
sprintf( p_szCur, "%s obtaining data base", (g_cNbUsers == 1)?"is":"are" );
MessageBox( szMessage, "Info", MB_ICONASTERISK);
}
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_BUTTON_LOOKUPDATE
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonLookupdate()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szMessage[1024];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if (!fn_bSomeoneUpdate(FALSE, TRUE))
strcpy (szMessage, "Nobody is updating" );
else
sprintf( szMessage, "%s is updating data base", g_a_szUserName[0] );
MessageBox( szMessage, "Info", MB_ICONASTERISK );
}
/*
---------------------------------------------------------------------------------------
Pre translate message
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
memmove( m_szCheat, m_szCheat + 1, 5 );
m_szCheat[5] = (TCHAR) pMsg->wParam;
/*
* look if cheat string has one cheat code
* Available cheat code are actually
* pause
* update
* obtain
* modlst
* reset
*/
if (m_bWorkInProgress)
{
if (strnicmp( m_szCheat + 1, "reset", 5) == 0)
{
m_bWorkInProgress = FALSE;
m_fn_vEnableButton(TRUE);
OnButtonRefresh();
}
}
else
{
if (strnicmp(m_szCheat + 1, "pause", 5) == 0)
{
if (m_lCheatFlag & C_lCheatPause)
{
m_lCheatFlag &= !C_lCheatPause;
MessageBox( "Pause unset", "Info", MB_ICONASTERISK );
}
else
{
m_lCheatFlag |= C_lCheatPause;
MessageBox( "Pause set", "Info", MB_ICONASTERISK );
}
}
else if (strnicmp( m_szCheat, "update", 6) == 0)
{
if ( m_lCheatFlag & C_lCheatUpdate)
{
m_lCheatFlag &= !C_lCheatUpdate;
fn_bEndUpdating();
MessageBox( "Update unset", "Info", MB_ICONASTERISK );
}
else
{
if (fn_bSomeoneUpdate(FALSE, TRUE))
{
if (g_cNbUsers)
{
sprintf( m_szMessage, "Can't update cause %s is updating\r\n", g_a_szUserName[0] );
m_fn_Result_vAddLine( m_szMessage, C_Result_cErrorLine );
}
else
m_fn_Result_vAddLine( "Can't access server", C_Result_cErrorLine );
}
else
{
fn_bBeginUpdating();
m_lCheatFlag |= C_lCheatUpdate;
MessageBox( "Update set", "Info", MB_ICONASTERISK );
}
}
}
else if (strnicmp( m_szCheat, "modlst", 6) == 0)
{
char szTxtFileName[ _MAX_PATH ];
char szBakFileName[ _MAX_PATH ];
BOOL bContinue;
sprintf( szTxtFileName, "%s\\%s", g_stIniData.szLocalPath, g_stIniData.szModifFile );
strcpy(szBakFileName, szTxtFileName );
strcpy( strrchr( szBakFileName, '.'), ".bak" );
if ( _access( szBakFileName, 0) != 0)
{
sprintf( m_szMessage, "Can't recuperate old modif list\n%s file doesn't exist", szBakFileName );
AfxMessageBox( m_szMessage, MB_OK | MB_ICONSTOP );
}
else
{
if (_access( szTxtFileName, 0) == 0)
{
sprintf( m_szMessage, "There's a current modif list file\nDo you want to replace it with old modif list file ?");
bContinue = (AfxMessageBox( m_szMessage, MB_YESNO | MB_ICONQUESTION ) == IDYES );
}
else
bContinue = TRUE;
if (bContinue)
{
if (!CopyFile( szBakFileName, szTxtFileName, FALSE ) )
{
sprintf( m_szMessage, "Error while trying to copy\n%s file to\n%s file", szBakFileName, szTxtFileName );
AfxMessageBox( m_szMessage, MB_OK | MB_ICONSTOP );
}
else
{
sprintf( m_szMessage, "Old list of modification recovered" );
AfxMessageBox( m_szMessage, MB_OK | MB_ICONINFORMATION );
}
OnButtonRefresh();
}
}
}
else if (strnicmp( m_szCheat, "obtain", 6) == 0)
{
fn_IniD_vSaveObtainingDate();
OnButtonRefresh();
}
}
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_BUTTON_VSSFILES
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonVssfiles()
{
m_oFileDlg.m_fn_vSetConfigType( C_ConfigType_cObtain );
if ( m_oFileDlg.DoModal() == IDOK )
{
fn_IniD_vWriteFileList( &g_stIniData.stObtainConfig, g_szIniFile );
m_fn_vDisplayProgramData();
}
else
{
if (g_stIniData.a_cAvailableConfig[ g_stIniData.stObtainConfig.cIndex ] == 0)
{
g_stIniData.stObtainConfig.cIndex = -1;
fn_IniD_vSetSingleFileList( &g_stIniData.stObtainConfig, g_stIniData.szVssPath );
m_fn_vDisplayProgramData();
}
}
}
/*
---------------------------------------------------------------------------------------
WM_SIZE
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnSize(UINT nType, int cx, int cy)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
RECT stRect;
CWnd *p_oWnd;
int iWnd;
long lWidth;
long lX;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CDialog::OnSize(nType, cx, cy);
if (nType != SIZE_MINIMIZED)
{
/*
* resize edit box control
*/
for (iWnd = 0; iWnd < m_cNbEditBox; iWnd ++)
{
p_oWnd = GetDlgItem( m_a_uiEditControl[iWnd] );
p_oWnd->GetWindowRect( &stRect );
ScreenToClient( &stRect );
stRect.right = stRect.left + (cx - m_a_iSizeLeft[iWnd]);
p_oWnd->MoveWindow(&stRect, FALSE);
}
/*
* resize right button control
*/
for (iWnd = 0; iWnd < m_cNbRightButtons; iWnd ++)
{
p_oWnd = GetDlgItem( m_a_uiRightAlignedButton[iWnd] );
p_oWnd->GetWindowRect( &stRect );
ScreenToClient( &stRect );
lWidth = stRect.right - stRect.left;
stRect.right = cx - 7;
stRect.left = stRect.right - lWidth;
p_oWnd->MoveWindow(&stRect, FALSE);
}
/*
* special resizing for IDC_BUTTON_CHANGEMODIF
*/
p_oWnd = GetDlgItem( IDC_BUTTON_CHANGEMODIF );
p_oWnd->GetWindowRect( &stRect );
ScreenToClient( &stRect );
lX = stRect.right - stRect.left;
stRect.right = cx - 7 - lWidth;
stRect.left = stRect.right - lX;
p_oWnd->MoveWindow(&stRect, FALSE);
/*
* resize bottom buttons control
*/
lWidth = (cx - 12) / m_cNbBottomButtons;
lX = 4;
stRect.bottom = cy - 5;
stRect.top = stRect.bottom - 20;
for (iWnd = 0; iWnd < m_cNbBottomButtons; iWnd ++)
{
stRect.left = ++lX;
stRect.right = (lX += lWidth);
GetDlgItem( m_a_uiBottomButton[iWnd] )->MoveWindow(&stRect, FALSE);
}
/*
* resize window result
*/
p_oWnd = GetDlgItem( IDC_RICHEDIT_RESULT );
if (p_oWnd != NULL)
{
p_oWnd->GetWindowRect( &stRect );
ScreenToClient( &stRect );
stRect.left = 7;
stRect.right = stRect.left + cx - 14;
stRect.bottom = stRect.top + (cy - m_iHeightLeft);
p_oWnd->MoveWindow(&stRect, FALSE);
}
/*
* resize progress bar
*/
stRect.bottom = cy - 5;
stRect.top = stRect.bottom - 21;
stRect.right -= 40;
GetDlgItem( IDC_PROGRESS )->MoveWindow( &stRect, FALSE );
/*
* resize Stop button
*/
stRect.left = stRect.right + 1;
stRect.right += 40;
GetDlgItem( IDC_BUTTON_STOP )->MoveWindow( &stRect, FALSE );
Invalidate();
}
}
/*
---------------------------------------------------------------------------------------
WM_SIZING
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnSizing( UINT nSide, LPRECT lpRect )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lWidth = lpRect->right - lpRect->left + 1;
long lHeight= lpRect->bottom - lpRect->top + 1;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* limit width : can't be less than 300 pixels
*/
if (lWidth < C_iMainMinWidth)
{
switch (nSide)
{
case WMSZ_BOTTOMLEFT:
case WMSZ_LEFT:
case WMSZ_TOPLEFT:
lpRect->left = lpRect->right - C_iMainMinWidth;
break;
case WMSZ_BOTTOMRIGHT:
case WMSZ_RIGHT:
case WMSZ_TOPRIGHT:
lpRect->right = lpRect->left + C_iMainMinWidth;
break;
}
}
/*
* limit height : can't be less than 300 pixels
*/
if (lHeight < C_iMainMinHeight)
{
switch (nSide)
{
case WMSZ_BOTTOM:
case WMSZ_BOTTOMLEFT:
case WMSZ_BOTTOMRIGHT:
lpRect->bottom = lpRect->top + C_iMainMinHeight;
break;
case WMSZ_TOP:
case WMSZ_TOPLEFT:
case WMSZ_TOPRIGHT:
lpRect->top = lpRect->bottom - C_iMainMinHeight;
}
}
CDialog::OnSizing( nSide, lpRect );
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_CHECK_HELP
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnCheckHelp()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CButton *p_oCheck = ((CButton *) GetDlgItem (IDC_CHECK_HELP));
RECT stRect;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( p_oCheck->GetCheck() == 1 )
{
CMenu oMenu;
oMenu.CreatePopupMenu();
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_ABOUTBOX, "About ...");
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_SHOWHELPFILE, "Help");
p_oCheck->GetWindowRect(&stRect);
oMenu.TrackPopupMenu( TPM_LEFTBUTTON, stRect.left, stRect.bottom, this );
oMenu.DestroyMenu();
p_oCheck->SetCheck( 0 );
}
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_CHECK_UPDATE
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnCheckUpdate()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CButton *p_oCheck = ((CButton *) GetDlgItem (IDC_CHECK_UPDATE));
RECT stRect;
BOOL bUpdatePossible;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( p_oCheck->GetCheck() == 1 )
{
CMenu oMenu;
oMenu.CreatePopupMenu();
bUpdatePossible = (g_stIniData.p_oObtainingTime->GetYear() != 100 ) && (g_lNumberOfFatherModifs != 0 );
oMenu.AppendMenu( MF_STRING | MF_ENABLED | (bUpdatePossible?0:MF_GRAYED), IDM_UPDATE, "Update");
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_UPDATEHISTORY, "History");
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_UPDATEOPTIONS, "Options...");
oMenu.AppendMenu( MF_STRING | MF_ENABLED, IDM_UPDATEWITHCONFIG, "Update with config");
p_oCheck->GetWindowRect(&stRect);
oMenu.TrackPopupMenu( TPM_LEFTBUTTON, stRect.left, stRect.bottom, this );
oMenu.DestroyMenu();
p_oCheck->SetCheck( 0 );
}
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDC_BUTTON_STOP
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnButtonStop()
{
if (m_bWorkInProgress)
m_bRequestToStop = TRUE;
}
/*
---------------------------------------------------------------------------------------
WM_HELPINFO
---------------------------------------------------------------------------------------
*/
BOOL CMngDataDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
::WinHelp( this->GetSafeHwnd(), C_szHelpFile, HELP_CONTEXT, IDH_J_INTERFACE);
return TRUE;
}
/*
---------------------------------------------------------------------------------------
BN_CLICKED on IDCANCEL button
---------------------------------------------------------------------------------------
*/
void CMngDataDlg::OnCancel()
{
if (!m_bQuitFromSysCommand)
{
if (AfxMessageBox( "Are you sure you want to Quit ?", MB_YESNO | MB_ICONQUESTION) == IDNO)
return;
}
CDialog::OnCancel();
}