00001
00002
00003
00004
00005
00006 #include <streams.h>
00007
00008 CBasePropertyPage::CBasePropertyPage(TCHAR *pName,
00009 LPUNKNOWN pUnk,
00010 int DialogId,
00011 int TitleId) :
00012 CUnknown(pName,pUnk),
00013 m_DialogId(DialogId),
00014 m_TitleId(TitleId),
00015 m_hwnd(NULL),
00016 m_Dlg(NULL),
00017 m_pPageSite(NULL),
00018 m_bObjectSet(FALSE),
00019 m_bDirty(FALSE)
00020 {
00021 }
00022
00023 #ifdef UNICODE
00024 CBasePropertyPage::CBasePropertyPage(CHAR *pName,
00025 LPUNKNOWN pUnk,
00026 int DialogId,
00027 int TitleId) :
00028 CUnknown(pName,pUnk),
00029 m_DialogId(DialogId),
00030 m_TitleId(TitleId),
00031 m_hwnd(NULL),
00032 m_Dlg(NULL),
00033 m_pPageSite(NULL),
00034 m_bObjectSet(FALSE),
00035 m_bDirty(FALSE)
00036 {
00037 }
00038 #endif
00039
00040 STDMETHODIMP_(ULONG) CBasePropertyPage::NonDelegatingAddRef()
00041 {
00042 LONG lRef = InterlockedIncrement(&m_cRef);
00043 ASSERT(lRef > 0);
00044 return max(ULONG(m_cRef),1ul);
00045 }
00046
00047 STDMETHODIMP_(ULONG) CBasePropertyPage::NonDelegatingRelease()
00048 {
00049
00050 if (InterlockedDecrement(&m_cRef) == 0) {
00051 m_cRef++;
00052 SetPageSite(NULL);
00053 SetObjects(0,NULL);
00054 delete this;
00055 return ULONG(0);
00056 } else {
00057 return max(ULONG(m_cRef),1ul);
00058 }
00059 }
00060
00061 STDMETHODIMP
00062 CBasePropertyPage::NonDelegatingQueryInterface(REFIID riid,void **ppv)
00063 {
00064 if (riid == IID_IPropertyPage) {
00065 return GetInterface((IPropertyPage *)this,ppv);
00066 } else {
00067 return CUnknown::NonDelegatingQueryInterface(riid,ppv);
00068 }
00069 }
00070
00071 STDMETHODIMP CBasePropertyPage::GetPageInfo(LPPROPPAGEINFO pPageInfo)
00072 {
00073 CheckPointer(pPageInfo,E_POINTER);
00074 WCHAR wszTitle[STR_MAX_LENGTH];
00075 WideStringFromResource(wszTitle,m_TitleId);
00076
00077 LPOLESTR pszTitle;
00078 HRESULT hr = AMGetWideString(wszTitle, &pszTitle);
00079 if (FAILED(hr)) {
00080 NOTE("No caption memory");
00081 return hr;
00082 }
00083
00084 pPageInfo->cb = sizeof(PROPPAGEINFO);
00085 pPageInfo->pszTitle = pszTitle;
00086 pPageInfo->pszDocString = NULL;
00087 pPageInfo->pszHelpFile = NULL;
00088 pPageInfo->dwHelpContext = 0;
00089
00090
00091 pPageInfo->size.cx = 340;
00092 pPageInfo->size.cy = 150;
00093
00094 GetDialogSize(m_DialogId, DialogProc,0L,&pPageInfo->size);
00095 return NOERROR;
00096 }
00097
00098 INT_PTR CALLBACK CBasePropertyPage::DialogProc(HWND hwnd,
00099 UINT uMsg,
00100 WPARAM wParam,
00101 LPARAM lParam)
00102 {
00103 CBasePropertyPage *pPropertyPage;
00104
00105 switch (uMsg) {
00106
00107 case WM_INITDIALOG:
00108
00109 SetWindowLongPtr(hwnd, DWLP_USER, lParam);
00110
00111 pPropertyPage = (CBasePropertyPage *) lParam;
00112 if (pPropertyPage == NULL) {
00113 return (LRESULT) 1;
00114 }
00115 pPropertyPage->m_Dlg = hwnd;
00116 }
00117
00118 pPropertyPage = (CBasePropertyPage *) GetWindowLongPtr(hwnd, DWLP_USER);
00119 if (pPropertyPage == NULL) {
00120 return (LRESULT) 1;
00121 }
00122 return pPropertyPage->OnReceiveMessage(hwnd,uMsg,wParam,lParam);
00123 }
00124
00125 STDMETHODIMP CBasePropertyPage::SetObjects(ULONG cObjects,LPUNKNOWN *ppUnk)
00126 {
00127 if (cObjects == 1) {
00128
00129 if ((ppUnk == NULL) || (*ppUnk == NULL)) {
00130 return E_POINTER;
00131 }
00132
00133
00134 m_bObjectSet = TRUE ;
00135 return OnConnect(*ppUnk);
00136
00137 } else if (cObjects == 0) {
00138
00139
00140 m_bObjectSet = FALSE ;
00141 return OnDisconnect();
00142 }
00143
00144 DbgBreak("No support for more than one object");
00145 return E_UNEXPECTED;
00146 }
00147
00148 STDMETHODIMP CBasePropertyPage::Activate(HWND hwndParent,
00149 LPCRECT pRect,
00150 BOOL fModal)
00151 {
00152 CheckPointer(pRect,E_POINTER);
00153
00154
00155 if (m_bObjectSet == FALSE) {
00156 return E_UNEXPECTED;
00157 }
00158
00159 if (m_hwnd) {
00160 return E_UNEXPECTED;
00161 }
00162
00163 m_hwnd = CreateDialogParam(g_hInst,
00164 MAKEINTRESOURCE(m_DialogId),
00165 hwndParent,
00166 DialogProc,
00167 (LPARAM) this);
00168 if (m_hwnd == NULL) {
00169 return E_OUTOFMEMORY;
00170 }
00171
00172 OnActivate();
00173 Move(pRect);
00174 return Show(SW_SHOWNORMAL);
00175 }
00176
00177 STDMETHODIMP CBasePropertyPage::Move(LPCRECT pRect)
00178 {
00179 CheckPointer(pRect,E_POINTER);
00180
00181 if (m_hwnd == NULL) {
00182 return E_UNEXPECTED;
00183 }
00184
00185 MoveWindow(m_hwnd,
00186 pRect->left,
00187 pRect->top,
00188 WIDTH(pRect),
00189 HEIGHT(pRect),
00190 TRUE);
00191
00192 return NOERROR;
00193 }
00194
00195 STDMETHODIMP CBasePropertyPage::Show(UINT nCmdShow)
00196 {
00197
00198 if (m_hwnd == NULL) {
00199 return E_UNEXPECTED;
00200 }
00201
00202 if ((nCmdShow != SW_SHOW) && (nCmdShow != SW_SHOWNORMAL) && (nCmdShow != SW_HIDE)) {
00203 return E_INVALIDARG;
00204 }
00205
00206 ShowWindow(m_hwnd,nCmdShow);
00207 InvalidateRect(m_hwnd,NULL,TRUE);
00208 return NOERROR;
00209 }
00210
00211 STDMETHODIMP CBasePropertyPage::Deactivate(void)
00212 {
00213 if (m_hwnd == NULL) {
00214 return E_UNEXPECTED;
00215 }
00216
00217 DWORD dwStyle = GetWindowLong(m_hwnd, GWL_EXSTYLE);
00218 dwStyle = dwStyle & (~WS_EX_CONTROLPARENT);
00219
00220 HWND hwnd = m_hwnd;
00221 m_hwnd = NULL;
00222 SetWindowLong(hwnd, GWL_EXSTYLE, dwStyle);
00223 m_hwnd = hwnd;
00224
00225 OnDeactivate();
00226
00227 DestroyWindow(m_hwnd);
00228 m_hwnd = NULL;
00229 return NOERROR;
00230 }
00231
00232 STDMETHODIMP CBasePropertyPage::SetPageSite(LPPROPERTYPAGESITE pPageSite)
00233 {
00234 if (pPageSite) {
00235
00236 if (m_pPageSite) {
00237 return E_UNEXPECTED;
00238 }
00239
00240 m_pPageSite = pPageSite;
00241 m_pPageSite->AddRef();
00242
00243 } else {
00244
00245 if (m_pPageSite == NULL) {
00246 return E_UNEXPECTED;
00247 }
00248
00249 m_pPageSite->Release();
00250 m_pPageSite = NULL;
00251 }
00252 return NOERROR;
00253 }
00254
00255 STDMETHODIMP CBasePropertyPage::Apply()
00256 {
00257
00258 if (m_bObjectSet == FALSE) {
00259 return E_UNEXPECTED;
00260 }
00261
00262 if (m_pPageSite == NULL) {
00263 return E_UNEXPECTED;
00264 }
00265
00266 if (m_bDirty == FALSE) {
00267 return NOERROR;
00268 }
00269
00270 HRESULT hr = OnApplyChanges();
00271 if (SUCCEEDED(hr)) {
00272 m_bDirty = FALSE;
00273 }
00274 return hr;
00275 }
00276
00277 INT_PTR CBasePropertyPage::OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
00278 {
00279
00280 CBasePropertyPage *pPropertyPage;
00281 {
00282 pPropertyPage = (CBasePropertyPage *) GetWindowLongPtr(hwnd, DWLP_USER);
00283 if (pPropertyPage->m_hwnd == NULL) {
00284 return 0;
00285 }
00286 switch (uMsg) {
00287 case WM_STYLECHANGING:
00288 if (wParam == GWL_EXSTYLE) {
00289 LPSTYLESTRUCT lpss = (LPSTYLESTRUCT)lParam;
00290 lpss->styleNew |= WS_EX_CONTROLPARENT;
00291 return 0;
00292 }
00293 }
00294 }
00295
00296 return DefWindowProc(hwnd,uMsg,wParam,lParam);
00297 }
00298