reman3/Rayman_X/cpa/tempgrp/Ctl/Src/Controls/CTL_BCL.cpp

388 lines
12 KiB
C++

// Implementation file for the definition of a characteristic base control
/////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Controls\CTL_BCL.hpp"
#include "Controls\CTL_Ctl.hpp"
//External Modules
#include "CTL_ErO.hpp"
//End of External Modules
#define C_SPACE_BETWEEN_CONTROLS 2
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//**************************************************************************************
CTL_Editor_BaseControlList::CTL_Editor_BaseControlList(BOOL _bMustDestroyElements /*= TRUE*/)
{
m_pri_bMustDestroyElements = _bMustDestroyElements;
}
//**************************************************************************************
CTL_Editor_BaseControlList::~CTL_Editor_BaseControlList()
{
if ( m_pri_bMustDestroyElements )
m_pri_fn_vEmptyList();
}
//**************************************************************************************
CTL_Editor_BaseControl *CTL_Editor_BaseControlList::m_pub_fn_pclAddControlAtHead(CTL_BaseWindowsControl *_pclBaseWindowsControl,
CWnd *_pclWnd,
CTL_Editor_Control *_pclParentControl,
CTL_tdeBaseControlDisplayType _eDisplayType,
unsigned char _ucPercentWidth,
unsigned short _uwFixedWidth,
unsigned short _uwHeight,
BOOL _bSamePlaceAsNext /*= FALSE*/,
BOOL _bGoToNextLineAfterMe /*= FALSE*/)
{
CTL_Editor_BaseControl *pclNewElement = new CTL_Editor_BaseControl( _pclBaseWindowsControl,
_pclWnd,
_pclParentControl,
_eDisplayType,
_ucPercentWidth,
_uwFixedWidth,
_uwHeight,
_bSamePlaceAsNext,
_bGoToNextLineAfterMe);
AddHead(pclNewElement);
return pclNewElement;
}
//**************************************************************************************
CTL_Editor_BaseControl *CTL_Editor_BaseControlList::m_pub_fn_pclAddControlAtTail(CTL_BaseWindowsControl *_pclBaseWindowsControl,
CWnd *_pclWnd,
CTL_Editor_Control *_pclParentControl,
CTL_tdeBaseControlDisplayType _eDisplayType,
unsigned char _ucPercentWidth,
unsigned short _uwFixedWidth,
unsigned short _uwHeight,
BOOL _bSamePlaceAsNext /*= FALSE*/,
BOOL _bGoToNextLineAfterMe /*= FALSE*/)
{
CTL_Editor_BaseControl *pclNewElement = new CTL_Editor_BaseControl( _pclBaseWindowsControl,
_pclWnd,
_pclParentControl,
_eDisplayType,
_ucPercentWidth,
_uwFixedWidth,
_uwHeight,
_bSamePlaceAsNext,
_bGoToNextLineAfterMe);
AddTail(pclNewElement);
return pclNewElement;
}
//**************************************************************************************
CTL_Editor_BaseControl *CTL_Editor_BaseControlList::m_pub_fn_pclAddControlAtPosition(unsigned char _ucTargettedPosition,
CTL_BaseWindowsControl *_pclBaseWindowsControl,
CWnd *_pclWnd,
CTL_Editor_Control *_pclParentControl,
CTL_tdeBaseControlDisplayType _eDisplayType,
unsigned char _ucPercentWidth,
unsigned short _uwFixedWidth,
unsigned short _uwHeight,
BOOL _bSamePlaceAsNext /*= FALSE*/,
BOOL _bGoToNextLineAfterMe /*= FALSE*/)
{
CTL_Editor_BaseControl *pclNewElement = new CTL_Editor_BaseControl( _pclBaseWindowsControl,
_pclWnd,
_pclParentControl,
_eDisplayType,
_ucPercentWidth,
_uwFixedWidth,
_uwHeight,
_bSamePlaceAsNext,
_bGoToNextLineAfterMe);
//Searches for the right Position
BOOL bFound = FALSE;
unsigned char ucCurrentPosition = 0;
POSITION pos = GetHeadPosition();
while ( (pos != NULL) && (!bFound) )
{
if ( ucCurrentPosition < _ucTargettedPosition )
{
GetNext(pos);
ucCurrentPosition ++;
}
else
bFound = TRUE;
}
InsertAfter(pos, pclNewElement);
return pclNewElement;
}
//**************************************************************************************
void CTL_Editor_BaseControlList::m_pub_fn_vComputeZoneOfAllBaseControls(long _lTotalWidth,
enum CTL_eControlSpacingType _eSpacingType)
{
CTL_Editor_BaseControlList *pclTempList = new CTL_Editor_BaseControlList(FALSE);
BOOL bMustGoOn = TRUE;
//Builds temp sub-list with one-line controls
CTL_Editor_BaseControl *pclBC;
BOOL bNextLineFound = FALSE;
POSITION GlobalPos = GetHeadPosition();
POSITION KeepedPos = GlobalPos;
while ( (GlobalPos != NULL) && (!bNextLineFound) )
{
pclBC = GetNext(GlobalPos);
bNextLineFound = pclBC->m_pri_bBeginsOnNextLine;
if ( !bNextLineFound )
{
KeepedPos = GlobalPos;
pclTempList->AddTail(pclBC);
}
}
while ( bMustGoOn )
{
//Adjusts Total witdh
long lTotalWidth = _lTotalWidth - pclTempList->m_pri_fn_wComputeTotalSizeOfSpaces();
//Resets computed values for base controls
CTL_Editor_BaseControl *pclCurrentBC;
POSITION pos = pclTempList->GetHeadPosition();
while ( pos != NULL )
{
pclCurrentBC = pclTempList->GetNext(pos);
pclCurrentBC->m_pri_cComputedPercentage = CTL_C_BASE_CONTROL_INVALID_PERCENTAGE;
pclCurrentBC->m_pri_lComputedWidth = 0;
}
//Computes total size of "non percentaged" sizes, and each of their sizes
long lTotalFixedSize = pclTempList->m_pri_fn_wComputeTotalSizeOfFixedSizeControlsAndTheirSize(_eSpacingType);
if ( _eSpacingType != CTL_SPACING_TYPE__AUTO )
{
ERROR_ASSERT( lTotalFixedSize < lTotalWidth );
lTotalWidth -= lTotalFixedSize;
//Computes percentages for the Base Controls which are "percentaged", and each of their sizes
pclTempList->m_pri_fn_vComputeTruePercentagesAndSizes(lTotalWidth);
}
//Computes Zone for all Base Controls
pos = pclTempList->GetHeadPosition();
while ( pos != NULL )
{
pclCurrentBC = pclTempList->GetNext(pos);
pclCurrentBC->m_pub_fn_vComputeBaseControlZone();
}
//Builds the next sub-list
if ( GlobalPos != NULL )
{
pclTempList->RemoveAll();
GlobalPos = KeepedPos;
bNextLineFound = FALSE;
//To avoid the first, for which we are sure 'BeginsOnNextLine' is TRUE
pclBC = GetNext(GlobalPos);
pclTempList->AddTail(pclBC);
KeepedPos = GlobalPos;
while ( (GlobalPos != NULL) && (!bNextLineFound) )
{
pclBC = GetNext(GlobalPos);
bNextLineFound = pclBC->m_pri_bBeginsOnNextLine;
if ( !bNextLineFound )
{
KeepedPos = GlobalPos;
pclTempList->AddTail(pclBC);
}
}
}
else
bMustGoOn = FALSE;
}
//Will not destroy
delete pclTempList;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////
// Private Functions //
///////////////////////
//**************************************************************************************
void CTL_Editor_BaseControlList::m_pri_fn_vEmptyList()
{
POSITION pos = GetHeadPosition();
while ( pos != NULL )
delete GetNext(pos);
RemoveAll();
}
//**************************************************************************************
short CTL_Editor_BaseControlList::m_pri_fn_wComputeTotalSizeOfSpaces()
{
short wTotalSize = 0;
POSITION pos = GetHeadPosition();
while ( pos != NULL )
{
GetNext(pos);
if ( pos != NULL )
wTotalSize += C_SPACE_BETWEEN_CONTROLS;
}
return wTotalSize;
}
//**************************************************************************************
short CTL_Editor_BaseControlList::m_pri_fn_wComputeTotalOfPercentages()
{
short wTotalPercentages = 0;
CTL_Editor_BaseControl *pclCurrentBC;
POSITION pos = GetHeadPosition();
while ( pos != NULL )
{
pclCurrentBC = GetNext(pos);
if ( !pclCurrentBC->m_pri_bSamePlaceAsNext )
if ( pclCurrentBC->m_pub_fn_bCanBeDisplayed() )
wTotalPercentages += pclCurrentBC->m_pri_ucPercentWidth;
}
return wTotalPercentages;
}
//**************************************************************************************
short CTL_Editor_BaseControlList::m_pri_fn_wComputeTotalSizeOfFixedSizeControlsAndTheirSize(enum CTL_eControlSpacingType _eSpacingType)
{
short wTotalSize = 0;
CTL_Editor_BaseControl *pclCurrentBC;
POSITION pos = GetHeadPosition();
while ( pos != NULL )
{
pclCurrentBC = GetNext(pos);
if ( pclCurrentBC->m_pub_fn_bCanBeDisplayed() )
{
//Computes size
switch ( pclCurrentBC->m_pub_fn_tdeGetDisplayType() )
{
////
case CTL_BASE_CONTROL_DISPLAY_TYPE__ALWAYS_FIXED:
pclCurrentBC->m_pri_lComputedWidth = pclCurrentBC->m_pri_uwFixedWidth;
break;
////
case CTL_BASE_CONTROL_DISPLAY_TYPE__ALWAYS_PERCENTAGED:
pclCurrentBC->m_pri_lComputedWidth = 0; //will be computed later !
break;
////
case CTL_BASE_CONTROL_DISPLAY_TYPE__USE_CALLBACK:
{
switch ( _eSpacingType )
{
/////
case CTL_SPACING_TYPE__SINGLE_LINE:
case CTL_SPACING_TYPE__MULTI_LINE:
pclCurrentBC->m_pri_lComputedWidth = 0; //will be computed later !
break;
/////
case CTL_SPACING_TYPE__AUTO:
case CTL_SPACING_TYPE__FIXED_SIZE:
pclCurrentBC->m_pri_lComputedWidth = pclCurrentBC->m_pri_td_p_fn_lGetSize_CallBack(pclCurrentBC);
break;
};
}
break;
////
case CTL_BASE_CONTROL_DISPLAY_TYPE__NORMAL:
{
switch ( _eSpacingType )
{
/////
case CTL_SPACING_TYPE__SINGLE_LINE:
case CTL_SPACING_TYPE__MULTI_LINE:
pclCurrentBC->m_pri_lComputedWidth = 0; //will be computed later !
break;
/////
case CTL_SPACING_TYPE__AUTO:
case CTL_SPACING_TYPE__FIXED_SIZE:
pclCurrentBC->m_pri_lComputedWidth = pclCurrentBC->m_pri_uwFixedWidth;
break;
};
}
break;
};
//Adds it to the total size
wTotalSize += (short)pclCurrentBC->m_pri_lComputedWidth;
}
}
return wTotalSize;
}
//**************************************************************************************
// !!! MUST ALWAYS BE CALLED AFTER 'm_pri_fn_wComputeTotalSizeOfFixedSizeControlsAndTheirSize' !!!
///////////////////////////////////////////////////////////////////////////////////////////////////
void CTL_Editor_BaseControlList::m_pri_fn_vComputeTruePercentagesAndSizes(long _lTotalWidth)
{
short wTotalPercentages = m_pri_fn_wComputeTotalOfPercentages();
if ( wTotalPercentages != 0 )
{
CTL_Editor_BaseControl *pclCurrentBC;
POSITION pos = GetHeadPosition();
while ( pos != NULL )
{
pclCurrentBC = GetNext(pos);
if ( pclCurrentBC->m_pri_lComputedWidth == 0 )
if ( pclCurrentBC->m_pub_fn_bCanBeDisplayed() )
pclCurrentBC->m_pri_lComputedWidth = (_lTotalWidth * pclCurrentBC->m_pri_ucPercentWidth) / wTotalPercentages;
}
}
}
//**************************************************************************************
BOOL CTL_Editor_BaseControlList::m_pri_fn_bAllBaseControlsPercentagesInitialized()
{
BOOL bReturn = TRUE;
POSITION pos = GetHeadPosition();
while ( (pos != NULL) && (bReturn) )
bReturn = ( GetNext(pos)->m_pri_cComputedPercentage != CTL_C_BASE_CONTROL_INVALID_PERCENTAGE );
return bReturn;
}