1579 lines
52 KiB
C++
1579 lines
52 KiB
C++
/*
|
|
=======================================================================================
|
|
Name : DlgConfl.cpp
|
|
|
|
Author : vincent lhullier Date :21/07/97
|
|
|
|
Description : implementation file for dialog box to display conflict
|
|
implementation of function to compare two section
|
|
=======================================================================================
|
|
Modification -> Author : Date :
|
|
Description :
|
|
=======================================================================================
|
|
*/
|
|
//#undef _DEBUG
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include "stdafx.h"
|
|
#include "mngdata5.h"
|
|
#include "dlgconfl.h"
|
|
#include "IniData.h"
|
|
#include "Constant.h"
|
|
#include "HelpId.h"
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
=======================================================================================
|
|
=======================================================================================
|
|
PART of code to decompose a file/section into a tree of section
|
|
=======================================================================================
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
=======================================================================================
|
|
Globals
|
|
=======================================================================================
|
|
*/
|
|
/*
|
|
* for script parsing functions
|
|
*/
|
|
char SCRT_g_szName [SCR_CV_ui_Cfg_MaxLenWord];
|
|
char SCRT_g_szNameExt[SCR_CV_ui_Cfg_MaxLenWord];
|
|
char SCRT_g_szFormat [SCR_CV_ui_Cfg_MaxLenLine];
|
|
char SCRT_g_szParams [SCR_CV_ui_Cfg_MaxLenLine];
|
|
SCR_tdst_File_Description SCRT_g_stFileDesc;
|
|
SCR_tdst_Page_Description SCRT_g_stPageDesc;
|
|
static BOOL SCRT_g_bPageInit = FALSE;
|
|
|
|
/*
|
|
* for coloration of lines in Rich Edit window
|
|
*/
|
|
static COLORREF gs_a_xColor[6] =
|
|
{
|
|
RGB( 255, 64, 64),
|
|
RGB( 255, 64, 64),
|
|
RGB( 255, 255, 255),
|
|
RGB( 0, 255, 255),
|
|
RGB( 0, 255, 0),
|
|
RGB( 128, 128, 128)
|
|
};
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Macros
|
|
=======================================================================================
|
|
*/
|
|
|
|
#define SCRT_M_vSwapSpaces( __p_stSection_, __iRead_ )\
|
|
{\
|
|
__iRead_ = (int) __p_stSection_->d_stCurPage->d_cBuffer[ __p_stSection_->iCurPosInPage ];\
|
|
while ( SCR_M_Pars_IsSpace( __iRead_ ) )\
|
|
{\
|
|
__p_stSection_->iCurPosInPage++;\
|
|
__iRead_ = (int) __p_stSection_->d_stCurPage->d_cBuffer[ __p_stSection_->iCurPosInPage ];\
|
|
}\
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions for global page and file desc
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : initialise global Page desc and file desc variable to analyse
|
|
a string with script parser macros and functions
|
|
_szPageContent -> content of page
|
|
Returns (void )
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void SCRT_fn_vInitFileAndPageDesc( char *_szPageContent, int _iNbChar = -1 )
|
|
{
|
|
if (!SCRT_g_bPageInit)
|
|
{
|
|
#ifdef SCR_DM_ProtectedVersion
|
|
SCRT_g_stPageDesc.uiSizeOf = sizeof( SCR_tdst_Page_Description );
|
|
#endif
|
|
SCRT_g_stPageDesc.p_stNext = SCRT_g_stPageDesc.p_stPrev = NULL;
|
|
SCRT_g_stFileDesc.d_stFirstPage = SCRT_g_stFileDesc.d_stLastPage = SCRT_g_stFileDesc.d_stCurPage = &SCRT_g_stPageDesc;
|
|
SCRT_g_bPageInit = 1;
|
|
}
|
|
|
|
if (_iNbChar == -1)
|
|
_iNbChar = strlen( _szPageContent ) + 2;
|
|
|
|
SCRT_g_stPageDesc.d_cBuffer = _szPageContent;
|
|
SCRT_g_stPageDesc.iNumOfChars = _iNbChar;
|
|
SCRT_g_stFileDesc.iCurPosInPage = 0;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions to free / clean
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : clean out a section tree
|
|
_p_stSection -> section tree to emptied
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void SCRT_fn_vClean( SCRT_tdstSection *_p_stSection )
|
|
{
|
|
long lElement;
|
|
|
|
if ( (_p_stSection == NULL) || (_p_stSection->cType != SCRT_C_cSection) )
|
|
return;
|
|
|
|
if (_p_stSection->bNameIsAllocate)
|
|
free( _p_stSection->szName );
|
|
|
|
if (_p_stSection->d_p_stElement)
|
|
{
|
|
for (lElement = 0; lElement < _p_stSection->lNumberOfElements; lElement ++)
|
|
{
|
|
SCRT_fn_vClean( (SCRT_tdstSection *) _p_stSection->d_p_stElement[ lElement ]);
|
|
free ( _p_stSection ->d_p_stElement[ lElement ] );
|
|
}
|
|
free ( _p_stSection ->d_p_stElement );
|
|
}
|
|
memset( _p_stSection, 0, sizeof( SCRT_tdstSection) );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : clean out Section tree and deallocate section tree structure
|
|
_p_stSection -> section tree to deallocate
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void SCRT_fn_vFree( SCRT_tdstSection *_p_stSection )
|
|
{
|
|
SCRT_fn_vClean( _p_stSection );
|
|
free( _p_stSection );
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions for build a section tree
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : build a tree that correspond to given section
|
|
_p_stSection -> tree to be build
|
|
_p_stSection -> section content
|
|
_szName -> nmae of file or section
|
|
bFile -> TRUE if name and section represent a file
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void SCRT_fn_vBuildSectionTree( SCRT_tdstSection *_p_stSection, SCR_tdst_File_Description *_p_stContent, char *_szName, unsigned short _uwNameLength, BOOL bFile )
|
|
{
|
|
SCR_tde_Cxt_ParseType eLineType;
|
|
unsigned int iNbRead;
|
|
char *szSavePosInSection;
|
|
char *szEndName;
|
|
char iRead;
|
|
|
|
if (bFile)
|
|
{
|
|
/* allocate memory to store file name */
|
|
_p_stSection->bNameIsAllocate = TRUE;
|
|
_p_stSection->szName = (char *) malloc (strlen( _szName ) + 1 );
|
|
strcpy( _p_stSection->szName, _szName );
|
|
}
|
|
else
|
|
{
|
|
if (_szName == NULL)
|
|
{
|
|
/* get section name */
|
|
while(1)
|
|
{
|
|
SCRT_M_vSwapSpaces( _p_stContent, iRead );
|
|
szSavePosInSection = _p_stContent->d_stCurPage->d_cBuffer + _p_stContent->iCurPosInPage;
|
|
|
|
iRead = fn_i_Pars_Line(_p_stContent, SCRT_g_szName, SCRT_g_szNameExt, SCRT_g_szFormat, SCRT_g_szParams, &eLineType, &iNbRead);
|
|
|
|
if (eLineType == SCR_EPT_Cxt_BeginSection)
|
|
{
|
|
_szName = szSavePosInSection;
|
|
_uwNameLength = (unsigned short) iNbRead;
|
|
szEndName = _szName + _uwNameLength - 1;
|
|
while ( (*szEndName == '\r') || (*szEndName == '\n') || (*szEndName == 0) || (*szEndName == ' ') || (*szEndName == '\t'))
|
|
{
|
|
szEndName --;
|
|
_uwNameLength--;
|
|
}
|
|
break;
|
|
}
|
|
else if (eLineType != SCR_EPT_Cxt_None)
|
|
return;
|
|
}
|
|
}
|
|
_p_stSection->cType = SCRT_C_cSection;
|
|
_p_stSection->bNameIsAllocate = FALSE;
|
|
_p_stSection->szName = _szName;
|
|
_p_stSection->uwNameLength = _uwNameLength;
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
SCRT_M_vSwapSpaces( _p_stContent, iRead );
|
|
szSavePosInSection = _p_stContent->d_stCurPage->d_cBuffer + _p_stContent->iCurPosInPage ;
|
|
|
|
iRead = fn_i_Pars_Line(_p_stContent, SCRT_g_szName, SCRT_g_szNameExt, SCRT_g_szFormat, SCRT_g_szParams, &eLineType, &iNbRead);
|
|
|
|
szEndName = szSavePosInSection + iNbRead - 1;
|
|
while ( (*szEndName == '\r') || (*szEndName == '\n') || (*szEndName == 0) || (*szEndName == ' ') || (*szEndName == '\t'))
|
|
{
|
|
iNbRead--;
|
|
szEndName--;
|
|
}
|
|
|
|
switch( eLineType )
|
|
{
|
|
case SCR_EPT_Cxt_Entry:
|
|
case SCR_EPT_Cxt_Directive:
|
|
{
|
|
SCRT_tdstEntry *p_stEntry;
|
|
|
|
if ( _p_stSection->lNumberOfElements)
|
|
{
|
|
if ( ((SCRT_tdstSection *) _p_stSection->d_p_stElement[ _p_stSection->lNumberOfElements - 1 ])->cType == SCRT_C_cSection )
|
|
((SCRT_tdstSection *) _p_stSection->d_p_stElement[ _p_stSection->lNumberOfElements - 1 ])->szEndSection = szSavePosInSection;
|
|
}
|
|
|
|
/*
|
|
* allocate new entry structure and fill ir
|
|
*/
|
|
p_stEntry = (SCRT_tdstEntry *) malloc( sizeof( SCRT_tdstEntry ) );
|
|
memset( p_stEntry, 0, sizeof( SCRT_tdstEntry ) );
|
|
p_stEntry->cType = SCRT_C_cEntry;
|
|
p_stEntry->szName = szSavePosInSection;
|
|
p_stEntry->uwNameLength = (unsigned short) iNbRead;
|
|
/*
|
|
* add this entry in current section element
|
|
*/
|
|
if (_p_stSection->d_p_stElement == NULL)
|
|
_p_stSection->d_p_stElement = (SCRT_tdstEntry **) malloc( 16 * sizeof( SCRT_tdstEntry * ) );
|
|
else if ( (_p_stSection->lNumberOfElements & 0xF) == 0)
|
|
_p_stSection->d_p_stElement = (SCRT_tdstEntry **) realloc( _p_stSection->d_p_stElement, (_p_stSection->lNumberOfElements + 16) * sizeof( SCRT_tdstEntry *) );
|
|
|
|
_p_stSection->d_p_stElement[ _p_stSection->lNumberOfElements++ ] = p_stEntry;
|
|
}
|
|
break;
|
|
case SCR_EPT_Cxt_BeginSection:
|
|
{
|
|
SCRT_tdstSection *p_stSub;
|
|
|
|
if ( _p_stSection->lNumberOfElements)
|
|
{
|
|
if ( ((SCRT_tdstSection *) _p_stSection->d_p_stElement[ _p_stSection->lNumberOfElements - 1 ])->cType == SCRT_C_cSection )
|
|
((SCRT_tdstSection *) _p_stSection->d_p_stElement[ _p_stSection->lNumberOfElements - 1 ])->szEndSection = szSavePosInSection;
|
|
}
|
|
|
|
/*
|
|
* allocate new section structure and initialize it
|
|
*/
|
|
p_stSub = (SCRT_tdstSection *) malloc ( sizeof( SCRT_tdstSection ) );
|
|
memset( p_stSub, 0, sizeof( SCRT_tdstSection) );
|
|
|
|
/*
|
|
* add this sub section to section element array
|
|
*/
|
|
if (_p_stSection->d_p_stElement == NULL)
|
|
_p_stSection->d_p_stElement = (SCRT_tdstEntry **) malloc( 16 * sizeof( SCRT_tdstEntry * ) );
|
|
else if ( (_p_stSection->lNumberOfElements & 0xF) == 0)
|
|
_p_stSection->d_p_stElement = (SCRT_tdstEntry **) realloc( _p_stSection->d_p_stElement, (_p_stSection->lNumberOfElements + 16) * sizeof( SCRT_tdstEntry *) );
|
|
|
|
_p_stSection->d_p_stElement[ _p_stSection->lNumberOfElements++ ] = (SCRT_tdstEntry *) p_stSub;
|
|
|
|
|
|
SCRT_fn_vBuildSectionTree( p_stSub, _p_stContent, szSavePosInSection, (unsigned short) iNbRead, FALSE );
|
|
}
|
|
break;
|
|
case SCR_EPT_Cxt_EndSection:
|
|
{
|
|
_p_stSection->szEndSection = _p_stContent->d_stCurPage->d_cBuffer + _p_stContent->iCurPosInPage ;
|
|
return;
|
|
}
|
|
break;
|
|
case SCR_EPT_Cxt_None:
|
|
{
|
|
if (iRead == EOF)
|
|
{
|
|
_p_stSection->szEndSection = _p_stContent->d_stCurPage->d_cBuffer + _p_stContent->iCurPosInPage ;
|
|
return;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : init and build section tree that correspond to section store in a
|
|
tdstFileInfo structure
|
|
_p_stSection -> tree to be build
|
|
_p_stSectionInfo -> section information
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void SCRT_fn_vInitAndBuildSectionTree( SCRT_tdstSection *_p_stSection, char *_szSectionContent, char *_szFileName )
|
|
{
|
|
memset( _p_stSection, 0, sizeof( SCRT_tdstSection) );
|
|
if (_szSectionContent == NULL)
|
|
return;
|
|
|
|
SCRT_fn_vInitFileAndPageDesc( _szSectionContent );
|
|
SCRT_fn_vBuildSectionTree( _p_stSection, &SCRT_g_stFileDesc, _szFileName, 0, (_szFileName != NULL) );
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions to compare two section tree
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get index of a line in section if this line exist
|
|
_p_stSection -> section tree where we search line
|
|
_szEntryName -> line
|
|
Returns (long ) index of line or -1 if not found
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long SCRT_fn_lGetExactElementIndex( SCRT_tdstSection *_p_stSection, SCRT_tdstEntry *_p_stElement )
|
|
{
|
|
long lIndex;
|
|
SCRT_tdstEntry *p_stSectionEntry;
|
|
|
|
for (lIndex = 0; lIndex < _p_stSection->lNumberOfElements; lIndex ++)
|
|
{
|
|
p_stSectionEntry = (SCRT_tdstEntry *) _p_stSection->d_p_stElement[ lIndex ];
|
|
|
|
if ( p_stSectionEntry->cCompState != SCRT_C_cNew )
|
|
continue;
|
|
|
|
if (p_stSectionEntry->uwNameLength == _p_stElement->uwNameLength)
|
|
if (strnicmp( p_stSectionEntry->szName, _p_stElement->szName, _p_stElement->uwNameLength ) == 0)
|
|
return lIndex;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : search for a entry within a section. Entry must not be linked with a same
|
|
entry in another tree and must have the same name. Parameters of entry
|
|
are different
|
|
_p_stSection -> section to search in
|
|
_lFirstIndex -> first not linked entry to begin seaching
|
|
_p_stEntry -> entry to search for
|
|
Returns (long ) -1 if fails,otherwise index of entry found
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long SCRT_fn_lGetDiffEntryIndex( SCRT_tdstSection *_p_stSection, long _lFirstIndex, SCRT_tdstEntry *_p_stEntry )
|
|
{
|
|
long lIndex;
|
|
SCRT_tdstEntry *p_stSectionEntry;
|
|
|
|
SCRT_fn_vInitFileAndPageDesc( _p_stEntry->szName, SCR_CV_ui_Cfg_MaxLenWord );
|
|
fn_i_Pars_Word( &SCRT_g_stFileDesc, SCRT_g_szName );
|
|
|
|
for (lIndex = _lFirstIndex; lIndex < _p_stSection->lNumberOfElements; lIndex ++)
|
|
{
|
|
p_stSectionEntry = (SCRT_tdstEntry *) _p_stSection->d_p_stElement[ lIndex ];
|
|
|
|
if (p_stSectionEntry->cCompState != SCRT_C_cNew)
|
|
return -1;
|
|
|
|
if ( p_stSectionEntry->cType != SCRT_C_cEntry )
|
|
continue;
|
|
|
|
SCRT_fn_vInitFileAndPageDesc( p_stSectionEntry->szName, SCR_CV_ui_Cfg_MaxLenWord );
|
|
fn_i_Pars_Word( &SCRT_g_stFileDesc, SCRT_g_szNameExt );
|
|
|
|
if (stricmp( SCRT_g_szName, SCRT_g_szNameExt) == 0 )
|
|
return lIndex;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get index of a subsection in section. sub section must have same name and
|
|
name ext as given subsection. But param and format are different
|
|
_p_stSection -> section tree where we search sub section
|
|
_lFirstIndex -> first not linked sub section in section
|
|
_p_stSubSection -> sub section to search for
|
|
Returns (long ) index of line or -1 if not found
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long SCRT_fn_lGetDiffSubSectionIndex( SCRT_tdstSection *_p_stSection, long _lFirstIndex, SCRT_tdstSection *_p_stSubSection )
|
|
{
|
|
long lIndex;
|
|
SCRT_tdstSection *p_stSectionSubSection;
|
|
|
|
SCRT_fn_vInitFileAndPageDesc( _p_stSubSection->szName + 1, SCR_CV_ui_Cfg_MaxLenWord );
|
|
fn_i_Pars_SectionName( &SCRT_g_stFileDesc, SCRT_g_szName, SCRT_g_szNameExt );
|
|
|
|
for (lIndex = _lFirstIndex; lIndex < _p_stSection->lNumberOfElements; lIndex ++)
|
|
{
|
|
p_stSectionSubSection = (SCRT_tdstSection *) _p_stSection->d_p_stElement[ lIndex ];
|
|
|
|
if (p_stSectionSubSection->cCompState != SCRT_C_cNew)
|
|
return -1;
|
|
|
|
if (p_stSectionSubSection->cType != SCRT_C_cSection)
|
|
continue;
|
|
|
|
SCRT_fn_vInitFileAndPageDesc( p_stSectionSubSection->szName + 1, SCR_CV_ui_Cfg_MaxLenWord );
|
|
fn_i_Pars_SectionName( &SCRT_g_stFileDesc, SCRT_g_szFormat, SCRT_g_szParams );
|
|
|
|
if ( (stricmp( SCRT_g_szName, SCRT_g_szFormat) == 0) && (stricmp( SCRT_g_szNameExt, SCRT_g_szParams) == 0) )
|
|
return lIndex;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : compare two section content
|
|
_p_stST1 -> first section tree
|
|
_p_stST2 -> secoind section tree
|
|
Returns (BOOL ) TRUE if section are the same, FALSE else
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL SCRT_fn_bCompareSectionTree( SCRT_tdstSection *_p_stSection1, SCRT_tdstSection *_p_stSection2 )
|
|
{
|
|
long lIndex1;
|
|
long lIndex2;
|
|
long lFirstIndex;
|
|
BOOL bResult = TRUE;
|
|
SCRT_tdstEntry *p_stElement;
|
|
|
|
/*
|
|
* first pass on element : find all exact elements
|
|
*/
|
|
for (lIndex1 = 0; lIndex1 < _p_stSection1->lNumberOfElements; lIndex1 ++)
|
|
{
|
|
p_stElement = _p_stSection1->d_p_stElement[ lIndex1 ];
|
|
lIndex2 = SCRT_fn_lGetExactElementIndex( _p_stSection2, p_stElement );
|
|
|
|
if (lIndex2 != -1)
|
|
{
|
|
_p_stSection2->d_p_stElement[ lIndex2 ]->cCompState = p_stElement->cCompState = SCRT_C_cSame;
|
|
p_stElement->lCompWith = lIndex2;
|
|
_p_stSection2->d_p_stElement[ lIndex2 ]->lCompWith = lIndex1;
|
|
|
|
if (p_stElement->cType == SCRT_C_cSection )
|
|
bResult &= SCRT_fn_bCompareSectionTree( (SCRT_tdstSection *) p_stElement, (SCRT_tdstSection *) _p_stSection2->d_p_stElement[lIndex2] );
|
|
}
|
|
else
|
|
bResult = FALSE;
|
|
}
|
|
|
|
if (bResult)
|
|
bResult &= (lIndex1 == _p_stSection2->lNumberOfElements );
|
|
else
|
|
{
|
|
/*
|
|
* Second pass on element to find all diff element
|
|
*/
|
|
lFirstIndex = 0;
|
|
for (lIndex1 = 0; lIndex1 < _p_stSection1->lNumberOfElements; lIndex1 ++)
|
|
{
|
|
p_stElement = _p_stSection1->d_p_stElement[ lIndex1 ];
|
|
if (p_stElement->cCompState == SCRT_C_cNew)
|
|
{
|
|
if (p_stElement->cType == SCRT_C_cSection)
|
|
lIndex2 = SCRT_fn_lGetDiffSubSectionIndex( _p_stSection2, lFirstIndex, (SCRT_tdstSection *) p_stElement );
|
|
else
|
|
lIndex2 = SCRT_fn_lGetDiffEntryIndex( _p_stSection2, lFirstIndex, p_stElement );
|
|
|
|
if (lIndex2 != -1)
|
|
{
|
|
_p_stSection2->d_p_stElement[ lIndex2 ]->cCompState = p_stElement->cCompState = SCRT_C_cDiff;
|
|
p_stElement->lCompWith = lIndex2;
|
|
_p_stSection2->d_p_stElement[ lIndex2 ]->lCompWith = lIndex1;
|
|
|
|
if (p_stElement->cType == SCRT_C_cSection )
|
|
bResult &= SCRT_fn_bCompareSectionTree( (SCRT_tdstSection *) p_stElement, (SCRT_tdstSection *) _p_stSection2->d_p_stElement[lIndex2] );
|
|
}
|
|
}
|
|
else
|
|
lFirstIndex = p_stElement->lCompWith + 1;
|
|
}
|
|
}
|
|
return bResult;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions to build a merge tree with two other tree
|
|
=======================================================================================
|
|
*/
|
|
|
|
void SCRT_fn_vMergeSectionTree( SCRT_tdstSection *_p_stMerge, SCRT_tdstSection *_p_stFirst, SCRT_tdstSection *_p_stSecond )
|
|
{
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions to make correspondance between a section
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get owner section of an entry
|
|
_p_stEntry -> pointer on entry
|
|
_p_oTree -> pointer on Tree Control that own entry
|
|
Returns (SCRT_tdstSection ) father section of entry
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
SCRT_tdstSection *SCRT_fnp_stGetOwnerSection( SCRT_tdstEntry *_p_stEntry, CTreeCtrl *_p_oTree )
|
|
{
|
|
HTREEITEM hOwnerSectionItem;
|
|
|
|
hOwnerSectionItem = _p_oTree->GetParentItem( _p_stEntry->hItem );
|
|
return (SCRT_tdstSection *) _p_oTree->GetItemData( hOwnerSectionItem );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get all parent of a section
|
|
_ppp_stGenealogy -> array of all parent of given section
|
|
_hItem -> item that correspond to section
|
|
_p_oTree -> Tree Control that own item
|
|
Returns (long ) number of parent
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long SCRT_fn_lGetSectionGenealogy( SCRT_tdstSection ***_ppp_stGenealogy, HTREEITEM _hItem, CTreeCtrl *_p_oTree )
|
|
{
|
|
long lNumberOfParents = 0;
|
|
HTREEITEM hParent;
|
|
long lIndex;
|
|
|
|
/*
|
|
* first :count number of parent
|
|
*/
|
|
hParent = _p_oTree->GetParentItem( _hItem );
|
|
while( hParent != NULL)
|
|
{
|
|
lNumberOfParents++;
|
|
hParent = _p_oTree->GetParentItem( hParent );
|
|
}
|
|
if (lNumberOfParents != 0)
|
|
{
|
|
/*
|
|
* allocate and fill genealogy
|
|
*/
|
|
*_ppp_stGenealogy = (SCRT_tdstSection **) malloc( lNumberOfParents * sizeof( SCRT_tdstSection *) );
|
|
lIndex = lNumberOfParents;
|
|
hParent = _p_oTree->GetParentItem( _hItem );
|
|
while (hParent != NULL)
|
|
{
|
|
(*_ppp_stGenealogy)[ --lIndex ] = (SCRT_tdstSection *) _p_oTree->GetItemData( hParent );
|
|
hParent = _p_oTree->GetParentItem( hParent );
|
|
}
|
|
}
|
|
return lNumberOfParents;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get section in a tree that is linked with the given one in another tree
|
|
_p_stSection -> section linked
|
|
_p_oFromTree -> tree that own previous section
|
|
_p_oInTree -> tree where we search linked section
|
|
Returns (SCRT_tdstSection ) section that is linked with first parameter
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
SCRT_tdstSection *SCRT_fnp_stGetCorrespondantSection( SCRT_tdstSection *_p_stSection, CTreeCtrl *_p_oFromTree, CTreeCtrl *_p_oInTree )
|
|
{
|
|
SCRT_tdstSection **pp_stSectionGenealogy;
|
|
long lNumberOfParents;
|
|
long lIndex;
|
|
SCRT_tdstSection *p_stSection;
|
|
|
|
if (_p_stSection->cCompState == SCRT_C_cNew)
|
|
return NULL;
|
|
|
|
p_stSection = (SCRT_tdstSection *) _p_oInTree->GetItemData(_p_oInTree->GetRootItem());
|
|
lNumberOfParents = SCRT_fn_lGetSectionGenealogy( &pp_stSectionGenealogy, _p_stSection->hItem, _p_oFromTree );
|
|
if (lNumberOfParents != 0)
|
|
{
|
|
for ( lIndex = 1; lIndex < lNumberOfParents; lIndex ++)
|
|
p_stSection = (SCRT_tdstSection *) p_stSection->d_p_stElement[ pp_stSectionGenealogy[lIndex]->lCompWith ];
|
|
free( pp_stSectionGenealogy );
|
|
p_stSection = (SCRT_tdstSection *) p_stSection->d_p_stElement[ _p_stSection->lCompWith ];
|
|
}
|
|
|
|
return p_stSection;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get in a section tree control item that correspond to given one in
|
|
another tree
|
|
_hItem -> item to find in InTree tree control
|
|
_p_oFromTree -> tree that own item
|
|
_p_oInTree -> tree where we search for a correspondant item
|
|
Returns (HTREEITEM ) item in InTree control that correspond to item parameter
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
HTREEITEM SCRT_fn_hGetCorrespondantItem( HTREEITEM _hItem, CTreeCtrl *_p_oFromTree, CTreeCtrl *_p_oInTree )
|
|
{
|
|
int iImage, iSelImage;
|
|
SCRT_tdstSection *p_stSection;
|
|
SCRT_tdstEntry *p_stEntry;
|
|
|
|
_p_oFromTree->GetItemImage( _hItem, iImage, iSelImage );
|
|
|
|
if (iImage < 4)
|
|
{
|
|
/*
|
|
* a section line
|
|
*/
|
|
p_stSection = (SCRT_tdstSection *) _p_oFromTree->GetItemData( _hItem );
|
|
p_stSection = SCRT_fnp_stGetCorrespondantSection( p_stSection, _p_oFromTree, _p_oInTree );
|
|
return (p_stSection == NULL) ? NULL : p_stSection->hItem;
|
|
}
|
|
|
|
/*
|
|
* an entry line
|
|
*/
|
|
p_stEntry = (SCRT_tdstEntry *) _p_oFromTree->GetItemData( _hItem );
|
|
if (p_stEntry->cCompState == SCRT_C_cNew)
|
|
return NULL;
|
|
|
|
p_stSection = SCRT_fnp_stGetOwnerSection( p_stEntry, _p_oFromTree );
|
|
p_stSection = SCRT_fnp_stGetCorrespondantSection( p_stSection, _p_oFromTree, _p_oInTree );
|
|
if (p_stSection == NULL)
|
|
return NULL;
|
|
|
|
p_stEntry = p_stSection->d_p_stElement[ p_stEntry->lCompWith ];
|
|
return p_stEntry->hItem;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
=======================================================================================
|
|
CConflictDlg dialog
|
|
=======================================================================================
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : constructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CConflictDlg::CConflictDlg(CWnd* pParent /*=NULL*/) : CDialog(CConflictDlg::IDD, pParent)
|
|
{
|
|
int iImage;
|
|
|
|
//{{AFX_DATA_INIT(CConflictDlg)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
m_szUserName = NULL;
|
|
m_szSectionName = NULL;
|
|
m_szVssSection = NULL;
|
|
m_szLocalSection = NULL;
|
|
|
|
m_bLocalOp = FALSE;
|
|
|
|
m_cDisplayMode = -1;
|
|
|
|
m_a_hIcon[0] = AfxGetApp()->LoadIcon( IDI_ICON_TREESECTIONSAME );
|
|
m_a_hIcon[1] = AfxGetApp()->LoadIcon( IDI_ICON_TREESECTIONDIFF );
|
|
m_a_hIcon[2] = AfxGetApp()->LoadIcon( IDI_ICON_TREESECTIONVSS );
|
|
m_a_hIcon[3] = AfxGetApp()->LoadIcon( IDI_ICON_TREESECTIONLOCAL );
|
|
m_a_hIcon[4] = AfxGetApp()->LoadIcon( IDI_ICON_TREEENTRYSAME );
|
|
m_a_hIcon[5] = AfxGetApp()->LoadIcon( IDI_ICON_TREEENTRYDIFF );
|
|
m_a_hIcon[6] = AfxGetApp()->LoadIcon( IDI_ICON_TREEENTRYVSS );
|
|
m_a_hIcon[7] = AfxGetApp()->LoadIcon( IDI_ICON_TREEENTRYLOCAL );
|
|
|
|
/* initialize and fill image list */
|
|
m_oImageList.Create( 16, 16, TRUE, 8, 5 );
|
|
for (iImage = 0; iImage < 8; iImage ++)
|
|
m_oImageList.Add( m_a_hIcon[ iImage ] );
|
|
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : destructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CConflictDlg::~CConflictDlg()
|
|
{
|
|
m_oImageList.DeleteImageList();
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Message map
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BEGIN_MESSAGE_MAP(CConflictDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CConflictDlg)
|
|
ON_WM_DESTROY()
|
|
ON_WM_SIZE()
|
|
ON_WM_SIZING()
|
|
ON_WM_HELPINFO()
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_LOCAL, OnSelchangedTreeLocal)
|
|
ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREE_LOCAL, OnItemexpandedTreeLocal)
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_VSS, OnSelchangedTreeVss)
|
|
ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREE_VSS, OnItemexpandedTreeVss)
|
|
ON_EN_VSCROLL(IDC_RICHEDIT_LOCALSECTION, OnVscrollRicheditLocal)
|
|
ON_EN_VSCROLL(IDC_RICHEDIT_VSSSECTION, OnVscrollRicheditVss)
|
|
ON_BN_CLICKED(IDC_BUTTON_TREETEXT, OnButtonTreetext)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/*
|
|
=======================================================================================
|
|
CConflictDlg specific functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
void CConflictDlg::m_fn_vChangeDisplayMode( char _cMode )
|
|
{
|
|
if (m_cDisplayMode != _cMode)
|
|
{
|
|
m_cDisplayMode = _cMode;
|
|
switch( _cMode )
|
|
{
|
|
case C_cDisplayText:
|
|
GetDlgItem( IDC_BUTTON_TREETEXT )->SetWindowText( "Tree" );
|
|
GetDlgItem( IDC_RICHEDIT_VSSSECTION )->ShowWindow( TRUE );
|
|
GetDlgItem( IDC_RICHEDIT_LOCALSECTION)->ShowWindow( TRUE );
|
|
GetDlgItem( IDC_TREE_VSS )->ShowWindow( FALSE );
|
|
GetDlgItem( IDC_TREE_LOCAL )->ShowWindow( FALSE );
|
|
break;
|
|
case C_cDisplayTree:
|
|
GetDlgItem( IDC_BUTTON_TREETEXT )->SetWindowText( "Text" );
|
|
GetDlgItem( IDC_RICHEDIT_VSSSECTION )->ShowWindow( FALSE );
|
|
GetDlgItem( IDC_RICHEDIT_LOCALSECTION)->ShowWindow( FALSE );
|
|
GetDlgItem( IDC_TREE_VSS )->ShowWindow( TRUE );
|
|
GetDlgItem( IDC_TREE_LOCAL )->ShowWindow( TRUE );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : recursive function to fill section tree
|
|
_p_oTree -> tree control to fill
|
|
_p_stSection -> section to consider
|
|
_hParent -> current father item
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::m_fn_vFillTree( CTreeCtrl *_p_oTree, SCRT_tdstSection *_p_stSection, HTREEITEM _hParent, int _iImage, BOOL _bVss )
|
|
{
|
|
char *szEnd, cEndChar;
|
|
HTREEITEM hCurrent;
|
|
long lIndex;
|
|
int iImage;
|
|
char cComp;
|
|
HTREEITEM hItem;
|
|
SCRT_tdstEntry *p_stElement;
|
|
|
|
//cEndChar = *(szEnd = SCRT_fn_p_szGetEndLine( _p_stSection->szName ));
|
|
szEnd = _p_stSection->szName + _p_stSection->uwNameLength;
|
|
cEndChar = *szEnd;
|
|
*szEnd = 0;
|
|
hCurrent = _p_oTree->InsertItem( _p_stSection->szName, _iImage, _iImage, _hParent );
|
|
_p_stSection->hItem = hCurrent;
|
|
_p_oTree->SetItemData( hCurrent, (DWORD) _p_stSection );
|
|
*szEnd = cEndChar;
|
|
|
|
for (lIndex = 0; lIndex < _p_stSection->lNumberOfElements; lIndex ++)
|
|
{
|
|
p_stElement = _p_stSection->d_p_stElement[ lIndex ];
|
|
if (p_stElement->cType == SCRT_C_cEntry )
|
|
{
|
|
szEnd = p_stElement->szName + p_stElement->uwNameLength;
|
|
*szEnd = 0;
|
|
cComp = p_stElement->cCompState;
|
|
iImage = (cComp == SCRT_C_cNew) ? (_bVss ? 6 : 7) : ((cComp == SCRT_C_cDiff) ? 5 : 4 );
|
|
hItem = _p_oTree->InsertItem( p_stElement->szName, iImage, iImage, hCurrent );
|
|
_p_oTree->SetItemData( hItem, (DWORD) p_stElement );
|
|
p_stElement->hItem = hItem;
|
|
*szEnd = cEndChar;
|
|
}
|
|
else
|
|
{
|
|
cComp = p_stElement->cCompState;
|
|
iImage = (cComp == SCRT_C_cNew) ? (_bVss ? 2 : 3) : ((cComp == SCRT_C_cDiff) ? 1 : 0 );
|
|
m_fn_vFillTree( _p_oTree, (SCRT_tdstSection *) p_stElement, hCurrent, iImage, _bVss );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Function to fill Rich Edit boxes
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : add a line in RichEdit Control
|
|
szLine -> line to add
|
|
cLineType -> type of line (info, ok, error)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long CConflictDlg::m_fn_RE_lAddText( CRichEditCtrl *_p_oRE, char *_szText, char *_szEndText, char _cType )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
long lOldLength;
|
|
long lNewLength;
|
|
long lSize;
|
|
char cSaveEnd;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
m_stCharFormat.crTextColor = gs_a_xColor[ _cType ];
|
|
m_stCharFormat.dwEffects = 0;
|
|
|
|
lOldLength = _p_oRE->GetTextLength();
|
|
lNewLength = lOldLength + (_szEndText - _szText);
|
|
lSize = _p_oRE->GetLimitText();
|
|
if (lNewLength > lSize)
|
|
{
|
|
lSize += 10000;
|
|
_p_oRE->LimitText( lSize );
|
|
}
|
|
cSaveEnd = *_szEndText;
|
|
*_szEndText = 0;
|
|
_p_oRE->ReplaceSel( _szText );
|
|
*_szEndText = cSaveEnd;
|
|
|
|
_p_oRE->SetSel( lOldLength, -1 );
|
|
_p_oRE->SetSelectionCharFormat( m_stCharFormat );
|
|
_p_oRE->SetSel( lNewLength, lNewLength );
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : function to assure that the two given Rich edit control have the same
|
|
number of lines
|
|
_p_oRE1 -> first RichEditCtrl
|
|
_p_oRE2 -> second RichEditCtrl
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::m_fn_RE_vRecaleLine( CRichEditCtrl *_p_oRE1, CRichEditCtrl *_p_oRE2 )
|
|
{
|
|
long lDiffLine;
|
|
CRichEditCtrl *p_oRE;
|
|
char *szNewLines;
|
|
|
|
lDiffLine = _p_oRE1->GetLineCount() - _p_oRE2->GetLineCount();
|
|
if (lDiffLine == 0)
|
|
return;
|
|
|
|
if (lDiffLine < 0)
|
|
{
|
|
p_oRE = _p_oRE1;
|
|
lDiffLine = -lDiffLine;
|
|
}
|
|
else
|
|
p_oRE = _p_oRE2;
|
|
|
|
szNewLines = (char *) malloc (lDiffLine + 1);
|
|
memset( szNewLines, '\n', lDiffLine );
|
|
m_fn_RE_lAddText( p_oRE, szNewLines, szNewLines + lDiffLine, SCRT_C_cComment );
|
|
free (szNewLines );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : print the beginning of section in a RichEditCtrl
|
|
_p_oRE -> the RichEdit Control
|
|
_p_stSection -> section to print
|
|
_szFrom -> current position in section content
|
|
_bVss -> say if it's a Vss or a local section
|
|
Returns (char *) new position in section content
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char *CConflictDlg::m_fn_RE_vPrintSectionBeginning( CRichEditCtrl *_p_oRE, SCRT_tdstSection *_p_stSection, char *_szFrom, BOOL _bVss )
|
|
{
|
|
char cType;
|
|
|
|
if (_szFrom < _p_stSection->szName )
|
|
{
|
|
m_fn_RE_lAddText( _p_oRE, _szFrom, _p_stSection->szName, SCRT_C_cComment);
|
|
_szFrom = _p_stSection->szName;
|
|
}
|
|
|
|
if ((cType = _p_stSection->cCompState) == SCRT_C_cNew)
|
|
cType = _bVss ? SCRT_C_cNewVss : SCRT_C_cNewLocal;
|
|
|
|
m_fn_RE_lAddText( _p_oRE, _szFrom, _szFrom + _p_stSection->uwNameLength, cType );
|
|
return _szFrom + _p_stSection->uwNameLength;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : print a section entry in a RichEdit Ctrl
|
|
_p_oRE -> the RichEdit Ctrl
|
|
_p_stEntry -> the entry
|
|
_szFrom -> current position in section content
|
|
_bVss -> say if it's a Vss entry or local entry
|
|
Returns (char *) new position in section content
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char *CConflictDlg::m_fn_RE_vPrintEntry( CRichEditCtrl *_p_oRE, SCRT_tdstEntry *_p_stEntry, char *_szFrom, BOOL _bVss )
|
|
{
|
|
char cType;
|
|
|
|
if (_szFrom < _p_stEntry->szName )
|
|
{
|
|
m_fn_RE_lAddText( _p_oRE, _szFrom, _p_stEntry->szName, SCRT_C_cComment);
|
|
_szFrom = _p_stEntry->szName;
|
|
}
|
|
|
|
if ((cType = _p_stEntry->cCompState) == SCRT_C_cNew)
|
|
cType = _bVss ? SCRT_C_cNewVss : SCRT_C_cNewLocal;
|
|
|
|
m_fn_RE_lAddText( _p_oRE, _szFrom, _szFrom + _p_stEntry->uwNameLength, cType );
|
|
return _szFrom + _p_stEntry->uwNameLength;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : print end of section in a RichEdit Ctrl
|
|
_p_oRE -> the RichEdit Control
|
|
_p_stSection -> section to print
|
|
_szFrom -> current position in section content
|
|
_bVss -> say if it's a Vss or a local section
|
|
Returns (char *) new position in section content
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char *CConflictDlg::m_fn_RE_vPrintSectionEnd( CRichEditCtrl *_p_oRE, SCRT_tdstSection *_p_stSection, char *_szFrom, BOOL _bVss )
|
|
{
|
|
char cType;
|
|
char *szBeforeEnd;
|
|
|
|
szBeforeEnd = _p_stSection->szEndSection;
|
|
while ( *szBeforeEnd != SCR_CC_c_Cfg_SectionEndMark )
|
|
szBeforeEnd --;
|
|
|
|
if (_szFrom < szBeforeEnd )
|
|
{
|
|
m_fn_RE_lAddText( _p_oRE, _szFrom, szBeforeEnd, SCRT_C_cComment);
|
|
_szFrom = szBeforeEnd;
|
|
}
|
|
|
|
if ((cType = _p_stSection->cCompState) == SCRT_C_cNew)
|
|
cType = _bVss ? SCRT_C_cNewVss : SCRT_C_cNewLocal;
|
|
|
|
m_fn_RE_lAddText( _p_oRE, _szFrom, _p_stSection->szEndSection, cType );
|
|
return _p_stSection->szEndSection;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : print a full section in a RichEdit Ctrl
|
|
_p_oRE -> the RichEdit Ctrl
|
|
_p_stSection -> the Section
|
|
_szFrom -> current position in section content
|
|
_bVss -> say if it's a Vss or local section
|
|
Returns (char *) new position in section content
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char *CConflictDlg::m_fn_RE_vPrintSection( CRichEditCtrl *_p_oRE, SCRT_tdstSection *_p_stSection, char *_szFrom, BOOL _bVss )
|
|
{
|
|
long lElement;
|
|
|
|
_szFrom = m_fn_RE_vPrintSectionBeginning( _p_oRE, _p_stSection, _szFrom, _bVss );
|
|
for (lElement = 0; lElement < _p_stSection->lNumberOfElements; lElement ++)
|
|
{
|
|
if (_p_stSection->d_p_stElement[lElement]->cType == SCRT_C_cEntry )
|
|
_szFrom = m_fn_RE_vPrintEntry( _p_oRE, _p_stSection->d_p_stElement[lElement], _szFrom, _bVss );
|
|
else
|
|
_szFrom = m_fn_RE_vPrintSection( _p_oRE, (SCRT_tdstSection *) _p_stSection->d_p_stElement[lElement], _szFrom, _bVss );
|
|
}
|
|
_szFrom = m_fn_RE_vPrintSectionEnd( _p_oRE, _p_stSection, _szFrom, _bVss );
|
|
return _szFrom;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : print two section in parrallel in the two RichEditCtrl (Vss and local of the
|
|
dialog box )
|
|
_p_stVssSection -> the VssSection
|
|
_szVssFrom -> current position in Vss section content
|
|
_p_stLclSection -> the LocalSection
|
|
_szLclFrom -> current position in local section content
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::m_fn_RE_vPrintTwoSection ( SCRT_tdstSection *_p_stVssSection,char **_p_szVssFrom, SCRT_tdstSection *_p_stLclSection,char **_p_szLclFrom )
|
|
{
|
|
long lVssElement, lLclElement;
|
|
|
|
m_fn_RE_vRecaleLine( &m_oVssRichEdit, &m_oLocalRichEdit );
|
|
*_p_szVssFrom = m_fn_RE_vPrintSectionBeginning( &m_oVssRichEdit, _p_stVssSection, *_p_szVssFrom, TRUE );
|
|
*_p_szLclFrom = m_fn_RE_vPrintSectionBeginning( &m_oLocalRichEdit, _p_stLclSection, *_p_szLclFrom, FALSE );
|
|
|
|
lVssElement = 0;
|
|
lLclElement = 0;
|
|
|
|
while (1)
|
|
{
|
|
for ( ; lVssElement < _p_stVssSection->lNumberOfElements; lVssElement++ )
|
|
{
|
|
if (_p_stVssSection->d_p_stElement[ lVssElement ]->cCompState != SCRT_C_cNew )
|
|
break;
|
|
|
|
if (_p_stVssSection->d_p_stElement[lVssElement]->cType == SCRT_C_cEntry )
|
|
*_p_szVssFrom = m_fn_RE_vPrintEntry( &m_oVssRichEdit, _p_stVssSection->d_p_stElement[lVssElement], *_p_szVssFrom, TRUE );
|
|
else
|
|
*_p_szVssFrom = m_fn_RE_vPrintSection( &m_oVssRichEdit, (SCRT_tdstSection *) _p_stVssSection->d_p_stElement[lVssElement], *_p_szVssFrom, TRUE );
|
|
}
|
|
|
|
for (; lLclElement < _p_stLclSection->lNumberOfElements; lLclElement++ )
|
|
{
|
|
if (_p_stLclSection->d_p_stElement[ lLclElement ]->cCompState != SCRT_C_cNew )
|
|
break;
|
|
|
|
if (_p_stLclSection->d_p_stElement[lLclElement]->cType == SCRT_C_cEntry )
|
|
*_p_szLclFrom = m_fn_RE_vPrintEntry( &m_oLocalRichEdit, _p_stLclSection->d_p_stElement[lLclElement], *_p_szLclFrom, FALSE );
|
|
else
|
|
*_p_szLclFrom = m_fn_RE_vPrintSection( &m_oLocalRichEdit, (SCRT_tdstSection *) _p_stLclSection->d_p_stElement[lLclElement], *_p_szLclFrom, FALSE );
|
|
}
|
|
|
|
if ( (lVssElement == _p_stVssSection->lNumberOfElements) && (lLclElement == _p_stLclSection->lNumberOfElements) )
|
|
break;
|
|
|
|
if (_p_stLclSection->d_p_stElement[lLclElement]->cType == SCRT_C_cEntry )
|
|
{
|
|
m_fn_RE_vRecaleLine( &m_oVssRichEdit, &m_oLocalRichEdit );
|
|
*_p_szVssFrom = m_fn_RE_vPrintEntry( &m_oVssRichEdit, _p_stVssSection->d_p_stElement[lVssElement], *_p_szVssFrom, TRUE );
|
|
*_p_szLclFrom = m_fn_RE_vPrintEntry( &m_oLocalRichEdit, _p_stLclSection->d_p_stElement[lLclElement], *_p_szLclFrom, FALSE );
|
|
}
|
|
else
|
|
m_fn_RE_vPrintTwoSection
|
|
(
|
|
(SCRT_tdstSection *) _p_stVssSection->d_p_stElement[ lVssElement ],
|
|
_p_szVssFrom,
|
|
(SCRT_tdstSection *) _p_stLclSection->d_p_stElement[ lLclElement ],
|
|
_p_szLclFrom
|
|
);
|
|
lVssElement ++;
|
|
lLclElement ++;
|
|
}
|
|
|
|
m_fn_RE_vRecaleLine( &m_oVssRichEdit, &m_oLocalRichEdit );
|
|
*_p_szVssFrom = m_fn_RE_vPrintSectionEnd( &m_oVssRichEdit, _p_stVssSection, *_p_szVssFrom, TRUE );
|
|
*_p_szLclFrom = m_fn_RE_vPrintSectionEnd( &m_oLocalRichEdit, _p_stLclSection, *_p_szLclFrom, FALSE );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Fill content of the Vss and local RichEdit control
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::m_fn_RE_vFill( void )
|
|
{
|
|
char *szVssFrom, *szLocalFrom;
|
|
|
|
szVssFrom = m_szVssSection;
|
|
szLocalFrom = m_szLocalSection;
|
|
if ( ( szVssFrom != NULL) && ( szLocalFrom != NULL) )
|
|
{
|
|
m_fn_RE_vPrintTwoSection( &m_stVssTree, &szVssFrom, &m_stLocalTree, &szLocalFrom );
|
|
}
|
|
else
|
|
{
|
|
if (szVssFrom != NULL)
|
|
m_fn_RE_vPrintSection( &m_oVssRichEdit, &m_stVssTree, m_szVssSection, TRUE );
|
|
if (szLocalFrom != NULL)
|
|
m_fn_RE_vPrintSection( &m_oLocalRichEdit, &m_stLocalTree, m_szLocalSection, FALSE);
|
|
m_fn_RE_vRecaleLine( &m_oVssRichEdit, &m_oLocalRichEdit );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
CConflictDlg message handlers
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_INITDIALOG
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL CConflictDlg::OnInitDialog()
|
|
{
|
|
char szText[1024];
|
|
BOOL bComp;
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
/*
|
|
* Set sections names
|
|
*/
|
|
GetDlgItem( IDC_STATIC_SECTION )->SetWindowText( m_szSectionName != NULL ? m_szSectionName: "" );
|
|
sprintf( szText, "Vss section\r\nchecked in by %s", m_szUserName != NULL ? m_szUserName: "???" );
|
|
GetDlgItem( IDC_STATIC_VSS )->SetWindowText( szText );
|
|
|
|
/*
|
|
* create and initialize RichEdit Control
|
|
*/
|
|
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | ES_AUTOHSCROLL | ES_READONLY;
|
|
RECT stRect;
|
|
|
|
GetDlgItem( IDC_TREE_VSS)->GetWindowRect( &stRect );
|
|
m_oVssRichEdit.Create( dwStyle, stRect, this, IDC_RICHEDIT_VSSSECTION );
|
|
|
|
GetDlgItem( IDC_TREE_LOCAL )->GetWindowRect( &stRect );
|
|
m_oLocalRichEdit.Create( dwStyle, stRect, this, IDC_RICHEDIT_LOCALSECTION );
|
|
|
|
m_oVssRichEdit.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_oVssRichEdit.SetBackgroundColor( FALSE, 0 );
|
|
m_oVssRichEdit.SetDefaultCharFormat( m_stCharFormat );
|
|
m_oVssRichEdit.SetEventMask( ENM_SCROLL );
|
|
m_oLocalRichEdit.SetBackgroundColor( FALSE, 0 );
|
|
m_oLocalRichEdit.SetDefaultCharFormat( m_stCharFormat );
|
|
m_oLocalRichEdit.SetEventMask( ENM_SCROLL );
|
|
|
|
m_p_oVssTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_VSS );
|
|
m_p_oLocalTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_LOCAL );
|
|
m_p_oMergeTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_MERGE );
|
|
|
|
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lShowDifferences)
|
|
{
|
|
/*
|
|
* build tree associated with vss section
|
|
*/
|
|
SCRT_fn_vInitAndBuildSectionTree( &m_stVssTree, m_szVssSection, NULL);
|
|
if (m_szVssSection == NULL)
|
|
{
|
|
m_stVssTree.bNameIsAllocate = TRUE;
|
|
m_stVssTree.szName = (char *) malloc ( 13 );
|
|
strcpy( m_stVssTree.szName, "<No section>" );
|
|
}
|
|
|
|
/*
|
|
* build tree associated with local section
|
|
*/
|
|
SCRT_fn_vInitAndBuildSectionTree( &m_stLocalTree, m_szLocalSection, NULL);
|
|
if (m_szLocalSection == NULL)
|
|
{
|
|
m_stLocalTree.bNameIsAllocate = TRUE;
|
|
m_stLocalTree.szName = (char *) malloc ( 13 );
|
|
strcpy( m_stLocalTree.szName, "<No section>" );
|
|
}
|
|
|
|
/*
|
|
* compare the two section
|
|
*/
|
|
bComp = SCRT_fn_bCompareSectionTree( &m_stVssTree,&m_stLocalTree );
|
|
m_stLocalTree.cCompState = m_stVssTree.cCompState = SCRT_C_cSame;
|
|
|
|
/*
|
|
* fill tree control with vss section tree
|
|
*/
|
|
m_p_oVssTree->SetImageList( &m_oImageList, TVSIL_NORMAL );
|
|
m_p_oVssTree->DeleteAllItems();
|
|
m_fn_vFillTree( m_p_oVssTree, &m_stVssTree, TVI_ROOT, 0, TRUE );
|
|
|
|
/*
|
|
* fill tree control with local section tree
|
|
*/
|
|
m_p_oLocalTree->DeleteAllItems();
|
|
m_p_oLocalTree->SetImageList( &m_oImageList, TVSIL_NORMAL );
|
|
m_fn_vFillTree( m_p_oLocalTree, &m_stLocalTree, TVI_ROOT, 0, FALSE );
|
|
|
|
/*
|
|
* merge tree
|
|
*/
|
|
m_p_oMergeTree->DeleteAllItems();
|
|
m_p_oMergeTree->SetImageList( &m_oImageList, TVSIL_NORMAL );
|
|
m_p_oMergeTree->ShowWindow( FALSE );
|
|
|
|
/*
|
|
* Fill Rich edit
|
|
*/
|
|
m_fn_RE_vFill();
|
|
|
|
m_cNbBottomButtons = 3;
|
|
}
|
|
else
|
|
{
|
|
m_oVssRichEdit.SetWindowText( (m_szVssSection == NULL) ? "<no section>" : m_szVssSection );
|
|
m_oLocalRichEdit.SetWindowText( (m_szLocalSection == NULL) ? "<no section>" : m_szLocalSection );
|
|
m_cNbBottomButtons = 2;
|
|
m_bLocalOp = TRUE; /* to avoid doing sometinh in response of RichEdit Control message */
|
|
}
|
|
|
|
/*
|
|
* set bottom buttons ID
|
|
*/
|
|
m_a_uiBottomButton[ 0 ] = IDCANCEL;
|
|
m_a_uiBottomButton[ 1 ] = IDOK;
|
|
m_a_uiBottomButton[ 2 ] = IDC_BUTTON_TREETEXT;
|
|
|
|
/*
|
|
* resize window with Window pref size
|
|
*/
|
|
MoveWindow( &g_stWinPref.stConflictPos );
|
|
m_fn_vChangeDisplayMode( C_cDisplayText );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_DESTROY
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
GetWindowRect( &g_stWinPref.stConflictPos );
|
|
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lShowDifferences)
|
|
{
|
|
SCRT_fn_vClean( &m_stVssTree );
|
|
SCRT_fn_vClean( &m_stLocalTree );
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_SIZING
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnSizing( UINT nSide, LPRECT lpRect )
|
|
{
|
|
long lWidth = lpRect->right - lpRect->left + 1;
|
|
long lHeight= lpRect->bottom - lpRect->top + 1;
|
|
|
|
if (lWidth < C_iConflictMinWidth)
|
|
{
|
|
switch (nSide)
|
|
{
|
|
case WMSZ_BOTTOMLEFT:
|
|
case WMSZ_LEFT:
|
|
case WMSZ_TOPLEFT:
|
|
lpRect->left = lpRect->right - C_iConflictMinWidth;
|
|
break;
|
|
case WMSZ_BOTTOMRIGHT:
|
|
case WMSZ_RIGHT:
|
|
case WMSZ_TOPRIGHT:
|
|
lpRect->right = lpRect->left + C_iConflictMinWidth;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (lHeight < C_iConflictMinHeight)
|
|
{
|
|
switch (nSide)
|
|
{
|
|
case WMSZ_BOTTOM:
|
|
case WMSZ_BOTTOMLEFT:
|
|
case WMSZ_BOTTOMRIGHT:
|
|
lpRect->bottom = lpRect->top + C_iConflictMinHeight;
|
|
break;
|
|
case WMSZ_TOP:
|
|
case WMSZ_TOPLEFT:
|
|
case WMSZ_TOPRIGHT:
|
|
lpRect->top = lpRect->bottom - C_iConflictMinHeight;
|
|
}
|
|
}
|
|
|
|
CDialog::OnSizing( nSide, lpRect );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_SIZE
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
RECT stRectL, stRectR;
|
|
int iMiddle, iHalfLength;
|
|
int iHeight;
|
|
long lWidth;
|
|
char cButton;
|
|
|
|
CDialog::OnSize(nType, cx, cy);
|
|
|
|
if ( (nType != SIZE_MINIMIZED) && (GetDlgItem( IDC_STATIC_SECTION ) != NULL) )
|
|
{
|
|
iMiddle = cx / 2;
|
|
iHalfLength = iMiddle - 8;
|
|
|
|
/*
|
|
* resizing top static for section name
|
|
*/
|
|
stRectL.top = 5;
|
|
stRectL.bottom = 20;
|
|
stRectL.left = 5;
|
|
stRectL.right = cx - 5;
|
|
GetDlgItem( IDC_STATIC_SECTION )->MoveWindow( &stRectL, FALSE );
|
|
|
|
stRectL.left = 5;
|
|
stRectL.right = stRectL.left + iHalfLength;
|
|
stRectR.left = iMiddle + 3;
|
|
stRectR.right = stRectR.left + iHalfLength;
|
|
/*
|
|
* static window for vss/local file
|
|
*/
|
|
stRectL.top = stRectR.top = 23;
|
|
stRectL.bottom = stRectR.bottom = 50;
|
|
GetDlgItem( IDC_STATIC_VSS )->MoveWindow( &stRectL, FALSE );
|
|
GetDlgItem( IDC_STATIC_LOCAL )->MoveWindow( &stRectR, FALSE );
|
|
|
|
/*
|
|
* vss and local Tree and Edit window
|
|
*/
|
|
iHeight = cy - 83;
|
|
|
|
stRectL.top = stRectR.top = 53;
|
|
//stRectL.bottom = stRectR.bottom = stRectL.top + (iHeight / 2) - 5;
|
|
stRectL.bottom = stRectR.bottom = cy - 30;
|
|
m_oVssRichEdit.MoveWindow( &stRectL, FALSE );
|
|
m_oLocalRichEdit.MoveWindow( &stRectR, FALSE );
|
|
m_p_oVssTree->MoveWindow( &stRectL, FALSE );
|
|
m_p_oLocalTree->MoveWindow( &stRectR, FALSE );
|
|
|
|
/*
|
|
* merge Tree window
|
|
*/
|
|
/*
|
|
stRectL.bottom = stRectR.bottom = cy - 30;
|
|
stRectL.top = stRectR.top = stRectL.bottom - (iHeight / 2);
|
|
m_p_oMergeTree->MoveWindow( &stRectL, FALSE );
|
|
//GetDlgItem( IDC_TREE_LOCAL )->MoveWindow( &stRectR, FALSE );
|
|
*/
|
|
|
|
/*
|
|
* bottom buttons
|
|
*/
|
|
stRectL.top = stRectR.top = cy - 25;
|
|
stRectL.bottom = stRectR.bottom = cy - 5;
|
|
|
|
lWidth = (cx - 12) / m_cNbBottomButtons;
|
|
stRectL.right = 4;
|
|
for (cButton = 0; cButton < m_cNbBottomButtons; cButton++ )
|
|
{
|
|
stRectL.left = stRectL.right + 1;
|
|
stRectL.right = stRectL.left + lWidth;
|
|
GetDlgItem( m_a_uiBottomButton[ cButton ] )->MoveWindow( &stRectL, FALSE );
|
|
}
|
|
|
|
Invalidate();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_HELPINFO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL CConflictDlg::OnHelpInfo(HELPINFO* pHelpInfo)
|
|
{
|
|
::WinHelp(this->GetSafeHwnd(), C_szHelpFile, HELP_CONTEXT, IDH_J_CONFLICT );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : BN_CLICKED on IDc_BUTTON_TREETEXT
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnButtonTreetext()
|
|
{
|
|
if (m_cDisplayMode == C_cDisplayText)
|
|
m_fn_vChangeDisplayMode( C_cDisplayTree );
|
|
else
|
|
m_fn_vChangeDisplayMode( C_cDisplayText );
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Notify message handle from Tree controls
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : TVN_SELCHANGED on IDC_TREE_LOCAL
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnSelchangedTreeLocal(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*) pNMHDR;
|
|
HTREEITEM hItem;
|
|
|
|
if (!m_bLocalOp)
|
|
{
|
|
hItem = SCRT_fn_hGetCorrespondantItem( pNMTreeView->itemNew.hItem , m_p_oLocalTree, m_p_oVssTree );
|
|
m_bLocalOp = TRUE;
|
|
m_p_oVssTree->SelectItem( hItem );
|
|
m_bLocalOp = FALSE;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : TVN_ITEMEXPANDED on IDC_TREE_LOCAL
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnItemexpandedTreeLocal(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
HTREEITEM hItem;
|
|
|
|
if (!m_bLocalOp)
|
|
{
|
|
hItem = SCRT_fn_hGetCorrespondantItem( pNMTreeView->itemNew.hItem , m_p_oLocalTree, m_p_oVssTree );
|
|
m_bLocalOp = TRUE;
|
|
m_p_oVssTree->Expand( hItem, pNMTreeView->action );
|
|
m_bLocalOp = FALSE;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : TVN_SELCHANGED on IDC_TREE_VSS
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnSelchangedTreeVss(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
HTREEITEM hItem;
|
|
|
|
if (!m_bLocalOp)
|
|
{
|
|
hItem = SCRT_fn_hGetCorrespondantItem( pNMTreeView->itemNew.hItem , m_p_oVssTree, m_p_oLocalTree );
|
|
m_bLocalOp = TRUE;
|
|
m_p_oLocalTree->SelectItem( hItem );
|
|
m_bLocalOp = FALSE;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : TVN_ITEMEXPANDED on IDC_TREE_VSS
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnItemexpandedTreeVss(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
HTREEITEM hItem;
|
|
|
|
if (!m_bLocalOp)
|
|
{
|
|
m_bLocalOp = TRUE;
|
|
hItem = SCRT_fn_hGetCorrespondantItem( pNMTreeView->itemNew.hItem , m_p_oVssTree, m_p_oLocalTree );
|
|
m_bLocalOp = FALSE;
|
|
m_p_oLocalTree->Expand( hItem, pNMTreeView->action );
|
|
}
|
|
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Message handle from Rich edit control
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : EN_VSCROLL on IDC_RICHEDIT_LOCALSECTION
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnVscrollRicheditLocal()
|
|
{
|
|
int iDiff;
|
|
|
|
if (!m_bLocalOp)
|
|
{
|
|
m_bLocalOp = TRUE;
|
|
iDiff = m_oLocalRichEdit.GetFirstVisibleLine() - m_oVssRichEdit.GetFirstVisibleLine();
|
|
m_oVssRichEdit.LineScroll( iDiff );
|
|
|
|
m_bLocalOp = FALSE;
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : EN_VSCROLL on IDC_RICHEDIT_VSSSECTION
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CConflictDlg::OnVscrollRicheditVss()
|
|
{
|
|
int iDiff;
|
|
|
|
if (!m_bLocalOp)
|
|
{
|
|
m_bLocalOp = TRUE;
|
|
iDiff = m_oVssRichEdit.GetFirstVisibleLine() - m_oLocalRichEdit.GetFirstVisibleLine();
|
|
m_oLocalRichEdit.LineScroll( iDiff );
|
|
m_bLocalOp = FALSE;
|
|
}
|
|
}
|
|
|