// HorlogeDlg.cpp : implementation file // #include "stdafx.h" #include "Horloge.h" #include "HorlogeDlg.h" #include "HorlogeParseCmdLine.h" #include "IvyApplication.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif UINT g_uTBBC = RegisterWindowMessage(L"TaskbarButtonCreated"); // for taskbar shell integration ///////////////////////////////////////////////////////////////////////////// // CHorlogeDlg dialog CHorlogeDlg::CHorlogeDlg(CWnd* pParent /*=NULL*/) : CDialog(CHorlogeDlg::IDD, pParent) { //{{AFX_DATA_INIT(CHorlogeDlg) m_busnumber = _T(""); m_big_speed = FALSE; m_filename = _T(""); m_pTaskBarlist = NULL; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); GetSystemTime(¤t_time); GetSystemTime(&start_time); bus = NULL; rate = 1.0; } void CHorlogeDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CHorlogeDlg) DDX_Control(pDX, IDC_SETTIME, m_setTime); DDX_Control(pDX, IDC_APPLIST, m_applist); DDX_Control(pDX, IDC_SPEED, m_Speed); DDX_Control(pDX, IDC_TIME, m_Time); DDX_Text(pDX, IDC_BUSNUMBER, m_busnumber); DDX_Check(pDX, IDC_BIGSPEED, m_big_speed); DDX_Text(pDX, IDC_FILENAME, m_filename); //}}AFX_DATA_MAP DDX_Control(pDX, IDC_FILEPROGRESS, file_progress); DDX_Control(pDX, IDC_SPIN1, m_speed_spin); } BEGIN_MESSAGE_MAP(CHorlogeDlg, CDialog) //{{AFX_MSG_MAP(CHorlogeDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_IVYSTART, OnIvystart) ON_BN_CLICKED(IDC_PAUSE, OnPause) ON_BN_CLICKED(IDC_START, OnStart) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_SETTIME, OnDatetimechangeSettime) ON_BN_CLICKED(IDC_BACKWARD, OnBackward) ON_BN_CLICKED(IDC_FORWARD, OnForward) ON_BN_CLICKED(IDC_BACK_5, OnBack5) ON_BN_CLICKED(IDC_BACK_2, OnBack2) ON_BN_CLICKED(IDC_BACK_1, OnBack1) ON_BN_CLICKED(IDC_FORW_1, OnForw1) ON_BN_CLICKED(IDC_FORW_2, OnForw2) ON_BN_CLICKED(IDC_FORW_5, OnForw5) ON_BN_CLICKED(IDC_FILE, OnFile) ON_BN_CLICKED(IDC_NORMAL_SPEED, OnNormalSpeed) ON_LBN_DBLCLK(IDC_APPLIST, OnDblclkApplist) ON_REGISTERED_MESSAGE( g_uTBBC, CHorlogeDlg::OnCreateThumbToolBar ) //}}AFX_MSG_MAP // ON_BN_DOUBLECLICKED(IDC_FORWARD, &CHorlogeDlg::OnBnDoubleclickedForward) // ON_BN_DOUBLECLICKED(IDC_BACKWARD, &CHorlogeDlg::OnBnDoubleclickedBackward) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN1, &CHorlogeDlg::OnDeltaposSpin1) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHorlogeDlg message handlers BOOL CHorlogeDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog //SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon ((CButton*)GetDlgItem(IDC_PAUSE))->SetIcon(AfxGetApp()->LoadIcon(IDI_PAUSE)); ((CButton*)GetDlgItem(IDC_START))->SetIcon(AfxGetApp()->LoadIcon(IDI_START)); ((CButton*)GetDlgItem(IDC_NORMAL_SPEED))->SetIcon(AfxGetApp()->LoadIcon(IDI_NORMAL_SPEED)); m_Time.Format(TEXT("%02d:%02d:%02d"), 0,0,0); m_Speed.Format(TEXT("%.2f"), rate ); m_setTime.GetTime(¤t_time); bus = new Ivy( "Horloge","Horloge READY",this,TRUE); // parse command Line Info HorlogeParseCmdLine cmd; cmd.m_busNumber = bus->GetDomain( NULL ); AfxGetApp()->ParseCommandLine( cmd ); // Set Argument from Command Line m_busnumber = cmd.m_busNumber; bus->BindMsg("^ClockEvent Time=([0-9]+):([0-9]+):([0-9]+) Rate=([-.0-9]+) Bs=([0-9]+)", BUS_CALLBACK_OF(CHorlogeDlg, IvyClockEvent )); bus->BindMsg("^ClockDatas Time=([0-9]+):([0-9]+):([0-9]+) Rate=([-.0-9]+) Bs=([0-9]+)", BUS_CALLBACK_OF(CHorlogeDlg, IvyClockEvent )); bus->BindMsg("^FileReadEvent Type=REJEU Name=([^ ]+) StartTime=([0-9]+):([0-9]+):([0-9]+) EndTime=([0-9]+):([0-9]+):([0-9]+)", BUS_CALLBACK_OF(CHorlogeDlg, IvyFileReadEvent )); bus->BindMsg("^rejeu READY", BUS_CALLBACK_OF(CHorlogeDlg, IvyRejeuReady)); m_busnumber = bus->GetDomain( CStringA( m_busnumber ) ); UpdateData(FALSE); // force bus start in case of start if ( cmd.m_start ) OnIvystart(); return TRUE; // return TRUE unless you set the focus to a control } LRESULT CHorlogeDlg::OnCreateThumbToolBar( WPARAM, LPARAM ) { AddThumbarButtons(); return 0; } void CHorlogeDlg::AddThumbarButtons() { // Initialize the pointer. You can also do this in the constructor. // Remember to release after use if( NULL == m_pTaskBarlist ) { CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&m_pTaskBarlist); } m_pTaskBarlist->HrInit(); // We mention that, we're specifying bitmap, tooltpi and other flags. // This is mask, only specified parameters will be taken from structure THUMBBUTTONMASK dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS; // Create the images from a single bitmap which contains // buttons seperated 16pix width. Like we handle toolbar buttons CImageList ImageList; ImageList.Create( MAKEINTRESOURCE( IDB_BITMAP_PAUSE), 16, 2, RGB( 0xFF,0,0xFF)); // Prepare the thumbar buttons THUMBBUTTON thbButtons[2]; thbButtons[0].dwMask = dwMask; // This can be any integer required on handling button events thbButtons[0].iId = IDB_THB_BUTTON_START; thbButtons[0].iBitmap = 0; lstrcpy( thbButtons[0].szTip, TEXT("Start")); thbButtons[0].dwFlags = THBF_ENABLED | THBF_DISMISSONCLICK; thbButtons[1].dwMask = dwMask; thbButtons[1].iId = IDB_THB_BUTTON_PAUSE; thbButtons[1].iBitmap = 1; thbButtons[1].dwFlags = THBF_ENABLED/*THBF_DISABLED*/ | THBF_DISMISSONCLICK; lstrcpy( thbButtons[1].szTip, TEXT("Pause")); // Declare the image list that contains the button images. m_pTaskBarlist->ThumbBarSetImageList(m_hWnd, ImageList.GetSafeHandle()); // Attach the toolbar to the thumbnail. m_pTaskBarlist->ThumbBarAddButtons(m_hWnd, ARRAYSIZE(thbButtons), thbButtons); // In this program we're using the interface later, so not releasing now. // It's Ok to release if finished using. We can create again when necessary } BOOL CHorlogeDlg::OnCommand(WPARAM wParam, LPARAM lParam) { UINT CommandID = LOWORD( wParam ); if( IDB_THB_BUTTON_START == CommandID ) { OnStart(); } else if( IDB_THB_BUTTON_PAUSE == CommandID ) { OnPause(); } else return CDialog::OnCommand(wParam, lParam); } void CHorlogeDlg::OnBnClickedButton1() { THUMBBUTTONMASK dwMask = THB_FLAGS; THUMBBUTTON thbButtons[2] = { }; thbButtons[0].dwMask = dwMask; thbButtons[0].iId = IDB_THB_BUTTON_START; thbButtons[0].dwFlags = THBF_DISABLED| THBF_DISMISSONCLICK; thbButtons[1].dwMask = dwMask; thbButtons[1].iId = IDB_THB_BUTTON_PAUSE; thbButtons[1].dwFlags = THBF_ENABLED | THBF_DISMISSONCLICK; m_pTaskBarlist->ThumbBarUpdateButtons( m_hWnd, ARRAYSIZE(thbButtons), thbButtons ); } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CHorlogeDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CHorlogeDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CHorlogeDlg::OnIvystart() { UpdateData(TRUE); bus->stop(); m_busnumber = bus->GetDomain( CStringA( m_busnumber ) ); bus->start( CStringA(m_busnumber)); m_applist.ResetContent(); UpdateData(FALSE); } void CHorlogeDlg::OnApplicationConnected(IvyApplication *app) { m_applist.AddString( CString(app->GetName()) ); } void CHorlogeDlg::OnApplicationDisconnected(IvyApplication *app) { m_applist.DeleteString(m_applist.FindString(0, CString(app->GetName())) ); } void CHorlogeDlg::OnDblclkApplist() { CString name; int sel = m_applist.GetCurSel(); m_applist.GetText( sel, name ); IvyApplication *app = bus->GetApplication( CStringA(name) ); if ( app ) { bus->SendDieMsg(app); m_applist.DeleteString( sel ); } } void CHorlogeDlg::IvyClockEvent( IvyApplication *app, int argc, const char **argv ) { // Ivy ClockEvent Time=10:23:45 Rate=3 Bs=0 current_time.wHour = atoi( *argv++ ); current_time.wMinute = atoi( *argv++ ); current_time.wSecond = atoi( *argv++ ); rate = atof( *argv++ ); int BigSpeed = atoi( *argv++ ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); m_Speed.Format(TEXT("%.2f"), rate ); m_big_speed = BigSpeed; m_setTime.SetTime(¤t_time); CTime cur_time( current_time ); CTime sta_time( start_time ); CTimeSpan span = cur_time - sta_time; file_progress.SetPos( span.GetTotalSeconds() ); TRACE("CHorlogeDlg::IvyClockEvent %d\n", span.GetTotalSeconds() ); UpdateData(FALSE); } void CHorlogeDlg::IvyFileReadEvent( IvyApplication *app, int argc, const char **argv ) { // Ivy FileReadEvent Type=REJEU Name=/home/fcolin/asterix/EAF3534D.rej StartTime=19:57:00 EndTime=20:09:59 const char* name = *argv++; int hh_start = atoi( *argv++ ); int mm_start = atoi( *argv++ ); int ss_start = atoi( *argv++ ); int hh_end = atoi( *argv++ ); int mm_end = atoi( *argv++ ); int ss_end = atoi( *argv++ ); start_time.wHour = hh_start; start_time.wMinute = mm_start; start_time.wSecond = ss_start; current_time = start_time; long start = (( hh_start * 60 ) + mm_start ) * 60 + ss_start; long end = (( hh_end * 60 ) + mm_end ) * 60 + ss_end; TRACE("CHorlogeDlg::IvyFileReadEvent range 0 %d\n", end - start ); file_progress.SetRange32(0, end - start ); file_progress.SetStep( 1 ); file_progress.SetPos( 0 ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); VERIFY(m_setTime.SetTime(¤t_time)); m_filename = name; bus->SendMsg("SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); UpdateData(FALSE); } void CHorlogeDlg::IvyRejeuReady( IvyApplication *app, int argc, const char **argv ) { bus->SendMsg("GetClockDatas"); } void CHorlogeDlg::OnPause() { bus->SendMsg("ClockPause"); } void CHorlogeDlg::OnStart() { bus->SendMsg("ClockStart"); } void CHorlogeDlg::OnBackward() { rate -= 0.5; m_Speed.Format(TEXT("%.2f"), rate ); bus->SendMsg("SetClock Rate=%.2f",rate); } void CHorlogeDlg::OnForward() { rate += 0.5; m_Speed.Format(TEXT("%.2f"), rate ); bus->SendMsg("SetClock Rate=%.2f",rate); } void CHorlogeDlg::OnNormalSpeed() { rate = 1.0; m_Speed.Format(TEXT("%.2f"), rate ); bus->SendMsg("SetClock Rate=%.2f",rate); m_speed_spin.SetPos( 0 ); } void CHorlogeDlg::OnDatetimechangeSettime(NMHDR* pNMHDR, LRESULT* pResult) { m_setTime.GetTime(¤t_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); *pResult = 0; } void CHorlogeDlg::OnBack5() { CTime new_time( current_time ); new_time -= CTimeSpan( 0, 0, 5, 0 ); new_time. GetAsSystemTime(current_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); } void CHorlogeDlg::OnBack2() { CTime new_time( current_time ); new_time -= CTimeSpan( 0, 0, 2, 0 ); new_time. GetAsSystemTime(current_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); } void CHorlogeDlg::OnBack1() { CTime new_time( current_time ); new_time -= CTimeSpan( 0, 0, 1, 0 ); new_time. GetAsSystemTime(current_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); } void CHorlogeDlg::OnForw1() { CTime new_time( current_time ); new_time += CTimeSpan( 0, 0, 1, 0 ); new_time. GetAsSystemTime(current_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); } void CHorlogeDlg::OnForw2() { CTime new_time( current_time ); new_time += CTimeSpan( 0, 0, 2, 0 ); new_time. GetAsSystemTime(current_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); } void CHorlogeDlg::OnForw5() { CTime new_time( current_time ); new_time += CTimeSpan( 0, 0, 5, 0 ); new_time. GetAsSystemTime(current_time); bus->SendMsg( "SetClock Time=%d:%d:%d", current_time.wHour, current_time.wMinute, current_time.wSecond ); m_Time.Format(TEXT("%02d:%02d:%02d"), current_time.wHour, current_time.wMinute, current_time.wSecond); } void CHorlogeDlg::OnFile() { CFileDialog file(TRUE,TEXT(".rej"),NULL, OFN_FILEMUSTEXIST,TEXT("Rejeu Files (*.rej;*.txt)|*.rej; *.txt|All Files (*.*)|*.*||")); if ( file.DoModal() == IDOK ) { bus->SendMsg( "FileRead Type=rejeu Name=%S", file.GetPathName() ); } } void CHorlogeDlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR); if ( rate <= 0.5 && pNMUpDown->iDelta < 0 ) { *pResult = 1; } else { rate += 0.5 * pNMUpDown->iDelta; m_Speed.Format(TEXT("%.2f"), rate ); bus->SendMsg("SetClock Rate=%.2f",rate); *pResult = 0; } }