📄 tffdshowpagebase.cpp
字号:
/*
* Copyright (c) 2002-2006 Milan Cutka
* based on Cabout.cpp from XviD DirectShow filter
*
* 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 of the License, 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "stdafx.h"
#include "TffdshowPageBase.h"
#include "IffdshowBase.h"
#include "TconfPageBase.h"
#include "Ttranslate.h"
#include "ffdebug.h"
#include "Tconfig.h"
//===================================== ThtiPage ===================================
TconfPageBase* ThtiPage::getPage(void)
{
if (id)
for (TconfPages::iterator page=begin();page!=end();page++)
if ((*page)->forCodec(*id)) return *page;
return *begin();
}
ThtiPage::~ThtiPage()
{
for (TconfPages::iterator page=begin();page!=end();page++)
{
if ((*page)->m_hwnd) DestroyWindow((*page)->m_hwnd);
delete *page;
}
}
//================================= TffdshowPageBase ===============================
TffdshowPageBase::TffdshowPageBase(LPUNKNOWN pUnk,HRESULT *phr,const wchar_t *ItitleW,const char_t *name,int IdialogId,int Iresstr):
CUnknown(name,pUnk),
titleW(ItitleW),
resstr(Iresstr),
pageSite(NULL),
dirty(false),
wasobjectset(false),
Twindow(NULL),
hil(NULL),
page(NULL),
isShift(false),
arrowsFont(NULL),
resorePos(true)
{
//CBasePropertyPage(NAME(name),pUnk,dialogId,resstr)
ASSERT(phr);
dialogId=IdialogId;
m_hwnd=NULL;
}
STDMETHODIMP TffdshowPageBase::GetPageInfo(LPPROPPAGEINFO pPageInfo)
{
CheckPointer(pPageInfo,E_POINTER);
pPageInfo->cb = sizeof(PROPPAGEINFO);
pPageInfo->pszDocString = NULL;
pPageInfo->pszHelpFile = NULL;
pPageInfo->dwHelpContext = 0;
LPOLESTR pszTitle;
AMGetWideString(titleW,&pszTitle);
pPageInfo->pszTitle=pszTitle;
if (HWND hwnd=createDialog(dialogId,GetDesktopWindow(),0))
{
RECT rc;
GetWindowRect(hwnd,&rc);
pPageInfo->size.cx=rc.right-rc.left;
pPageInfo->size.cy=rc.bottom-rc.top;
DestroyWindow(hwnd);
}
else
{
pPageInfo->size.cx=340;
pPageInfo->size.cy=150;
}
return S_OK;
}
void TffdshowPageBase::selectPage(TconfPageBase *Ipage)
{
if (!Ipage->m_hwnd) Ipage->createWindow();
bool pageChanged=page!=Ipage;
if (page && pageChanged)
if (Tconfig::winNT)
ShowWindow(page->m_hwnd,SW_HIDE);
else
page->destroyWindow();
page=Ipage;
CRect rp=getChildRect(IDC_PLACE_PAGE);
SetWindowPos(page->m_hwnd,htv,rp.left,rp.top,0,0,SWP_NOSIZE);
page->resize(rp);
pageIs=page->enabled();
if (page->wndEnabled!=pageIs) page->enable();
if (pageIs) page->cfg2dlg();
if (pageChanged) ShowWindow(page->m_hwnd,SW_SHOW);
enable(page->helpURL!=NULL && pageIs,IDC_BT_HELP);
InvalidateRect(m_hwnd,NULL,FALSE);
int lastpage=page->uniqueID();
cfgSet(IDFF_lastPage,lastpage);
}
ThtiPage* TffdshowPageBase::addTI(TVINSERTSTRUCT *tvis,TconfPageBase *page)
{
ThtiPage *htiPage=new ThtiPage(NULL,page);htiPages.push_back(htiPage);
if (tvis)
{
tvis->item.lParam=(LPARAM)htiPage;
tvis->item.pszText=LPTSTR(page->dialogName());
HTREEITEM hti=TreeView_InsertItem(htv,tvis);
page->hti=hti;
htiPage->hti=hti;
}
else
{
page->hti=NULL;
htiPage->hti=NULL;
}
return htiPage;
}
ThtiPage* TffdshowPageBase::addTI(TVINSERTSTRUCT *tvis,const TconfPages &pages,int *Iid)
{
ThtiPage *htiPage=new ThtiPage(Iid,pages);htiPages.push_back(htiPage);
HTREEITEM hti;
if (tvis)
{
tvis->item.lParam=(LPARAM)htiPage;
tvis->item.pszText=LPTSTR(pages[0]->dialogName());
tvis->item.iImage=tvis->item.iSelectedImage=0;
hti=TreeView_InsertItem(htv,tvis);
}
else
hti=NULL;
for (TconfPages::iterator i=htiPage->begin();i!=htiPage->end();i++)
(*i)->hti=hti;
htiPage->hti=hti;
return htiPage;
}
ThtiPage* TffdshowPageBase::hti2htiPage(HTREEITEM hti)
{
TVITEM tvi;
tvi.hItem=hti;
tvi.mask=TVIF_PARAM;
TreeView_GetItem(htv,&tvi);
return (ThtiPage*)tvi.lParam;
}
TconfPageBase* TffdshowPageBase::hti2page(HTREEITEM hti)
{
return hti2htiPage(hti)->getPage();
}
HWND TffdshowPageBase::findParentDlg(void)
{
for (HWND dlg=GetParent(m_hwnd);dlg;dlg=GetParent(dlg))
if (GetWindowStyle(dlg)&WS_DLGFRAME)
return dlg;
return NULL;
}
void TffdshowPageBase::translate(void)
{
Twindow::translate();
for (ThtiPages::const_iterator hp=htiPages.begin();hp!=htiPages.end();hp++)
for (TconfPages::const_iterator i=(*hp)->begin();i!=(*hp)->end();i++)
{
if ((*i)->m_hwnd) (*i)->translate();
TVITEM ti;
ti.hItem=(*i)->hti;
ti.mask=TVIF_TEXT;
ti.pszText=LPTSTR((*i)->dialogName());
TreeView_SetItem(htv,&ti);
if ((*i)->m_hwnd) (*i)->cfg2dlg();
}
if (comptrQ<IPropertyPageSiteFF> siteFF=pageSite)
siteFF->onTranslate();
}
bool TffdshowPageBase::translateTV()
{
if (page && tr->translateMode)
{
HTREEITEM hti=TreeView_GetDropHilight(htv);
if (!hti) hti=TreeView_GetSelection(htv);
ThtiPage *pages=hti2htiPage(hti);
char_t newtrans[1024]=_l("");
for (TconfPages::const_iterator page=pages->begin();page!=pages->end();page++)
{
const char_t *oldtrans=tr->translate((*page)->dialogId);
if (oldtrans)
{
if (newtrans[0]=='\0')
{
strcpy(newtrans,oldtrans);
if (!inputString(_l("Translate"),oldtrans,newtrans,1024))
break;
}
tr->newTranslation((*page)->dialogId,0,newtrans);
}
}
translate();
return true;
}
return false;
}
void TffdshowPageBase::enableHints(bool is)
{
cfgSet(IDFF_showHints,is);
for (ThtiPages::const_iterator hp=htiPages.begin();hp!=htiPages.end();hp++)
for (TconfPages::const_iterator i=(*hp)->begin();i!=(*hp)->end();i++)
(*i)->enableHints(is);
}
void TffdshowPageBase::setChange(void)
{
dirty=true;
if (pageSite) pageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
}
void TffdshowPageBase::onHelp(void)
{
if (!page || !page->helpURL) return;
char_t fullflnm[MAX_PATH];
_makepath(fullflnm,NULL,config->pth,_l("help\\"),NULL);
strcat(fullflnm,page->helpURL);
if (fileexists(fullflnm))
ShellExecute(m_hwnd,_l("open"),fullflnm,NULL,_l("."),SW_SHOWNORMAL);
}
STDMETHODIMP TffdshowPageBase::SetPageSite(LPPROPERTYPAGESITE IpageSite)
{
if (IpageSite)
{
if (pageSite)
return E_UNEXPECTED;
pageSite=IpageSite;
pageSite->AddRef();
}
else
{
if (!pageSite)
return E_UNEXPECTED;
pageSite->Release();
pageSite=NULL;
}
return S_OK;
}
STDMETHODIMP TffdshowPageBase::SetObjects(ULONG cObjects,LPUNKNOWN *ppUnk)
{
if (cObjects==1)
{
if (!ppUnk || !*ppUnk) return E_POINTER;
wasobjectset=true;
return OnConnect(*ppUnk);
}
else if (cObjects==0)
{
wasobjectset=false;
return OnDisconnect();
}
else
return E_UNEXPECTED;
}
HRESULT TffdshowPageBase::OnConnect(IUnknown *pUnk)
{
DPRINTF(_l("On connect 1"));
if (!(deci=pUnk)) return E_NOINTERFACE;
ASSERT(deci);
deci->initDialog();
deci->loadDialogSettings();
setDeci(deci);
DPRINTF(_l("On connect 2"));
return S_OK;
}
HRESULT TffdshowPageBase::OnDisconnect(void)
{
if (deci) deci->doneDialog();
deci=NULL;
return S_OK;
}
STDMETHODIMP TffdshowPageBase::Activate(HWND hwndParent,LPCRECT rect,BOOL fModal)
{
CheckPointer(rect,E_POINTER);
if (!wasobjectset) return E_UNEXPECTED;
if (m_hwnd) return E_UNEXPECTED;
HWND hwnd=createDialog(dialogId,hwndParent);
if (hwnd==NULL) return E_OUTOFMEMORY;
//setHWND(hwnd);
translate();
Move(rect);
Show(SW_SHOWNORMAL);
//LOGFONT lf={-13L,-13L,0L,0L,FW_NORMAL,0,0,0,SYMBOL_CHARSET,OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,FF_ROMAN+VARIABLE_PITCH,"Webdings"};
LOGFONT lf={18L,0L,0L,0L,FW_NORMAL,0,0,0,SYMBOL_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_DONTCARE+DEFAULT_PITCH,_l("Webdings")};
arrowsFont=CreateFontIndirect(&lf);
dlg=findParentDlg();
if (IsWindow(dlg))
{
if (resorePos && cfgGet(IDFF_dlgRestorePos))
{
int x,y;
x=cfgGet(IDFF_dlgPosX);
y=cfgGet(IDFF_dlgPosY);
WINDOWPLACEMENT wpl;
wpl.length=sizeof(wpl);
GetWindowPlacement(dlg,&wpl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -