// DUiText.cpp: implementation of the CDUiText class.
//
//////////////////////////////////////////////////////////////////////

#include "DUiMan.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDUiText::CDUiText()
{
    SetObjectType(DUI_TEXT);

    m_dwTextArraySize = 256;
    m_wszText = (WCHAR *)malloc(sizeof(WCHAR) * m_dwTextArraySize);
    m_wszText[0] = 0;
    m_dwTextLength = 0;

    m_dwFontColor = 0x00000000;
    m_dwSelectedFontColor = 0x00000000;

}

CDUiText::~CDUiText()
{
}

DWORD CDUiText::Display(BOOL bRefresh)
{
    DWORD dwRetVal = 0;

    return dwRetVal;
}

DWORD CDUiText::DisplayText(BOOL bRefresh)
{
    DWORD dwRetVal = 0;
    HDC         dc;
    WCHAR       wszTemp[1024];
    WCHAR       *wszPtr;
    RECT        rSource;
    WCHAR       wszTemp2[1024];
    DWORD       dwStringLength;
    rSource.left = m_xPos - 1;
    rSource.top = m_yPos - 1;
    rSource.right = m_xPos + m_dwWidth;
    rSource.bottom = m_yPos + m_dwHeight;

    if (m_pFont && g_pDUiManager->GetDC(&dc))
    {
        SelectObject(dc,m_pFont->GetFont());
        SetBkMode(dc,OPAQUE);
        SetBkColor(dc,ColorToColorRef(m_dwBackgroundColor));
        SetTextColor(dc,ColorToColorRef(m_dwFontColor));
        
        SIZE size;
        int iFit;
        int *piCharDims = NULL;
        
        wcscpy(wszTemp,m_wszText);
        OutputDebugString(wszTemp);
        dwStringLength = wcslen(wszTemp);
        piCharDims = (int*)malloc(sizeof(int)*dwStringLength);
        wszPtr = wszTemp;
        if (GetTextExtentExPoint(dc,wszTemp,dwStringLength,m_dwWidth-10,&iFit,piCharDims,&size))
        {
            wsprintf(wszTemp2,L"Will fit %d length %d\r\n",iFit,dwStringLength);
            OutputDebugString(wszTemp2);
            //quick truncation
            if (iFit < (int)dwStringLength)
            {
//                if (TRUE) //hack truncate for now
                if (FALSE)
                {
                    if (iFit < 0)
                    {
                        iFit = 0;
                    }
                    dwStringLength = (DWORD) iFit;
                    wszTemp[iFit] = 0;
                }
                else
                {
                    wszPtr = wszTemp + (dwStringLength - iFit);
                    dwStringLength -= (dwStringLength - iFit);
                }
            }
        }

        if (piCharDims)
        {
            free(piCharDims);
        }
        ExtTextOut(dc,rSource.left+4 ,rSource.top+5,ETO_OPAQUE,NULL,wszPtr,dwStringLength,NULL);
    }
    return dwRetVal;
}

void CDUiText::GetText(WCHAR *wszText)
{
    wcscpy(wszText,m_wszText);
}

void CDUiText::SetText(WCHAR *wszText)
{
    WCHAR *wszOld;
    if ((wcslen(wszText) + 1) < m_dwTextArraySize)
    {
        wcscpy(m_wszText,wszText);
    }
    else
    {
        m_dwTextArraySize = wcslen(wszText) * 2;
        wszOld = m_wszText;
        m_wszText = (WCHAR *) realloc(m_wszText,m_dwTextArraySize);
        m_dwTextLength = m_dwTextArraySize / 2;
        wcscpy(m_wszText,wszText);
    }
}
