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

474 lines
15 KiB
C++

// Implementation file for the definition of a group of controls
// used to edit a Characteristic
/////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Controls\CTL_Ctl.hpp"
#include "Controls\CTL_BCtl.hpp"
#include "WControls\CTL_WSta.hpp"
#include "WControls\CTL_WCkB.hpp"
#include "Others\CTL_Pri.hpp"
#include "Others\CTL_Pub.hpp"
//External Modules
#include "CTL_ErO.hpp"
//End of External Modules
#define C_TIMER_DELAY 150 //in milliseconds
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//Constructor(s) / Destructor
////////////////////////////////////
//************************************************************************
CTL_Editor_Control::CTL_Editor_Control(CTL_tdeEditorDataType tdeType,
BOOL bIsAlwaysReadOnly,
CTL_tdeControlSpacingType tdeSpacingType,
BOOL bUserCanChangeAspect,
CTL_Editor_ControlList *_pclParentList,
CString _csControlName,
//ANNECY BBB {
BOOL _bAcceptNameFromData /*= TRUE*/,
//ANNECY BBB }
//Stefan Dumitrean 20-07-98 ( OAC buttons )
unsigned char ucInitialCurrentPair /* = 0*/
//End Stefan Dumitrean 20-07-98 ( OAC buttons )
)
{
//ANNECY BBB {
m_bAcceptNameFromData = _bAcceptNameFromData;
//ANNECY BBB }
m_tdeDataType = tdeType;
m_bIsAlwaysReadOnly = bIsAlwaysReadOnly;
m_bIsReadOnly = m_bIsAlwaysReadOnly;
m_tdeSpacingType = tdeSpacingType;
m_bUserCanChangeAspect = bUserCanChangeAspect;
m_pro_csControlName = _csControlName;
//ANNECY CB
#if 0
ERROR_PREPARE_M(CTL_g_csModuleNameForErO,
"Trying to create a control",
"CTL_Editor_Control::CTL_Editor_Control(...)",
E_ERROR_GRAVITY_WARNING,
"No name was given to the control... TUT Module probably won't accept this !");
ERROR_ASSERT( !m_pro_csControlName.IsEmpty() );
#endif
//END
m_pri_pclParentList = _pclParentList;
m_bControlCreated = FALSE;
m_bHidden = TRUE;
m_pclNameStatic = NULL;
m_pclData = NULL;
m_crZoneRect = CRect(0,0,0,0);
m_pclListOfBaseControls = new CTL_Editor_BaseControlList;
m_pri_p_fn_bControlCanBeDisplayedCallBack = CTL_g_p_fnDefaultCallBack_ControlCanBeDisplayed;
//Stefan Dumitrean 20-07-98 ( OAC buttons )
m_ucInitialCurrentPair = ucInitialCurrentPair;
//End Stefan Dumitrean 20-07-98 ( OAC buttons )
}
//************************************************************************
CTL_Editor_Control::~CTL_Editor_Control()
{
delete m_pclListOfBaseControls;
}
//Access functions
//////////////////////////////////
//************************************************************************
BOOL CTL_Editor_Control::m_fn_bIsReadOnly()
{
if ( m_bIsAlwaysReadOnly )
return TRUE;
else
return m_bIsReadOnly;
}
//************************************************************************
BOOL CTL_Editor_Control::m_fn_bIsAlwaysReadOnly()
{
return m_bIsAlwaysReadOnly;
}
//************************************************************************
BOOL CTL_Editor_Control::m_pub_fn_bHasBeenCreated()
{
return m_bControlCreated;
}
//************************************************************************
BOOL CTL_Editor_Control::m_fn_bCanUserChangeAspect()
{
return m_bUserCanChangeAspect;
}
//************************************************************************
CRect CTL_Editor_Control::m_fn_crGetZoneRect()
{
return m_crZoneRect;
}
//************************************************************************
CTL_Editor_Data *CTL_Editor_Control::m_fn_pclGetEditedData()
{
return m_pclData;
}
//************************************************************************
void CTL_Editor_Control::m_fn_vSetEditedData(CTL_Editor_Data *pclData)
{
m_pclData = pclData;
m_pclData->m_pub_fn_vSetParentControl(this);
}
//************************************************************************
CTL_tdeEditorDataType CTL_Editor_Control::m_pub_fn_tdeGetDataType()
{
return m_tdeDataType;
}
//************************************************************************
CTL_tdeControlSpacingType CTL_Editor_Control::m_fn_tdeGetSpacingType()
{
return m_tdeSpacingType;
}
//************************************************************************
void CTL_Editor_Control::m_pub_fn_vDisplayInZone( CRect &_r_crSameLineDestinationZone,
CRect &_r_crNextLineDestinationZone)
{
if ( m_pub_fn_bMustBeDisplayed() )
{
//Security !!
_r_crSameLineDestinationZone.bottom = _r_crSameLineDestinationZone.top;
_r_crNextLineDestinationZone.bottom = _r_crNextLineDestinationZone.top;
switch( m_fn_tdeGetSpacingType() )
{
//#################################################################
case CTL_SPACING_TYPE__MULTI_LINE:
case CTL_SPACING_TYPE__SINGLE_LINE:
//Forces this control to start on next line
_r_crSameLineDestinationZone = _r_crNextLineDestinationZone;
m_pri_fn_vDisplaySubControlsInZone( TRUE,
_r_crSameLineDestinationZone,
_r_crNextLineDestinationZone);
//Forces the next control to start on next line
_r_crSameLineDestinationZone = _r_crNextLineDestinationZone;
break;
//#################################################################
case CTL_SPACING_TYPE__AUTO:
case CTL_SPACING_TYPE__FIXED_SIZE:
//If control lies in the left X space
if ( m_pri_fn_bCanDisplayInWidth(_r_crSameLineDestinationZone.Width()) )
{
m_pri_fn_vDisplaySubControlsInZone( FALSE,
_r_crSameLineDestinationZone,
_r_crNextLineDestinationZone);
}
//else changes for the next line
else
{
//Forces this control to start on next line
_r_crSameLineDestinationZone = _r_crNextLineDestinationZone;
m_pri_fn_vDisplaySubControlsInZone( TRUE,
_r_crSameLineDestinationZone,
_r_crNextLineDestinationZone);
}
break;
}
}//End of test for non display
else
{
m_fn_vHide();
//Security !!
m_bHidden = TRUE;
}
}
//************************************************************************
BOOL CTL_Editor_Control::m_pri_fn_bCanDisplayInWidth(unsigned short uwLeftWidth)
{
//ANNECY CB
#if 0
ERROR_ASSERT( (m_fn_tdeGetSpacingType() == CTL_SPACING_TYPE__AUTO)
|| (m_fn_tdeGetSpacingType() == CTL_SPACING_TYPE__FIXED_SIZE)
);
#endif
//END
return ( uwLeftWidth >= m_pri_fn_uwComputeTotalWidth(0) ); //Parameter is only used for Percentage calculations
}
//************************************************************************
unsigned short CTL_Editor_Control::m_pri_fn_uwComputeTotalWidth(unsigned short uwAllowedTotalWidth)
{
unsigned short uwTotalWidth = 0;
m_pclListOfBaseControls->m_pub_fn_vComputeZoneOfAllBaseControls(uwAllowedTotalWidth,
m_fn_tdeGetSpacingType());
CTL_Editor_BaseControl *pclBaseCtrl;
POSITION pos = m_pclListOfBaseControls->GetHeadPosition();
while ( pos != NULL )
{
pclBaseCtrl = m_pclListOfBaseControls->GetNext(pos);
if ( !pclBaseCtrl->m_pri_bSamePlaceAsNext )
uwTotalWidth += (pclBaseCtrl->m_pri_lComputedWidth + CTL_C_SPACE_BETWEEN_CONTROLS);
}
return uwTotalWidth;
}
//************************************************************************
unsigned char CTL_Editor_Control::m_pri_fn_ucGetBaseControlNumber()
{
return m_pclListOfBaseControls->GetCount();
}
//Member functions
///////////////////////////
//************************************************************************
//Display of sub_controls in list
void CTL_Editor_Control::m_pri_fn_vDisplaySubControlsInZone(BOOL _bUseNextLineZone,
CRect &_r_crSameLineDestinationZone,
CRect &_r_crNextLineDestinationZone)
{
ERROR_ASSERT( m_pclData != NULL );
if ( m_fn_bAcceptsToTakeNameFromData() && (m_pub_fn_csGetControlName().CompareNoCase(m_pclData->m_pub_fn_csGetDataName()) != 0) ) //ANNECY BBB
m_pub_fn_csSetControlName(m_pclData->m_pub_fn_csGetDataName());
//Computes exact width for all base controls in list
short wTotalWidth = _bUseNextLineZone ? _r_crNextLineDestinationZone.Width(): _r_crSameLineDestinationZone.Width();
m_pclListOfBaseControls->m_pub_fn_vComputeZoneOfAllBaseControls(wTotalWidth,
m_fn_tdeGetSpacingType());
//Then displays them
CTL_Editor_BaseControl *pclCurrentBaseControl;
POSITION pos = m_pclListOfBaseControls->GetHeadPosition();
while ( pos != NULL )
{
pclCurrentBaseControl = m_pclListOfBaseControls->GetNext(pos);
if ( pclCurrentBaseControl->m_pub_fn_bCanBeDisplayed() )
pclCurrentBaseControl->m_pub_fn_vMoveInZone(_r_crSameLineDestinationZone,
_r_crNextLineDestinationZone);
}
//Displays (only if necessary, i.e. if hidden)
m_bHidden = TRUE; //TEMPORAIRE : to force display
m_fn_vDisplay();
//Security !!
m_bHidden = FALSE;
}
//************************************************************************
//Function called to update parent window in case of values changes.
void CTL_Editor_Control::m_fn_vUpdateParent(CTL_tdeUpdateReason eReason,
long _lUserDefinedReason /*= 0*/)
{
}
//************************************************************************
void CTL_Editor_Control::m_pub_fn_vSetControlCanBeDisplayedCallBack(CTL_td_p_fn_bControlCanBeDisplayed _p_fn_CallBalck)
{
ERROR_ASSERT( m_pri_p_fn_bControlCanBeDisplayedCallBack == NULL );
if ( m_pri_p_fn_bControlCanBeDisplayedCallBack == NULL )
m_pri_p_fn_bControlCanBeDisplayedCallBack = _p_fn_CallBalck;
}
//************************************************************************
BOOL CTL_Editor_Control::m_pub_fn_bMustBeDisplayed()
{
//Calls CallBack if it exists
if ( m_pri_p_fn_bControlCanBeDisplayedCallBack != NULL )
return m_pri_p_fn_bControlCanBeDisplayedCallBack(this);
else
return TRUE;
}
//************************************************************************
//Function called to edit complex data (which can not be directly
//edited)
void CTL_Editor_Control::m_fn_vEditData()
{
ERROR_ASSERT( FALSE ) ;
}
//************************************************************************
//Function called to hide group of controls
void CTL_Editor_Control::m_fn_vHide()
{
m_pro_fn_vHideBaseControls();
m_crZoneRect = CRect(0,0,0,0);
}
//************************************************************************
void CTL_Editor_Control::m_fn_vAskForNewAspect(unsigned short uwAllowedTotalWidth)
{
// EdActors_ControlDefinitionDialog dial(this, uwAllowedTotalWidth);
// dial.DoModal();
}
//************************************************************************
//Function called to develop complex data in tree
void CTL_Editor_Control::m_fn_vDevelopData()
{
}
//The list of base controls
//************************************************************************
CTL_Editor_BaseControlList *CTL_Editor_Control::m_pub_fn_pclGetListOfBaseControls()
{
return m_pclListOfBaseControls;
}
//************************************************************************
//The parent list of controls
CTL_Editor_ControlList *CTL_Editor_Control::m_pub_fn_pclGetParentList()
{
return m_pri_pclParentList;
}
//************************************************************************
//Returns the old name
CString CTL_Editor_Control::m_pub_fn_csSetControlName(CString _csNewName)
{
CString csOldName(m_pro_csControlName);
m_pro_csControlName = _csNewName;
//Updates display
m_pclNameStatic->m_fn_vSetTextToDisplay(m_pro_csControlName);
return csOldName;
}
//************************************************************************
CString CTL_Editor_Control::m_pub_fn_csGetControlName()
{
return m_pro_csControlName;
}
//************************************************************************
CTL_Editor_Static *CTL_Editor_Control::m_pub_fn_pclGetNameStatic()
{
return m_pclNameStatic;
}
//*********************************************************************************
CTL_OwnerData *CTL_Editor_Control::m_pub_fn_pclAddOwnerData(void *_pvDataPtr,
CString _csName)
{
return m_pri_clListOfOwnerData.m_pub_fn_pclAddOwnerData(_pvDataPtr, _csName);
}
//*********************************************************************************
CTL_OwnerData *CTL_Editor_Control::m_pub_fn_pclAddOwnerData(long _lData,
CString _csName)
{
return m_pri_clListOfOwnerData.m_pub_fn_pclAddOwnerData(_lData, _csName);
}
//*********************************************************************************
CTL_OwnerData *CTL_Editor_Control::m_pub_fn_pclGetOwnerDataWithName(CString _csSearchedName)
{
return m_pri_clListOfOwnerData.m_pub_fn_pclFindOwnerDataWithName(_csSearchedName);
}
//************************************************************************
// Constructs the Edit for the name and the CheckBox for the links
BOOL CTL_Editor_Control::m_pro_fn_bCreateBaseControls(unsigned char _ucNamePercentWidth,
unsigned short _uwNameMinWidth,
unsigned short _uwHeight,
BOOL _bGoToNextLineAfterName /*= FALSE*/)
{
BOOL bCreationOK = TRUE;
//Creates a static box for the name of the charac.
////////////////////////////////////////////////////
ERROR_ASSERT( m_pclNameStatic == NULL );
m_pclNameStatic = new CTL_Editor_Static(m_pro_csControlName,
CTL_STATIC_TYPE__FIELD_NAME,
0,
this,
m_pclParentWnd
);
#ifndef CTL_WITH_NO_TUT
m_pclNameStatic->m_pub_fn_vRegisterWindowsControl(m_pub_fn_csGetControlName() + " - Field Name");
#endif //CTL_WITH_NO_TUT
CTL_Editor_BaseControl *pclBC;
pclBC = m_pclListOfBaseControls->m_pub_fn_pclAddControlAtTail(m_pclNameStatic,
m_pclNameStatic,
this,
CTL_BASE_CONTROL_DISPLAY_TYPE__USE_CALLBACK,
_ucNamePercentWidth,
_uwNameMinWidth,
_uwHeight,
FALSE,
_bGoToNextLineAfterName);
pclBC->m_pub_fn_vSetGetSize_CallBack(CTL_fn_lComputeSizeOfStaticForName);
return bCreationOK;
}
//************************************************************************
void CTL_Editor_Control::m_pro_fn_vDisplayBaseControls()
{
if ( m_bHidden )
{
POSITION pos = m_pclListOfBaseControls->GetHeadPosition();
while ( pos != NULL )
m_pclListOfBaseControls->GetNext(pos)->m_fn_vDisplayBaseControl();
m_bHidden = FALSE;
}
}
//************************************************************************
void CTL_Editor_Control::m_pro_fn_vHideBaseControls()
{
if ( !m_bHidden )
{
POSITION pos = m_pclListOfBaseControls->GetHeadPosition();
while ( pos != NULL )
m_pclListOfBaseControls->GetNext(pos)->m_fn_vHideBaseControl();
m_bHidden = TRUE;
}
}