215 lines
4.5 KiB
C++
215 lines
4.5 KiB
C++
|
// LogEdit.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "LogEdit.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
/*************************************************************************
|
||
|
FILE : LogEdit.cpp Version 1.0
|
||
|
|
||
|
Author : Ranojay Sen (sen_ranojay@email.com)
|
||
|
|
||
|
Description: CLogEdit is a CEdit derived class and runs on MS-Windows
|
||
|
|
||
|
CLogEdit class can be used very easily for the
|
||
|
purpose of logging data by any application or any
|
||
|
Hardware. The automatic scrolling and updating the
|
||
|
Cursor position to the end of the line are the main
|
||
|
features of this class. this code can be modified by
|
||
|
profesional programmers to serve their specific needs
|
||
|
|
||
|
|
||
|
Copyright(c) 2008
|
||
|
by Ranojay Sen (sen_ranojay@email.com)
|
||
|
|
||
|
This code may be used in compiled form in any way you desire. This
|
||
|
file may be redistributed unmodified by any means PROVIDING it is
|
||
|
not sold for profit without the authors written consent, and
|
||
|
providing that this notice and the authors name is included. If
|
||
|
the source code in this file is used in any commercial application
|
||
|
then a simple email to the author would be nice.
|
||
|
|
||
|
This file is provided "as is" with no expressed or implied warranty.
|
||
|
The author accepts no liability if it causes any damage.
|
||
|
|
||
|
*************************************************************************/
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CLogEdit
|
||
|
|
||
|
CLogEdit::CLogEdit()
|
||
|
{
|
||
|
m_maxLineCount = 1000;
|
||
|
flag=1;
|
||
|
PromptStr="Prompt::";
|
||
|
}
|
||
|
|
||
|
CLogEdit::~CLogEdit()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CLogEdit, CEdit)
|
||
|
//{{AFX_MSG_MAP(CLogEdit)
|
||
|
ON_WM_SETFOCUS()
|
||
|
ON_WM_CHAR()
|
||
|
ON_WM_LBUTTONDBLCLK()
|
||
|
ON_WM_LBUTTONDOWN()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CLogEdit message handlers
|
||
|
|
||
|
int CLogEdit::Trace(TCHAR *szString, ...)
|
||
|
{
|
||
|
va_list args;
|
||
|
va_start(args, szString);
|
||
|
|
||
|
int nrs = _Trace(szString, args);
|
||
|
|
||
|
va_end(args);
|
||
|
return nrs;
|
||
|
}
|
||
|
|
||
|
int CLogEdit::_Trace(TCHAR *szFormat, va_list args)
|
||
|
{
|
||
|
int nrs;
|
||
|
DWORD dwWrite=0;
|
||
|
SYSTEMTIME sysTime={0};
|
||
|
TCHAR szHead[1024*10] = {0,};
|
||
|
TCHAR szBuffer[1024*10] = {0,};
|
||
|
|
||
|
GetLocalTime(&sysTime);
|
||
|
|
||
|
nrs = _vsntprintf(szBuffer, sizeof szBuffer, szFormat, args);
|
||
|
|
||
|
if(szBuffer[nrs-1] == 0x0D || szBuffer[nrs-1] == 0x0A)
|
||
|
{
|
||
|
szBuffer[nrs-1] = 0x0D;
|
||
|
szBuffer[nrs] = 0x0A;
|
||
|
szBuffer[++nrs] = 0;
|
||
|
}
|
||
|
|
||
|
dwWrite = wsprintf(szHead, TEXT("[%d-%02d-%02d %02d:%02d:%02d] %s"), sysTime.wYear, sysTime.wMonth, sysTime.wDay
|
||
|
, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, szBuffer);
|
||
|
|
||
|
InsertLines(szHead, FALSE);
|
||
|
|
||
|
return nrs;
|
||
|
}
|
||
|
|
||
|
void CLogEdit::RemoveTopLine(CString& message)
|
||
|
{
|
||
|
INT32 pos = message.Find(L"\r\n", 0);
|
||
|
if(pos >= 0) {
|
||
|
message = message.Right(message.GetLength() - (pos + 2));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CLogEdit::GetLineCountProxy(CString message)
|
||
|
{
|
||
|
INT32 iStart = 0;
|
||
|
INT32 pos;
|
||
|
INT32 count = 0;
|
||
|
|
||
|
do {
|
||
|
pos = message.Find(L"\r\n", iStart);
|
||
|
count++;
|
||
|
if(pos >= 0)
|
||
|
iStart = pos + 1;
|
||
|
} while(pos >= 0);
|
||
|
|
||
|
//TRACE("LINE COUNT : %d\n", count);
|
||
|
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
void CLogEdit::InsertLines(CString Line,BOOL st)
|
||
|
{
|
||
|
CString wndtext;
|
||
|
//GetWindowText ( wndtext );
|
||
|
wndtext = m_strLogs;
|
||
|
int text_length = wndtext.GetLength() ;
|
||
|
if( text_length <=1)
|
||
|
{
|
||
|
if(!st)
|
||
|
wndtext = wndtext + Line ;
|
||
|
else
|
||
|
wndtext = wndtext + PromptStr + Line ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(!st)
|
||
|
wndtext = wndtext +"\r\n"+ Line ;
|
||
|
else
|
||
|
wndtext = wndtext + "\r\n"+PromptStr + Line ;
|
||
|
}
|
||
|
|
||
|
int cnt = GetLineCountProxy(wndtext);
|
||
|
if(cnt > m_maxLineCount)
|
||
|
RemoveTopLine(wndtext);
|
||
|
m_strLogs = wndtext;
|
||
|
CWnd *pParent = AfxGetMainWnd();
|
||
|
if(pParent)
|
||
|
pParent->PostMessage(WM_TBD_UPDATE_LOG, 0, 0);
|
||
|
// SetWindowText ( wndtext );
|
||
|
|
||
|
// LineScroll ( GetLineCount(), 0x0 );
|
||
|
// UpdateCaretPos();
|
||
|
|
||
|
}
|
||
|
|
||
|
void CLogEdit::UpdateLogsToEdit()
|
||
|
{
|
||
|
SetWindowText(m_strLogs);
|
||
|
LineScroll (GetLineCount(), 0x0);
|
||
|
}
|
||
|
|
||
|
void CLogEdit::UpdateCaretPos()
|
||
|
{
|
||
|
for ( int i = 0 ; i < GetLineCount() ; i++ )
|
||
|
SendMessage( WM_KEYDOWN, VK_DOWN , 0x0 ) ;
|
||
|
for ( int i = 0 ; i < LineLength( GetLineCount() - 1 ) ; i++ )
|
||
|
SendMessage( WM_KEYDOWN, VK_RIGHT , 0x0 ) ;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CLogEdit::OnSetFocus(CWnd* pOldWnd)
|
||
|
{
|
||
|
CEdit::OnSetFocus(pOldWnd);
|
||
|
|
||
|
if(flag==1)
|
||
|
{
|
||
|
flag = 0;
|
||
|
//InsertLines("Log Edit Demo Version 1.0 Feb-2008",FALSE);
|
||
|
}
|
||
|
UpdateCaretPos();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CLogEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
UpdateCaretPos();
|
||
|
return;
|
||
|
// CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CLogEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
UpdateCaretPos();
|
||
|
}
|
||
|
|
||
|
void CLogEdit::OnLButtonDown(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
UpdateCaretPos();
|
||
|
|
||
|
}
|