📄 window.cpp
字号:
/*____________________________________________________________________________
FreeAmp - The Free MP3 Player
Copyright (C) 1999 EMusic
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., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: Window.cpp,v 1.29.2.2.6.1 2000/04/09 15:56:41 ijr Exp $
____________________________________________________________________________*/
// The debugger can't handle symbols more than 255 characters long.
// STL often creates symbols longer than that.
// When symbols are longer than 255 characters, the warning is disabled.
#ifdef WIN32
#pragma warning(disable:4786)
#endif
#include <stdio.h>
#include <algorithm>
#include "Window.h"
#include "Theme.h"
#include "debug.h"
#define DB Debug_v("%s:%d\n", __FILE__, __LINE__);
const int iDesktopSnapAmount = 10;
Window::Window(Theme *pTheme, string &oName)
{
m_oName = oName;
m_bExit = false;
m_pTheme = pTheme;
m_bWindowMove = false;
m_bLButtonDown = false;
m_bStayOnTop = false;
m_bLiveInToolbar = false;
m_pCanvas = NULL;
m_pMouseInControl = NULL;
m_pCaptureControl = NULL;
m_pMouseDownControl = NULL;
m_bIsVulcanMindMeldHost = false;
m_bMindMeldInProgress = false;
m_pUsageMutex = new Mutex();
m_pUsageSem = new Semaphore();
m_iUsageCount = 0;
}
Window::~Window(void)
{
if (!m_bIsVulcanMindMeldHost)
{
delete m_pCanvas;
ClearControls();
}
delete m_pUsageMutex;
delete m_pUsageSem;
}
void Window::IncUsageRef(void)
{
for(;;)
{
m_pUsageMutex->Acquire();
if (m_iUsageCount < 0)
{
m_pUsageMutex->Release();
m_pUsageSem->Wait();
}
else
break;
}
m_iUsageCount++;
m_pUsageMutex->Release();
}
void Window::DecUsageRef(void)
{
m_pUsageMutex->Acquire();
m_iUsageCount--;
m_pUsageSem->Signal();
m_pUsageMutex->Release();
}
void Window::LockUsageRef(void)
{
for(;;)
{
m_pUsageMutex->Acquire();
if (m_iUsageCount > 0)
{
m_pUsageMutex->Release();
ProcessWaitingMessages();
m_pUsageSem->Wait();
}
else
break;
}
m_iUsageCount = -1;
m_pUsageMutex->Release();
}
void Window::UnlockUsageRef(void)
{
m_pUsageMutex->Acquire();
m_iUsageCount = 0;
m_pUsageSem->Signal();
m_pUsageMutex->Release();
}
void Window::VulcanMindMeldHost(bool bHost)
{
m_bIsVulcanMindMeldHost = bHost;
if (bHost)
{
delete m_pCanvas;
m_pCanvas = NULL;
}
}
Error Window::VulcanMindMeld(Window *pOther)
{
vector<Control *>::iterator i;
ControlMapIterator j;
string oName;
LockUsageRef();
m_oName = pOther->m_oName;
m_pTheme = pOther->m_pTheme;
m_bWindowMove = pOther->m_bWindowMove;
m_bStayOnTop = pOther->m_bLiveInToolbar;
m_pMouseInControl = NULL;
m_pCaptureControl = NULL;
m_pMouseDownControl = NULL;
m_oControls.clear();
for(i = pOther->m_oControls.begin(); i != pOther->m_oControls.end(); i++)
{
m_oControls.push_back(*i);
}
m_oControlMap.clear();
for(j = pOther->m_oControlMap.begin(); j != pOther->m_oControlMap.end(); j++)
m_oControlMap.insert(pair<string, Control *>((*j).first, (*j).second));
m_pCanvas = pOther->m_pCanvas;
UnlockUsageRef();
Init();
return kError_NoErr;
}
void Window::Init(void)
{
vector<Control *>::iterator i;
IncUsageRef();
m_pCanvas->Init();
for(i = m_oControls.begin(); i != m_oControls.end(); i++)
{
(*i)->SetParent(this);
(*i)->Init();
}
m_pTheme->InitControls();
DecUsageRef();
}
void Window::AddControl(Control *pControl)
{
string oName;
IncUsageRef();
pControl->GetName(oName);
m_oControlMap.insert(pair<string, Control *>(oName, pControl));
m_oControls.push_back(pControl);
DecUsageRef();
}
void Window::ClearControls(void)
{
IncUsageRef();
while(m_oControls.size() > 0)
{
delete m_oControls[0];
m_oControls.erase(m_oControls.begin());
}
m_oControlMap.clear();
DecUsageRef();
}
Canvas *Window::GetCanvas(void)
{
return m_pCanvas;
}
void Window::GetName(string &oName)
{
oName = m_oName;
}
Error Window::ControlEnable(const string &oTarget, bool bSet, bool &bEnable)
{
ControlMapIterator i;
IncUsageRef();
pair<ControlMapIterator, ControlMapIterator> keyRange
= m_oControlMap.equal_range(oTarget);
for (i = keyRange.first; i != keyRange.second; i++)
{
i->second->Enable(bSet, bEnable);
}
DecUsageRef();
return kError_NoErr;
}
Error Window::ControlShow(const string &oTarget, bool bSet, bool &bShow)
{
Pos oPos;
Rect oRect;
Error eRet;
Control *pControl;
ControlMapIterator i;
IncUsageRef();
pair<ControlMapIterator, ControlMapIterator> keyRange
= m_oControlMap.equal_range(oTarget);
for (i = keyRange.first; i != keyRange.second; i++)
{
pControl = i->second;
eRet = pControl->Show(bSet, bShow);
GetMousePos(oPos);
GetWindowPosition(oRect);
oPos.x -= oRect.x1;
oPos.y -= oRect.y1;
if (bSet && bShow && pControl->PosInControl(oPos))
pControl->AcceptTransition(CT_MouseEnter);
}
DecUsageRef();
return kError_NoErr;
}
Error Window::ControlIntValue(const string &oTarget, bool bSet, int &iValue)
{
ControlMapIterator i;
IncUsageRef();
pair<ControlMapIterator, ControlMapIterator> keyRange
= m_oControlMap.equal_range(oTarget);
for (i = keyRange.first; i != keyRange.second; i++)
{
i->second->IntValue(bSet, iValue);
}
DecUsageRef();
return kError_NoErr;
}
Error Window::ControlStringValue(const string &oTarget, bool bSet, string &oValue)
{
ControlMapIterator i;
IncUsageRef();
pair<ControlMapIterator, ControlMapIterator> keyRange
= m_oControlMap.equal_range(oTarget);
for (i = keyRange.first; i != keyRange.second; i++)
{
i->second->StringValue(bSet, oValue);
}
DecUsageRef();
return kError_NoErr;
}
Error Window::ControlGetDesc(const string &oTarget, string &oDesc)
{
ControlMapIterator i;
IncUsageRef();
pair<ControlMapIterator, ControlMapIterator> keyRange
= m_oControlMap.equal_range(oTarget);
for (i = keyRange.first; i != keyRange.second; i++)
{
i->second->GetDesc(oDesc);
DecUsageRef();
return kError_NoErr;
}
DecUsageRef();
return kError_InvalidParam;
}
Error Window::ControlGetTip(const string &oTarget, string &oTip)
{
ControlMapIterator i;
IncUsageRef();
pair<ControlMapIterator, ControlMapIterator> keyRange
= m_oControlMap.equal_range(oTarget);
for (i = keyRange.first; i != keyRange.second; i++)
{
i->second->GetTip(oTip);
DecUsageRef();
return kError_NoErr;
}
DecUsageRef();
return kError_InvalidParam;
}
Error Window::SendControlMessage(Control *pControl,
ControlMessageEnum eMesg)
{
string oControlName;
Error eRet;
IncUsageRef();
pControl->GetName(oControlName);
eRet = m_pTheme->HandleControlMessage(oControlName, eMesg);
DecUsageRef();
return eRet;
}
bool Window::DoesControlExist(const string &oName)
{
bool bRet;
IncUsageRef();
bRet = m_oControlMap.find(oName) != m_oControlMap.end();
DecUsageRef();
return bRet;
}
Control *Window::ControlFromPos(Pos &oPos)
{
vector<Control *>::iterator i;
bool bShown;
Control *pControl;
IncUsageRef();
for(i = m_oControls.begin(); i != m_oControls.end(); i++)
{
(*i)->Show(false, bShown);
if ((*i)->PosInControl(oPos) && bShown)
{
pControl = (*i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -