client/EterPythonLib/PythonWindowManager.cpp

1256 lines
26 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "PythonWindow.h"
#include "PythonSlotWindow.h"
#include "PythonGridSlotWindow.h"
#include "PythonWindowManager.h"
//#define __WINDOW_LEAK_CHECK__
BOOL g_bShowOverInWindowName = FALSE;
namespace UI
{
static PyObject* gs_poEmptyTuple = NULL;
PyObject * BuildEmptyTuple()
{
Py_INCREF(gs_poEmptyTuple);
return gs_poEmptyTuple;
}
std::set<CWindow*> gs_kSet_pkWnd;
CWindowManager::CWindowManager()
:
m_pActiveWindow(NULL),
m_pPointWindow(NULL),
m_pLeftCaptureWindow(NULL),
m_pMiddleCaptureWindow(NULL),
m_pRightCaptureWindow(NULL),
m_pLockWindow(NULL),
m_bAttachingFlag(FALSE),
m_dwAttachingType(0),
m_dwAttachingIndex(0),
m_dwAttachingSlotNumber(0),
m_poMouseHandler(NULL),
m_iHres(0),
m_iVres(0),
m_bOnceIgnoreMouseLeftButtonUpEventFlag(FALSE)
{
m_pRootWindow = new CWindow(NULL);
m_pRootWindow->SetName("root");
m_pRootWindow->Show();
const char * layerTbl[] = {"GAME","UI_BOTTOM","UI","TOP_MOST","CURTAIN"};
for(DWORD layer = 0; layer < sizeof(layerTbl)/sizeof(layerTbl[0]); layer++)
{
CWindow * pLayer = new CLayer(NULL);
pLayer->SetName(layerTbl[layer]);
pLayer->Show();
m_LayerWindowMap.insert(TLayerContainer::value_type(layerTbl[layer], pLayer));
m_pRootWindow->AddChild(pLayer);
m_LayerWindowList.push_back(pLayer);
}
m_ActiveWindowList.clear();
m_LockWindowList.clear();
gs_poEmptyTuple = Py_BuildValue("()");
}
CWindowManager::~CWindowManager()
{
Py_DECREF(gs_poEmptyTuple);
stl_wipe_second(m_LayerWindowMap);
m_LayerWindowMap.clear();
m_LayerWindowList.clear();
m_KeyCaptureWindowMap.clear();
delete m_pRootWindow;
m_pRootWindow = NULL;
}
void CWindowManager::Destroy()
{
__ClearReserveDeleteWindowList();
#ifdef __WINDOW_LEAK_CHECK__
std::set<CWindow*>::iterator i;
for (i=gs_kSet_pkWnd.begin(); i!=gs_kSet_pkWnd.end(); ++i)
{
CWindow* pkWnd=*i;
Logf(1, "CWindowManager::Destroy LOST WINDOW %s\n", pkWnd->GetName());
}
#endif
}
void CWindowManager::SetMouseHandler(PyObject * poMouseHandler)
{
m_poMouseHandler = poMouseHandler;
}
CWindow * CWindowManager::RegisterWindow(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CWindow(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return (pWin);
}
CWindow * CWindowManager::__NewWindow(PyObject * po, DWORD dwWndType)
{
switch(dwWndType)
{
case WT_SLOT:
return new CSlotWindow(po);
break;
case WT_GRIDSLOT:
return new CGridSlotWindow(po);
break;
case WT_TEXTLINE:
return new CTextLine(po);
break;
case WT_MARKBOX:
return new CMarkBox(po);
break;
case WT_IMAGEBOX:
return new CImageBox(po);
break;
case WT_EXP_IMAGEBOX:
return new CExpandedImageBox(po);
break;
case WT_ANI_IMAGEBOX:
return new CAniImageBox(po);
break;
case WT_BUTTON:
return new CButton(po);
break;
case WT_RATIOBUTTON:
return new CRadioButton(po);
break;
case WT_TOGGLEBUTTON:
return new CToggleButton(po);
break;
case WT_DRAGBUTTON:
return new CDragButton(po);
break;
case WT_BOX:
return new CBox(po);
break;
case WT_BAR:
return new CBar(po);
break;
case WT_LINE:
return new CLine(po);
break;
case WT_BAR3D:
return new CBar3D(po);
break;
case WT_NUMLINE:
return new CNumberLine(po);
break;
default:
assert(!"CWindowManager::__NewWindow");
break;
}
return new CWindow(po);
}
CWindow * CWindowManager::RegisterTypeWindow(PyObject * po, DWORD dwWndType, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = __NewWindow(po, dwWndType);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterSlotWindow(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CSlotWindow(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterGridSlotWindow(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CGridSlotWindow(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterTextLine(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CTextLine(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterImageBox(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CImageBox(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterMarkBox(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CMarkBox(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterExpandedImageBox(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CExpandedImageBox(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterAniImageBox(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CAniImageBox(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterButton(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CButton(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterRadioButton(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CRadioButton(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterToggleButton(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CToggleButton(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterDragButton(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CDragButton(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterBox(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CBox(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterBar(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CBar(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterLine(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CLine(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterBar3D(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CBar3D(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
CWindow * CWindowManager::RegisterNumberLine(PyObject * po, const char * c_szLayer)
{
assert(m_LayerWindowMap.end() != m_LayerWindowMap.find(c_szLayer));
CWindow * pWin = new CNumberLine(po);
m_LayerWindowMap[c_szLayer]->AddChild(pWin);
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.insert(pWin);
#endif
return pWin;
}
void CWindowManager::NotifyDestroyWindow(CWindow * pWindow)
{
if (pWindow == m_pActiveWindow)
m_pActiveWindow = NULL;
if (pWindow == m_pPointWindow)
m_pPointWindow = NULL;
if (pWindow == m_pLeftCaptureWindow)
m_pLeftCaptureWindow = NULL;
if (pWindow == m_pMiddleCaptureWindow)
m_pMiddleCaptureWindow = NULL;
if (pWindow == m_pRightCaptureWindow)
m_pRightCaptureWindow = NULL;
if (pWindow == m_pLockWindow)
m_pLockWindow = NULL;
m_LockWindowList.remove(pWindow);
m_ActiveWindowList.remove(pWindow);
m_PickAlwaysWindowList.remove(pWindow);
TKeyCaptureWindowMap::iterator itor = m_KeyCaptureWindowMap.begin();
for (; itor != m_KeyCaptureWindowMap.end();)
{
if (pWindow == itor->second)
{
itor = m_KeyCaptureWindowMap.erase(itor);
}
else
{
++itor;
}
}
}
void CWindowManager::DestroyWindow(CWindow * pWin)
{
NotifyDestroyWindow(pWin);
if (pWin->HasParent())
{
CWindow * pParentWin = pWin->GetParent();
pParentWin->DeleteChild(pWin);
}
pWin->Clear();
m_ReserveDeleteWindowList.push_back(pWin);
}
BOOL CWindowManager::IsDragging()
{
long ldx = abs(m_lMouseX - m_lPickedX);
long ldy = abs(m_lMouseY - m_lPickedY);
if (ldx+ldy < 10)
return FALSE;
return TRUE;
}
BOOL CWindowManager::IsAttaching()
{
return m_bAttachingFlag;
}
DWORD CWindowManager::GetAttachingType()
{
return m_dwAttachingType;
}
DWORD CWindowManager::GetAttachingIndex()
{
return m_dwAttachingIndex;
}
DWORD CWindowManager::GetAttachingSlotNumber()
{
return m_dwAttachingSlotNumber;
}
void CWindowManager::GetAttachingIconSize(BYTE * pbyWidth, BYTE * pbyHeight)
{
*pbyWidth = m_byAttachingIconWidth;
*pbyHeight = m_byAttachingIconHeight;
}
void CWindowManager::AttachIcon(DWORD dwType, DWORD dwIndex, DWORD dwSlotNumber, BYTE byWidth, BYTE byHeight)
{
m_bAttachingFlag = TRUE;
m_dwAttachingType = dwType;
m_dwAttachingIndex = dwIndex;
m_dwAttachingSlotNumber = dwSlotNumber;
m_byAttachingIconWidth = byWidth;
m_byAttachingIconHeight = byHeight;
}
void CWindowManager::SetAttachingFlag(BOOL bFlag)
{
m_bAttachingFlag = bFlag;
}
void CWindowManager::DeattachIcon()
{
SetAttachingFlag(FALSE);
if (m_poMouseHandler)
PyCallClassMemberFunc(m_poMouseHandler, "DeattachObject", BuildEmptyTuple());
}
void CWindowManager::SetParent(CWindow * pWindow, CWindow * pParentWindow)
{
if (!pWindow)
{
assert(!"CWindowManager::SetParent - There is no self window!");
return;
}
if (!pParentWindow)
{
assert(!"There is no parent window");
return;
}
if (pWindow->HasParent())
{
CWindow * pOldParentWindow = pWindow->GetParent();
if (pParentWindow == pOldParentWindow)
return;
pOldParentWindow->DeleteChild(pWindow);
}
pParentWindow->AddChild(pWindow);
}
void CWindowManager::SetPickAlways(CWindow * pWindow)
{
m_PickAlwaysWindowList.push_back(pWindow);
}
void CWindowManager::OnceIgnoreMouseLeftButtonUpEvent()
{
m_bOnceIgnoreMouseLeftButtonUpEventFlag = TRUE;
m_iIgnoreEndTime = timeGetTime() + 500;
}
void CWindowManager::LockWindow(CWindow * pWin)
{
if (m_pActiveWindow)
m_pActiveWindow->OnKillFocus();
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB8AE>Ʈ<EFBFBD>ȿ<EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
m_LockWindowList.remove(pWin);
if (m_pLockWindow)
{
if (m_pLockWindow==pWin)
return;
m_LockWindowList.push_back(m_pLockWindow);
}
m_pLockWindow = pWin;
}
void CWindowManager::UnlockWindow()
{
if (m_pLockWindow)
{
if (m_LockWindowList.empty())
{
m_pLockWindow = NULL;
if (m_pActiveWindow)
m_pActiveWindow->OnSetFocus();
}
else
{
m_pLockWindow = m_LockWindowList.back();
m_LockWindowList.pop_back();
}
}
}
void CWindowManager::ActivateWindow(CWindow * pWin)
{
m_ActiveWindowList.remove(pWin);
if (pWin == m_pActiveWindow)
return;
if (m_pActiveWindow)
{
// NOTE : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Window<6F><77> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Clear<61><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ұ<EFBFBD>?
// <20>ϴ<EFBFBD><CFB4><EFBFBD> <20>ߺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǸ<C8B5> <20><>Ŀ<EFBFBD><C4BF> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> 5<><35> <20≯<EFBFBD><CCB8>̴<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.. - [levites]
m_ActiveWindowList.push_back(m_pActiveWindow);
m_pActiveWindow->OnKillFocus();
}
m_pActiveWindow = pWin;
if (m_pActiveWindow)
{
m_pActiveWindow->OnSetFocus();
}
}
void CWindowManager::DeactivateWindow()
{
if (m_pActiveWindow)
{
if (m_ActiveWindowList.empty())
{
m_pActiveWindow->OnKillFocus();
m_pActiveWindow = NULL;
}
else
{
m_pActiveWindow->OnKillFocus();
m_pActiveWindow = m_ActiveWindowList.back();
m_ActiveWindowList.pop_back();
m_pActiveWindow->OnSetFocus();
}
}
}
void CWindowManager::SetTop(CWindow * pWin)
{
if (!pWin->HasParent())
return;
CWindow * pParentWindow = pWin->GetParent();
pParentWindow->SetTop(pWin);
// NOTE : Capture<72><65> <20><><EFBFBD>µȴ<C2B5>..? - [levites]
// NOTE : <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E5B7A1> <20>ؼ<EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ĸ<><20><><EFBFBD>Ƽ<EFBFBD> â<><C3A2> <20><>ư<EFBFBD><C6B0> <20>ι<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>׸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
// ResetCapture();
}
void CWindowManager::SetTopUIWindow()
{
if (m_pLockWindow)
return;
// GameLayer<65><72> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><>ŷ <20>ƴٸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SetTop<6F><70> <20><><EFBFBD>ش<EFBFBD>.
TLayerContainer::iterator itor = m_LayerWindowMap.find("UI");
if (itor == m_LayerWindowMap.end())
return;
CWindow * pGameLayer = itor->second;
CWindow * pTopWindow = pGameLayer->PickTopWindow(m_lMouseX, m_lMouseY);
if (pTopWindow)
{
SetTop(pTopWindow);
}
}
CWindow * CWindowManager::GetActivateWindow()
{
return m_pActiveWindow;
}
void CWindowManager::ResetCapture()
{
m_pLeftCaptureWindow = NULL;
m_pMiddleCaptureWindow = NULL;
m_pRightCaptureWindow = NULL;
}
void CWindowManager::SetResolution(int hres, int vres)
{
if (hres<=0 || vres<=0)
return;
m_iHres = hres;
m_iVres = vres;
}
float CWindowManager::GetAspect()
{
return (m_iHres)/float(m_iVres);
}
void CWindowManager::SetScreenSize(long lWidth, long lHeight)
{
m_lWidth = lWidth;
m_lHeight = lHeight;
for (TLayerContainer::iterator itor = m_LayerWindowMap.begin(); itor != m_LayerWindowMap.end(); ++itor)
{
itor->second->SetSize(lWidth, lHeight);
}
}
void CWindowManager::__ClearReserveDeleteWindowList()
{
for (TWindowContainer::iterator itor = m_ReserveDeleteWindowList.begin(); itor != m_ReserveDeleteWindowList.end(); ++itor)
{
CWindow * pWin = *itor;
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.erase(pWin);
#endif
delete pWin;
}
m_ReserveDeleteWindowList.clear();
}
void CWindowManager::Update()
{
__ClearReserveDeleteWindowList();
m_pRootWindow->Update();
}
void CWindowManager::Render()
{
m_pRootWindow->Render();
}
CWindow * CWindowManager::__PickWindow(long x, long y)
{
if (m_pLockWindow)
{
return m_pLockWindow->PickWindow(x, y);
}
for (TWindowContainer::iterator itor = m_PickAlwaysWindowList.begin(); itor != m_PickAlwaysWindowList.end(); ++itor)
{
CWindow * pWindow = *itor;
if (pWindow->IsRendering())
if (pWindow->IsIn(x, y))
return pWindow;
}
for (TWindowContainer::reverse_iterator ritor = m_LayerWindowList.rbegin(); ritor != m_LayerWindowList.rend(); ++ritor)
{
CWindow * pLayer = *ritor;
CWindow * pPickedWindow = pLayer->PickWindow(x, y);
if (pPickedWindow != pLayer)
return pPickedWindow;
}
return NULL;
}
void CWindowManager::SetMousePosition(long x, long y)
{
if (m_iHres==0)
return;
if (m_iVres==0)
return;
m_lMouseX = m_lWidth * x / m_iHres;
m_lMouseY = m_lHeight * y / m_iVres;
}
void CWindowManager::GetMousePosition(long & rx, long & ry)
{
rx = m_lMouseX;
ry = m_lMouseY;
}
void CWindowManager::RunMouseMove(long x, long y)
{
if (IsAttaching())
{
if (x > m_lWidth)
x = m_lWidth;
if (y > m_lHeight)
y = m_lHeight;
}
SetMousePosition(x, y);
CWindow * pPointWindow = __PickWindow(m_lMouseX, m_lMouseY);
if (g_bShowOverInWindowName)
{
if (pPointWindow)
{
static std::string strPickWindowName = "";
if (0 != strPickWindowName.compare(pPointWindow->GetName()))
{
Tracef(" OverInWindowName [%s]\n", pPointWindow->GetName());
strPickWindowName = pPointWindow->GetName();
}
}
}
if (m_pLeftCaptureWindow)
{
CWindow * pWin = m_pLeftCaptureWindow;
if (pWin->IsFlag(CWindow::FLAG_MOVABLE))
{
long x = m_lMouseX - m_lDragX;
long y = m_lMouseY - m_lDragY;
if (pWin->HasParent())
{
x -= pWin->GetParent()->GetRect().left;
y -= pWin->GetParent()->GetRect().top;
}
long lx, ly;
pWin->GetPosition(&lx, &ly);
if (pWin->IsFlag(CWindow::FLAG_RESTRICT_X))
{
x = lx;
}
if (pWin->IsFlag(CWindow::FLAG_RESTRICT_Y))
{
y = ly;
}
if (pWin->IsFlag(CWindow::FLAG_LIMIT))
{
RECT limitRect = pWin->GetLimitBias();
limitRect.right = m_lWidth - limitRect.right;
limitRect.bottom = m_lHeight - limitRect.bottom;
if (x < limitRect.left)
x = limitRect.left;
else if (x + pWin->GetWidth() >= limitRect.right)
x = limitRect.right - pWin->GetWidth();
if (y < limitRect.top)
y = limitRect.top;
else if (y + pWin->GetHeight() >= limitRect.bottom)
y = limitRect.bottom - pWin->GetHeight();
}
pWin->SetPosition(x, y);
pWin->OnMoveWindow(x, y);
}
else if (m_pLeftCaptureWindow->IsFlag(CWindow::FLAG_DRAGABLE))
{
long x = m_lMouseX - m_lDragX;
long y = m_lMouseY - m_lDragY;
m_pLeftCaptureWindow->OnMouseDrag(x, y);
}
}
if (m_pPointWindow != pPointWindow)
{
#ifdef _DEBUG
if (pPointWindow && pPointWindow->GetName())
Tracenf("PointWindow: %s", pPointWindow->GetName());
#endif
if (m_pPointWindow)
m_pPointWindow->OnMouseOverOut();
m_pPointWindow = pPointWindow;
if (m_pPointWindow)
m_pPointWindow->OnMouseOverIn();
}
if (m_pPointWindow)
{
m_pPointWindow->OnMouseOver();
}
}
void CWindowManager::RunMouseLeftButtonDown(long x, long y)
{
SetTopUIWindow();
/////
SetMousePosition(x, y);
CWindow * pWin = GetPointWindow();
if (!pWin)
return;
// Attach
if (pWin->IsFlag(CWindow::FLAG_ATTACH))
pWin = pWin->GetRoot();
// Drag
if (!pWin->IsFlag(CWindow::FLAG_NOT_CAPTURE))
m_pLeftCaptureWindow = pWin;
m_lDragX = m_lMouseX - pWin->GetRect().left;
m_lDragY = m_lMouseY - pWin->GetRect().top;
m_lPickedX = m_lMouseX;
m_lPickedY = m_lMouseY;
// Event
pWin->OnMouseLeftButtonDown();
}
void CWindowManager::RunMouseLeftButtonUp(long x, long y)
{
if (m_bOnceIgnoreMouseLeftButtonUpEventFlag)
{
m_bOnceIgnoreMouseLeftButtonUpEventFlag = FALSE;
if (timeGetTime() < m_iIgnoreEndTime)
{
return;
}
}
SetMousePosition(x, y);
if (m_pLeftCaptureWindow)
{
if (m_pLeftCaptureWindow->OnMouseLeftButtonUp())
{
// NOTE : <20><><EFBFBD>⼭ m_pLeftCaptureWindow<6F><77> NULL <20><> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>!! - [levites]
m_pLeftCaptureWindow = NULL;
return;
}
}
CWindow * pWin = GetPointWindow();
if (pWin)
pWin->OnMouseLeftButtonUp();
m_pLeftCaptureWindow = NULL;
}
void CWindowManager::RunMouseLeftButtonDoubleClick(long x, long y)
{
SetMousePosition(x, y);
CWindow * pWin = GetPointWindow();
if (!pWin)
return;
pWin->OnMouseLeftButtonDoubleClick();
}
void CWindowManager::RunMouseRightButtonDown(long x, long y)
{
SetTopUIWindow();
///////////////////////////////////////////////////////////////////////////////////////////
SetMousePosition(x, y);
CWindow * pWin = GetPointWindow();
if (!pWin)
return;
// Attach
if (pWin->IsFlag(CWindow::FLAG_ATTACH))
pWin = pWin->GetRoot();
// Drag
if (!pWin->IsFlag(CWindow::FLAG_NOT_CAPTURE))
m_pRightCaptureWindow = pWin;
pWin->OnMouseRightButtonDown();
}
void CWindowManager::RunMouseRightButtonUp(long x, long y)
{
if (m_pRightCaptureWindow)
{
if (m_pRightCaptureWindow->OnMouseRightButtonUp())
{
m_pRightCaptureWindow = NULL;
return;
}
}
CWindow * pWin = GetPointWindow();
if (pWin)
pWin->OnMouseRightButtonUp();
m_pRightCaptureWindow = NULL;
DeattachIcon();
}
void CWindowManager::RunMouseRightButtonDoubleClick(long x, long y)
{
SetMousePosition(x, y);
CWindow * pWin = GetPointWindow();
if (pWin)
{
pWin->OnMouseRightButtonDoubleClick();
}
}
void CWindowManager::RunMouseMiddleButtonDown(long x, long y)
{
SetMousePosition(x, y);
CWindow * pWin = GetPointWindow();
if (!pWin)
return;
m_pMiddleCaptureWindow = pWin;
pWin->OnMouseMiddleButtonDown();
}
void CWindowManager::RunMouseMiddleButtonUp(long x, long y)
{
SetMousePosition(x, y);
if (m_pMiddleCaptureWindow)
{
if (m_pMiddleCaptureWindow->OnMouseMiddleButtonUp())
{
m_pMiddleCaptureWindow = NULL;
return;
}
}
CWindow * pWin = GetPointWindow();
if (!pWin)
return;
pWin->OnMouseMiddleButtonUp();
m_pMiddleCaptureWindow = NULL;
}
// IME
void CWindowManager::RunIMEUpdate()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMEUpdate();
return;
}
if (!m_pActiveWindow)
return;
if (!m_pActiveWindow->IsRendering())
return;
m_pActiveWindow->OnIMEUpdate();
}
void CWindowManager::RunIMETabEvent()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMETabEvent();
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMETabEvent())
return;
}
if (!m_pRootWindow->RunIMETabEvent())
{
if (!m_ActiveWindowList.empty())
{
CWindow * pWindow = *(m_ActiveWindowList.begin());
ActivateWindow(pWindow);
/////////////////////////////////////////////
CWindow * pParentWindow = pWindow;
CWindow * pCurrentWindow = pWindow->GetParent();
DWORD dwMaxLoopCount = 20;
for (DWORD i = 0; i < dwMaxLoopCount; ++i)
{
if (!pParentWindow)
break;
if (pParentWindow == m_LayerWindowMap["GAME"])
{
SetTop(pCurrentWindow);
break;
}
pCurrentWindow = pParentWindow;
pParentWindow = pCurrentWindow->GetParent();
}
}
}
}
void CWindowManager::RunIMEReturnEvent()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMEReturnEvent();
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMEReturnEvent())
return;
}
m_pRootWindow->RunIMEReturnEvent();
}
void CWindowManager::RunIMEKeyDown(int vkey)
{
if (m_pLockWindow)
{
m_pLockWindow->OnKeyDown(vkey);
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMEKeyDownEvent(vkey))
return;
}
// NOTE : <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> Activate<74>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> EditLine<6E><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ
}
void CWindowManager::RunChangeCodePage()
{
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMEChangeCodePage())
return;
}
}
void CWindowManager::RunOpenCandidate()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMEOpenCandidateListEvent();
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMEOpenCandidateListEvent())
return;
}
}
void CWindowManager::RunCloseCandidate()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMECloseCandidateListEvent();
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMECloseCandidateListEvent())
return;
}
}
void CWindowManager::RunOpenReading()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMEOpenReadingWndEvent();
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMEOpenReadingWndEvent())
return;
}
}
void CWindowManager::RunCloseReading()
{
if (m_pLockWindow)
{
m_pLockWindow->OnIMECloseReadingWndEvent();
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsRendering())
{
if (m_pActiveWindow->OnIMECloseReadingWndEvent())
return;
}
}
// IME
void CWindowManager::RunKeyDown(int vkey)
{
if (m_pLockWindow)
{
m_pLockWindow->OnKeyDown(vkey);
m_KeyCaptureWindowMap.insert(std::make_pair(vkey, m_pLockWindow));
return;
}
if (m_pActiveWindow)
if (m_pActiveWindow->IsShow())
{
if (m_pActiveWindow->OnKeyDown(vkey))
{
m_KeyCaptureWindowMap.insert(std::make_pair(vkey, m_pActiveWindow));
return;
}
}
CWindow * pKeyCaptureWindow = m_pRootWindow->RunKeyDownEvent(vkey);
if (pKeyCaptureWindow)
if (m_ReserveDeleteWindowList.end() == std::find(m_ReserveDeleteWindowList.begin(), m_ReserveDeleteWindowList.end(), pKeyCaptureWindow))
{
m_KeyCaptureWindowMap.insert(TKeyCaptureWindowMap::value_type(vkey, pKeyCaptureWindow));
}
}
void CWindowManager::RunKeyUp(int vkey)
{
TKeyCaptureWindowMap::iterator itor = m_KeyCaptureWindowMap.find(vkey);
if (m_KeyCaptureWindowMap.end() != itor)
{
CWindow * pKeyCaptureWindow = itor->second;
if (pKeyCaptureWindow)
pKeyCaptureWindow->OnKeyUp(vkey);
m_KeyCaptureWindowMap.erase(itor);
return;
}
if (m_pLockWindow)
{
m_pLockWindow->OnKeyUp(vkey);
return;
}
if (m_pActiveWindow)
{
if (m_pActiveWindow->OnKeyUp(vkey))
return;
}
m_pRootWindow->RunKeyUpEvent(vkey);
}
void CWindowManager::RunPressEscapeKey()
{
if (m_pLockWindow)
{
m_pLockWindow->OnPressEscapeKey();
return;
}
m_pRootWindow->RunPressEscapeKeyEvent();
}
void CWindowManager::RunPressExitKey()
{
if (m_pLockWindow)
{
m_pLockWindow->OnPressExitKey();
return;
}
if (m_pActiveWindow)
{
if (m_pActiveWindow->OnPressExitKey())
return;
}
m_pRootWindow->RunPressExitKeyEvent();
}
}