00001
00002
00003
00004
00005 #include "MFCBase.h"
00006 #include "LogWndFrame.h"
00007 #include "LogWndView.h"
00008
00009
00010 #ifdef _DEBUG
00011 #define new DEBUG_NEW
00012 #endif
00013
00014
00015 using namespace jbxl;
00016 using namespace jbxwl;
00017
00018
00019 IMPLEMENT_DYNCREATE(CLogWndView, CExTextView)
00020
00021
00022 CLogWndView::CLogWndView()
00023 {
00024
00025
00026 pFrame = NULL;
00027 pDoc = NULL;
00028 Title = _T("");
00029
00030 m_FontSizeX = 0;
00031 m_FontSizeY = 0;
00032 m_DocLastPos = 0;
00033
00034 m_msx = m_msy = 0;
00035 m_mex = m_mey = 0;
00036 m_mpress = FALSE;
00037 m_dragsx = 0;
00038 m_dragsy = 0;
00039 m_dragex = 0;
00040 m_dragey = 0;
00041
00042 m_copysy = -1;
00043 m_copyey = -1;
00044 m_locked = FALSE;
00045
00046 KanjiCode = CODE_SJIS;
00047
00048
00049 }
00050
00051
00052
00053 CLogWndView::~CLogWndView()
00054 {
00055 DEBUG_INFO("DESTRUCTOR: CLogWndView: START\n");
00056
00057 while(m_locked) ::Sleep(10);
00058
00059 DEBUG_INFO("DESTRUCTOR: CLogWndView: END\n");
00060 }
00061
00062
00063
00064 BEGIN_MESSAGE_MAP(CLogWndView, CExTextView)
00065 ON_WM_CREATE()
00066 ON_WM_DESTROY()
00067 ON_WM_LBUTTONDOWN()
00068 ON_WM_LBUTTONUP()
00069 ON_WM_MOUSEMOVE()
00070 ON_WM_ERASEBKGND()
00071 ON_WM_SIZE()
00072 END_MESSAGE_MAP()
00073
00074
00075
00076 BOOL CLogWndView::PreCreateWindow(CREATESTRUCT& cs)
00077 {
00078 CSize sizeTotal(100, 100);
00079 CSize sizeLine(m_FontSizeX, m_FontSizeY);
00080 CSize sizePage(m_FontSizeX, m_FontSizeY*LINES_PER_PAGE);
00081 SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
00082
00083 BOOL ret = CScrollView::PreCreateWindow(cs);
00084 return ret;
00085 }
00086
00087
00088
00089 BOOL CLogWndView::OnEraseBkgnd(CDC* pDC)
00090 {
00091 return CExTextView::OnEraseBkgnd(pDC);
00092 }
00093
00094
00095
00096 void CLogWndView::OnSize(UINT nType, int cx, int cy)
00097 {
00098 CExTextView::OnSize(nType, cx, cy);
00099 }
00100
00101
00102
00103 void CLogWndView::OnDraw(CDC* pDC)
00104 {
00105 if (pDoc==NULL) pDoc = GetDocument();
00106 if (!pDoc || pDoc->ringBuffer==NULL) return;
00107
00108 CLogRingBuffer* pRB = pDoc->ringBuffer;
00109 if (pRB->getMaxLineY()==0) return;
00110
00111 CSingleLock lock(&(pDoc->criticalKey));
00112 lock.Lock();
00113 while (!lock.IsLocked()) {
00114 Sleep(100);
00115 lock.Lock();
00116 }
00117
00118 resetScrollSize();
00119
00120 CFont* pOldFontX = pDC->SelectObject(&m_ScreenFont);
00121 CRect rc;
00122 pDC->GetClipBox(&rc);
00123
00124 int nLineBegin = rc.top/m_FontSizeY;
00125 int nLineEnd = min((rc.bottom+m_FontSizeY-1)/m_FontSizeY, pRB->getMaxLineY());
00126
00127 for (int i=nLineBegin; i<nLineEnd; i++) {
00128 Buffer buf = pRB->getRingBuffer(i);
00129 if (buf.buf==NULL) break;
00130
00131 if (i>=m_copysy && i<=m_copyey) {
00132 pDC->SetBkColor(RGB(200,200,200));
00133 }
00134 else {
00135 pDC->SetBkColor(RGB(255,255,255));
00136 }
00137
00138 if (buf.state==LOG_RB_WARNING) {
00139 pDC->SetTextColor(RGB(20,20,200));
00140 }
00141 else if (buf.state==LOG_RB_ERROR) {
00142 pDC->SetTextColor(RGB(200,20,20));
00143 }
00144 else if (buf.state==LOG_RB_DEBUG) {
00145 pDC->SetTextColor(RGB(20,150,20));
00146 }
00147 else if (buf.state==LOG_RB_INFO) {
00148 pDC->SetTextColor(RGB(20,150,150));
00149 }
00150 else {
00151 pDC->SetTextColor(RGB(0,0,0));
00152 }
00153
00154
00155 CString outtext = mbs2ts((char*)buf.buf);
00156 pDC->TextOut(DISPLAY_MARGIN, i*m_FontSizeY+DISPLAY_MARGIN, (LPCTSTR)outtext);
00157 free_Buffer(&buf);
00158 }
00159
00160 setScrollPosition(pDC, pRB);
00161
00162 lock.Unlock();
00163
00164 pDC->SelectObject(pOldFontX);
00165 }
00166
00167
00168
00169 void CLogWndView::setScrollPosition(CDC* pDC, CLogRingBuffer* pRB)
00170 {
00171 int lastPos = pRB->getLastPosition();
00172 if (m_DocLastPos==lastPos) return;
00173 m_DocLastPos = lastPos;
00174
00175 CRect rc;
00176 GetClientRect(&rc);
00177
00178 POINT pt;
00179 pt.x = 0;
00180 pt.y = (lastPos+1)*m_FontSizeY - rc.bottom + rc.top;
00181 if (pt.y<0) pt.y = 0;
00182
00183 ScrollToPosition(pt);
00184 }
00185
00186
00187
00188 void CLogWndView::resetScrollSize()
00189 {
00190 if (pDoc==NULL) pDoc = GetDocument();
00191 if (!pDoc || !pDoc->ringBuffer) return;
00192 CLogRingBuffer* pRB = pDoc->ringBuffer;
00193 if (pRB->getMaxLineY()==0 || pRB->getMaxLineX()==0) return;
00194
00195 int scrollSizeX = m_FontSizeX*pRB->getMaxLineX() + DISPLAY_MARGIN;
00196 int scrollSizeY = m_FontSizeY*pRB->getMaxLineY() + DISPLAY_MARGIN;
00197
00198
00199 if (scrollSizeX!=m_ScrollSizeX || scrollSizeY!=m_ScrollSizeY) {
00200 m_ScrollSizeX = scrollSizeX;
00201 m_ScrollSizeY = scrollSizeY;
00202
00203 CSize sizeTotal(m_ScrollSizeX, m_ScrollSizeY);
00204 CSize sizeLine(m_FontSizeX, m_FontSizeY);
00205 CSize sizePage(m_FontSizeX, m_FontSizeY*LINES_PER_PAGE);
00206
00207 SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
00208 }
00209
00210 return;
00211 }
00212
00213
00214
00215 void CLogWndView::OnInitialUpdate()
00216 {
00217 CExTextView::OnInitialUpdate();
00218
00219 if (pDoc==NULL) pDoc = GetDocument();
00220 if (!pDoc || pDoc->ringBuffer==NULL) return;
00221 CLogRingBuffer* pRB = pDoc->ringBuffer;
00222
00223 CClientDC dc(this);
00224 TEXTMETRIC tm;
00225 dc.GetTextMetrics(&tm);
00226
00227 m_FontSizeX = dc.GetTextExtent(CString('0', 1)).cx;
00228 m_FontSizeY = tm.tmHeight + tm.tmExternalLeading;
00229
00230 m_ScrollSizeX = m_FontSizeX + DISPLAY_MARGIN;
00231 m_ScrollSizeY = m_FontSizeY + DISPLAY_MARGIN;
00232
00233
00234 CSize sizeTotal(m_ScrollSizeX+2, m_ScrollSizeY);
00235 CSize sizeLine(m_FontSizeX, m_FontSizeY);
00236 CSize sizePage(m_FontSizeX, m_FontSizeY*LINES_PER_PAGE);
00237
00238 SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
00239
00240 return;
00241 }
00242
00243
00244
00245 void CLogWndView::clearViewDoc()
00246 {
00247 if (pDoc==NULL) pDoc = GetDocument();
00248 if (!pDoc || pDoc->ringBuffer==NULL) return;
00249 CLogRingBuffer* pRB = pDoc->ringBuffer;
00250
00251 CSingleLock lock(&(pDoc->criticalKey));
00252 lock.Lock();
00253 while (!lock.IsLocked()) {
00254 Sleep(100);
00255 lock.Lock();
00256 }
00257
00258 m_ScrollSizeX = m_FontSizeX + DISPLAY_MARGIN;
00259 m_ScrollSizeY = m_FontSizeY + DISPLAY_MARGIN;
00260
00261
00262 CSize sizeTotal(m_ScrollSizeX+2, m_ScrollSizeY);
00263 CSize sizeLine(m_FontSizeX, m_FontSizeY);
00264 CSize sizePage(m_FontSizeX, m_FontSizeY*LINES_PER_PAGE);
00265
00266 SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
00267
00268 POINT pt;
00269 pt.x = 0;
00270 pt.y = 0;
00271
00272 ScrollToPosition(pt);
00273
00274 pDoc->clear();
00275
00276 InvalidateRect(NULL, TRUE);
00277
00278 lock.Unlock();
00279 }
00280
00281
00282
00283 void CLogWndView::SetTitle(LPCTSTR title)
00284 {
00285 this->Title = title;
00286 pFrame->Title = title;
00287 pFrame->SetTitle(title);
00288 pFrame->SetWindowText(title);
00289 pDoc->SetTitle(title);
00290
00291 return;
00292 }
00293
00294
00295
00296 #ifdef _DEBUG
00297
00298 void CLogWndView::AssertValid() const
00299 {
00300 CScrollView::AssertValid();
00301 }
00302
00303
00304
00305 void CLogWndView::Dump(CDumpContext& dc) const
00306 {
00307 CScrollView::Dump(dc);
00308 }
00309
00310
00311
00312 CLogWndDoc* CLogWndView::GetDocument() const
00313 {
00314 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLogWndDoc)));
00315 return (CLogWndDoc*)m_pDocument;
00316 }
00317
00318
00319 #endif //_DEBUG
00320
00321
00322
00323
00325
00326
00327
00328 int CLogWndView::OnCreate(LPCREATESTRUCT lpcs)
00329 {
00330 if (CScrollView::OnCreate(lpcs)==-1) return -1;
00331
00332 CString fname, fsize;
00333 fname.LoadString(IDS_STR_FONT_GOTHIC);
00334 fsize.LoadString(IDS_STR_FONT_SIZE);
00335 int sz = ttoi(fsize);
00336
00337 CClientDC dc(this);
00338 m_ScreenFont.CreatePointFont(sz, (LPCTSTR)fname, &dc);
00339
00340
00341 OnInitialUpdate();
00342 return 0;
00343 }
00344
00345
00346
00347 void CLogWndView::OnDestroy(void)
00348 {
00349 m_ScreenFont.DeleteObject();
00350 CScrollView::OnDestroy();
00351 }
00352
00353
00354
00355
00357
00358
00359 void CLogWndView::OnLButtonDown(UINT nFlags, CPoint point)
00360 {
00361 CPoint scrlpos = GetScrollPosition();
00362 m_msx = point.x + scrlpos.x;
00363 m_msy = point.y + scrlpos.y;
00364
00365 m_dragsx = m_msx/m_FontSizeX;
00366 m_dragsy = m_msy/m_FontSizeY;
00367 m_mpress = TRUE;
00368
00369
00370 CRect rc;
00371 GetClientRect(&rc);
00372 if (point.x>=rc.left && point.x<=rc.right && point.y>rc.top && point.y<=rc.bottom) {
00373 m_copysy = -1;
00374 m_copyey = -1;
00375 InvalidateRect(NULL, FALSE);
00376 }
00377
00378 CScrollView::OnLButtonDown(nFlags, point);
00379 }
00380
00381
00382
00383 void CLogWndView::OnLButtonUp(UINT nFlags, CPoint point)
00384 {
00385 m_mpress = FALSE;
00386
00387 CScrollView::OnLButtonUp(nFlags, point);
00388 }
00389
00390
00391
00392 void CLogWndView::OnMouseMove(UINT nFlags, CPoint point)
00393 {
00394 if (m_mpress) {
00395 CPoint scrlpos = GetScrollPosition();
00396 m_mex = point.x + scrlpos.x;
00397 m_mey = point.y + scrlpos.y;
00398 m_dragex = m_mex/m_FontSizeX;
00399 m_dragey = m_mey/m_FontSizeY;
00400
00401 if (m_dragsx!=m_dragex || m_dragsy!=m_dragey) {
00402 m_copysy = m_dragsy;
00403 m_copyey = m_dragey;
00404 InvalidateRect(NULL, FALSE);
00405 }
00406 }
00407
00408 CScrollView::OnMouseMove(nFlags, point);
00409 }
00410
00411
00412
00413 CString CLogWndView::getCopyData(void)
00414 {
00415 CString ret = _T("");
00416 if (m_copysy<0 || m_copysy>m_copyey) return ret;
00417
00418 CLogWndDoc* pdoc = GetDocument();
00419 if (!pdoc || !pdoc->ringBuffer) return ret;
00420 CLogRingBuffer* pRB = pdoc->ringBuffer;
00421
00422 for (int i=m_copysy; i<=m_copyey; i++) {
00423 Buffer buf = dup_Buffer(pRB->pBuf[i]);
00424 if (pRB->getKindData(i)!=LOG_RB_BINARY_DATA) {
00425 if (buf.buf[buf.vldsz-1]!='\n') cat_s2Buffer("\n", &buf);
00426 }
00427
00428 ret = ret + mbs2ts((char*)buf.buf);
00429 free_Buffer(&buf);
00430 }
00431
00432 return ret;
00433 }
00434
00435
00436
00437
00438
00439
00440 BOOL CLogWndView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
00441 {
00442 SCROLLINFO info;
00443 info.cbSize = sizeof(SCROLLINFO);
00444 info.fMask = SIF_TRACKPOS;
00445
00446 if (LOBYTE(nScrollCode)==SB_THUMBTRACK)
00447 {
00448 GetScrollInfo(SB_HORZ, &info);
00449 nPos = info.nTrackPos;
00450 }
00451
00452 if (HIBYTE(nScrollCode)==SB_THUMBTRACK)
00453 {
00454 GetScrollInfo(SB_VERT, &info);
00455 nPos = info.nTrackPos;
00456 }
00457
00458 return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
00459 }
00460