/*
* $Id$
*
* (C) 2003-2006 Gabest
* (C) 2006-2010 see AUTHORS
*
* This file is part of mplayerc.
*
* Mplayerc 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 3 of the License, or
* (at your option) any later version.
*
* Mplayerc 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, see .
*
*/
#include "stdafx.h"
#include "mplayerc.h"
#include "PlayerInfoBar.h"
#include "MainFrm.h"
// CPlayerInfoBar
IMPLEMENT_DYNAMIC(CPlayerInfoBar, CDialogBar)
CPlayerInfoBar::CPlayerInfoBar(int nFirstColWidth) : m_nFirstColWidth(nFirstColWidth)
{
}
CPlayerInfoBar::~CPlayerInfoBar()
{
}
void CPlayerInfoBar::SetLine(CString label, CString info)
{
if(info.IsEmpty())
{
RemoveLine(label);
return;
}
for(size_t idx = 0; idx < m_label.GetCount(); idx++)
{
CString tmp;
m_label[idx]->GetWindowText(tmp);
if(label == tmp)
{
m_info[idx]->GetWindowText(tmp);
if(info != tmp) m_info[idx]->SetWindowText(info);
return;
}
}
CAutoPtr l(DNew CStatusLabel(true, false));
l->Create(label, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SS_OWNERDRAW, CRect(0,0,0,0), this);
m_label.Add(l);
CAutoPtr i(DNew CStatusLabel(false, true));
i->Create(info, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SS_OWNERDRAW, CRect(0,0,0,0), this);
m_info.Add(i);
Relayout();
}
void CPlayerInfoBar::GetLine(CString label, CString& info)
{
info.Empty();
for(size_t idx = 0; idx < m_label.GetCount(); idx++)
{
CString tmp;
m_label[idx]->GetWindowText(tmp);
if(label == tmp)
{
m_info[idx]->GetWindowText(tmp);
info = tmp;
return;
}
}
}
void CPlayerInfoBar::RemoveLine(CString label)
{
for(size_t i = 0; i < m_label.GetCount(); i++)
{
CString tmp;
m_label[i]->GetWindowText(tmp);
if(label == tmp)
{
m_label.RemoveAt(i);
m_info.RemoveAt(i);
break;
}
}
Relayout();
}
void CPlayerInfoBar::RemoveAllLines()
{
m_label.RemoveAll();
m_info.RemoveAll();
Relayout();
}
BOOL CPlayerInfoBar::Create(CWnd* pParentWnd)
{
return CDialogBar::Create(pParentWnd, IDD_PLAYERINFOBAR, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_BOTTOM, IDD_PLAYERINFOBAR);
}
BOOL CPlayerInfoBar::PreCreateWindow(CREATESTRUCT& cs)
{
if(!CDialogBar::PreCreateWindow(cs))
return FALSE;
m_dwStyle &= ~CBRS_BORDER_TOP;
m_dwStyle &= ~CBRS_BORDER_BOTTOM;
return TRUE;
}
CSize CPlayerInfoBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
CRect r;
GetParent()->GetClientRect(&r);
r.bottom = r.top + m_label.GetCount() * 17 + (m_label.GetCount() ? 4 : 0);
return r.Size();
}
void CPlayerInfoBar::Relayout()
{
CRect r;
GetParent()->GetClientRect(&r);
int w = m_nFirstColWidth, h = 17, y = 2;
for(size_t i = 0; i < m_label.GetCount(); i++)
{
CDC* pDC = m_label[i]->GetDC();
CString str;
m_label[i]->GetWindowText(str);
w = max(w, pDC->GetTextExtent(str).cx);
m_label[i]->ReleaseDC(pDC);
}
for(size_t i = 0; i < m_label.GetCount(); i++, y += h)
{
m_label[i]->MoveWindow(1, y, w - 10, h);
m_info[i]->MoveWindow(w + 10, y, r.Width()-(w+10)-1, h);
}
}
BEGIN_MESSAGE_MAP(CPlayerInfoBar, CDialogBar)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
// CPlayerInfoBar message handlers
BOOL CPlayerInfoBar::OnEraseBkgnd(CDC* pDC)
{
for(CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow())
{
CRect r;
pChild->GetClientRect(&r);
pChild->MapWindowPoints(this, &r);
pDC->ExcludeClipRect(&r);
}
CRect r;
GetClientRect(&r);
CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
if(pFrame->m_pLastBar != this || pFrame->m_fFullScreen)
r.InflateRect(0, 0, 0, 1);
if(pFrame->m_fFullScreen)
r.InflateRect(1, 0, 1, 0);
pDC->Draw3dRect(&r, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
r.DeflateRect(1, 1);
pDC->FillSolidRect(&r, 0);
return TRUE;
}
void CPlayerInfoBar::OnSize(UINT nType, int cx, int cy)
{
CDialogBar::OnSize(nType, cx, cy);
Relayout();
Invalidate();
}
void CPlayerInfoBar::OnLButtonDown(UINT nFlags, CPoint point)
{
CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
if(!pFrame->m_fFullScreen)
{
MapWindowPoints(pFrame, &point, 1);
pFrame->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}
}