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

对话框与窗口

开发平台:

Visual C++

  1. // ControlFavorites.cpp: implementation of the CControlFavoriteFolder class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "styler.h"
  6. #include "ControlFavorites.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. IMPLEMENT_XTP_CONTROL(CControlFavoriteLink, CXTPControlButton)
  13. IMPLEMENT_XTP_CONTROL(CControlFavoriteFolder, CXTPControlButton)
  14. CControlFavoriteFolder::CControlFavoriteFolder(LPCTSTR strRootDir)
  15. {
  16. m_strRootDir = strRootDir;
  17. }
  18. void CControlFavoriteFolder::Copy(CXTPControl* pControl, BOOL bRecursive)
  19. {
  20. ASSERT(DYNAMIC_DOWNCAST(CControlFavoriteFolder, pControl));
  21. CXTPControlButton::Copy(pControl, bRecursive);
  22. m_strRootDir = ((CControlFavoriteFolder*)pControl)->m_strRootDir;
  23. }
  24. void CControlFavoriteFolder::DoPropExchange(CXTPPropExchange* pPX)
  25. {
  26. CXTPControlButton::DoPropExchange(pPX);
  27. PX_String(pPX, _T("RootDir"), m_strRootDir, _T(""));
  28. }
  29. void CControlFavoriteFolder::OnCalcDynamicSize(DWORD /*dwMode*/)
  30. {
  31. if (GetParent()->GetType() !=xtpBarTypePopup)
  32. return;
  33. ASSERT(m_pControls->GetAt(m_nIndex) == this);
  34. while (m_nIndex + 1 < m_pControls->GetCount())
  35. {
  36. CXTPControl* pControl = m_pControls->GetAt(m_nIndex + 1); 
  37. if (
  38. pControl->GetID() == ID_OPENALLFOLDERITEMS ||
  39. pControl->GetID() == ID_ADDPAGEHERE ||
  40. pControl->GetID() == ID_FAVORITE_LINK ||
  41. pControl->GetID() == ID_FAVORITE_FOLDER)
  42. {
  43. m_pControls->Remove(pControl);
  44. }
  45. else break;
  46. }
  47. if (m_pParent->IsCustomizeMode())
  48. {
  49. m_dwHideFlags = 0;
  50. return;
  51. }
  52. m_dwHideFlags |= xtpHideGeneric;
  53. //CString         strPath2;
  54. CString         str;
  55. WIN32_FIND_DATA wfd;
  56. HANDLE          h;
  57. int             nPos = 0;
  58. int             nEndPos = 0;
  59. #define INTERNET_MAX_PATH_LENGTH 2048
  60. TCHAR           buf[INTERNET_MAX_PATH_LENGTH];
  61. CStringArray    astrFavorites;
  62. CStringArray    astrFavoritesUrl;
  63. CStringArray    astrDirs;
  64. CStringArray    astrFiles;
  65. // make sure there's a trailing backslash
  66. if(m_strRootDir[m_strRootDir.GetLength() - 1] != _T('\'))
  67. m_strRootDir += _T('\');
  68. int nStartPos = m_nIndex + 1;
  69. // now scan the directory, first for .URL files and then for subdirectories
  70. // that may also contain .URL files
  71. h = FindFirstFile(m_strRootDir + _T("*.*"), &wfd);
  72. if(h != INVALID_HANDLE_VALUE)
  73. {
  74. nEndPos = nStartPos;
  75. do
  76. {
  77. if((wfd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
  78. {
  79. str = wfd.cFileName;
  80. if(str.Right(4).CompareNoCase(_T(".url")) == 0)
  81. {
  82. // an .URL file is formatted just like an .INI file, so we can
  83. // use GetPrivateProfileString() to get the information we want
  84. ::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"),
  85.   _T(""), buf, INTERNET_MAX_PATH_LENGTH,
  86.   m_strRootDir + str);
  87. str = str.Left(str.GetLength() - 4);
  88. // scan through the array and perform an insertion sort
  89. // to make sure the menu ends up in alphabetic order
  90. for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
  91. {
  92. if(str.CompareNoCase(astrFavorites[nPos]) < 0)
  93. break;
  94. }
  95. astrFavorites.InsertAt(nPos, str);
  96. astrFavoritesUrl.InsertAt(nPos, buf);
  97. astrFiles.InsertAt(nPos, m_strRootDir + wfd.cFileName);
  98. ++nEndPos;
  99. }
  100. }
  101. } while(FindNextFile(h, &wfd));
  102. FindClose(h);
  103. // Now add these items to the menu
  104. for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
  105. {
  106. CControlFavoriteLink* pControl = (CControlFavoriteLink*)m_pControls->Add(new CControlFavoriteLink(), ID_FAVORITE_LINK, astrFavoritesUrl[nPos], nPos, TRUE);
  107. pControl->SetCaption(astrFavorites[nPos]);
  108. pControl->SetTooltip(astrFavoritesUrl[nPos]);
  109. pControl->SetDescription(astrFavoritesUrl[nPos]);
  110. pControl->SetFlags(xtpFlagManualUpdate | xtpFlagShowPopupBarTip);
  111. pControl->SetStyle(xtpButtonIconAndCaption);
  112. pControl->m_strFileName = astrFiles[nPos];
  113. }
  114. // now that we've got all the .URL files, check the subdirectories for more
  115. int nLastDir = 0;
  116. h = FindFirstFile(m_strRootDir + _T("*.*"), &wfd);
  117. ASSERT(h != INVALID_HANDLE_VALUE);
  118. do
  119. {
  120. if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  121. {
  122. // ignore the current and parent directory entries
  123. if(lstrcmp(wfd.cFileName, _T(".")) == 0 || lstrcmp(wfd.cFileName, _T("..")) == 0)
  124. continue;
  125. for(nPos = 0 ; nPos < nLastDir ; ++nPos)
  126. {
  127. if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
  128. break;
  129. }
  130. CXTPControlPopup* pControl = (CXTPControlPopup*)m_pControls->Add(xtpControlButtonPopup, ID_FAVORITE_FOLDER, NULL, nStartPos + nPos, TRUE);
  131. CXTPControls* pChildControls = pControl->GetCommandBar()->GetControls();
  132. pChildControls->Add(new CControlFavoriteFolder(m_strRootDir + wfd.cFileName), 0);
  133. pControl->SetCaption(wfd.cFileName);
  134. pControl->SetFlags(xtpFlagManualUpdate);
  135. astrDirs.InsertAt(nPos, wfd.cFileName);
  136. ++nLastDir;
  137. }
  138. } while(FindNextFile(h, &wfd));
  139. FindClose(h);
  140. }
  141. CXTPControl* pControlAddPageHere = m_pControls->Add(xtpControlButton, ID_ADDPAGEHERE, m_strRootDir, nStartPos, TRUE);
  142. pControlAddPageHere->SetCaption(_T("&Add page here..."));
  143. pControlAddPageHere->SetBeginGroup(GetBeginGroup());
  144. if (nStartPos != nEndPos)
  145. {
  146. CXTPControl* pControlOpenAll = m_pControls->Add(xtpControlButton, ID_OPENALLFOLDERITEMS, m_strRootDir, nStartPos + 1, TRUE);
  147. pControlOpenAll->SetCaption(_T("&Open all folder items"));
  148. pControlOpenAll->SetFlags(xtpFlagManualUpdate);
  149. m_pControls->GetAt(pControlOpenAll->GetIndex() + 1)->SetBeginGroup(TRUE);
  150. }
  151. }
  152. BOOL CControlFavoriteFolder::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect) 
  153. {
  154. if (pCommandBar->GetType() != xtpBarTypePopup)
  155. {
  156. dropEffect = DROPEFFECT_NONE;
  157. return FALSE;
  158. }
  159. return TRUE;
  160. }