00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include "ComPropertySheet.h"
00028 #include "..\..\DSUtil\DSUtil.h"
00029
00030
00031
00032 class CComPropertyPageSite : public CUnknown, public IPropertyPageSite
00033 {
00034 IComPropertyPageDirty* m_pPPD;
00035
00036 public:
00037 CComPropertyPageSite(IComPropertyPageDirty* pPPD) : CUnknown(NAME("CComPropertyPageSite"), NULL), m_pPPD(pPPD) {}
00038
00039 DECLARE_IUNKNOWN
00040 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv)
00041 {
00042 return
00043 QI(IPropertyPageSite)
00044 __super::NonDelegatingQueryInterface(riid, ppv);
00045 }
00046
00047
00048 STDMETHODIMP OnStatusChange(DWORD flags)
00049 {
00050 if(m_pPPD)
00051 {
00052 if(flags&PROPPAGESTATUS_DIRTY) m_pPPD->OnSetDirty(true);
00053 if(flags&PROPPAGESTATUS_CLEAN) m_pPPD->OnSetDirty(false);
00054 }
00055 return S_OK;
00056 }
00057 STDMETHODIMP GetLocaleID(LCID* pLocaleID)
00058 {
00059 CheckPointer(pLocaleID, E_POINTER);
00060 *pLocaleID = ::GetUserDefaultLCID();
00061 return S_OK;
00062 }
00063 STDMETHODIMP GetPageContainer(IUnknown** ppUnk) {return E_NOTIMPL;}
00064 STDMETHODIMP TranslateAccelerator(LPMSG pMsg) {return E_NOTIMPL;}
00065 };
00066
00067
00068
00069 IMPLEMENT_DYNAMIC(CComPropertySheet, CPropertySheet)
00070 CComPropertySheet::CComPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
00071 : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
00072 {
00073 m_pSite = new CComPropertyPageSite(this);
00074 m_size.SetSize(0, 0);
00075 }
00076
00077 CComPropertySheet::CComPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
00078 : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
00079 {
00080 m_pSite = new CComPropertyPageSite(this);
00081 m_size.SetSize(0, 0);
00082 }
00083
00084 CComPropertySheet::~CComPropertySheet()
00085 {
00086 }
00087
00088 int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)
00089 {
00090 if(!pSPP) return(0);
00091
00092 CAUUID caGUID;
00093 caGUID.pElems = NULL;
00094 if(FAILED(pSPP->GetPages(&caGUID)))
00095 return(0);
00096
00097 IUnknown* lpUnk = NULL;
00098 if(FAILED(pSPP.QueryInterface(&lpUnk)))
00099 return(0);
00100
00101 m_spp.AddTail(pSPP);
00102
00103 ULONG nPages = 0;
00104 for(ULONG i = 0; i < caGUID.cElems; i++)
00105 {
00106 CComPtr<IPropertyPage> pPage;
00107
00108 HRESULT hr = pPage.CoCreateInstance(caGUID.pElems[i]);
00109
00110 if(FAILED(hr))
00111 {
00112 if(CComQIPtr<IPersist> pP = pSPP)
00113 hr = LoadExternalPropertyPage(pP, caGUID.pElems[i], &pPage);
00114 }
00115
00116 if(SUCCEEDED(hr))
00117 {
00118 HRESULT hr;
00119 hr = pPage->SetPageSite(m_pSite);
00120 hr = pPage->SetObjects(1, &lpUnk);
00121 PROPPAGEINFO ppi;
00122 hr = pPage->GetPageInfo(&ppi);
00123 m_size.cx = max(m_size.cx, ppi.size.cx);
00124 m_size.cy = max(m_size.cy, ppi.size.cy);
00125 CAutoPtr<CComPropertyPage> p(new CComPropertyPage(pPage));
00126 AddPage(p);
00127 m_pages.AddTail(p);
00128 nPages++;
00129 }
00130 }
00131
00132 if(caGUID.pElems) CoTaskMemFree(caGUID.pElems);
00133 lpUnk->Release();
00134
00135 return(nPages);
00136 }
00137
00138 void CComPropertySheet::OnActivated(CPropertyPage* pPage)
00139 {
00140 if(!pPage) return;
00141
00142 CRect bounds(30000,30000,-30000,-30000);
00143
00144 CRect wr, cr;
00145 GetWindowRect(wr);
00146 GetClientRect(cr);
00147 CSize ws = wr.Size(), cs = cr.Size();
00148
00149 CRect twr, tcr;
00150 CTabCtrl* pTC = (CTabCtrl*)GetDlgItem(AFX_IDC_TAB_CONTROL);
00151 pTC->GetWindowRect(twr);
00152 pTC->GetClientRect(tcr);
00153 CSize tws = twr.Size(), tcs = tcr.Size();
00154
00155 if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
00156 {
00157 pChild->ModifyStyle(WS_CAPTION|WS_THICKFRAME, 0);
00158 pChild->ModifyStyleEx(WS_EX_DLGMODALFRAME, 0);
00159
00160 for(CWnd* pGrandChild = pChild->GetWindow(GW_CHILD); pGrandChild; pGrandChild = pGrandChild->GetNextWindow())
00161 {
00162 if(!(pGrandChild->GetStyle()&WS_VISIBLE)) continue;
00163
00164 CRect r;
00165 pGrandChild->GetWindowRect(&r);
00166 pChild->ScreenToClient(r);
00167 bounds |= r;
00168 }
00169 }
00170
00171 bounds |= CRect(0,0,0,0);
00172 bounds.SetRect(0, 0, bounds.right + max(bounds.left, 4), bounds.bottom + max(bounds.top, 4));
00173
00174 CRect r = CRect(CPoint(0,0), bounds.Size());
00175 pTC->AdjustRect(TRUE, r);
00176 r.SetRect(twr.TopLeft(), twr.TopLeft() + r.Size());
00177 ScreenToClient(r);
00178 pTC->MoveWindow(r);
00179 pTC->ModifyStyle(TCS_MULTILINE, TCS_SINGLELINE);
00180
00181 CSize diff = r.Size() - tws;
00182
00183 if(!bounds.IsRectEmpty())
00184 {
00185 if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
00186 pChild->MoveWindow(bounds);
00187 CRect r = twr;
00188 pTC->AdjustRect(FALSE, r);
00189 ScreenToClient(r);
00190 pPage->MoveWindow(CRect(r.TopLeft(), bounds.Size()));
00191 }
00192
00193 int _afxPropSheetButtons[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP };
00194 for(int i = 0; i < countof(_afxPropSheetButtons); i++)
00195 {
00196 if(CWnd* pWnd = GetDlgItem(_afxPropSheetButtons[i]))
00197 {
00198 pWnd->GetWindowRect(r);
00199 ScreenToClient(r);
00200 pWnd->MoveWindow(CRect(r.TopLeft() + diff, r.Size()));
00201 }
00202 }
00203
00204 MoveWindow(CRect(wr.TopLeft(), ws + diff));
00205
00206 Invalidate();
00207 }
00208
00209
00210 BEGIN_MESSAGE_MAP(CComPropertySheet, CPropertySheet)
00211 END_MESSAGE_MAP()
00212
00213
00214
00215
00216 BOOL CComPropertySheet::OnInitDialog()
00217 {
00218 BOOL bResult = (BOOL)Default();
00219
00220 if (!(GetStyle() & WS_CHILD))
00221 CenterWindow();
00222
00223 return bResult;
00224 }