ControlFavorites.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:6k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // ControlFavorites.cpp: implementation of the CControlFavorites class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "resource.h"
  22. #include "ControlFavorites.h"
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char THIS_FILE[]=__FILE__;
  26. #define new DEBUG_NEW
  27. #endif
  28. IMPLEMENT_XTP_CONTROL(CControlFavorites, CXTPControlButton)
  29. CControlFavorites::CControlFavorites(LPCTSTR strRootDir)
  30. {
  31. m_strRootDir = strRootDir;
  32. }
  33. void CControlFavorites::Copy(CXTPControl* pControl, BOOL bRecursive)
  34. {
  35. ASSERT(DYNAMIC_DOWNCAST(CControlFavorites, pControl));
  36. CXTPControlButton::Copy(pControl, bRecursive);
  37. m_strRootDir = ((CControlFavorites*)pControl)->m_strRootDir;
  38. }
  39. void CControlFavorites::DoPropExchange(CXTPPropExchange* pPX)
  40. {
  41. CXTPControlButton::DoPropExchange(pPX);
  42. PX_String(pPX, _T("RootDir"), m_strRootDir);
  43. }
  44. void CControlFavorites::OnCalcDynamicSize(DWORD /*dwMode*/)
  45. {
  46. if (GetParent()->GetType() !=xtpBarTypePopup)
  47. return;
  48. ASSERT(m_pControls->GetAt(m_nIndex) == this);
  49. while (m_nIndex + 1 < m_pControls->GetCount())
  50. {
  51. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1);
  52. if (
  53. pControl->GetID() == ID_FAVORITE_LINK ||
  54. pControl->GetID() == ID_FAVORITE_FOLDER)
  55. {
  56. m_pControls->Remove(pControl);
  57. }
  58. else break;
  59. }
  60. if (m_pParent->IsCustomizeMode())
  61. {
  62. m_dwHideFlags = 0;
  63. return;
  64. }
  65. m_dwHideFlags |= xtpHideGeneric;
  66. //CString         strPath2;
  67. CString         str;
  68. WIN32_FIND_DATA wfd;
  69. HANDLE          h;
  70. int             nPos = 0;
  71. int             nEndPos = 0;
  72. #define INTERNET_MAX_PATH_LENGTH 2048
  73. TCHAR           buf[INTERNET_MAX_PATH_LENGTH];
  74. CStringArray    astrFavorites;
  75. CStringArray    astrFavoritesUrl;
  76. CStringArray    astrDirs;
  77. // make sure there's a trailing backslash
  78. if(m_strRootDir[m_strRootDir.GetLength() - 1] != _T('\'))
  79. m_strRootDir += _T('\');
  80. int nStartPos = m_nIndex + 1;
  81. // now scan the directory, first for .URL files and then for subdirectories
  82. // that may also contain .URL files
  83. h = FindFirstFile(m_strRootDir + _T("*.*"), &wfd);
  84. if(h != INVALID_HANDLE_VALUE)
  85. {
  86. nEndPos = nStartPos;
  87. do
  88. {
  89. if((wfd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
  90. {
  91. str = wfd.cFileName;
  92. if(str.Right(4).CompareNoCase(_T(".url")) == 0)
  93. {
  94. // an .URL file is formatted just like an .INI file, so we can
  95. // use GetPrivateProfileString() to get the information we want
  96. ::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"),
  97. _T(""), buf, INTERNET_MAX_PATH_LENGTH,
  98. m_strRootDir + str);
  99. str = str.Left(str.GetLength() - 4);
  100. // scan through the array and perform an insertion sort
  101. // to make sure the menu ends up in alphabetic order
  102. for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
  103. {
  104. if(str.CompareNoCase(astrFavorites[nPos]) < 0)
  105. break;
  106. }
  107. astrFavorites.InsertAt(nPos, str);
  108. astrFavoritesUrl.InsertAt(nPos, buf);
  109. ++nEndPos;
  110. }
  111. }
  112. } while(FindNextFile(h, &wfd));
  113. FindClose(h);
  114. BOOL bBeginGroup  = GetBeginGroup();
  115. // Now add these items to the menu
  116. for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
  117. {
  118. CXTPControlButton* pControl = (CXTPControlButton*)m_pControls->Add(xtpControlButton, ID_FAVORITE_LINK, astrFavoritesUrl[nPos], nPos, TRUE);
  119. pControl->SetCaption(astrFavorites[nPos]);
  120. pControl->SetTooltip(astrFavoritesUrl[nPos]);
  121. pControl->SetDescription(astrFavoritesUrl[nPos]);
  122. pControl->SetFlags(xtpFlagManualUpdate);
  123. pControl->SetStyle(xtpButtonIconAndCaption);
  124. }
  125. // now that we've got all the .URL files, check the subdirectories for more
  126. int nLastDir = 0;
  127. h = FindFirstFile(m_strRootDir + _T("*.*"), &wfd);
  128. ASSERT(h != INVALID_HANDLE_VALUE);
  129. do
  130. {
  131. if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  132. {
  133. // ignore the current and parent directory entries
  134. if(lstrcmp(wfd.cFileName, _T(".")) == 0 || lstrcmp(wfd.cFileName, _T("..")) == 0)
  135. continue;
  136. for(nPos = 0 ; nPos < nLastDir ; ++nPos)
  137. {
  138. if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
  139. break;
  140. }
  141. CXTPControlPopup* pControl = (CXTPControlPopup*)m_pControls->Add(xtpControlButtonPopup, ID_FAVORITE_FOLDER, _T(""), nStartPos + nPos, TRUE);
  142. CXTPControls* pChildControls = pControl->GetCommandBar()->GetControls();
  143. pChildControls->Add(new CControlFavorites(m_strRootDir + wfd.cFileName), 0);
  144. pControl->SetCaption(wfd.cFileName);
  145. pControl->SetFlags(xtpFlagManualUpdate);
  146. astrDirs.InsertAt(nPos, wfd.cFileName);
  147. ++nLastDir;
  148. }
  149. } while(FindNextFile(h, &wfd));
  150. FindClose(h);
  151. if (nEndPos != nStartPos || nLastDir != 0)
  152. {
  153. CXTPControl* pControlFirst = m_pControls->GetAt(m_nIndex + 1);
  154. if (pControlFirst) pControlFirst->SetBeginGroup(bBeginGroup);
  155. }
  156. }
  157. }
  158. BOOL CControlFavorites::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
  159. {
  160. if (pCommandBar->GetType() != xtpBarTypePopup)
  161. {
  162. dropEffect = DROPEFFECT_NONE;
  163. return FALSE;
  164. }
  165. return TRUE;
  166. }