From c77821d0b4b3ae09e47ce6d6ca9d6b21dbb56d30 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 4 Nov 2013 08:59:15 +0000 Subject: LCDFramework project removed, integrated to MirandaG15 project git-svn-id: http://svn.miranda-ng.org/main/trunk@6767 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MirandaG15/src/LCDFramework/CLCDLabel.cpp | 228 ++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 plugins/MirandaG15/src/LCDFramework/CLCDLabel.cpp (limited to 'plugins/MirandaG15/src/LCDFramework/CLCDLabel.cpp') diff --git a/plugins/MirandaG15/src/LCDFramework/CLCDLabel.cpp b/plugins/MirandaG15/src/LCDFramework/CLCDLabel.cpp new file mode 100644 index 0000000000..6451f76665 --- /dev/null +++ b/plugins/MirandaG15/src/LCDFramework/CLCDLabel.cpp @@ -0,0 +1,228 @@ +#include "stdafx.h" +#include "CLCDGfx.h" +#include "CLCDObject.h" +#include "CLCDTextObject.h" +#include "CLCDLabel.h" +#include "math.h" + +//************************************************************************ +// constructor +//************************************************************************ +CLCDLabel::CLCDLabel() +{ + m_strText = _T(""); + m_bCutOff = true; +} + +//************************************************************************ +// destructor +//************************************************************************ +CLCDLabel::~CLCDLabel() +{ +} + +//************************************************************************ +// initializes the label +//************************************************************************ +bool CLCDLabel::Initialize() +{ + if(!CLCDTextObject::Initialize()) + return false; + + return true; +} + +//************************************************************************ +// deinitializes the label +//************************************************************************ +bool CLCDLabel::Shutdown() +{ + if(!CLCDTextObject::Shutdown()) + return false; + + return true; +} + +//************************************************************************ +// updates the label +//************************************************************************ +bool CLCDLabel::Update() +{ + if(!CLCDTextObject::Update()) + return false; + + return true; +} + +//************************************************************************ +// draws the label +//************************************************************************ +bool CLCDLabel::Draw(CLCDGfx *pGfx) +{ + if(!CLCDTextObject::Draw(pGfx)) + return false; + + SelectObject(pGfx->GetHDC(),m_hFont); + + int iTop = (int)(GetHeight()-(m_vLines.size()*m_iFontHeight))/2;///2;//()/2; + RECT rBoundary = {0,iTop,GetWidth(), GetHeight()-iTop}; + + vector::iterator iter = m_vLines.begin(); + while(!m_vLines.empty() && iter != m_vLines.end()) + { + DrawTextEx(pGfx->GetHDC(), (LPTSTR)(*iter).c_str(), (*iter).length(), &rBoundary, m_iTextFormat, &m_dtp); + rBoundary.top += m_iFontHeight; + iter++; + } + return true; +} + +//************************************************************************ +// sets the label's text +//************************************************************************ +void CLCDLabel::SetText(tstring strText) +{ + m_strText = strText; + + UpdateCutOffIndex(); +} + +//************************************************************************ +// called when the labels font has changed +//************************************************************************ +void CLCDLabel::OnFontChanged() +{ + UpdateCutOffIndex(); +} + +//************************************************************************ +// called when the labels size has changed +//************************************************************************ +void CLCDLabel::OnSizeChanged(SIZE OldSize) +{ + if(GetWidth() == OldSize.cx && GetHeight() == OldSize.cy) + return; + UpdateCutOffIndex(); +} + +//************************************************************************ +// sets the wordwrap mode +//************************************************************************ +void CLCDLabel::SetWordWrap(bool bEnable) +{ + m_bWordWrap = bEnable; +} + +//************************************************************************ +// updates the cutoff index +//************************************************************************ +void CLCDLabel::UpdateCutOffIndex() +{ + int iLen = m_strText.length(); + + m_vLines.clear(); + + if(iLen <= 0) + { + m_strCutOff = _T(""); + m_iCutOffIndex = 0; + return; + } + // variables + + HDC hDC = CreateCompatibleDC(NULL); + SelectObject(hDC, m_hFont); + + if(NULL == hDC) + return; + + int iWidth = GetWidth(); + SIZE sizeChar = {0, 0}; + SIZE sizeLine = {0, 0}; + SIZE sizeWord = {0,0}; + SIZE sizeCutOff = {0, 0}; + + int iAvailableLines = GetHeight()/m_iFontHeight; + // unitialized or too small labels need to be handled + if(iAvailableLines <= 0) + iAvailableLines = 1; + + // process wordwrapping + int i = 0; + if(m_bWordWrap && GetWidth() > 0) + { + int *piExtents = new int[m_strText.length()]; + TCHAR *szString = (TCHAR*)m_strText.c_str(); + int iMaxChars = 0; + tstring::size_type pos = 0; + + while(i= i && pos != i+iMaxChars) + iMaxChars = 1 + pos - i; + // if the string doesnt fit, try to wrap the last word to the next line + else if(iMaxChars < iLen - i || sizeLine.cx >= GetWidth()) + { + // find the last space in the line ( substract -1 from offset to ignore spaces as last chars ) + pos = m_strText.rfind(_T(" "),i + iMaxChars -1 ); + if(pos != tstring::npos && pos != i && pos >= i & pos != i+iMaxChars) + iMaxChars = 1 + pos - i; + } + + if(m_vLines.size() == iAvailableLines-1) + iMaxChars = iLen - i; + + m_vLines.push_back(m_strText.substr(i,iMaxChars)); + i += iMaxChars; + } + free(piExtents); + } + else + m_vLines.push_back(m_strText); + + // calculate the cutoff position + + GetTextExtentPoint(hDC,_T("..."),3,&sizeCutOff); + + int *piWidths = new int[(*--m_vLines.end()).length()]; + int iMaxChars = 0; + + GetTextExtentExPoint(hDC,(*--m_vLines.end()).c_str(),(*--m_vLines.end()).length(),iWidth,&iMaxChars,piWidths,&sizeLine); + + if(iMaxChars < (*--m_vLines.end()).length()) + { + for(iMaxChars--;iMaxChars>0;iMaxChars--) + { + if(piWidths[iMaxChars] + sizeCutOff.cx <= iWidth) + break; + } + (*--m_vLines.end()) = (*--m_vLines.end()).substr(0,iMaxChars) + _T("..."); + } + free(piWidths); + + DeleteObject(hDC); + + //if(GetWidth() == 0) + m_iLineCount = 1; + //else + // m_iLineCount = ceil((double)(sizeLine.cx + sizeCutOff.cx)/GetWidth()); + + //if(m_iLineCount > GetHeight()/m_iFontHeight) + // m_iLineCount = GetHeight()/m_iFontHeight; +} + +//************************************************************************ +// sets the cutoff mode +//************************************************************************ +void CLCDLabel::SetCutOff(bool bEnable) +{ + m_bCutOff = bEnable; +} \ No newline at end of file -- cgit v1.2.3