undolist.cpp
上传用户:lj3531212
上传日期:2007-06-18
资源大小:346k
文件大小:4k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // UndoList.cpp : 
  2. //
  3. #include "stdafx.h"
  4. #include "GraphSoft.h"
  5. #include "UndoList.h"
  6. #include "Und_Base.h"
  7. #include "CoreLog.h"
  8. #include "Core.h"
  9. #include "UndoDlg.h"
  10. #include "GraphSoftView.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CUndoList
  18. CUndoList::CUndoList()
  19. {
  20. m_pParentDlg = NULL;
  21. m_nPos = -1;
  22. m_nToolTip = -1;
  23. m_bToolTip = false;
  24. m_pToolTip = NULL;
  25. }
  26. CUndoList::~CUndoList()
  27. {
  28. if (m_pToolTip != NULL)
  29. delete m_pToolTip;
  30. }
  31. BEGIN_MESSAGE_MAP(CUndoList, CListBox)
  32. //{{AFX_MSG_MAP(CUndoList)
  33. ON_WM_MOUSEMOVE()
  34. ON_WM_LBUTTONDOWN()
  35. ON_CONTROL_REFLECT(LBN_SELCHANGE, OnSelchange)
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CUndoList
  40. void CUndoList::SetContents()
  41. {
  42. ResetContent();
  43. if(m_pToolTip) delete m_pToolTip ;
  44. m_nPos = -1;
  45. m_nToolTip = -1;
  46. m_bToolTip = false;
  47. m_pToolTip = NULL;
  48. CCoreLog* pLog = m_pCore->GetCoreLog();
  49. // Undo/Redo
  50. if (m_nID == ID_EDIT_UNDO) {
  51. for (long int nUndoUndo = pLog->m_nUndoUndo-1; nUndoUndo >= 0; nUndoUndo--) {
  52. CUND_Base* pUndBase = pLog->m_undoInfo[nUndoUndo];
  53. AddString(pUndBase->GetTitle());
  54. }
  55. }
  56. else if (m_nID == ID_EDIT_REDO) {
  57. for (long int nUndoUndo = pLog->m_nUndoUndo; nUndoUndo < pLog->m_nUndoInfo; nUndoUndo++) {
  58. CUND_Base* pUndBase = pLog->m_undoInfo[nUndoUndo];
  59. AddString(pUndBase->GetTitle());
  60. }
  61. }
  62. // 
  63. if (m_pToolTip == NULL) {
  64. m_pToolTip = new CToolTipCtrl;
  65. if (m_pToolTip->Create(this)) {
  66. m_pToolTip->AddTool(this, "");
  67. // 
  68. m_pToolTip->SetDelayTime(TTDT_INITIAL, 100); // 100ms
  69. m_pToolTip->SetDelayTime(TTDT_AUTOPOP, 1000*10); // 10s
  70. m_pToolTip->SetDelayTime(TTDT_RESHOW, 100); // 100ms
  71. }
  72. }
  73. }
  74. void CUndoList::OnMouseMove(UINT nFlags, CPoint point) 
  75. BOOL bOutside;
  76. long int nPos = this->ItemFromPoint(point, bOutside);
  77. if (! bOutside) {
  78. SetPos(nPos);
  79. if (m_pToolTip != NULL) {
  80. if (m_nToolTip != m_nPos) {
  81. m_nToolTip = m_nPos;
  82. m_bToolTip = false;
  83. CRect rect ;
  84. GetClientRect(&rect) ;
  85. long int nTextLen = GetTextLen(nPos) ;
  86. if (nTextLen > 0) {
  87. CString text;
  88. GetText(m_nToolTip, text);
  89. CFont* pFont = GetParent()->GetFont();
  90. LOGFONT logFont;
  91. pFont->GetLogFont(&logFont);
  92. CFont font;
  93. font.CreateFontIndirect(&logFont);
  94. CDC dc;
  95. dc.CreateCompatibleDC(NULL);
  96. dc.SelectObject(font);
  97. SIZE sz;
  98. ::GetTextExtentPoint32(dc.GetSafeHdc(), text, text.GetLength(), &sz);
  99. if (sz.cx > rect.Width()) {
  100. m_pToolTip->UpdateTipText(text, this);
  101. m_bToolTip = true;
  102. }
  103. }
  104. }
  105. m_pToolTip->Activate(m_bToolTip);
  106. }
  107. }
  108. CListBox::OnMouseMove(nFlags, point);
  109. }
  110. void CUndoList::OnLButtonDown(UINT nFlags, CPoint point) 
  111. {
  112.     OnUndo();
  113. CListBox::OnLButtonDown(nFlags, point);
  114. }
  115. void CUndoList::OnSelchange() 
  116. {
  117. long int nPos = GetCurSel();
  118. if (nPos != m_nPos)
  119. SetPos(nPos);
  120. }
  121. void CUndoList::OnUndo()
  122. {
  123. int i;
  124. if(m_nID == ID_EDIT_REDO){
  125. for (i = 0; i <= m_nPos; i++)
  126. m_pCore->OnEditRedo();
  127. }else if(m_nID == ID_EDIT_UNDO){
  128. for (i = 0; i <= m_nPos; i++)
  129. m_pCore->OnEditUndo();
  130. }
  131. GetParent()->PostMessage(WM_CLOSE);
  132. }
  133. void CUndoList::SetPos(long nPos)
  134. {
  135. if (m_nPos != nPos) {
  136. m_nPos = nPos;
  137. SetCurSel(m_nPos);
  138. if (m_pParentDlg != NULL) {
  139. m_pParentDlg->SetStatus(1+m_nPos);
  140. }
  141. }
  142. }
  143. BOOL CUndoList::PreTranslateMessage(MSG* pMsg) 
  144. {
  145. if (m_pToolTip != NULL)
  146. m_pToolTip->RelayEvent(pMsg);
  147. return CListBox::PreTranslateMessage(pMsg);
  148. }