#include "winframe.h"
/*
* CWindowFrame
*
* Implements the frame around windows: contains one or more child windows
* and displays their title bar(s).
*
*/
// width/height of a border
#define BORDER_SIZE 4
// height of the caption
#define CAPTION_HEIGHT 14
// width/height of a diagonal sizing grip
#define GRIP_SIZE (BORDER_SIZE + CAPTION_HEIGHT)
CWindowFrame::CWindowFrame(const windowdef_t* def, IWindowServer* srv)
: CWindow(def, srv)
{
//m_bDrag = false;
}
/*WindowHit CWindowFrame::HitTest(int x, int y)
{
Rectangle rect = GetPosition();
if (!rect.PtInRect(x, y))
return hitNone;
//if (GetClient().PtInRect(x, y))
//return hitClient;
x -= rect.left;
y -= rect.top;
rect.Offset(-rect.left, -rect.top);
if (x < BORDER_SIZE)
{
if (y < GRIP_SIZE)
return hitTopLeft;
else if (y >= rect.Height() - GRIP_SIZE)
return hitBottomLeft;
else
return hitLeft;
}
if (x >= rect.Width() - BORDER_SIZE)
{
if (y < GRIP_SIZE)
return hitTopRight;
else if (y >= rect.Height() - GRIP_SIZE)
return hitBottomRight;
else
return hitRight;
}
if (y < BORDER_SIZE)
{
if (x < GRIP_SIZE)
return hitTopLeft;
else if (x >= rect.Width() - GRIP_SIZE)
return hitTopRight;
else
return hitTop;
}
if (y >= rect.Height() - BORDER_SIZE)
{
if (x < GRIP_SIZE)
return hitBottomLeft;
else if (x >= rect.Width() - GRIP_SIZE)
return hitBottomRight;
else
return hitBottom;
}
rect.Inflate(-BORDER_SIZE, -BORDER_SIZE);
rect.bottom = rect.top + CAPTION_HEIGHT;
if (rect.PtInRect(x, y))
return hitCaption;
return hitNone;
}
bool CWindowFrame::PreDispatchMessage(Message* pMsg)
{
MouseStat* pStat = (MouseStat*) (pMsg + 1);
ISurface::DrawMode oldMode;
if (m_bDrag)
{
if (pMsg->dwMessage >= WM_LBUTTONDOWN &&
pMsg->dwMessage <= WM_MOUSEWHEEL)
{
switch (pMsg->dwMessage)
{
case WM_MOUSEMOVE:
oldMode = g_pScreen->SetDrawMode(ISurface::modeNot);
ConditShowCursor(m_rectDrag, false);
g_pScreen->Rect(m_rectDrag, 0, 1);
m_rectDrag.Offset(pStat->nXPos - m_ptDrag.x, pStat->nYPos - m_ptDrag.y);
g_pScreen->Rect(m_rectDrag, 0, 1);
ConditShowCursor(m_rectDrag, true);
g_pScreen->SetDrawMode(oldMode);
m_ptDrag = Point(pStat->nXPos, pStat->nYPos);
break;
case WM_LBUTTONUP:
oldMode = g_pScreen->SetDrawMode(ISurface::modeNot);
ConditShowCursor(m_rectDrag, false);
g_pScreen->Rect(m_rectDrag, 0, 1);
ConditShowCursor(m_rectDrag, true);
g_pScreen->SetDrawMode(oldMode);
m_bDrag = false;
SetCapture(NULL);
MoveWindow(m_rectDrag);
break;
}
return false;
}
}
return true;
}
void CWindowFrame::OnMessage(const Message* pMsg)
{
MouseStat* pStat = (MouseStat*) (pMsg + 1);
WindowHit nHit;
ISurface::DrawMode oldMode;
switch (pMsg->dwMessage)
{
case WM_LBUTTONDOWN:
Window::OnMessage(pMsg);
nHit = HitTest(pStat->nXPos, pStat->nYPos);
if (nHit == hitCaption)
{
m_bDrag = true;
m_rectDrag = GetPosition();
m_ptDrag = Point(pStat->nXPos, pStat->nYPos);
SetCapture(this);
oldMode = g_pScreen->SetDrawMode(ISurface::modeNot);
ConditShowCursor(m_rectDrag, false);
g_pScreen->Rect(m_rectDrag, 0, 1);
ConditShowCursor(m_rectDrag, true);
g_pScreen->SetDrawMode(oldMode);
}
break;
default:
Window::OnMessage(pMsg);
}
}*/
void CWindowFrame::RemoveChild(CWindow* child)
{
CWindow::RemoveChild(child);
if (m_first == NULL && m_last == NULL)
Release();
}
/*
* Code for Windows 95-style frame.
* Boring.
*/
#if 0
void CWindowFrame::AdjustForFrame(rectangle_t* rect)
{
rect->InflateRect(-BORDER_SIZE, -BORDER_SIZE);
rect->top += CAPTION_HEIGHT;
}
void CWindowFrame::OnPaint(ISurface* pSurf, const rectangle_t* rectPaint)
{
rectangle_t rect = *this;
IFont* pFont = m_font;
int y;
point_t size;
pSurf->Rect3d(rect,
pSurf->ColourMatch(0xc0c0c0),
pSurf->ColourMatch(0x000000), 1);
rect.InflateRect(-1, -1);
pSurf->Rect3d(rect,
pSurf->ColourMatch(0xffffff),
pSurf->ColourMatch(0x808080), 1);
rect.InflateRect(-1, -1);
rect.top += CAPTION_HEIGHT;
pSurf->Rect3d(rect,
pSurf->ColourMatch(0x808080),
pSurf->ColourMatch(0xffffff), 1);
rect.InflateRect(-1, -1);
pSurf->Rect3d(rect,
pSurf->ColourMatch(0x000000),
pSurf->ColourMatch(0xc0c0c0), 1);
rect.InflateRect(1, 1);
rect.top -= CAPTION_HEIGHT;
pSurf->FillRect(
rectangle_t(rect.left, rect.top, rect.right, rect.top + CAPTION_HEIGHT),
pSurf->ColourMatch(0x000080));
pFont->GetTextExtent(m_title, &size);
y = (CAPTION_HEIGHT - size.y) / 2;
pFont->DrawText(pSurf, rect.left + y, rect.top + y, m_title,
pSurf->ColourMatch(0xffffff));
}
#else
/*
* Trendy BeOS-style active tab title bar.
* Cool.
*/
void CWindowFrame::AdjustForFrame(rectangle_t* rect)
{
point_t pt;
rect->InflateRect(-BORDER_SIZE, -BORDER_SIZE);
m_font->GetTextExtent(m_title, &pt);
rect->top += 4 + pt.y;
}
void CWindowFrame::OnPaint(ISurface* pSurf, const rectangle_t* rectPaint)
{
rectangle_t rc = *this;
CWindow* pChild;
point_t pt;
m_font->GetTextExtent(m_title, &pt);
rc.top += 4 + pt.y;
pSurf->Rect(rc, pSurf->ColourMatch(0x808080), 1);
rc.InflateRect(-1, -1);
pSurf->Rect(rc, pSurf->ColourMatch(0xc0c0c0), 1);
rc.InflateRect(-1, -1);
pSurf->Rect3d(rc, pSurf->ColourMatch(0x808080),
pSurf->ColourMatch(0xffffff), 1);
rc.InflateRect(-1, -1);
pSurf->Rect(rc, pSurf->ColourMatch(0xc0c0c0), 1);
rc = *this;
rc.bottom = rc.top + pt.y + 5;
for (pChild = m_first; pChild; pChild = pChild->m_next)
{
m_font->GetTextExtent(pChild->m_title, &pt);
rc.right = rc.left + pt.x + 6;
pSurf->FillRect(rc, pSurf->ColourMatch(0xffff00));
pSurf->Rect(rc, pSurf->ColourMatch(0x808000), 1);
m_font->DrawText(pSurf, rc.left + 3, rc.top + 2, pChild->m_title, 0);
rc.left = rc.right + 1;
}
}
#endif