XPropertiesWndCtl.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:55k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 10/13/98 2:09:52 PM
  5.   Comments: XPropertiesWndCtl.cpp : Implementation of the CXPropertiesWndCtrl ActiveX Control class.
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "XPropertiesWnd.h"
  9. #include "XPropertiesWndCtl.h"
  10. #include "XPropertiesWndPpg.h"
  11. #include "XGeneralWndPropPage.h"
  12. //#include "ControlsWnd.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. IMPLEMENT_DYNCREATE(CXPropertiesWndCtrl, COleControl)
  19. #ifdef _OBEJCTISSAFETY
  20. //Implementation IObjectSafety
  21. BEGIN_INTERFACE_MAP(CXPropertiesWndCtrl, COleControl)
  22.   INTERFACE_PART(CXPropertiesWndCtrl, IID_IObjectSafety, ObjectSafety)
  23. END_INTERFACE_MAP()
  24. //Implementation IObjectSafety
  25. // Implementation of IObjectSafety
  26. STDMETHODIMP CXPropertiesWndCtrl::XObjectSafety::GetInterfaceSafetyOptions(
  27. REFIID riid, 
  28. DWORD __RPC_FAR *pdwSupportedOptions, 
  29. DWORD __RPC_FAR *pdwEnabledOptions)
  30. {
  31. METHOD_PROLOGUE_EX(CXPropertiesWndCtrl, ObjectSafety)
  32. if (!pdwSupportedOptions || !pdwEnabledOptions)
  33. {
  34. return E_POINTER;
  35. }
  36. *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
  37. *pdwEnabledOptions = 0;
  38. if (NULL == pThis->GetInterface(&riid))
  39. {
  40. TRACE(_T("Requested interface is not supported.n"));
  41. return E_NOINTERFACE;
  42. }
  43. // What interface is being checked out anyhow?
  44. OLECHAR szGUID[39];
  45. int i = StringFromGUID2(riid, szGUID, 39);
  46. if (riid == IID_IDispatch)
  47. {
  48. // Client wants to know if object is safe for scripting
  49. *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
  50. return S_OK;
  51. }
  52. else if (riid == IID_IPersistPropertyBag 
  53.   || riid == IID_IPersistStreamInit
  54.   || riid == IID_IPersistStorage
  55.   || riid == IID_IPersistMemory)
  56. {
  57. // Those are the persistence interfaces COleControl derived controls support
  58. // as indicated in AFXCTL.H
  59. // Client wants to know if object is safe for initializing from persistent data
  60. *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
  61. return S_OK;
  62. }
  63. else
  64. {
  65. // Find out what interface this is, and decide what options to enable
  66. TRACE(_T("We didn't account for the safety of this interface, and it's one we support...n"));
  67. return E_NOINTERFACE;
  68. }
  69. }
  70. STDMETHODIMP CXPropertiesWndCtrl::XObjectSafety::SetInterfaceSafetyOptions(
  71. REFIID riid, 
  72. DWORD dwOptionSetMask, 
  73. DWORD dwEnabledOptions)
  74. {
  75. METHOD_PROLOGUE_EX(CXPropertiesWndCtrl, ObjectSafety)
  76. OLECHAR szGUID[39];
  77. // What is this interface anyway?
  78. // We can do a quick lookup in the registry under HKEY_CLASSES_ROOTInterface
  79. int i = StringFromGUID2(riid, szGUID, 39);
  80. if (0 == dwOptionSetMask && 0 == dwEnabledOptions)
  81. {
  82. // the control certainly supports NO requests through the specified interface
  83. // so it's safe to return S_OK even if the interface isn't supported.
  84. return S_OK;
  85. }
  86. // Do we support the specified interface?
  87. if (NULL == pThis->GetInterface(&riid))
  88. {
  89. TRACE1("%s is not support.n", szGUID);
  90. return E_FAIL;
  91. }
  92. if (riid == IID_IDispatch)
  93. {
  94. TRACE(_T("Client asking if it's safe to call through IDispatch.n"));
  95. TRACE(_T("In other words, is the control safe for scripting?n"));
  96. if (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions)
  97. {
  98. return S_OK;
  99. }
  100. else
  101. {
  102. return E_FAIL;
  103. }
  104. }
  105. else if (riid == IID_IPersistPropertyBag 
  106.   || riid == IID_IPersistStreamInit
  107.   || riid == IID_IPersistStorage
  108.   || riid == IID_IPersistMemory)
  109. {
  110. TRACE(_T("Client asking if it's safe to call through IPersist*.n"));
  111. TRACE(_T("In other words, is the control safe for initializing from persistent data?n"));
  112. if (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions)
  113. {
  114. return NOERROR;
  115. }
  116. else
  117. {
  118. return E_FAIL;
  119. }
  120. }
  121. else
  122. {
  123. TRACE1("We didn't account for the safety of %s, and it's one we support...n", szGUID);
  124. return E_FAIL;
  125. }
  126. }
  127. STDMETHODIMP_(ULONG) CXPropertiesWndCtrl::XObjectSafety::AddRef()
  128. {
  129. METHOD_PROLOGUE_EX_(CXPropertiesWndCtrl, ObjectSafety)
  130. return (ULONG)pThis->ExternalAddRef();
  131. }
  132. STDMETHODIMP_(ULONG) CXPropertiesWndCtrl::XObjectSafety::Release()
  133. {
  134. METHOD_PROLOGUE_EX_(CXPropertiesWndCtrl, ObjectSafety)
  135. return (ULONG)pThis->ExternalRelease();
  136. }
  137. STDMETHODIMP CXPropertiesWndCtrl::XObjectSafety::QueryInterface(
  138. REFIID iid, LPVOID* ppvObj)
  139. {
  140. METHOD_PROLOGUE_EX_(CXPropertiesWndCtrl, ObjectSafety)
  141. return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
  142. }
  143. #endif //_OBEJCTISSAFETY
  144. static const FONTDESC _fontdescItem =
  145.   { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 8 ), FW_NORMAL, 
  146.      ANSI_CHARSET, FALSE, FALSE, FALSE };
  147. /////////////////////////////////////////////////////////////////////////////
  148. // Message map
  149. BEGIN_MESSAGE_MAP(CXPropertiesWndCtrl, COleControl)
  150. //{{AFX_MSG_MAP(CXPropertiesWndCtrl)
  151. ON_WM_CREATE()
  152. ON_WM_SIZE()
  153. ON_WM_SETFOCUS()
  154. ON_WM_DESTROY()
  155. //}}AFX_MSG_MAP
  156. ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
  157. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  158. END_MESSAGE_MAP()
  159. /////////////////////////////////////////////////////////////////////////////
  160. // Dispatch map
  161. BEGIN_DISPATCH_MAP(CXPropertiesWndCtrl, COleControl)
  162. //{{AFX_DISPATCH_MAP(CXPropertiesWndCtrl)
  163. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "PagesAndItems", m_sPagesAndItems, OnPagesAndItemsChanged, VT_BSTR)
  164. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "AutoResizingColumns", m_bAutoResizingColumns, OnResizingColumnsChanged, VT_BOOL)
  165. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "SignEnableDisable", m_bSignEnableDisable, OnSignEnableDisableChanged, VT_BOOL)
  166. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "ToolTips", m_bToolTips, OnToolTipsChanged, VT_BOOL)
  167. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "FirstPageHasCaption", m_bFirstPageHasCaption, OnFirstPageHasCaptionChanged, VT_BOOL)
  168. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "AsFloor", m_bAsFloor, OnAsFloorChanged, VT_BOOL)
  169. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "ResizeFirstColumn", m_bResizeFirstColumn, OnResizeFirstColumnChanged, VT_BOOL)
  170. DISP_PROPERTY_NOTIFY(CXPropertiesWndCtrl, "Animation", m_bAnimation, OnAnimationChanged, VT_BOOL)
  171. DISP_PROPERTY_EX(CXPropertiesWndCtrl, "ItemFont", GetItemFont, SetItemFont, VT_FONT)
  172. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPagesCount", _GetPagesCount, VT_I4, VTS_NONE)
  173. DISP_FUNCTION(CXPropertiesWndCtrl, "AddPage", _AddPage, VT_I2, VTS_BSTR)
  174. DISP_FUNCTION(CXPropertiesWndCtrl, "DeletePage", _DeletePage, VT_BOOL, VTS_I2)
  175. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPageName", _GetPageName, VT_BSTR, VTS_I2)
  176. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPage", _GetPage, VT_I2, VTS_BSTR)
  177. DISP_FUNCTION(CXPropertiesWndCtrl, "ActivatePage", _ActivatePage, VT_EMPTY, VTS_I2)
  178. DISP_FUNCTION(CXPropertiesWndCtrl, "InsertProperty", _InsertProperty, VT_I2, VTS_I2 VTS_I2 VTS_BSTR VTS_BSTR VTS_I2)
  179. DISP_FUNCTION(CXPropertiesWndCtrl, "DeleteProperty", _DeleteProperty, VT_BOOL, VTS_I2 VTS_I2)
  180. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPropertyName", _GetPropertyName, VT_BSTR, VTS_I2 VTS_I2)
  181. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPropertyType", _GetPropertyType, VT_I2, VTS_I2 VTS_I2)
  182. DISP_FUNCTION(CXPropertiesWndCtrl, "SetPropertyType", _SetPropertyType, VT_EMPTY, VTS_I2 VTS_I2 VTS_I2)
  183. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPropertyAs", _GetPropertyAs, VT_BSTR, VTS_I2 VTS_I2)
  184. DISP_FUNCTION(CXPropertiesWndCtrl, "IsProperty", _IsProperty, VT_BOOL, VTS_I2 VTS_I2)
  185. DISP_FUNCTION(CXPropertiesWndCtrl, "GetIDListCtrl", _GetIDListCtrl, VT_I4, VTS_I2)
  186. DISP_FUNCTION(CXPropertiesWndCtrl, "GetActivePage", _GetActivePage, VT_I2, VTS_NONE)
  187. DISP_FUNCTION(CXPropertiesWndCtrl, "GetxFloorWnd", _GetxFloorWnd, VT_UNKNOWN, VTS_NONE)
  188. DISP_FUNCTION(CXPropertiesWndCtrl, "GetDefaultValue", _GetDefaultValue, VT_BOOL, VTS_I2 VTS_I2 VTS_PBSTR)
  189. DISP_FUNCTION(CXPropertiesWndCtrl, "SetDefaultValue", _SetDefaultValue, VT_BOOL, VTS_I2 VTS_I2 VTS_BSTR)
  190. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPropertyCount", _GetPropertyCount, VT_I2, VTS_I2)
  191. DISP_FUNCTION(CXPropertiesWndCtrl, "SetPropertyName", _SetPropertyName, VT_EMPTY, VTS_I2 VTS_I2 VTS_BSTR)
  192. DISP_FUNCTION(CXPropertiesWndCtrl, "GetPropertyIndex", _GetPropertyIndex, VT_BOOL, VTS_BSTR VTS_PI2 VTS_PI2)
  193. DISP_FUNCTION(CXPropertiesWndCtrl, "SetDefaultValueByName", _SetDefaultValueByName, VT_BOOL, VTS_BSTR VTS_BSTR)
  194. DISP_FUNCTION(CXPropertiesWndCtrl, "GetDefaultValueByName", _GetDefaultValueByName, VT_BSTR, VTS_BSTR)
  195. DISP_FUNCTION(CXPropertiesWndCtrl, "GetActiveProperty", _GetActiveProperty, VT_I2, VTS_PI2)
  196. DISP_FUNCTION(CXPropertiesWndCtrl, "SetActiveProperty", _SetActiveProperty, VT_BOOL, VTS_I2 VTS_I2)
  197. DISP_FUNCTION(CXPropertiesWndCtrl, "SetActivePropertyByName", _SetActivePropertyByName, VT_BOOL, VTS_BSTR)
  198. DISP_FUNCTION(CXPropertiesWndCtrl, "DeletePropertyByName", _DeletePropertyByName, VT_BOOL, VTS_BSTR)
  199. DISP_FUNCTION(CXPropertiesWndCtrl, "AddProperty", _AddProperty, VT_I2, VTS_BSTR VTS_BSTR VTS_I2)
  200. DISP_FUNCTION(CXPropertiesWndCtrl, "Init", _Init, VT_EMPTY, VTS_NONE)
  201. DISP_FUNCTION(CXPropertiesWndCtrl, "RefreshProperty", RefreshProperty, VT_EMPTY, VTS_I2 VTS_I2)
  202. DISP_FUNCTION(CXPropertiesWndCtrl, "GetValue", GetValue, VT_VARIANT, VTS_I2 VTS_I2 VTS_I4)
  203. DISP_FUNCTION(CXPropertiesWndCtrl, "GetValueByName", GetValueByName, VT_VARIANT, VTS_BSTR VTS_I4)
  204. DISP_FUNCTION(CXPropertiesWndCtrl, "SetValue", SetValue, VT_EMPTY, VTS_I2 VTS_I2 VTS_VARIANT VTS_I2)
  205. DISP_FUNCTION(CXPropertiesWndCtrl, "Check", Check, VT_EMPTY, VTS_NONE)
  206. DISP_FUNCTION(CXPropertiesWndCtrl, "GetNComboObject", GetNComboObject, VT_DISPATCH, VTS_I4 VTS_I4)
  207. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "ColumnKey", GetColumnKey, SetColumnKey, VT_I4, VTS_I2 VTS_I2)
  208. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "ColumnWidth", GetColumnWidth, SetColumnWidth, VT_I4, VTS_I2 VTS_I2 VTS_I2)
  209. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "ColumnName", GetColumnName, SetColumnName, VT_BSTR, VTS_I2 VTS_I2 VTS_I2)
  210. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "ColumnHeader", GetColumnHeader, SetColumnHeader, VT_BOOL, VTS_I2 VTS_I2)
  211. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "DropDownWidth", GetDropDownWidth, SetDropDownWidth, VT_R8, VTS_I2 VTS_I2)
  212. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "DropDownHeight", GetDropDownHeight, SetDropDownHeight, VT_I4, VTS_I2 VTS_I2)
  213. DISP_PROPERTY_PARAM(CXPropertiesWndCtrl, "ColumnKeyByName", GetColumnKeyByName, SetColumnKeyByName, VT_BSTR, VTS_I2 VTS_I2)
  214. DISP_STOCKPROP_BACKCOLOR()
  215. DISP_STOCKPROP_FONT()
  216. //}}AFX_DISPATCH_MAP
  217. DISP_FUNCTION_ID(CXPropertiesWndCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  218. END_DISPATCH_MAP()
  219. /////////////////////////////////////////////////////////////////////////////
  220. // Event map
  221. BEGIN_EVENT_MAP(CXPropertiesWndCtrl, COleControl)
  222. //{{AFX_EVENT_MAP(CXPropertiesWndCtrl)
  223. EVENT_CUSTOM("SelectItem", FireSelectItem, VTS_I2  VTS_I2)
  224. EVENT_CUSTOM("SelectPage", FireSelectPage, VTS_I2)
  225. EVENT_CUSTOM("UnselectItem", FireUnselectItem, VTS_I2  VTS_I2)
  226. EVENT_CUSTOM("PropertyChanging", FirePropertyChanging, VTS_I2  VTS_I2)
  227. EVENT_CUSTOM("PropertyChanged", FirePropertyChanged, VTS_I2  VTS_I2 VTS_BOOL)
  228. EVENT_CUSTOM("ButtonClick", FireButtonClick, VTS_I2  VTS_I2 )
  229. EVENT_CUSTOM("LoadItems", FireLoadItems, VTS_I2  VTS_I2  VTS_PBSTR)
  230. EVENT_CUSTOM("SetObject", FireSetObject, VTS_I4  VTS_I4  VTS_PDISPATCH)
  231. EVENT_CUSTOM("Delete", FireDelete, VTS_I2  VTS_I2)
  232. //}}AFX_EVENT_MAP
  233. END_EVENT_MAP()
  234. BEGIN_EVENTSINK_MAP( CXPropertiesWndCtrl, COleControl )
  235. ON_EVENT( CXPropertiesWndCtrl, IDXFLOORWND, 1 /*ActivatePage*/, OnActivatePage, VTS_I2)
  236. END_EVENTSINK_MAP()
  237. /////////////////////////////////////////////////////////////////////////////
  238. // Property pages
  239. // TODO: Add more property pages as needed.  Remember to increase the count!
  240. BEGIN_PROPPAGEIDS(CXPropertiesWndCtrl, 4)
  241. PROPPAGEID(CXPropertiesWndPropPage::guid)
  242. PROPPAGEID(CXGeneralWndPropPage::guid)
  243.     PROPPAGEID(CLSID_CColorPropPage)
  244. PROPPAGEID(CLSID_CFontPropPage )
  245. END_PROPPAGEIDS(CXPropertiesWndCtrl)
  246. /////////////////////////////////////////////////////////////////////////////
  247. // Initialize class factory and guid
  248. IMPLEMENT_OLECREATE_EX(CXPropertiesWndCtrl, "XPROPERTIESWND.XPropertiesWndCtrl.1",
  249. 0x7b914a5b, 0x6271, 0x11d2, 0x86, 0xb8, 0, 0x40, 0x5, 0x5c, 0x8, 0xd9)
  250. /////////////////////////////////////////////////////////////////////////////
  251. // Type library ID and version
  252. IMPLEMENT_OLETYPELIB(CXPropertiesWndCtrl, _tlid, _wVerMajor, _wVerMinor)
  253. /////////////////////////////////////////////////////////////////////////////
  254. // Interface IDs
  255. const IID BASED_CODE IID_DXPropertiesWnd =
  256. { 0x7b914a59, 0x6271, 0x11d2, { 0x86, 0xb8, 0, 0x40, 0x5, 0x5c, 0x8, 0xd9 } };
  257. const IID BASED_CODE IID_DXPropertiesWndEvents =
  258. { 0x7b914a5a, 0x6271, 0x11d2, { 0x86, 0xb8, 0, 0x40, 0x5, 0x5c, 0x8, 0xd9 } };
  259. /////////////////////////////////////////////////////////////////////////////
  260. // Control type information
  261. static const DWORD BASED_CODE _dwXPropertiesWndOleMisc =
  262. OLEMISC_SIMPLEFRAME |
  263. OLEMISC_ACTIVATEWHENVISIBLE |
  264. OLEMISC_SETCLIENTSITEFIRST |
  265. OLEMISC_INSIDEOUT |
  266. OLEMISC_CANTLINKINSIDE |
  267. OLEMISC_RECOMPOSEONRESIZE;
  268. IMPLEMENT_OLECTLTYPE(CXPropertiesWndCtrl, IDS_XPROPERTIESWND, _dwXPropertiesWndOleMisc)
  269. /////////////////////////////////////////////////////////////////////////////
  270. // CXPropertiesWndCtrl::CXPropertiesWndCtrlFactory::UpdateRegistry -
  271. // Adds or removes system registry entries for CXPropertiesWndCtrl
  272. // Function name : CXPropertiesWndCtrl::CXPropertiesWndCtrlFactory::UpdateRegistry
  273. // Description     : Call to register this
  274. // Return type : BOOL 
  275. // Argument         : BOOL bRegister
  276. BOOL CXPropertiesWndCtrl::CXPropertiesWndCtrlFactory::UpdateRegistry(BOOL bRegister)
  277. {
  278. // TODO: Verify that your control follows apartment-model threading rules.
  279. // Refer to MFC TechNote 64 for more information.
  280. // If your control does not conform to the apartment-model rules, then
  281. // you must modify the code below, changing the 6th parameter from
  282. // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
  283. if (bRegister)
  284. return AfxOleRegisterControlClass(
  285. AfxGetInstanceHandle(),
  286. m_clsid,
  287. m_lpszProgID,
  288. IDS_XPROPERTIESWND,
  289. IDB_XPROPERTIESWND,
  290. afxRegInsertable | afxRegApartmentThreading,
  291. _dwXPropertiesWndOleMisc,
  292. _tlid,
  293. _wVerMajor,
  294. _wVerMinor);
  295. else
  296. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  297. }
  298. /////////////////////////////////////////////////////////////////////////////
  299. // CXPropertiesWndCtrl::CXPropertiesWndCtrl - Constructor
  300. // Function name : CXPropertiesWndCtrl::CXPropertiesWndCtrl
  301. // Description     : Default constuctor, initialize all interfaces
  302. // Return type : 
  303. CXPropertiesWndCtrl::CXPropertiesWndCtrl():m_itemFont(&m_xItemFontNotify)
  304. {
  305. InitializeIIDs(&IID_DXPropertiesWnd, &IID_DXPropertiesWndEvents);
  306. m_rgbEditColor = RGB(0,0,255);
  307. EnableSimpleFrame();
  308. }
  309. /////////////////////////////////////////////////////////////////////////////
  310. // CXPropertiesWndCtrl::~CXPropertiesWndCtrl - Destructor
  311. CXPropertiesWndCtrl::~CXPropertiesWndCtrl()
  312. {
  313. }
  314. /////////////////////////////////////////////////////////////////////////////
  315. // CXPropertiesWndCtrl::OnDraw - Drawing function
  316. void CXPropertiesWndCtrl::OnDraw(
  317. CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  318. {
  319. // Erase the background
  320. pdc->FillSolidRect(rcBounds, TranslateColor(GetBackColor()));
  321. // Fill the version of ActiveX control
  322. CString version;
  323.  version.Format(_T("xPropertiesWnd %i.%i"),_wVerMajor, _wVerMinor);
  324. pdc->SetBkMode(TRANSPARENT);
  325. pdc->DrawText(version, CRect(rcBounds), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  326. }
  327. /////////////////////////////////////////////////////////////////////////////
  328. // CXPropertiesWndCtrl::DoPropExchange - Persistence support
  329. // Function name : CXPropertiesWndCtrl::DoPropExchange
  330. // Description     : Implemente persistance...
  331. // Return type : void 
  332. // Argument         : CPropExchange* pPX
  333. void CXPropertiesWndCtrl::DoPropExchange(CPropExchange* pPX)
  334. {
  335. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  336. COleControl::DoPropExchange(pPX);
  337. PX_Bool(pPX, _T("AsFloor"), m_bAsFloor, TRUE);
  338. PX_String(pPX, _T("PagesAndItems"), m_sPagesAndItems , _T(""));
  339. PX_Bool(pPX, _T("AutoResizingColumns"), m_bAutoResizingColumns , TRUE);
  340. PX_Bool(pPX, _T("SignEnableDisable"), m_bSignEnableDisable , TRUE);
  341. PX_Bool(pPX, _T("ToolTips"), m_bToolTips , TRUE);
  342. PX_Bool(pPX, _T("FirstPageHasCaption"), m_bFirstPageHasCaption, FALSE);
  343. PX_Bool(pPX, _T("ResizeFirstColumn"), m_bResizeFirstColumn, TRUE);
  344. PX_Bool(pPX, _T("Animation"), m_bAnimation , FALSE);
  345. PX_Font(pPX, _T("ItemFont"), m_itemFont, &_fontdescItem);
  346. if ( pPX->IsLoading() )
  347. {
  348. OnAsFloorChanged();
  349. OnPagesAndItemsChanged();
  350. OnResizingColumnsChanged();
  351. OnSignEnableDisableChanged();
  352. OnToolTipsChanged();
  353. OnFirstPageHasCaptionChanged();
  354. OnResizeFirstColumnChanged();
  355. OnAnimationChanged();
  356. }
  357. }
  358. /////////////////////////////////////////////////////////////////////////////
  359. // CXPropertiesWndCtrl::OnResetState - Reset control to default state
  360. void CXPropertiesWndCtrl::OnResetState()
  361. {
  362. COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  363. SetBackColor((OLE_COLOR)defaultRGBBkGndProp);
  364. m_sPagesAndItems.Empty();
  365. m_bAutoResizingColumns = TRUE;
  366. }
  367. /////////////////////////////////////////////////////////////////////////////
  368. // CXPropertiesWndCtrl::AboutBox - Display an "About" box to the user
  369. void CXPropertiesWndCtrl::AboutBox()
  370. {
  371. CDialog dlgAbout(IDD_ABOUTBOX_XPROPERTIESWND);
  372. dlgAbout.DoModal();
  373. }
  374. /////////////////////////////////////////////////////////////////////////////
  375. // CXPropertiesWndCtrl message handlers
  376. // Function name : CXPropertiesWndCtrl::OnCreate
  377. // Description     : Call OnInit after this control was created.
  378. // Return type : int 
  379. // Argument         : LPCREATESTRUCT lpCreateStruct
  380. int CXPropertiesWndCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  381. {
  382. lpCreateStruct->style |= WS_CLIPCHILDREN;
  383. if (COleControl::OnCreate(lpCreateStruct) == -1)
  384. return -1;
  385. if (!OnInit())
  386. {
  387. #ifdef _DEBUG
  388. TRACE0("Warning: Cannot create ActiveX xPropertiesWnd control.n");
  389. #endif
  390. return -1;
  391. }
  392. return 0;
  393. }
  394. // Function name : CXPropertiesWndCtrl::OnSize
  395. // Description     : resize the xFlooWnd control when something is happening with parent
  396. // Return type : void 
  397. // Argument         : UINT nType
  398. // Argument         : int cx
  399. // Argument         : int cy
  400. void CXPropertiesWndCtrl::OnSize(UINT nType, int cx, int cy) 
  401. {
  402. COleControl::OnSize(nType, cx, cy);
  403. if (::IsWindow(m_xFloorWnd.m_hWnd))
  404. m_xFloorWnd.MoveWindow(0,0,cx,cy);
  405. }
  406. // Function name : CXPropertiesWndCtrl::OnInit
  407. // Description     : Init the control
  408. // Return type : BOOL 
  409. BOOL CXPropertiesWndCtrl::OnInit()
  410. {
  411. BOOL bResult = m_xFloorWnd.Create(_T(""), WS_CHILD | WS_VISIBLE , CRect(0,0,0,0), this, IDXFLOORWND);
  412. OnBackColorChanged();
  413. OnPagesAndItemsChanged();
  414. OnAnimationChanged();
  415. return bResult;
  416. }
  417. // Function name : CXPropertiesWndCtrl::OnAnimationChanged
  418. // Description     : 
  419. // Return type : void 
  420. void CXPropertiesWndCtrl::OnAnimationChanged() 
  421. {
  422. if (m_xFloorWnd.GetControlUnknown())
  423. m_xFloorWnd.SetProperty(1, VT_BOOL, m_bAnimation);
  424. SetModifiedFlag();
  425. }
  426. // Function name : CXPropertiesWndCtrl::OnBackColorChanged
  427. // Description     : Change the color background, will change the xFloorWnd Color
  428. // Return type : void 
  429. void CXPropertiesWndCtrl::OnBackColorChanged()
  430. {
  431. if (m_xFloorWnd.GetControlUnknown())
  432. m_xFloorWnd.SetBackColor(GetBackColor());
  433. InvalidateControl();
  434. }
  435. // Function name : CXPropertiesWndCtrl::OnPagesAndItemsChanged
  436. // Description     : 
  437. // Return type : void 
  438. void CXPropertiesWndCtrl::OnPagesAndItemsChanged() 
  439. {
  440. // Make some tricks to eliminate flickering
  441. BOOL bWnd = ::IsWindow(m_hWnd);
  442. BOOL bVisible = FALSE; 
  443. if (bWnd) bVisible = GetStyle() & WS_VISIBLE;
  444. if (bWnd) ShowWindow(SW_HIDE);
  445. // Effecitve load
  446. m_xFloorWnd.Load(m_sPagesAndItems, this);
  447. // Restore the state of window
  448. if (bVisible)
  449. ShowWindow(SW_SHOW);
  450. SetModifiedFlag();
  451. }
  452. // Function name : CXPropertiesWndCtrl::OnResizingColumnsChanged
  453. // Description     : After the m_bResizingColumnListCtrl is change the value
  454. // Return type : void 
  455. void CXPropertiesWndCtrl::OnResizingColumnsChanged() 
  456. {
  457. m_xFloorWnd.SetAutoResizingColumns(m_bAutoResizingColumns);
  458. SetModifiedFlag();
  459. }
  460. // Function name : CXPropertiesWndCtrl::OnSignEnableDisableChanged
  461. // Description     : 
  462. // Return type : void 
  463. void CXPropertiesWndCtrl::OnSignEnableDisableChanged() 
  464. {
  465. m_xFloorWnd.SetSignEnableDisable(m_bSignEnableDisable);
  466. SetModifiedFlag();
  467. }
  468. // Function name : CXPropertiesWndCtrl::OnActivatePage
  469. // Description     : Event for activate page
  470. // Return type : void 
  471. // Argument         : short nIndexPage
  472. void CXPropertiesWndCtrl::OnActivatePage(short nIndexPage)
  473. {
  474. FireSelectPage(nIndexPage);
  475. }
  476. // Function name : CXPropertiesWndCtrl::PreTranslateMessage
  477. // Description     : Treat separatly ESCAPE key
  478. // Return type : BOOL 
  479. // Argument         : MSG* pMsg
  480. BOOL CXPropertiesWndCtrl::PreTranslateMessage(MSG* pMsg) 
  481. {
  482. switch (pMsg->message)
  483. {
  484. case WM_KEYDOWN:
  485. {
  486. switch (pMsg->wParam)
  487. {
  488. case VK_ESCAPE:
  489. case VK_CANCEL:
  490. case VK_UP:
  491. case VK_DOWN:
  492. case VK_PRIOR:
  493. case VK_NEXT:
  494. {
  495. if (CWnd* pFocus = GetFocus())
  496. {
  497. pFocus->SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
  498. return TRUE;
  499. }
  500. break;
  501. }
  502. }
  503. break;
  504. }
  505. }
  506. return COleControl::PreTranslateMessage(pMsg);
  507. }
  508. // Function name : CXPropertiesWndCtrl::_GetPagesCount
  509. // Description     : Return the number of pages from control
  510. // Return type : short 
  511. long CXPropertiesWndCtrl::_GetPagesCount() 
  512. {
  513. return m_xFloorWnd.GetPagesCount();
  514. }
  515. // Function name : CXPropertiesWndCtrl::_AddPage
  516. // Description     : Add a new page 
  517. // Return type : short 
  518. // Argument         : LPCTSTR lpszPageName
  519. short CXPropertiesWndCtrl::_AddPage(LPCTSTR lpszPageName) 
  520. {
  521. return m_xFloorWnd.AddPage(lpszPageName, this);
  522. }
  523. // Function name : CXPropertiesWndCtrl::_DeletePage
  524. // Description     : Delete the page nIndexPage
  525. // Return type : BOOL 
  526. // Argument         : short nIndexPage
  527. BOOL CXPropertiesWndCtrl::_DeletePage(short nIndexPage) 
  528. {
  529. ResetMAPFound();
  530. return m_xFloorWnd.DeletePage(nIndexPage);
  531. }
  532. // Function name : CXPropertiesWndCtrl::_GetPageName
  533. // Description     : Return the name of page nIndexPage
  534. // Return type : BSTR 
  535. // Argument         : short nIndexPage
  536. BSTR CXPropertiesWndCtrl::_GetPageName(short nIndexPage) 
  537. {
  538. CString strResult;
  539. strResult = m_xFloorWnd.GetPageName(nIndexPage);
  540. return strResult.AllocSysString();
  541. }
  542. // Function name : CXPropertiesWndCtrl::_GetPage
  543. // Description     : Return the position of page called lpszPageName
  544. // Return type : short 
  545. // Argument         : LPCTSTR lpszPageName
  546. short CXPropertiesWndCtrl::_GetPage(LPCTSTR lpszPageName) 
  547. {
  548. return m_xFloorWnd.GetPage(lpszPageName);
  549. }
  550. // Function name : CXPropertiesWndCtrl::_ActivatePage
  551. // Description     : Activate page nIndexPage
  552. // Return type : void 
  553. // Argument         : short nIndexPage
  554. void CXPropertiesWndCtrl::_ActivatePage(short nIndexPage) 
  555. {
  556. m_xFloorWnd.ActivatePage(nIndexPage);
  557. }
  558. // Function name : CXPropertiesWndCtrl::GetListCtrl
  559. // Description     : Return * to page list ctrl if item exist there
  560. // Return type : CPageListCtrl* 
  561. // Argument         : int nIndexPage
  562. // Argument         : int nIndexProperty
  563. CPageListCtrl* CXPropertiesWndCtrl::GetListCtrl(int nIndexPage, int nIndexProperty)
  564. {
  565. if (m_xFloorWnd.IsPage(nIndexPage))
  566. if (CPageListCtrl* pListCtrl = m_xFloorWnd.GetListCtrl(nIndexPage))
  567. if (nIndexProperty >= 0)
  568. if (nIndexProperty < pListCtrl->GetItemCount())
  569. return pListCtrl;
  570. return NULL;
  571. }
  572. // Function name : CXPropertiesWndCtrl::_InsertProperty
  573. // Description     : Insert a new property into control
  574. // Return type : short 
  575. // Argument         : short nIndexPage
  576. // Argument         : short nIndexProperty
  577. // Argument         : LPCTSTR lpszPropertyName
  578. // Argument         : LPCTSTR lpszPropertyAs : 
  579. // Argument         : long lpszProperyType : 0 - Enable, 1: Grayed, 2: Black
  580. short CXPropertiesWndCtrl::_InsertProperty(short nIndexPage, short nIndexProperty, LPCTSTR lpszPropertyName, LPCTSTR lpszPropertyAs, short nProperyType) 
  581. {
  582. short nResult = -1;
  583. if (m_xFloorWnd.IsPage(nIndexPage))
  584. if (CPageListCtrl* pListCtrl = m_xFloorWnd.GetListCtrl(nIndexPage))
  585. if (pListCtrl->m_asControls.GetID(lpszPropertyAs) != -1)
  586. {
  587. ResetMAPFound();
  588. nResult = (short)pListCtrl->InsertItemVrt((nIndexProperty == -1 ? pListCtrl->GetItemCount() : nIndexProperty), lpszPropertyName, MAKELPARAM(pListCtrl->m_asControls.GetID(lpszPropertyAs), nProperyType));
  589. }
  590. return nResult;
  591. }
  592. // Function name : CXPropertiesWndCtrl::_DeleteProperty
  593. // Description     : Delete one property
  594. // Return type : BOOL 
  595. // Argument         : short nIndexPage
  596. // Argument         : short nIndexProperty
  597. BOOL CXPropertiesWndCtrl::_DeleteProperty(short nIndexPage, short nIndexProperty) 
  598. {
  599. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  600. {
  601. ResetMAPFound();
  602. return pListCtrl->DeleteItemVrt(nIndexProperty);
  603. }
  604. return FALSE;
  605. }
  606. // Function name : CXPropertiesWndCtrl::_GetPropertyName
  607. // Description     : Get name of property
  608. // Return type : BSTR 
  609. // Argument         : short nIndexPage
  610. // Argument         : short nIndexProperty
  611. BSTR CXPropertiesWndCtrl::_GetPropertyName(short nIndexPage, short nIndexProperty) 
  612. {
  613. CString strResult;
  614. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  615. strResult = pListCtrl->GetPropertyName(nIndexProperty);
  616. return strResult.AllocSysString();
  617. }
  618. // Function name : CXPropertiesWndCtrl::_GetPropertyType
  619. // Description     : Get property type
  620. // Return type : short 
  621. // Argument         : short nIndexPage
  622. // Argument         : short nIndexProperty
  623. short CXPropertiesWndCtrl::_GetPropertyType(short nIndexPage, short nIndexProperty) 
  624. {
  625. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  626. return HIWORD(pListCtrl->GetItemData(nIndexProperty));
  627. return -1;
  628. }
  629. // Function name : CXPropertiesWndCtrl::_SetPropertyType
  630. // Description     : set a new property type
  631. // Return type : void 
  632. // Argument         : short nIndexPage
  633. // Argument         : short nIndexProperty
  634. // Argument         : short nNewType
  635. void CXPropertiesWndCtrl::_SetPropertyType(short nIndexPage, short nIndexProperty, short nNewType) 
  636. {
  637. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  638. pListCtrl->SetItemData(nIndexProperty, MAKELPARAM(LOWORD(pListCtrl->GetItemData(nIndexProperty)), nNewType));
  639. }
  640. // Function name : CXPropertiesWndCtrl::_GetPropertyAs
  641. // Description     : Get as property
  642. // Return type : BSTR 
  643. // Argument         : short nIndexPage
  644. // Argument         : short nIndexProperty
  645. BSTR CXPropertiesWndCtrl::_GetPropertyAs(short nIndexPage, short nIndexProperty) 
  646. {
  647. CString strResult;
  648. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  649. strResult = pListCtrl->GetItemAsControl(nIndexProperty);
  650. return strResult.AllocSysString();
  651. }
  652. // Function name : CXPropertiesWndCtrl::_IsProperty
  653. // Description     : return TRUE or FALSE if exist property nIndexPage, nIndexProperty
  654. // Return type : BOOL 
  655. // Argument         : short nIndexPage
  656. // Argument         : short nIndexProperty
  657. BOOL CXPropertiesWndCtrl::_IsProperty(short nIndexPage, short nIndexProperty) 
  658. {
  659. return GetListCtrl(nIndexPage, nIndexProperty) != NULL;
  660. }
  661. // Function name : CXPropertiesWndCtrl::_GetIDListCtrl
  662. // Description     : get ID 
  663. // Return type : long 
  664. // Argument         : short nIndexPage
  665. long CXPropertiesWndCtrl::_GetIDListCtrl(short nIndexPage) 
  666. {
  667. if (m_xFloorWnd.IsPage(nIndexPage))
  668. if (CPageListCtrl* pListCtrl = m_xFloorWnd.GetListCtrl(nIndexPage))
  669. return pListCtrl->GetDlgCtrlID();
  670. return -1;
  671. }
  672. // Function name : CXPropertiesWndCtrl::_GetActivePage
  673. // Description     : Return the active page
  674. // Return type : short 
  675. short CXPropertiesWndCtrl::_GetActivePage() 
  676. {
  677. if (m_xFloorWnd.GetControlUnknown())
  678. return m_xFloorWnd.GetActivePage();
  679. return -1;
  680. }
  681. // Function name : CXPropertiesWndCtrl::_GetxFloorWnd
  682. // Description     : 
  683. // Return type : LPUNKNOWN 
  684. LPUNKNOWN CXPropertiesWndCtrl::_GetxFloorWnd() 
  685. {
  686. return m_xFloorWnd.GetControlUnknown();
  687. }
  688. // Function name : CXPropertiesWndCtrl::_GetDefaultValue
  689. // Description     : 
  690. // Return type : BOOL 
  691. // Argument         : short nIndexPage
  692. // Argument         : short nIndexProperty
  693. // Argument         : BSTR FAR* sPropertyValue
  694. BOOL CXPropertiesWndCtrl::_GetDefaultValue(short nIndexPage, short nIndexProperty, BSTR FAR* sPropertyValue) 
  695. {
  696. if (sPropertyValue)
  697. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  698. {
  699. *sPropertyValue = pListCtrl->GetDefaultValue(nIndexProperty).AllocSysString();
  700. return TRUE;
  701. }
  702. return FALSE;
  703. }
  704. // Function name : CXPropertiesWndCtrl::GetValueByName
  705. // Description     : return the value of a property
  706. // Return type : VARIANT 
  707. // Argument         : LPCTSTR lpszPropertyName
  708. VARIANT CXPropertiesWndCtrl::GetValueByName(LPCTSTR lpszPropertyName, long nColumn) 
  709. {
  710. VARIANT vaResult;
  711. VariantInit(&vaResult);
  712. short nIndexPage, nIndexProperty;
  713. if (_GetPropertyIndex(lpszPropertyName, &nIndexPage, &nIndexProperty))
  714. return GetValue(nIndexPage, nIndexProperty, nColumn);
  715. return vaResult;
  716. }
  717. // Function name : CXPropertiesWndCtrl::GetValue
  718. // Description     : 
  719. // Return type : VARIANT 
  720. // Argument         : short nIndexPage
  721. // Argument         : short nIndexProperty
  722. // Argument         : long nColumn
  723. VARIANT CXPropertiesWndCtrl::GetValue(short nIndexPage, short nIndexProperty, long nColumn) 
  724. {
  725. VARIANT vaResult;
  726. VariantInit(&vaResult);
  727. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  728. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty, FALSE))
  729. {
  730. vaResult = pControl->GetValue(nColumn);
  731. pControl->Delete();
  732. }
  733. else
  734. {
  735. vaResult.vt = VT_BSTR;
  736. vaResult.bstrVal = pListCtrl->GetDefaultValue(nIndexProperty).AllocSysString();
  737. }
  738. return vaResult;
  739. }
  740. // Function name : CXPropertiesWndCtrl::SetValue
  741. // Description     : 
  742. // Return type : void 
  743. // Argument         : short nIndexPage
  744. // Argument         : short nIndexProperty
  745. // Argument         : const VARIANT FAR& vValue
  746. // Argument         : short nColumn
  747. void CXPropertiesWndCtrl::SetValue(short nIndexPage, short nIndexProperty, const VARIANT FAR& vValue, short nColumn) 
  748. {
  749. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  750. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty, FALSE))
  751. {
  752. pControl->SetValue(vValue, nColumn);
  753. pControl->Delete();
  754. //Redraw item for control...
  755. pListCtrl->RedrawItems(pControl->GetSelectedItem(), pControl->GetSelectedItem());
  756. }
  757. }
  758. // Function name : CXPropertiesWndCtrl::_SetDefaultValue
  759. // Description     : 
  760. // Return type : BOOL 
  761. // Argument         : short nIndexPage
  762. // Argument         : short nIndexProperty
  763. // Argument         : LPCTSTR lpszDefaultvalue
  764. BOOL CXPropertiesWndCtrl::_SetDefaultValue(short nIndexPage, short nIndexProperty, LPCTSTR lpszDefaultvalue) 
  765. {
  766. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  767. return pListCtrl->SetDefaultValue(nIndexProperty, lpszDefaultvalue);
  768. return FALSE;
  769. }
  770. // Function name : CXPropertiesWndCtrl::_GetPropertyCount
  771. // Description     : return number or propery from page nIndexPage
  772. // Return type : short 
  773. // Argument         : short nIndexPage
  774. short CXPropertiesWndCtrl::_GetPropertyCount(short nIndexPage) 
  775. {
  776. if (CPageListCtrl* pListCtrl = m_xFloorWnd.GetListCtrl(nIndexPage))
  777. return pListCtrl->GetItemCount();
  778. return 0;
  779. }
  780. // Function name : CXPropertiesWndCtrl::_SetPropertyName
  781. // Description     : Set the new property of control
  782. // Return type : void 
  783. // Argument         : short nIndexPage
  784. // Argument         : short nIndexProperty
  785. // Argument         : LPCTSTR lpszProperyName
  786. void CXPropertiesWndCtrl::_SetPropertyName(short nIndexPage, short nIndexProperty, LPCTSTR lpszProperyName) 
  787. {
  788. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  789. {
  790. ResetMAPFound();
  791. pListCtrl->SetPropertyName(nIndexProperty, lpszProperyName);
  792. }
  793. }
  794. // Function name : CXPropertiesWndCtrl::GetPageName
  795. // Description     : return the name page from a path
  796. // Return type : CString 
  797. // Argument         : LPCTSTR lpszPathPropertyName
  798. CString CXPropertiesWndCtrl::GetPageName(LPCTSTR lpszPathPropertyName)
  799. {
  800. CString pageName, propertyName;
  801. AfxExtractSubString(pageName, lpszPathPropertyName, 0, TCHAR('\'));
  802. AfxExtractSubString(propertyName, lpszPathPropertyName, 1, TCHAR('\'));
  803. if (propertyName.IsEmpty())
  804. {
  805. propertyName = pageName;
  806. pageName.Empty();
  807. }
  808. return pageName;
  809. }
  810. // Function name : CXPropertiesWndCtrl::GetPropertyName
  811. // Description     : return the property name from path
  812. // Return type : CString 
  813. // Argument         : LPCTSTR lpszPathPropertyName
  814. CString CXPropertiesWndCtrl::GetPropertyName(LPCTSTR lpszPathPropertyName)
  815. {
  816. CString pageName, propertyName;
  817. AfxExtractSubString(pageName, lpszPathPropertyName, 0, TCHAR('\'));
  818. AfxExtractSubString(propertyName, lpszPathPropertyName, 1, TCHAR('\'));
  819. if (propertyName.IsEmpty())
  820. {
  821. propertyName = pageName;
  822. pageName.Empty();
  823. }
  824. return propertyName;
  825. }
  826. // Function name : CXPropertiesWndCtrl::AppendSearch
  827. // Description     : Add a new result search
  828. // Return type : void 
  829. // Argument         : LPCTSTR lpszPropertyName
  830. // Argument         : short lLow
  831. // Argument         : short lHigh
  832. void CXPropertiesWndCtrl::AppendSearch(LPCTSTR lpszPropertyName, short lLow, short lHigh)
  833. {
  834. m_mapSearch[lpszPropertyName] = (CObject*)MAKELPARAM(lLow,lHigh);
  835. }
  836. // Function name : CXPropertiesWndCtrl::AlreadyFound
  837. // Description     : Already lpszProperty was searched
  838. // Return type : BOOL 
  839. // Argument         : LPCTSTR lpszPropertyName
  840. // Argument         : short * lLow
  841. // Argument         : short * lHigh
  842. BOOL CXPropertiesWndCtrl::AlreadyFound(LPCTSTR lpszPropertyName, short * lLow, short * lHigh)
  843. {
  844. CObject* pObject = NULL;
  845. if (m_mapSearch.Lookup(lpszPropertyName, pObject))
  846. {
  847. *lLow = LOWORD((LPARAM)pObject);
  848. *lHigh = HIWORD((LPARAM)pObject);
  849. return TRUE;
  850. }
  851. return FALSE;
  852. }
  853. // Function name : CXPropertiesWndCtrl::ResetMAPFound
  854. // Description     : 
  855. // Return type : void 
  856. void CXPropertiesWndCtrl::ResetMAPFound()
  857. {
  858. m_mapSearch.RemoveAll();
  859. }
  860. // Function name : CXPropertiesWndCtrl::_GetPropertyIndex
  861. // Description     : Return the index of page and property for property called lpszPropertyName
  862. // Return type : BOOL 
  863. // Argument         : LPCTSTR lpszPropertyName
  864. // Argument         : short FAR* nIndexPage
  865. // Argument         : short FAR* nIndexProperty
  866. BOOL CXPropertiesWndCtrl::_GetPropertyIndex(LPCTSTR lpszPropertyName, short FAR* nIndexPage, short FAR* nIndexProperty) 
  867. {
  868. *nIndexPage = -1; *nIndexProperty = -1;
  869. if (AlreadyFound(lpszPropertyName, nIndexPage, nIndexProperty))
  870. return nIndexProperty >= 0;
  871. CString pageName = GetPageName(lpszPropertyName), propertyName = GetPropertyName(lpszPropertyName);
  872. if (!propertyName.IsEmpty())
  873. {
  874. int iStart = 0, iEnd = _GetPagesCount(), sPage = -1;
  875. if (!pageName.IsEmpty())
  876. if ((sPage = m_xFloorWnd.GetPage(pageName))>= 0)
  877. {
  878. iStart = sPage;
  879. iEnd = sPage + 1;
  880. *nIndexPage = iStart;
  881. }
  882. else
  883. {
  884. *nIndexPage = -1;
  885. iEnd = -1;
  886. }
  887. for (int i = iStart; i < iEnd; i++)
  888. for (int j = 0; j < _GetPropertyCount(i); j++)
  889. if (CString(_GetPropertyName(i, j)).CompareNoCase(propertyName) == 0)
  890. {
  891. *nIndexPage = i;
  892. *nIndexProperty = j;
  893. AppendSearch(lpszPropertyName, i, j);
  894. return TRUE;
  895. }
  896. }
  897. return FALSE;
  898. }
  899. // Function name : CXPropertiesWndCtrl::_SetDefaultValueByName
  900. // Description     : Set the default value by property name
  901. // Return type : BOOL 
  902. // Argument         : LPCTSTR lpszPropertyName
  903. // Argument         : LPCTSTR lpszPropertyValue
  904. BOOL CXPropertiesWndCtrl::_SetDefaultValueByName(LPCTSTR lpszPropertyName, LPCTSTR lpszPropertyValue) 
  905. {
  906. short nPage, nProperty;
  907. if (_GetPropertyIndex(lpszPropertyName, &nPage, &nProperty))
  908. return _SetDefaultValue(nPage, nProperty, lpszPropertyValue);
  909. return FALSE;
  910. }
  911. // Function name : CXPropertiesWndCtrl::_GetDefaultValueByName
  912. // Description     : get the default value from property lpszPropertyName
  913. // Return type : BSTR 
  914. // Argument         : LPCTSTR lpszPropertyName
  915. BSTR CXPropertiesWndCtrl::_GetDefaultValueByName(LPCTSTR lpszPropertyName) 
  916. {
  917. short nIndexPage, nIndexProperty;
  918. if (_GetPropertyIndex(lpszPropertyName, &nIndexPage, &nIndexProperty))
  919. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  920. {
  921. CString strResult = pListCtrl->GetDefaultValue(nIndexProperty);
  922. return strResult.AllocSysString();
  923. }
  924. return NULL;
  925. }
  926. // Function name : CXPropertiesWndCtrl::_GetActiveProperty
  927. // Description     : return the Active Property
  928. // Return type : short 
  929. // Argument         : short FAR* nIndexPage
  930. short CXPropertiesWndCtrl::_GetActiveProperty(short FAR* nIndexPage) 
  931. {
  932. if (nIndexPage)
  933. {
  934. *nIndexPage = _GetActivePage();
  935. return m_xFloorWnd.GetListCtrl(*nIndexPage)->GetActiveProperty();
  936. }
  937. return -1;
  938. }
  939. // Function name : CXPropertiesWndCtrl::_SetActiveProperty
  940. // Description     : 
  941. // Return type : BOOL 
  942. // Argument         : short nIndexPage
  943. // Argument         : short IndexProperty
  944. BOOL CXPropertiesWndCtrl::_SetActiveProperty(short nIndexPage, short nIndexProperty) 
  945. {
  946. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  947. {
  948. m_xFloorWnd.ActivatePage(nIndexPage);
  949. pListCtrl->SetActiveProperty(nIndexProperty);
  950. return TRUE;
  951. }
  952. return FALSE;
  953. }
  954. // Function name : CXPropertiesWndCtrl::_SetActivePropertyByName
  955. // Description     : Set property lpszPropertyName as active
  956. // Return type : BOOL 
  957. // Argument         : LPCTSTR lpszPropertyName
  958. BOOL CXPropertiesWndCtrl::_SetActivePropertyByName(LPCTSTR lpszPropertyName) 
  959. {
  960. short nIndexPage, nIndexProperty;
  961. if (_GetPropertyIndex(lpszPropertyName, &nIndexPage, &nIndexProperty))
  962. return _SetActiveProperty(nIndexPage, nIndexProperty);
  963. return FALSE;
  964. }
  965. // Function name : CXPropertiesWndCtrl::_DeletePropertyByName
  966. // Description     : Delete a property by name
  967. // Return type : BOOL 
  968. // Argument         : LPCTSTR lpszPropertyName
  969. BOOL CXPropertiesWndCtrl::_DeletePropertyByName(LPCTSTR lpszPropertyName) 
  970. {
  971. short nIndexPage, nIndexProperty;
  972. if (_GetPropertyIndex(lpszPropertyName, &nIndexPage, &nIndexProperty))
  973. return _DeleteProperty(nIndexPage, nIndexProperty);
  974. return FALSE;
  975. }
  976. // Function name : CXPropertiesWndCtrl::_AddProperty
  977. // Description     : Add a new property
  978. // Return type : BOOL 
  979. // Argument         : short lpszPropertyName
  980. // Argument         : LPCTSTR lpszPropertyAs
  981. // Argument         : short nPropertyType
  982. short CXPropertiesWndCtrl::_AddProperty(LPCTSTR lpszPropertyName, LPCTSTR lpszPropertyAs, short nPropertyType) 
  983. {
  984. short nIndexPage = -1, nIndexProperty = -1;
  985. _GetPropertyIndex(lpszPropertyName, &nIndexPage, &nIndexProperty);
  986. nIndexPage = max(0, nIndexPage);
  987. return _InsertProperty(nIndexPage, -1, GetPropertyName(lpszPropertyName), lpszPropertyAs, nPropertyType);
  988. }
  989. // Function name : CXPropertiesWndCtrl::GetColumnKey
  990. // Description     : Return a column key for ...
  991. // Return type : long 
  992. // Argument         : short nIndexPage
  993. // Argument         : short nIndexProperty
  994. long CXPropertiesWndCtrl::GetColumnKey(short nIndexPage, short nIndexProperty) 
  995. {
  996. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  997. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  998. return pControl->GetColumnKey();
  999. return -1;
  1000. }
  1001. // Function name : CXPropertiesWndCtrl::SetColumnKey
  1002. // Description     : Set a column key
  1003. // Return type : void 
  1004. // Argument         : short nIndexPage
  1005. // Argument         : short nIndexProperty
  1006. // Argument         : long nNewValue
  1007. void CXPropertiesWndCtrl::SetColumnKey(short nIndexPage, short nIndexProperty, long nNewValue) 
  1008. {
  1009. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1010. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1011. pControl->SetColumnKey(nNewValue);
  1012. }
  1013. // Function name : CXPropertiesWndCtrl::GetColumnWidth
  1014. // Description     : return the width of column
  1015. // Return type : long 
  1016. // Argument         : short nIndexPage
  1017. // Argument         : short nIndexProperty
  1018. long CXPropertiesWndCtrl::GetColumnWidth(short nIndexPage, short nIndexProperty, short nColumn) 
  1019. {
  1020. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1021. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1022. return pControl->GetColumnWidth(nColumn);
  1023. return -1;
  1024. }
  1025. // Function name : CXPropertiesWndCtrl::GetColumnKeyByName
  1026. // Description     : 
  1027. // Return type : BSTR 
  1028. // Argument         : short nIndexPage
  1029. // Argument         : short nIndexProperty
  1030. BSTR CXPropertiesWndCtrl::GetColumnKeyByName(short nIndexPage, short nIndexProperty) 
  1031. {
  1032. CString strResult;
  1033. if (BSTR bStr = GetColumnName(nIndexPage, nIndexProperty, (short)GetColumnKey(nIndexPage, nIndexProperty)))
  1034. {
  1035. strResult = CString(bStr);
  1036. ::SysFreeString(bStr);
  1037. return strResult.AllocSysString();
  1038. }
  1039. return NULL;
  1040. }
  1041. // Function name : CXPropertiesWndCtrl::SetColumnKeyByName
  1042. // Description     : Search column named lpszNewValue, and set that as column key
  1043. // Return type : void 
  1044. // Argument         : short nIndexPage
  1045. // Argument         : short nIndexProperty
  1046. // Argument         : LPCTSTR lpszNewValue
  1047. void CXPropertiesWndCtrl::SetColumnKeyByName(short nIndexPage, short nIndexProperty, LPCTSTR lpszNewValue) 
  1048. {
  1049. int nColumn = 0;
  1050. CString sColumn;
  1051. do 
  1052. {
  1053. BSTR bStr = GetColumnName(nIndexPage, nIndexProperty, nColumn);
  1054. sColumn = CString(bStr);
  1055. ::SysFreeString(bStr);
  1056. if (sColumn.IsEmpty())
  1057. break;
  1058. if (sColumn.CompareNoCase(lpszNewValue) == 0)
  1059. {
  1060. SetColumnKey(nIndexPage, nIndexProperty , nColumn);
  1061. break;
  1062. }
  1063. nColumn++;
  1064. }
  1065. while (1);
  1066. SetModifiedFlag();
  1067. }
  1068. // Function name : CXPropertiesWndCtrl::SetColumnWidth
  1069. // Description     : Set the new width of column
  1070. // Return type : void 
  1071. // Argument         : short nIndexPage
  1072. // Argument         : short nIndexProperty
  1073. // Argument         : long nNewValue
  1074. void CXPropertiesWndCtrl::SetColumnWidth(short nIndexPage, short nIndexProperty, short nColumn, long nNewValue) 
  1075. {
  1076. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1077. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1078. pControl->SetColumnWidth(nColumn, nNewValue);
  1079. }
  1080. // Function name : CXPropertiesWndCtrl::GetHeaderName
  1081. // Description     : 
  1082. // Return type : BSTR 
  1083. // Argument         : short nIndexPage
  1084. // Argument         : short nIndexProperty
  1085. // Argument         : short nColumn
  1086. BSTR CXPropertiesWndCtrl::GetColumnName(short nIndexPage, short nIndexProperty, short nColumn) 
  1087. {
  1088. CString strResult;
  1089. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1090. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1091. return CString(pControl->GetColumnName(nColumn)).AllocSysString();
  1092. return NULL;
  1093. }
  1094. // Function name : CXPropertiesWndCtrl::SetColumnName
  1095. // Description     : 
  1096. // Return type : void 
  1097. // Argument         : short nIndexPage
  1098. // Argument         : short nIndexProperty
  1099. // Argument         : short nColumn
  1100. // Argument         : LPCTSTR lpszNewValue
  1101. void CXPropertiesWndCtrl::SetColumnName(short nIndexPage, short nIndexProperty, short nColumn, LPCTSTR lpszNewValue) 
  1102. {
  1103. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1104. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1105. pControl->SetColumnName(nColumn, lpszNewValue);
  1106. }
  1107. // Function name : CXPropertiesWndCtrl::GetColumnName
  1108. // Description     : 
  1109. // Return type : BOOL 
  1110. // Argument         : short nIndexPage
  1111. // Argument         : short nIndexProperty
  1112. BOOL CXPropertiesWndCtrl::GetColumnHeader(short nIndexPage, short nIndexProperty) 
  1113. {
  1114. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1115. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1116. return pControl->GetColumnHeader();
  1117. return FALSE;
  1118. }
  1119. // Function name : CXPropertiesWndCtrl::SetColumnHeader
  1120. // Description     : 
  1121. // Return type : void 
  1122. // Argument         : short nIndexPage
  1123. // Argument         : short nIndexProperty
  1124. // Argument         : BOOL bNewValue
  1125. void CXPropertiesWndCtrl::SetColumnHeader(short nIndexPage, short nIndexProperty, BOOL bNewValue) 
  1126. {
  1127. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1128. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1129. pControl->SetColumnHeader(bNewValue);
  1130. }
  1131. // Function name : CXPropertiesWndCtrl::GetDropDownWidth
  1132. // Description     : Get rate of drop down width
  1133. // Return type : double 
  1134. // Argument         : short nIndexPage
  1135. // Argument         : short nIndexProperty
  1136. double CXPropertiesWndCtrl::GetDropDownWidth(short nIndexPage, short nIndexProperty) 
  1137. {
  1138. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1139. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1140. return pControl->GetDropDownWidth();
  1141. return -1.0;
  1142. }
  1143. // Function name : CXPropertiesWndCtrl::SetDropDownWidth
  1144. // Description     : Set the new rate for drop down width
  1145. // Return type : void 
  1146. // Argument         : short nIndexPage
  1147. // Argument         : short nIndexProperty
  1148. // Argument         : double newValue
  1149. void CXPropertiesWndCtrl::SetDropDownWidth(short nIndexPage, short nIndexProperty, double newValue) 
  1150. {
  1151. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1152. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1153. pControl->SetDropDownWidth(newValue);
  1154. }
  1155. // Function name : CXPropertiesWndCtrl::GetDropDownHeight
  1156. // Description     : 
  1157. // Return type : long 
  1158. // Argument         : short nIndexPage
  1159. // Argument         : short nIndexProperty
  1160. long CXPropertiesWndCtrl::GetDropDownHeight(short nIndexPage, short nIndexProperty) 
  1161. {
  1162. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1163. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1164. return pControl->GetDropDownHeight();
  1165. return -1;
  1166. }
  1167. // Function name : CXPropertiesWndCtrl::SetDropDownHeight
  1168. // Description     : 
  1169. // Return type : void 
  1170. // Argument         : short nIndexPage
  1171. // Argument         : short nIndexProperty
  1172. // Argument         : long nNewValue
  1173. void CXPropertiesWndCtrl::SetDropDownHeight(short nIndexPage, short nIndexProperty, long nNewValue) 
  1174. {
  1175. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1176. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1177. pControl->SetDropDownHeight(nNewValue);
  1178. }
  1179. // Function name : CXPropertiesWndCtrl::RefreshProperty
  1180. // Description     : If the control associated with property is ADOR.Recordset it will be reqery
  1181. // Return type : void 
  1182. // Argument         : short nIndexPage
  1183. // Argument         : short nIndexProperty
  1184. void CXPropertiesWndCtrl::RefreshProperty(short nIndexPage, short nIndexProperty) 
  1185. {
  1186. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1187. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1188. pControl->Refresh();
  1189. }
  1190. // Function name : CXPropertiesWndCtrl::_Init
  1191. // Description     : Init the control
  1192. // Return type : void 
  1193. void CXPropertiesWndCtrl::_Init() 
  1194. {
  1195. m_xFloorWnd.Init();
  1196. }
  1197. // Function name : CXPropertiesWndCtrl::OnToolTipsChanged
  1198. // Description     : 
  1199. // Return type : void 
  1200. void CXPropertiesWndCtrl::OnToolTipsChanged() 
  1201. {
  1202. SetModifiedFlag();
  1203. }
  1204. // Function name : CXPropertiesWndCtrl::OnResizeFirstColumnChanged
  1205. // Description     : 
  1206. // Return type : void 
  1207. void CXPropertiesWndCtrl::OnResizeFirstColumnChanged() 
  1208. {
  1209. // TODO: Add notification handler code
  1210. SetModifiedFlag();
  1211. }
  1212. // Function name : CXPropertiesWndCtrl::OnFirstPageHasCaptionChanged
  1213. // Description     : Set the new value for m_bFirstPageHasCaption
  1214. // Return type : void 
  1215. void CXPropertiesWndCtrl::OnFirstPageHasCaptionChanged() 
  1216. {
  1217. m_xFloorWnd.m_bFirstPageHasCaption = m_bFirstPageHasCaption;
  1218. SetModifiedFlag();
  1219. }
  1220. // Function name : CXPropertiesWndCtrl::OnAsFloorChanged
  1221. // Description     : Change the style ...
  1222. // Return type : void 
  1223. void CXPropertiesWndCtrl::OnAsFloorChanged() 
  1224. {
  1225. m_xFloorWnd.m_bAsFloor = m_bAsFloor;
  1226. if (m_xFloorWnd.GetControlUnknown())
  1227. m_xFloorWnd.StyleAs(m_xFloorWnd.m_bAsFloor);
  1228. SetModifiedFlag();
  1229. }
  1230. // Function name : CXPropertiesWndCtrl::OnFontChanged
  1231. // Description     : Select the font for xFloorWnd.ActiveX control
  1232. // Return type : void 
  1233. void CXPropertiesWndCtrl::OnFontChanged() 
  1234. {
  1235. COleControl::OnFontChanged();
  1236. if (m_xFloorWnd.GetControlUnknown())
  1237. {
  1238. m_xFloorWnd.SetProperty(DISPID_FONT, VT_DISPATCH, GetFont());
  1239. int iPage = NULL;
  1240. if ((iPage = _GetActivePage()) >=0 )
  1241. m_xFloorWnd.GetListCtrl(iPage)->OnFontChanged();
  1242. }
  1243. }
  1244. // Function name : CXPropertiesWndCtrl::GetItemFont
  1245. // Description     : return the Item font
  1246. // Return type : LPFONTDISP 
  1247. LPFONTDISP CXPropertiesWndCtrl::GetItemFont() 
  1248. {
  1249. return m_itemFont.GetFontDispatch();
  1250. }
  1251. // Function name : CXPropertiesWndCtrl::SetItemFont
  1252. // Description     : Set the new item font
  1253. // Return type : void 
  1254. // Argument         : LPFONTDISP newValue
  1255. void CXPropertiesWndCtrl::SetItemFont(LPFONTDISP newValue) 
  1256. {
  1257. m_itemFont.InitializeFont(&_fontdescItem, newValue);
  1258. SetModifiedFlag();
  1259. }
  1260. // Function name : STDMETHODIMP_
  1261. // Description     : Add a new referince to ItemFontNotify interface
  1262. // Return type : 
  1263. // Argument         : ULONG
  1264. STDMETHODIMP_(ULONG) CXPropertiesWndCtrl::XItemFontNotify::AddRef( )
  1265. {
  1266.     METHOD_MANAGE_STATE(CXPropertiesWndCtrl, ItemFontNotify)
  1267.     return 1;
  1268. }
  1269. // Function name : STDMETHODIMP_
  1270. // Description     : release the added interface
  1271. // Return type : 
  1272. // Argument         : ULONG
  1273. STDMETHODIMP_(ULONG) CXPropertiesWndCtrl::XItemFontNotify::Release( )
  1274. {
  1275.     METHOD_MANAGE_STATE(CXPropertiesWndCtrl, ItemFontNotify)
  1276.     return 0;
  1277. }
  1278. // Function name : CXPropertiesWndCtrl::XItemFontNotify::QueryInterface
  1279. // Description     : If something ask, ask
  1280. // Return type : STDMETHODIMP 
  1281. // Argument         :  REFIID iid
  1282. // Argument         : LPVOID FAR* ppvObj
  1283. STDMETHODIMP CXPropertiesWndCtrl::XItemFontNotify::QueryInterface( REFIID iid, LPVOID FAR* ppvObj )
  1284. {
  1285.     METHOD_MANAGE_STATE( CXPropertiesWndCtrl , ItemFontNotify )
  1286.     if( IsEqualIID( iid, IID_IUnknown ) || IsEqualIID( iid, IID_IPropertyNotifySink))
  1287.     {
  1288.  *ppvObj= this;
  1289.  AddRef();
  1290.  return NOERROR;
  1291.     }
  1292.     return ResultFromScode(E_NOINTERFACE);
  1293. }
  1294. // Function name : CXPropertiesWndCtrl::XItemFontNotify::OnRequestEdit
  1295. // Description     : 
  1296. // Return type : STDMETHODIMP 
  1297. // Argument         : DISPID
  1298. STDMETHODIMP CXPropertiesWndCtrl::XItemFontNotify::OnRequestEdit(DISPID)
  1299. {
  1300.     return NOERROR;
  1301. }
  1302. // Function name : CXPropertiesWndCtrl::XItemFontNotify::OnChanged
  1303. // Description     : If font is changed
  1304. // Return type : STDMETHODIMP 
  1305. // Argument         : DISPID
  1306. STDMETHODIMP CXPropertiesWndCtrl::XItemFontNotify::OnChanged(DISPID)
  1307. {
  1308.     METHOD_MANAGE_STATE( CXPropertiesWndCtrl , ItemFontNotify )
  1309. if (pThis->m_xFloorWnd.GetControlUnknown())
  1310. {
  1311. LOGFONT logFont;
  1312. if (::GetObject(pThis->m_itemFont.GetFontHandle(), sizeof(LOGFONT), &logFont))
  1313. {
  1314. int i = 0; CPageListCtrl* pPage = NULL;
  1315. while (pPage = pThis->m_xFloorWnd.GetListCtrl(i++))
  1316. {
  1317. pPage->CreateItemFont((const LOGFONT*)&logFont);
  1318. pPage->Invalidate();
  1319. }
  1320. }
  1321. }
  1322.     return NOERROR;
  1323. }
  1324. void CXPropertiesWndCtrl::OnSetFocus(CWnd* pOldWnd) 
  1325. {
  1326. COleControl::OnSetFocus(pOldWnd);
  1327. int iPage = -1;
  1328. if ((iPage = _GetActivePage())  >= 0)
  1329. {
  1330. if (CPageListCtrl* pPage = m_xFloorWnd.GetListCtrl(iPage))
  1331. pPage->SetFocus();
  1332. }
  1333. }
  1334. // Function name : CXPropertiesWndCtrl::Check
  1335. // Description     : Check the notdeleted controls
  1336. // Return type : void 
  1337. void CXPropertiesWndCtrl::Check() 
  1338. {
  1339. POSITION pos = m_mapPg2CtrlCreated.GetStartPosition();
  1340. CString sResult, temp;
  1341. temp.Format(_T("ttthis = %08X nn"), &m_mapPg2CtrlCreated);
  1342. sResult += temp;
  1343. while (pos)
  1344. {
  1345. CPageListCtrl* pListCtrl = NULL;
  1346. TMapIdx2Ctrl* pMap = NULL;
  1347. m_mapPg2CtrlCreated.GetNextAssoc(pos, pListCtrl, pMap);
  1348. BSTR bStr = pListCtrl->GetControlWnd()->_GetPageName((short)pListCtrl->GetIndexPage());
  1349. CString sName(bStr);
  1350. ::SysFreeString(bStr);
  1351. temp.Format(_T("%s, %08Xn"), sName, pListCtrl); 
  1352. sResult += temp;
  1353. POSITION posMap = pMap->GetStartPosition();
  1354. while (posMap)
  1355. {
  1356. CControlsWnd* pControl = NULL;
  1357. long nSelected = NULL;
  1358. pMap->GetNextAssoc(posMap, nSelected, pControl);
  1359. temp.Format(_T("t %i %s %08Xn"), nSelected, pControl->GetWindowNotify()->GetPropertyName(pControl->GetSelectedItem()));
  1360. sResult += temp;
  1361. }
  1362. }
  1363. AfxMessageBox(sResult);
  1364. }
  1365. // Function name : CXPropertiesWndCtrl::OnDestroy
  1366. // Description     : Call to destroy all notdeleted controls.
  1367. // Return type : void 
  1368. void CXPropertiesWndCtrl::OnDestroy() 
  1369. {
  1370. COleControl::OnDestroy();
  1371. KillAllControls();
  1372. }
  1373. // Function name : CXPropertiesWndCtrl::KillAllControls
  1374. // Description     : Kill all controls
  1375. // Return type : void 
  1376. void CXPropertiesWndCtrl::KillAllControls()
  1377. {
  1378. POSITION posMap = m_mapPg2CtrlCreated.GetStartPosition();
  1379. TMapIdx2Ctrl* pMap = NULL; CPageListCtrl* pPage = NULL;
  1380. while (posMap)
  1381. {
  1382. m_mapPg2CtrlCreated.GetNextAssoc(posMap, pPage, pMap);
  1383. if (pMap)
  1384. {
  1385. CControlsWnd* pControl = NULL;
  1386. long nSelectedItem = NULL;
  1387. POSITION posCtrl = pMap->GetStartPosition();
  1388. while ( posCtrl )
  1389. {
  1390. pMap->GetNextAssoc(posCtrl, nSelectedItem, pControl);
  1391. delete pControl;
  1392. }
  1393. delete pMap;
  1394. }
  1395. }
  1396. m_mapPg2CtrlCreated.RemoveAll();
  1397. }
  1398. // Function name : CXPropertiesWndCtrl::GetNComboObject
  1399. // Description     : return the NCombo control attached to the property (nIndexPage, nIndexProperty)
  1400. // Return type : LPDISPATCH 
  1401. // Argument         : long nIndexPage
  1402. // Argument         : long nIndexProperty
  1403. LPDISPATCH CXPropertiesWndCtrl::GetNComboObject(long nIndexPage, long nIndexProperty) 
  1404. {
  1405. if (CPageListCtrl* pListCtrl = GetListCtrl(nIndexPage, nIndexProperty))
  1406. if (CControlsWnd* pControl = pListCtrl->GetControl(nIndexProperty))
  1407. if (pControl->IsKindOf(RUNTIME_CLASS(CControlsWnd_CNComboBox)))
  1408. {
  1409. IDispatch* pDispatch = NULL;
  1410. pControl->GetWindow()->GetControlUnknown()->QueryInterface(IID_IDispatch, (void**)&pDispatch);
  1411. return pDispatch;
  1412. }
  1413. return NULL;
  1414. }