oledlgs3.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_OLE2_SEG
  12. #pragma code_seg(AFX_OLE2_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. UINT CALLBACK
  20. AfxOleHookProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  21. ////////////////////////////////////////////////////////////////////////////
  22. // EditProperties dialog wrapper
  23. COlePropertiesDialog::COlePropertiesDialog(
  24. COleClientItem* pItem, UINT nScaleMin, UINT nScaleMax, CWnd* pParentWnd)
  25. : COleDialog(pParentWnd), m_xLinkInfo(NULL)
  26. {
  27. ASSERT_VALID(pItem);
  28. memset(&m_op, 0, sizeof(m_op)); // initialize structure to 0/NULL
  29. // fill in common part
  30. m_op.cbStruct = sizeof(m_op);
  31. m_op.dwFlags = 0;
  32. if (AfxHelpEnabled())
  33. m_op.dwFlags |= OPF_SHOWHELP;
  34. m_nIDHelp = AFX_IDD_OBJECTPROPERTIES;
  35. // specific to this dialog
  36. memset(&m_gp, 0, sizeof(m_gp));
  37. m_gp.cbStruct = sizeof(m_gp);
  38. m_gp.lpfnHook = AfxOleHookProc;
  39. m_gp.dwFlags = 0;
  40. memset(&m_vp, 0, sizeof(m_vp));
  41. m_vp.cbStruct = sizeof(m_vp);
  42. m_vp.lpfnHook = AfxOleHookProc;
  43. m_vp.dwFlags = 0;
  44. m_vp.nScaleMin = nScaleMin;
  45. m_vp.nScaleMax = nScaleMax;
  46. memset(&m_lp, 0, sizeof(m_lp));
  47. m_lp.cbStruct = sizeof(m_lp);
  48. m_lp.lpfnHook = AfxOleHookProc;
  49. m_lp.dwFlags = 0;
  50. m_op.lpObjInfo = &m_xOleUIObjInfo;
  51. m_op.lpLinkInfo = &m_xLinkInfo;
  52. m_op.dwLink = (DWORD)pItem;
  53. m_op.dwObject = (DWORD)pItem;
  54. m_op.lpGP = &m_gp; m_op.lpVP = &m_vp;
  55. if (pItem->GetType() == OT_LINK)
  56. {
  57. m_op.dwFlags |= OPF_OBJECTISLINK;
  58. m_op.lpLP = &m_lp;
  59. }
  60. memset(&m_psh, 0, sizeof(m_psh));
  61. m_psh.dwSize = sizeof(PROPSHEETHEADER);
  62. m_op.lpPS = &m_psh;
  63. }
  64. int COlePropertiesDialog::DoModal()
  65. {
  66. ASSERT_VALID(this);
  67. ASSERT(m_gp.lpfnHook != NULL); // can still be a user hook
  68. ASSERT(m_vp.lpfnHook != NULL); // can still be a user hook
  69. ASSERT(m_lp.lpfnHook != NULL); // can still be a user hook
  70. // disable scale if OnApplyScale not implemented
  71. if (!OnApplyScale(NULL, -1, FALSE))
  72. m_op.lpVP->dwFlags |= VPF_DISABLESCALE;
  73. // invoke the dialog
  74. m_op.lpPS->hwndParent = PreModal();
  75. int iResult = MapResult(::OleUIObjectProperties(&m_op));
  76. PostModal();
  77. return iResult;
  78. }
  79. BOOL COlePropertiesDialog::OnInitDialog()
  80. {
  81. BOOL bResult = COleDialog::OnInitDialog();
  82. // automatic centering doesn't work for this dialog
  83. if (!(GetStyle() & WS_CHILD))
  84. CenterWindow();
  85. return bResult;
  86. }
  87. STDMETHODIMP_(ULONG) COlePropertiesDialog::XOleUIObjInfo::AddRef()
  88. {
  89. return 0;
  90. }
  91. STDMETHODIMP_(ULONG) COlePropertiesDialog::XOleUIObjInfo::Release()
  92. {
  93. return 0;
  94. }
  95. STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::QueryInterface(
  96. REFIID, LPVOID*)
  97. {
  98. return E_NOTIMPL;
  99. }
  100. STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::GetObjectInfo(
  101. DWORD dwObject, DWORD* lpdwObjSize, LPTSTR* lplpszLabel,
  102. LPTSTR* lplpszType, LPTSTR* lplpszShortType, LPTSTR* lplpszLocation)
  103. {
  104. COleClientItem* pItem = (COleClientItem*)dwObject;
  105. ASSERT_VALID(pItem);
  106. BOOL bIsLink = (pItem->GetType() == OT_LINK);
  107. if (lpdwObjSize != NULL)
  108. {
  109. ASSERT(pItem->m_lpStorage != NULL);
  110. // try ILockBytes first, then IStorage
  111. STATSTG statStg;
  112. if ((pItem->m_lpLockBytes == NULL ||
  113. pItem->m_lpLockBytes->Stat(&statStg, STATFLAG_NONAME) != S_OK) &&
  114. pItem->m_lpStorage->Stat(&statStg, STATFLAG_NONAME) != S_OK)
  115. {
  116. *lpdwObjSize = 0xFFFFFFFF;
  117. }
  118. else
  119. {
  120. ASSERT(statStg.pwcsName == NULL);
  121. if (statStg.cbSize.HighPart > 0)
  122. *lpdwObjSize = 0xFFFFFFFE;
  123. else if (statStg.cbSize.LowPart == 0)
  124. *lpdwObjSize = 0xFFFFFFFF;
  125. else
  126. *lpdwObjSize = statStg.cbSize.LowPart;
  127. }
  128. }
  129. if (lplpszLabel != NULL)
  130. {
  131. TCHAR szFormatLink[128];
  132. AfxLoadString(AFX_IDS_PASTELINKEDTYPE, szFormatLink, _countof(szFormatLink));
  133. TCHAR szFormatObj[] = _T("%s");
  134. LPTSTR lpszFormat = bIsLink ? szFormatLink : szFormatObj;
  135. CString strType;
  136. pItem->GetUserType(USERCLASSTYPE_FULL, strType);
  137. CString strResult;
  138. strResult.Format(lpszFormat, (LPCTSTR)strType);
  139. *lplpszLabel = AfxAllocTaskString(strResult);
  140. }
  141. if (lplpszType != NULL)
  142. {
  143. LPOLESTR lpOleStr;
  144. pItem->m_lpObject->GetUserType(USERCLASSTYPE_FULL, &lpOleStr);
  145. *lplpszType = TASKSTRINGOLE2T(lpOleStr);
  146. }
  147. if (lplpszShortType != NULL)
  148. {
  149. LPOLESTR lpOleStr;
  150. pItem->m_lpObject->GetUserType(USERCLASSTYPE_SHORT, &lpOleStr);
  151. *lplpszShortType = TASKSTRINGOLE2T(lpOleStr);
  152. }
  153. if (lplpszLocation != NULL)
  154. {
  155. if (bIsLink)
  156. {
  157. LPOLELINK lpOleLink = NULL;
  158. pItem->m_lpObject->QueryInterface(IID_IOleLink, (LPVOID*)&lpOleLink);
  159. ASSERT(lpOleLink != NULL);
  160. LPOLESTR lpOleStr;
  161. lpOleLink->GetSourceDisplayName(&lpOleStr);
  162. *lplpszLocation = TASKSTRINGOLE2T(lpOleStr);
  163. lpOleLink->Release();
  164. }
  165. else
  166. {
  167. CDocument* pDoc = (CDocument*)pItem->GetDocument();
  168. CString strLocation = pDoc->GetPathName();
  169. if (strLocation.IsEmpty())
  170. strLocation = pDoc->GetTitle();
  171. *lplpszLocation = AfxAllocTaskString(strLocation);
  172. }
  173. }
  174. return S_OK;
  175. }
  176. STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::GetConvertInfo(
  177. DWORD dwObject, CLSID* lpClassID, WORD* lpwFormat,
  178. CLSID*, LPCLSID*, UINT*)
  179. {
  180. COleClientItem* pItem = (COleClientItem*)dwObject;
  181. ASSERT_VALID(pItem);
  182. if (lpClassID != NULL)
  183. {
  184. if (pItem->GetType() == OT_LINK ||
  185. S_OK != ReadClassStg(pItem->m_lpStorage, lpClassID))
  186. {
  187. pItem->GetClassID(lpClassID);
  188. }
  189. }
  190. if (lpwFormat != NULL)
  191. {
  192. *lpwFormat = 0;
  193. CLIPFORMAT cf;
  194. if (ReadFmtUserTypeStg(pItem->m_lpStorage, &cf, NULL) == S_OK)
  195. *lpwFormat = (WORD)cf;
  196. }
  197. // Note: leave rest at default
  198. return S_OK;
  199. }
  200. STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::ConvertObject(
  201. DWORD dwObject, REFCLSID clsidNew)
  202. {
  203. COleClientItem* pItem = (COleClientItem*)dwObject;
  204. ASSERT_VALID(pItem);
  205. if (!pItem->ConvertTo(clsidNew))
  206. {
  207. AfxMessageBox(AFX_IDP_FAILED_TO_CONVERT,
  208. MB_OK | MB_ICONEXCLAMATION);
  209. return E_FAIL;
  210. }
  211. return S_OK;
  212. }
  213. STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::GetViewInfo(
  214. DWORD dwObject, HGLOBAL* phMetaPict, DWORD* pdvAspect, int* pnCurrentScale)
  215. {
  216. COleClientItem* pItem = (COleClientItem*)dwObject;
  217. ASSERT_VALID(pItem);
  218. if (phMetaPict != NULL)
  219. *phMetaPict = pItem->GetIconicMetafile();
  220. if (pdvAspect != NULL)
  221. *pdvAspect = pItem->GetDrawAspect();
  222. if (pnCurrentScale != NULL)
  223. *pnCurrentScale = 100; // 100% (arbitrary for now)
  224. return S_OK;
  225. }
  226. STDMETHODIMP COlePropertiesDialog::XOleUIObjInfo::SetViewInfo(
  227. DWORD dwObject, HGLOBAL hMetaPict, DWORD dvAspect,
  228. int nCurrentScale, BOOL bRelativeToOrig)
  229. {
  230. METHOD_PROLOGUE_EX_(COlePropertiesDialog, OleUIObjInfo)
  231. COleClientItem* pItem = (COleClientItem*)dwObject;
  232. ASSERT_VALID(pItem);
  233. // handle aspect changes
  234. if (dvAspect != -1)
  235. {
  236. pItem->OnChange(OLE_CHANGED_ASPECT, dvAspect);
  237. pItem->SetDrawAspect((DVASPECT)dvAspect);
  238. // force scale to 100% when changing aspects
  239. if (dvAspect == DVASPECT_ICON)
  240. {
  241. nCurrentScale = 100;
  242. bRelativeToOrig = TRUE;
  243. }
  244. else if (nCurrentScale == -1)
  245. {
  246. nCurrentScale = 100;
  247. bRelativeToOrig = FALSE;
  248. }
  249. }
  250. // handle icon representation changes
  251. if (hMetaPict != NULL)
  252. {
  253. pItem->SetIconicMetafile(hMetaPict);
  254. if (pItem->GetDrawAspect() == DVASPECT_ICON)
  255. pItem->OnChange(OLE_CHANGED, (DWORD)DVASPECT_ICON);
  256. }
  257. // handle scale changes
  258. if (nCurrentScale != -1)
  259. {
  260. pThis->OnApplyScale(pItem, nCurrentScale, bRelativeToOrig);
  261. }
  262. return S_OK;
  263. }
  264. BOOL COlePropertiesDialog::OnApplyScale(COleClientItem*, int, BOOL)
  265. {
  266. // Note: no default implementation. Must override or scaling
  267. // controls will be disabled during the DoModal call.
  268. return FALSE;
  269. }
  270. /////////////////////////////////////////////////////////////////////////////
  271. // COlePropertiesDialog diagnostics
  272. #ifdef _DEBUG
  273. void COlePropertiesDialog::Dump(CDumpContext& dc) const
  274. {
  275. COleDialog::Dump(dc);
  276. }
  277. void COlePropertiesDialog::AssertValid() const
  278. {
  279. COleDialog::AssertValid();
  280. ASSERT(m_op.cbStruct == sizeof(m_op));
  281. ASSERT(m_gp.cbStruct == sizeof(m_gp));
  282. ASSERT(m_vp.cbStruct == sizeof(m_vp));
  283. ASSERT(m_lp.cbStruct == sizeof(m_lp));
  284. }
  285. #endif
  286. ////////////////////////////////////////////////////////////////////////////
  287. // ChangeSource dialog wrapper
  288. COleChangeSourceDialog::COleChangeSourceDialog(COleClientItem* pItem,
  289. CWnd* pParentWnd) : COleDialog(pParentWnd), m_xLinkInfo(NULL)
  290. {
  291. ASSERT_VALID(pItem);
  292. memset(&m_cs, 0, sizeof(m_cs)); // initialize structure to 0/NULL
  293. // fill in common part
  294. m_cs.cbStruct = sizeof(m_cs);
  295. m_cs.dwFlags = 0;
  296. if (AfxHelpEnabled())
  297. m_cs.dwFlags |= CSF_SHOWHELP;
  298. m_cs.lpfnHook = AfxOleHookProc;
  299. m_nIDHelp = AFX_IDD_CHANGESOURCE;
  300. // specific to this dialog
  301. m_cs.lpOleUILinkContainer = &m_xLinkInfo;
  302. m_cs.dwLink = (DWORD)pItem;
  303. }
  304. int COleChangeSourceDialog::DoModal()
  305. {
  306. ASSERT_VALID(this);
  307. ASSERT(m_cs.lpfnHook != NULL); // can still be a user hook
  308. m_cs.hWndOwner = PreModal();
  309. int iResult = MapResult(::OleUIChangeSource(&m_cs));
  310. PostModal();
  311. return iResult;
  312. }
  313. void COleChangeSourceDialog::PreInitDialog()
  314. {
  315. // automatic centering doesn't work for this dialog
  316. if (!(GetStyle() & WS_CHILD))
  317. CenterWindow();
  318. }
  319. COleChangeSourceDialog::~COleChangeSourceDialog()
  320. {
  321. CoTaskMemFree(m_cs.lpszTo);
  322. CoTaskMemFree(m_cs.lpszFrom);
  323. CoTaskMemFree(m_cs.lpszDisplayName);
  324. }
  325. /////////////////////////////////////////////////////////////////////////////
  326. // COleChangeSourceDialog diagnostics
  327. #ifdef _DEBUG
  328. void COleChangeSourceDialog::Dump(CDumpContext& dc) const
  329. {
  330. COleDialog::Dump(dc);
  331. dc << "m_cs.cbStruct = " << m_cs.cbStruct;
  332. dc << "\nm_cs.dwFlags = " << (LPVOID)m_cs.dwFlags;
  333. dc << "\nm_cs.hWndOwner = " << (UINT)m_cs.hWndOwner;
  334. dc << "\nm_cs.lpszCaption = " << m_cs.lpszCaption;
  335. dc << "\nm_cs.lCustData = " << (LPVOID)m_cs.lCustData;
  336. dc << "\nm_cs.hInstance = " << (UINT)m_cs.hInstance;
  337. dc << "\nm_cs.lpszTemplate = " << (LPVOID)m_cs.lpszTemplate;
  338. dc << "\nm_cs.hResource = " << (UINT)m_cs.hResource;
  339. if (m_cs.lpfnHook == AfxOleHookProc)
  340. dc << "\nhook function set to standard MFC hook function";
  341. else
  342. dc << "\nhook function set to non-standard hook function";
  343. dc << "\n";
  344. }
  345. void COleChangeSourceDialog::AssertValid() const
  346. {
  347. COleDialog::AssertValid();
  348. ASSERT(m_cs.cbStruct == sizeof(m_cs));
  349. ASSERT(m_cs.lpfnHook != NULL);
  350. }
  351. #endif
  352. #ifdef AFX_INIT_SEG
  353. #pragma code_seg(AFX_INIT_SEG)
  354. #endif
  355. IMPLEMENT_DYNAMIC(COlePropertiesDialog, COleDialog)
  356. IMPLEMENT_DYNAMIC(COleChangeSourceDialog, COleDialog)
  357. /////////////////////////////////////////////////////////////////////////////