Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasimir666 <casimir666@users.sourceforge.net>2006-06-25 01:37:43 +0400
committerCasimir666 <casimir666@users.sourceforge.net>2006-06-25 01:37:43 +0400
commit0868305e78da2b0742c2ce349efa041d5622ae21 (patch)
tree663fd93132c7927910ba7c13188d6332b2e3e5b2 /src/apps/mplayerc/ComPropertySheet.cpp
parent43c8656956a0460fc4551e3ea7a39b9f3094a3e3 (diff)
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@14 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/apps/mplayerc/ComPropertySheet.cpp')
-rw-r--r--src/apps/mplayerc/ComPropertySheet.cpp246
1 files changed, 246 insertions, 0 deletions
diff --git a/src/apps/mplayerc/ComPropertySheet.cpp b/src/apps/mplayerc/ComPropertySheet.cpp
new file mode 100644
index 000000000..49cc664ed
--- /dev/null
+++ b/src/apps/mplayerc/ComPropertySheet.cpp
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2003-2006 Gabest
+ * http://www.gabest.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+// ComPropertySheet.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "mplayerc.h"
+#include "ComPropertySheet.h"
+#include "..\..\DSUtil\DSUtil.h"
+#include "..\..\filters\InternalPropertyPage.h"
+
+// CComPropertyPageSite
+
+class CComPropertyPageSite : public CUnknown, public IPropertyPageSite
+{
+ IComPropertyPageDirty* m_pPPD;
+
+public:
+ CComPropertyPageSite(IComPropertyPageDirty* pPPD) : CUnknown(NAME("CComPropertyPageSite"), NULL), m_pPPD(pPPD) {}
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv)
+ {
+ return
+ QI(IPropertyPageSite)
+ __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+
+ // IPropertyPageSite
+ STDMETHODIMP OnStatusChange(DWORD flags)
+ {
+ if(m_pPPD)
+ {
+ if(flags&PROPPAGESTATUS_DIRTY) m_pPPD->OnSetDirty(true);
+ if(flags&PROPPAGESTATUS_CLEAN) m_pPPD->OnSetDirty(false);
+ }
+ return S_OK;
+ }
+ STDMETHODIMP GetLocaleID(LCID* pLocaleID)
+ {
+ CheckPointer(pLocaleID, E_POINTER);
+ *pLocaleID = ::GetUserDefaultLCID();
+ return S_OK;
+ }
+ STDMETHODIMP GetPageContainer(IUnknown** ppUnk) {return E_NOTIMPL;}
+ STDMETHODIMP TranslateAccelerator(LPMSG pMsg) {return E_NOTIMPL;}
+};
+
+// CComPropertySheet
+
+IMPLEMENT_DYNAMIC(CComPropertySheet, CPropertySheet)
+CComPropertySheet::CComPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
+ : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
+{
+ m_pSite = new CComPropertyPageSite(this);
+ m_size.SetSize(0, 0);
+}
+
+CComPropertySheet::CComPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
+ : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
+{
+ m_pSite = new CComPropertyPageSite(this);
+ m_size.SetSize(0, 0);
+}
+
+CComPropertySheet::~CComPropertySheet()
+{
+}
+
+int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)
+{
+ if(!pSPP) return(0);
+
+ CAUUID caGUID;
+ caGUID.pElems = NULL;
+ if(FAILED(pSPP->GetPages(&caGUID)))
+ return(0);
+
+ IUnknown* lpUnk = NULL;
+ if(FAILED(pSPP.QueryInterface(&lpUnk)))
+ return(0);
+
+ m_spp.AddTail(pSPP);
+
+ CComQIPtr<ISpecifyPropertyPages2> pSPP2 = pSPP;
+ CComQIPtr<IPersist> pPersist = pSPP;
+
+ ULONG nPages = 0;
+ for(ULONG i = 0; i < caGUID.cElems; i++)
+ {
+ CComPtr<IPropertyPage> pPage;
+
+ HRESULT hr = E_FAIL;
+
+ if(FAILED(hr) && !pPage && pSPP2)
+ {
+ hr = pSPP2->CreatePage(caGUID.pElems[i], &pPage);
+ }
+
+ if(FAILED(hr) && !pPage)
+ {
+ hr = pPage.CoCreateInstance(caGUID.pElems[i]);
+ }
+
+ if(FAILED(hr) && !pPage && pPersist)
+ {
+ hr = LoadExternalPropertyPage(pPersist, caGUID.pElems[i], &pPage);
+ }
+
+ if(SUCCEEDED(hr))
+ {
+ if(AddPage(pPage, lpUnk))
+ nPages++;
+ }
+ }
+
+ if(caGUID.pElems) CoTaskMemFree(caGUID.pElems);
+ lpUnk->Release();
+
+ return(nPages);
+}
+
+bool CComPropertySheet::AddPage(IPropertyPage* pPage, IUnknown* pUnk)
+{
+ if(!pPage || !pUnk) return false;
+
+ HRESULT hr;
+ hr = pPage->SetPageSite(m_pSite);
+ hr = pPage->SetObjects(1, &pUnk);
+ PROPPAGEINFO ppi;
+ hr = pPage->GetPageInfo(&ppi);
+ m_size.cx = max(m_size.cx, ppi.size.cx);
+ m_size.cy = max(m_size.cy, ppi.size.cy);
+ CAutoPtr<CComPropertyPage> p(new CComPropertyPage(pPage));
+ __super::AddPage(p);
+ m_pages.AddTail(p);
+
+ return true;
+}
+
+void CComPropertySheet::OnActivated(CPropertyPage* pPage)
+{
+ if(!pPage) return;
+
+ CRect bounds(30000,30000,-30000,-30000);
+
+ CRect wr, cr;
+ GetWindowRect(wr);
+ GetClientRect(cr);
+ CSize ws = wr.Size(), cs = cr.Size();
+
+ CRect twr, tcr;
+ CTabCtrl* pTC = (CTabCtrl*)GetDlgItem(AFX_IDC_TAB_CONTROL);
+ pTC->GetWindowRect(twr);
+ pTC->GetClientRect(tcr);
+ CSize tws = twr.Size(), tcs = tcr.Size();
+
+ if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
+ {
+ pChild->ModifyStyle(WS_CAPTION|WS_THICKFRAME, 0);
+ pChild->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CONTROLPARENT);
+
+ for(CWnd* pGrandChild = pChild->GetWindow(GW_CHILD); pGrandChild; pGrandChild = pGrandChild->GetNextWindow())
+ {
+ if(!(pGrandChild->GetStyle()&WS_VISIBLE)) continue;
+
+ CRect r;
+ pGrandChild->GetWindowRect(&r);
+ pChild->ScreenToClient(r);
+ bounds |= r;
+ }
+ }
+
+ bounds |= CRect(0,0,0,0);
+ bounds.SetRect(0, 0, bounds.right + max(bounds.left, 4), bounds.bottom + max(bounds.top, 4));
+
+ CRect r = CRect(CPoint(0,0), bounds.Size());
+ pTC->AdjustRect(TRUE, r);
+ r.SetRect(twr.TopLeft(), twr.TopLeft() + r.Size());
+ ScreenToClient(r);
+ pTC->MoveWindow(r);
+ pTC->ModifyStyle(TCS_MULTILINE, TCS_SINGLELINE);
+
+ CSize diff = r.Size() - tws;
+
+ if(!bounds.IsRectEmpty())
+ {
+ if(CWnd* pChild = pPage->GetWindow(GW_CHILD))
+ pChild->MoveWindow(bounds);
+ CRect r = twr;
+ pTC->AdjustRect(FALSE, r);
+ ScreenToClient(r);
+ pPage->MoveWindow(CRect(r.TopLeft(), bounds.Size()));
+ }
+
+ int _afxPropSheetButtons[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP };
+ for(int i = 0; i < countof(_afxPropSheetButtons); i++)
+ {
+ if(CWnd* pWnd = GetDlgItem(_afxPropSheetButtons[i]))
+ {
+ pWnd->GetWindowRect(r);
+ ScreenToClient(r);
+ pWnd->MoveWindow(CRect(r.TopLeft() + diff, r.Size()));
+ }
+ }
+
+ MoveWindow(CRect(wr.TopLeft(), ws + diff));
+
+ Invalidate();
+}
+
+
+BEGIN_MESSAGE_MAP(CComPropertySheet, CPropertySheet)
+END_MESSAGE_MAP()
+
+
+// CComPropertySheet message handlers
+
+BOOL CComPropertySheet::OnInitDialog()
+{
+ BOOL bResult = (BOOL)Default();//CPropertySheet::OnInitDialog();
+
+ if (!(GetStyle() & WS_CHILD))
+ CenterWindow();
+
+ return bResult;
+}