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

542 lines
16 KiB
C++

/*
=======================================================================================
Name : DlgObtai.cpp
Author : vincent lhullier Date :28/08/97
Description : implementation file for obtain dialog box
=======================================================================================
Modification -> Author : Date :
Description :
=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "mngdata5.h"
#include "DlgObtai.h"
#include "IniData.h"
#include "modiflst.h"
#include "majdata.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
=======================================================================================
CBatchObtainDlg dialog
=======================================================================================
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : constructor
----------------------------------------------------------------------------------------
*/
CBatchObtainDlg::CBatchObtainDlg(CWnd* pParent) : CDialog(CBatchObtainDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBatchObtainDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
/*
* load bitmap for digit and separation
*/
m_a_oDigit[0].LoadBitmap( IDB_BITMAP_DIGIT0 );
m_a_oDigit[1].LoadBitmap( IDB_BITMAP_DIGIT1 );
m_a_oDigit[2].LoadBitmap( IDB_BITMAP_DIGIT2 );
m_a_oDigit[3].LoadBitmap( IDB_BITMAP_DIGIT3 );
m_a_oDigit[4].LoadBitmap( IDB_BITMAP_DIGIT4 );
m_a_oDigit[5].LoadBitmap( IDB_BITMAP_DIGIT5 );
m_a_oDigit[6].LoadBitmap( IDB_BITMAP_DIGIT6 );
m_a_oDigit[7].LoadBitmap( IDB_BITMAP_DIGIT7 );
m_a_oDigit[8].LoadBitmap( IDB_BITMAP_DIGIT8 );
m_a_oDigit[9].LoadBitmap( IDB_BITMAP_DIGIT9 );
m_oSeparator.LoadBitmap( IDB_BITMAP_SEPAR );
m_bObtain = FALSE;
}
/*
----------------------------------------------------------------------------------------
Description : destructor
----------------------------------------------------------------------------------------
*/
CBatchObtainDlg::~CBatchObtainDlg()
{
char cBitmap;
for (cBitmap = 0; cBitmap < 10; cBitmap ++)
m_a_oDigit[ cBitmap ].DeleteObject();
m_oSeparator.DeleteObject();
}
/*
----------------------------------------------------------------------------------------
Description : message map
----------------------------------------------------------------------------------------
*/
BEGIN_MESSAGE_MAP(CBatchObtainDlg, CDialog)
//{{AFX_MSG_MAP(CBatchObtainDlg)
ON_WM_DRAWITEM()
ON_BN_CLICKED(IDC_CHECK_WAIT, OnCheckWait)
ON_EN_KILLFOCUS(IDC_EDIT_SECONDS, OnKillfocusEditSeconds)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_TIME, OnDeltaposSpinTime)
ON_BN_CLICKED(IDC_CHECK_USETIMER, OnCheckUsetimer)
ON_WM_TIMER()
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_SECONDS, OnDeltaposSpinSeconds)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
----------------------------------------------------------------------------------------
Description : BN_CLICKED on IDCANCEL button
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnCancel()
{
CDialog::OnCancel();
}
/*
=======================================================================================
Specific functions
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : compute elapse time before next try to obtain
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::fn_vComputeElapseTime()
{
time_t xTimer;
struct tm *p_stTime;
long lSecondsLeft;
div_t stDiv;
time ( &xTimer );
if (m_bUseTimer)
{
p_stTime = localtime( &xTimer );
m_cHours = g_stWinPref.cHour - p_stTime->tm_hour;
m_cMinutes = g_stWinPref.cMinute - p_stTime->tm_min;
m_cSeconds = - p_stTime->tm_sec;
m_lSeconds = m_cSeconds + m_cMinutes * 60 + m_cHours * 3600;
m_lSeconds += g_stWinPref.cRelativeDay * 24*3600;
if (m_lSeconds <= 0)
{
m_lSeconds = m_cHours = m_cMinutes = m_cSeconds = 0;
m_bUseTimer = FALSE;
m_bTry = TRUE;
}
else
{
stDiv = div( m_lSeconds, 3600);
m_cHours = stDiv.quot;
lSecondsLeft = stDiv.rem;
stDiv = div (lSecondsLeft, 60 );
m_cMinutes = stDiv.quot;
m_cSeconds = stDiv.rem;
}
}
else
{
m_lSeconds = m_xNextTry - xTimer;
if (m_lSeconds <= 0)
{
m_lSeconds = m_cHours = m_cMinutes = m_cSeconds = 0;
m_bTry = TRUE;
}
stDiv = div(m_lSeconds, 60 );
m_cMinutes = stDiv.quot;
m_cSeconds = stDiv.rem;
}
}
/*
=======================================================================================
Message handlers
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : WM_INITDIALOG
----------------------------------------------------------------------------------------
*/
BOOL CBatchObtainDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CComboBox *p_oCB;
CSpinButtonCtrl *p_oSpin;
char szValue[10];
/*
* set elapse time and spin to that data
*/
//GetDlgItem( IDC_EDIT_TIME )->SetWindowText( itoa( g_stWinPref.lElapseTime, szValue, 10 ) );
p_oSpin = (CSpinButtonCtrl *) GetDlgItem( IDC_SPIN_TIME );
p_oSpin->SetRange( 10, 600 );
p_oSpin->SetPos( g_stWinPref.lElapseTime );
GetDlgItem( IDC_EDIT_SECONDS )->SetWindowText( itoa( g_stWinPref.lElapseTime, szValue, 10 ) );
/*
* set use timer check
*/
((CButton *) GetDlgItem( IDC_CHECK_USETIMER))->SetCheck( g_stWinPref.bUseTimer ? 1 : 0 );
/*
* set relative day
*/
p_oCB = (CComboBox *) GetDlgItem( IDC_COMBO_DAY );
p_oCB->SetCurSel( g_stWinPref.cRelativeDay );
/*
* set date
*/
sprintf( szValue, "%02d:%02d", g_stWinPref.cHour, g_stWinPref.cMinute );
GetDlgItem( IDC_EDIT_TIME )->SetWindowText( szValue );
/*
* set check for wait to be alone
*/
((CButton *) GetDlgItem( IDC_CHECK_NOBODYELSE))->SetCheck( g_stWinPref.bWaitToBeAlone ? 1 : 0 );
OnCheckUsetimer();
return TRUE;
}
/*
----------------------------------------------------------------------------------------
Description : WM_DRAWITEM
----------------------------------------------------------------------------------------
*/
#define C_xLightColor RGB(255,0,0)
#define C_xMiddleColor RGB(192,0,0)
#define C_xDarkColor RGB(128,0,0)
void CBatchObtainDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
div_t stDiv;
CPoint oPos( 10, 10);
CSize oDigitSize( 15, 30 );
CSize oSeparSize( 5, 30 );
CBrush oBrush( C_xMiddleColor );
if (nIDCtl == IDC_BUTTON_TIME)
{
CDC *p_oDC = CDC::FromHandle( lpDIS->hDC );
p_oDC->Draw3dRect( &lpDIS->rcItem, C_xLightColor, C_xDarkColor );
lpDIS->rcItem.left++; lpDIS->rcItem.top++; lpDIS->rcItem.bottom--; lpDIS->rcItem.right--;
p_oDC->FrameRect( &lpDIS->rcItem, &oBrush );
lpDIS->rcItem.left++; lpDIS->rcItem.top++; lpDIS->rcItem.bottom--; lpDIS->rcItem.right--;
p_oDC->FrameRect( &lpDIS->rcItem, &oBrush );
lpDIS->rcItem.left++; lpDIS->rcItem.top++; lpDIS->rcItem.bottom--; lpDIS->rcItem.right--;
p_oDC->Draw3dRect( &lpDIS->rcItem, C_xDarkColor, C_xLightColor );
lpDIS->rcItem.left++; lpDIS->rcItem.top++; lpDIS->rcItem.bottom--; lpDIS->rcItem.right--;
p_oDC->FillSolidRect( &lpDIS->rcItem, RGB( 0,0,0 ) );
/* hour */
stDiv = div( m_cHours, 10);
p_oDC->DrawState( oPos, oDigitSize, &m_a_oDigit[ stDiv.quot ], DST_BITMAP );
oPos.x += 16;
p_oDC->DrawState( oPos, oDigitSize, &m_a_oDigit[ stDiv.rem ], DST_BITMAP );
oPos.x += 16;
p_oDC->DrawState( oPos, oDigitSize, &m_oSeparator, DST_BITMAP );
oPos.x += 6;
/* minute */
stDiv = div( m_cMinutes, 10);
p_oDC->DrawState( oPos, oDigitSize, &m_a_oDigit[ stDiv.quot ], DST_BITMAP );
oPos.x += 16;
p_oDC->DrawState( oPos, oDigitSize, &m_a_oDigit[ stDiv.rem ], DST_BITMAP );
oPos.x += 16;
p_oDC->DrawState( oPos, oDigitSize, &m_oSeparator, DST_BITMAP );
oPos.x += 6;
/* seconds */
stDiv = div( m_cSeconds, 10);
p_oDC->DrawState( oPos, oDigitSize, &m_a_oDigit[ stDiv.quot ], DST_BITMAP );
oPos.x += 16;
p_oDC->DrawState( oPos, oDigitSize, &m_a_oDigit[ stDiv.rem ], DST_BITMAP );
}
CDialog::OnDrawItem(nIDCtl, lpDIS);
}
/*
----------------------------------------------------------------------------------------
Description : BN_CLICKED on IDC_BUTTON_WAIT
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnCheckWait()
{
BOOL bWait= ((CButton *) GetDlgItem( IDC_CHECK_WAIT ))->GetCheck() == 1;
BOOL bContinue = TRUE;
GetDlgItem( IDC_STATIC_SECONDS )->ShowWindow( !bWait );
GetDlgItem( IDC_EDIT_SECONDS )->ShowWindow( !bWait );
GetDlgItem( IDC_SPIN_SECONDS )->ShowWindow( !bWait );
GetDlgItem( IDC_STATIC_SECONDS2 )->ShowWindow( !bWait );
GetDlgItem( IDC_CHECK_USETIMER )->ShowWindow( !bWait );
GetDlgItem( IDC_STATIC_TIMER )->ShowWindow( !bWait );
GetDlgItem( IDC_STATIC_DAY )->ShowWindow( !bWait && g_stWinPref.bUseTimer );
GetDlgItem( IDC_COMBO_DAY )->ShowWindow( !bWait && g_stWinPref.bUseTimer );
GetDlgItem( IDC_STATIC_TIME )->ShowWindow( !bWait && g_stWinPref.bUseTimer );
GetDlgItem( IDC_EDIT_TIME )->ShowWindow( !bWait && g_stWinPref.bUseTimer );
GetDlgItem( IDC_SPIN_TIME )->ShowWindow( !bWait && g_stWinPref.bUseTimer );
GetDlgItem( IDC_STATIC_TIME2 )->ShowWindow( !bWait && g_stWinPref.bUseTimer );
GetDlgItem( IDC_CHECK_NOBODYELSE )->ShowWindow( !bWait );
GetDlgItem( IDCANCEL )->ShowWindow( !bWait );
GetDlgItem( IDC_STATIC_WAIT )->ShowWindow( bWait );
GetDlgItem( IDC_BUTTON_TIME )->ShowWindow( bWait );
GetDlgItem( IDC_STATIC_RESULT )->ShowWindow( bWait );
if ( bWait )
{
g_stWinPref.cRelativeDay = ((CComboBox *) GetDlgItem( IDC_COMBO_DAY ))->GetCurSel();
g_stWinPref.bWaitToBeAlone = ((CButton *) GetDlgItem( IDC_CHECK_NOBODYELSE ))->GetCheck() == 1;
/*
* display what we are waiting
*/
char szMessage[1024], *p_szMessage = szMessage;
char szDay[ 40 ];
m_bUseTimer = g_stWinPref.bUseTimer;
if (g_stWinPref.bUseTimer)
{
((CComboBox *) GetDlgItem( IDC_COMBO_DAY) )->GetLBText( g_stWinPref.cRelativeDay, szDay );
p_szMessage += sprintf( p_szMessage, "Wait %s %02d:%02d and then\r\n", szDay, g_stWinPref.cHour, g_stWinPref.cMinute );
}
p_szMessage += sprintf( p_szMessage, "Try to obtain every %d seconds\r\n", g_stWinPref.lElapseTime );
if (g_stWinPref.bWaitToBeAlone)
p_szMessage += sprintf( p_szMessage, "Obtain only if database is unoccupied" );
else
p_szMessage += sprintf( p_szMessage, "Obtain even if another one is obtaining data" );
GetDlgItem( IDC_STATIC_WAIT )->SetWindowText( szMessage );
GetDlgItem( IDC_STATIC_RESULT )->SetWindowText( "" );
m_lTryCount = 0;
time ( &m_xNextTry );
m_bTry = FALSE;
fn_vComputeElapseTime();
GetDlgItem( IDC_BUTTON_TIME)->Invalidate();
m_uiTimer = SetTimer( 1, 1000, NULL );
}
else
{
KillTimer( m_uiTimer );
}
}
/*
----------------------------------------------------------------------------------------
Description : EM_KILLFOCUS on IDC_EDIT_SECONDS
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnKillfocusEditSeconds()
{
char szValue[10];
GetDlgItem( IDC_EDIT_SECONDS )->GetWindowText( szValue, 9 );
g_stWinPref.lElapseTime = atoi( szValue );
if (g_stWinPref.lElapseTime < 10)
g_stWinPref.lElapseTime = 10;
else if (g_stWinPref.lElapseTime > 600)
g_stWinPref.lElapseTime = 600;
GetDlgItem( IDC_EDIT_SECONDS )->SetWindowText( itoa( g_stWinPref.lElapseTime, szValue, 10 ) );
}
/*
----------------------------------------------------------------------------------------
Description : UDN_DELTAPOS on IDC_SPIN_TIME
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnDeltaposSpinTime(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
int iDelta;
char szTime[10];
iDelta = pNMUpDown->iDelta;
if ( (GetKeyState( VK_SHIFT ) & 0x8000) == 0)
{
g_stWinPref.cMinute += iDelta;
if (g_stWinPref.cMinute < 0)
{
g_stWinPref.cMinute = 59;
iDelta = -1;
}
else if (g_stWinPref.cMinute > 59)
{
g_stWinPref.cMinute = 0;
iDelta = 1;
}
else
iDelta = 0;
}
if (iDelta)
{
g_stWinPref.cHour += iDelta;
if (g_stWinPref.cHour < 0)
g_stWinPref.cHour = 23;
else if (g_stWinPref.cHour > 23)
g_stWinPref.cHour = 0;
}
sprintf( szTime, "%02d:%02d", g_stWinPref.cHour, g_stWinPref.cMinute );
GetDlgItem( IDC_EDIT_TIME )->SetWindowText( szTime );
*pResult = 1;
}
/*
----------------------------------------------------------------------------------------
Description : BN_CLICKED on IDC_USE_TIMER
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnCheckUsetimer()
{
g_stWinPref.bUseTimer = ((CButton *) GetDlgItem( IDC_CHECK_USETIMER ))->GetCheck() == 1;
GetDlgItem( IDC_STATIC_DAY )->ShowWindow( g_stWinPref.bUseTimer );
GetDlgItem( IDC_COMBO_DAY )->ShowWindow( g_stWinPref.bUseTimer );
GetDlgItem( IDC_STATIC_TIME )->ShowWindow( g_stWinPref.bUseTimer );
GetDlgItem( IDC_EDIT_TIME )->ShowWindow( g_stWinPref.bUseTimer );
GetDlgItem( IDC_SPIN_TIME )->ShowWindow( g_stWinPref.bUseTimer );
GetDlgItem( IDC_STATIC_TIME2 )->ShowWindow( g_stWinPref.bUseTimer );
}
/*
----------------------------------------------------------------------------------------
Description : WM_TIMER
nIDEvent -> ident of timer
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnTimer(UINT nIDEvent)
{
char szMessage[ 256 ], *p_szMessage;
if (nIDEvent == m_uiTimer )
{
fn_vComputeElapseTime();
GetDlgItem( IDC_BUTTON_TIME)->Invalidate();
if ( m_bTry )
{
/*
* try to obtain
*/
p_szMessage = szMessage + sprintf( szMessage, "%d ->", ++m_lTryCount );
if (g_stWinPref.bWaitToBeAlone && fn_bSomeoneObtain( FALSE ))
{
if (g_cNbUsers)
sprintf( p_szMessage, "Can't obtain cause %s is obtaining\r\n", g_a_szUserName[0] );
else
sprintf( p_szMessage, "Can't access server" );
}
else
{
if (fn_bSomeoneUpdate(FALSE, FALSE))
{
if (g_cNbUsers)
sprintf( p_szMessage, "Can't obtain cause %s is updating\r\n", g_a_szUserName[0] );
else
sprintf( p_szMessage, "Can't access server" );
}
else
{
if (!fn_bBeginObtaining() )
sprintf( p_szMessage, "Can't access server" );
else
{
m_bObtain = TRUE;
OnCancel();
}
}
}
GetDlgItem( IDC_STATIC_RESULT )->SetWindowText( szMessage );
/*
* obtain can not be done
*/
time_t xTimer;
time ( &xTimer );
m_bTry = FALSE;
m_xNextTry = xTimer + g_stWinPref.lElapseTime;
}
}
CDialog::OnTimer(nIDEvent);
}
/*
----------------------------------------------------------------------------------------
Description : UDN_DELTAPOS on IDC_SPIN_TIME
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnDeltaposSpinSeconds(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
int iDelta;
char szValue[10];
iDelta = -pNMUpDown->iDelta;
g_stWinPref.lElapseTime += iDelta;
if (g_stWinPref.lElapseTime < 10)
g_stWinPref.lElapseTime = 10;
else if (g_stWinPref.lElapseTime > 600)
g_stWinPref.lElapseTime = 600;
GetDlgItem( IDC_EDIT_SECONDS )->SetWindowText( itoa( g_stWinPref.lElapseTime, szValue, 10 ) );
*pResult = 1;
}
/*
----------------------------------------------------------------------------------------
Description : WM_DESTROY
----------------------------------------------------------------------------------------
*/
void CBatchObtainDlg::OnDestroy()
{
CDialog::OnDestroy();
KillTimer( m_uiTimer );
}