Subversion Repositories spk

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/****h* EZ.LCD.SDK.Wrapper/EZ_LCD_Page.cpp
 * NAME
 *   EZ_LCD_Page.cpp
 * COPYRIGHT
 *   The Logitech EZ LCD SDK Wrapper, including all accompanying 
 *   documentation, is protected by intellectual property laws. All rights 
 *   not expressly granted by Logitech are reserved.
 * PURPOSE
 *   Part of the SDK package.
 * AUTHOR
 *   Christophe Juncker (christophe_juncker@logitech.com)
 *   Vahid Afshar (Vahid_Afshar@logitech.com)
 * CREATION DATE
 *   06/13/2005
 * MODIFICATION HISTORY
 *   03/01/2006 - Added the concept of pages.
 *   
 *******
 */

#include "StdAfx.h"

#include "LCDUI/LCDText.h"
#include "LCDUI/LCDStreamingText.h"
#include "LCDUI/LCDIcon.h"
#include "LCDUI/LCDProgressBar.h"
#include "LCDUI/LCDBitmap.h"
#include "EZ_LCD.h"
#include "EZ_LCD_Page.h"

// text box height for various font sizes
CONST INT LG_SMALL_FONT_TEXT_BOX_HEIGHT = 12;
CONST INT LG_MEDIUM_FONT_TEXT_BOX_HEIGHT = 13;
CONST INT LG_BIG_FONT_TEXT_BOX_HEIGHT = 20;

// corresponding font size
CONST INT LG_SMALL_FONT_SIZE = 7;
CONST INT LG_MEDIUM_FONT_SIZE = 8;
CONST INT LG_BIG_FONT_SIZE = 12;

// logical origin Y value for various font sizes
CONST INT LG_SMALL_FONT_LOGICAL_ORIGIN_Y = -3;
CONST INT LG_MEDIUM_FONT_LOGICAL_ORIGIN_Y = -2;
CONST INT LG_BIG_FONT_LOGICAL_ORIGIN_Y = -4;

// Scrolling text parameters
CONST INT LG_SCROLLING_SPEED = 25;
CONST INT LG_SCROLLING_STEP = 7;
CONST INT LG_SCROLLING_DELAY_MS = 2000;
CONST TCHAR LG_SCROLLING_GAP_TEXT[] = _T("       ");

// Progress bar parameters
CONST INT LG_PROGRESS_BAR_RANGE_MIN = 0;
CONST INT LG_PROGRESS_BAR_RANGE_MAX = 100;
CONST INT LG_PROGRESS_BAR_INITIAL_HEIGHT = 5;

// Font
CONST LPCTSTR LG_FONT = _T("Microsoft Sans Serif");

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::CEzLcdPage
 * NAME
 *  CEzLcdPage::CEzLcdPage(LPCTSTR friendlyName, INT width, INT height) -- Basic constructor
 * FUNCTION
 *  Does necessary initialization.
 * INPUTS
 *  friendlyName  - friendly name of the applet/game. This name will be 
 *                  displayed in the Logitech G-series LCD Manager.
 *  width         - width in pixels of the LCD.
 *  height        - height in pixels of the LCD.
 ******
 */
CEzLcdPage::CEzLcdPage()
{
        m_pContainer = NULL;
}

CEzLcdPage::CEzLcdPage(CEzLcd * pContainer, INT iWidth, INT iHeight)
{
        m_pContainer = pContainer;
        Init(iWidth, iHeight);
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::CEzLcdPage
 * NAME
 *  CEzLcdPage::CEzLcdPage(LPCTSTR friendlyName, INT width, INT height, lgLcdOnConfigureCB callbackFunction, PVOID configContext) -- Constructor including configure button callback function
 * FUNCTION
 *  Does necessary initialization.
 * INPUTS
 *  friendlyName  - friendly name of the applet/game. This name will be 
 *                  displayed in the Logitech G-series LCD Manager.
 *  width         - width in pixels of the LCD.
 *  height        - height in pixels of the LCD.
 ******
 */

CEzLcdPage::~CEzLcdPage()
{
    LCD_OBJECT_LIST::iterator it_ = m_Objects.begin();
    while(it_ != m_Objects.end())
    {
        CLCDBase *pObject_ = *it_;
        LCDUIASSERT(NULL != pObject_);
        delete pObject_;

        ++it_;
    }
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::AddText
 * NAME
 *  HANDLE CEzLcdPage::AddText(LGObjectType type, LGTextSize size, INT alignment, INT maxLengthPixels) -- Add a text object to the LCD
 * INPUTS
 *  type            - specifies whether the text is static or 
 *                    scrolling. Possible types are: LG_SCROLLING_TEXT,
 *                    LG_STATIC_TEXT
 *  size            - size of the text. Choose between these three: 
 *                    LG_SMALL, LG_MEDIUM or LG_BIG.
 *  alignment       - alignment of the text. Values are: DT_LEFT, 
 *                    DT_CENTER, DT_RIGHT.
 *  maxLengthPixels - max length in pixels of the text. If the text is
 *                    longer and of type LG_STATIC_TEXT, it will be cut
 *                    off. If the text is longer and of type 
 *                    LG_SCROLLING_TEXT, it will scroll.
 * RETURN VALUE 
 *  Handle for this object.
 * SEE ALSO
 *  CEzLcdPage::AddIcon
 *  CEzLcdPage::AddProgressBar
 ******
 */
HANDLE CEzLcdPage::AddText(LGObjectType type, LGTextSize size, INT iAlignment, INT iMaxLengthPixels)
{
    return AddText(type, size, iAlignment, iMaxLengthPixels, 1);
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::AddText
 * NAME
 *  HANDLE CEzLcdPage::AddText(LGObjectType type, LGTextSize size, INT alignment, INT maxLengthPixels, INT numberOfLines) -- Add a text object to the LCD
 * INPUTS
 *  type            - specifies whether the text is static or 
 *                    scrolling. Possible types are: LG_SCROLLING_TEXT,
 *                    LG_STATIC_TEXT
 *  size            - size of the text. Choose between these three: 
 *                    LG_SMALL, LG_MEDIUM or LG_BIG.
 *  alignment       - alignment of the text. Values are: DT_LEFT, 
 *                    DT_CENTER, DT_RIGHT.
 *  maxLengthPixels - max length in pixels of the text. If the text is
 *                    longer and of type LG_STATIC_TEXT, it will be cut
 *                    off. If the text is longer and of type 
 *                    LG_SCROLLING_TEXT, it will scroll.
 *  numberOfLines   - number of lines the text can use. For static text 
 *                    only. If number bigger than 1 and statoc text is too
 *                    long to fit on LCD, the text will be displayed on 
 *                    multiple lines as necessary.
 * RETURN VALUE 
 *  Handle for this object.
 * SEE ALSO
 *  CEzLcdPage::AddIcon
 *  CEzLcdPage::AddProgressBar
 ******
 */
HANDLE CEzLcdPage::AddText(LGObjectType type, LGTextSize size, INT iAlignment, INT iMaxLengthPixels, INT iNumberOfLines)
{
    LCDUIASSERT(LG_SCROLLING_TEXT == type || LG_STATIC_TEXT == type || type == LG_SCROLLING_TEXT_FAST);
    CLCDText* pStaticText_;
    CLCDStreamingText* pStreamingText_;

    INT iBoxHeight_ = LG_MEDIUM_FONT_TEXT_BOX_HEIGHT;
    INT iFontSize_ = LG_MEDIUM_FONT_SIZE;
    INT iLocalOriginY_ = LG_MEDIUM_FONT_LOGICAL_ORIGIN_Y;

    switch (type)
    {
    case LG_SCROLLING_TEXT:
    case LG_SCROLLING_TEXT_FAST:
        pStreamingText_ = new CLCDStreamingText();
        LCDUIASSERT(NULL != pStreamingText_);
        pStreamingText_->Initialize();
        pStreamingText_->SetOrigin(0, 0);
        pStreamingText_->SetFontFaceName(LG_FONT);
        pStreamingText_->SetAlignment(iAlignment);
        pStreamingText_->SetText(_T(" "));
        pStreamingText_->SetGapText(LG_SCROLLING_GAP_TEXT);
                if ( type == LG_SCROLLING_TEXT_FAST )
                        pStreamingText_->SetSpeed(LG_SCROLLING_SPEED * 2);
                else
                        pStreamingText_->SetSpeed(LG_SCROLLING_SPEED);
        pStreamingText_->SetScrollingStep(LG_SCROLLING_STEP);
        pStreamingText_->SetStartDelay(LG_SCROLLING_DELAY_MS);

        if (LG_SMALL == size)
        {
            iBoxHeight_ = LG_SMALL_FONT_TEXT_BOX_HEIGHT;
            iFontSize_ = LG_SMALL_FONT_SIZE;
            iLocalOriginY_ = LG_SMALL_FONT_LOGICAL_ORIGIN_Y;
        }
        else if (LG_MEDIUM == size)
        {
            iBoxHeight_ = LG_MEDIUM_FONT_TEXT_BOX_HEIGHT;
            iFontSize_ = LG_MEDIUM_FONT_SIZE;
            iLocalOriginY_ = LG_MEDIUM_FONT_LOGICAL_ORIGIN_Y;
        }
        else if (LG_BIG == size)
        {
            pStreamingText_->SetFontWeight(FW_BOLD);
            iBoxHeight_ = LG_BIG_FONT_TEXT_BOX_HEIGHT;
            iFontSize_ = LG_BIG_FONT_SIZE;
            iLocalOriginY_ = LG_BIG_FONT_LOGICAL_ORIGIN_Y;
        }

        pStreamingText_->SetSize(iMaxLengthPixels, iBoxHeight_);                
        pStreamingText_->SetFontPointSize(iFontSize_);
        pStreamingText_->SetLogicalOrigin(0, iLocalOriginY_);
        pStreamingText_->SetObjectType(LG_SCROLLING_TEXT);

        AddObject(pStreamingText_);

        return pStreamingText_;
        break;
    case LG_STATIC_TEXT:
        pStaticText_ = new CLCDText();
        LCDUIASSERT(NULL != pStaticText_);
        pStaticText_->Initialize();
        pStaticText_->SetOrigin(0, 0);
        pStaticText_->SetFontFaceName(LG_FONT);
        pStaticText_->SetAlignment(iAlignment);
        pStaticText_->SetBackgroundMode(OPAQUE);
        pStaticText_->SetText(_T(" "));

        if (LG_SMALL == size)
        {
            iBoxHeight_ = iNumberOfLines * LG_SMALL_FONT_TEXT_BOX_HEIGHT;
            iFontSize_ = LG_SMALL_FONT_SIZE;
            iLocalOriginY_ = LG_SMALL_FONT_LOGICAL_ORIGIN_Y;
        }
        else if (LG_MEDIUM == size)
        {
            iBoxHeight_ = iNumberOfLines * LG_MEDIUM_FONT_TEXT_BOX_HEIGHT;
            iFontSize_ = LG_MEDIUM_FONT_SIZE;
            iLocalOriginY_ = LG_MEDIUM_FONT_LOGICAL_ORIGIN_Y;
        }
        else if (LG_BIG == size)
        {
            pStaticText_->SetFontWeight(FW_BOLD);
            iBoxHeight_ = iNumberOfLines * LG_BIG_FONT_TEXT_BOX_HEIGHT;
            iFontSize_ = LG_BIG_FONT_SIZE;
            iLocalOriginY_ = LG_BIG_FONT_LOGICAL_ORIGIN_Y;
        }

        pStaticText_->SetSize(iMaxLengthPixels, iBoxHeight_);
        pStaticText_->SetFontPointSize(iFontSize_);
        pStaticText_->SetLogicalOrigin(0, iLocalOriginY_);
        pStaticText_->SetObjectType(LG_STATIC_TEXT);

        if (1 < iNumberOfLines)
            pStaticText_->SetWordWrap(TRUE);

        AddObject(pStaticText_);

        return pStaticText_;
        break;
    default:
        LCDUITRACE(_T("ERROR: trying to add text object with undefined type\n"));
    }

    return NULL;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::SetText
 * NAME
 *  HRESULT CEzLcdPage::SetText -- Set text
 * INPUTS
 *  hHandle          - handle to the object.
 *  pText            - text string.
 * RETURN VALUE 
 *  E_FAIL if there was an error.
 *  S_OK if no error.
 ******
 */
HRESULT CEzLcdPage::SetText(HANDLE hHandle, LPCTSTR pText)
{
    CLCDBase* pMyObject_ = GetObject(hHandle);

    if (NULL != pMyObject_)
    {
        LCDUIASSERT(LG_STATIC_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT_FAST == pMyObject_->GetObjectType());
        if (LG_STATIC_TEXT == pMyObject_->GetObjectType())
        {
            CLCDText* pStaticText_ = static_cast<CLCDText*>(pMyObject_);
            LCDUIASSERT(NULL != pStaticText_);
            pStaticText_->SetText(pText);
            return S_OK;
        }
        else if (LG_SCROLLING_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT_FAST == pMyObject_->GetObjectType())
        {
            CLCDStreamingText* pStreamingText_ = static_cast<CLCDStreamingText*>(pMyObject_);
            LCDUIASSERT(NULL != pStreamingText_);
            pStreamingText_->SetText(pText);
            return S_OK;
        }
    }

    return E_FAIL;
}

HRESULT CEzLcdPage::SetSpeed(HANDLE hHandle, DWORD speed)
{
    CLCDBase* pMyObject_ = GetObject(hHandle);

    if (NULL != pMyObject_)
    {
        LCDUIASSERT(LG_SCROLLING_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT_FAST == pMyObject_->GetObjectType());
        if (LG_SCROLLING_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT_FAST == pMyObject_->GetObjectType())
        {
            CLCDStreamingText* pStreamingText_ = static_cast<CLCDStreamingText*>(pMyObject_);
            LCDUIASSERT(NULL != pStreamingText_);
            pStreamingText_->SetSpeed ( speed );
            return S_OK;
        }
    }

    return E_FAIL;
}

HRESULT CEzLcdPage::SetText(HANDLE hHandle, const std::string &pText)
{
    CLCDBase* pMyObject_ = GetObject(hHandle);

    if (NULL != pMyObject_)
    {
        LCDUIASSERT(LG_STATIC_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT == pMyObject_->GetObjectType());
        if (LG_STATIC_TEXT == pMyObject_->GetObjectType())
        {
            CLCDText* pStaticText_ = static_cast<CLCDText*>(pMyObject_);
            LCDUIASSERT(NULL != pStaticText_);
            pStaticText_->SetText(pText);
            return S_OK;
        }
        else if (LG_SCROLLING_TEXT == pMyObject_->GetObjectType() || LG_SCROLLING_TEXT_FAST == pMyObject_->GetObjectType())
        {
            CLCDStreamingText* pStreamingText_ = static_cast<CLCDStreamingText*>(pMyObject_);
            LCDUIASSERT(NULL != pStreamingText_);
            pStreamingText_->SetText(pText);
            return S_OK;
        }
    }

    return E_FAIL;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::AddIcon
 * NAME
 *  HANDLE CEzLcdPage::AddIcon -- Add an icon object to the LCD
 * INPUTS
 *  hIcon            - icon to be displayed on the LCD. Should be 1 bpp
 *                     bitmap.
 *  iWidth           - x-axis size of the bitmap.
 *  iHeight          - y-axis size of the bitmap.
 * RETURN VALUE 
 *  Handle for this object.
 * SEE ALSO
 *  CEzLcdPage::AddText
 *  CEzLcdPage::AddProgressBar
 ******
 */
HANDLE CEzLcdPage::AddIcon(HICON hIcon, INT iWidth, INT iHeight)
{
    CLCDIcon* hIcon_ = new CLCDIcon();
    LCDUIASSERT(NULL != hIcon_);
    hIcon_->Initialize();
    hIcon_->SetOrigin(0, 0);
    hIcon_->SetSize(iWidth, iHeight);
    hIcon_->SetIcon(hIcon, iWidth, iHeight);
    hIcon_->SetObjectType(LG_ICON);

    AddObject(hIcon_);

    return hIcon_;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::AddProgressBar
 * NAME
 *  HANDLE CEzLcdPage::AddProgressBar -- Add a progress bar object to the LCD.
 * INPUTS
 *  type            - type of the progress bar. Types are: LG_CURSOR, 
 *                    LG_FILLED.
 * RETURN VALUE 
 *  Handle for this object.
 * SEE ALSO
 *  CEzLcdPage::AddText
 *  CEzLcdPage::AddIcon
 ******
 */
HANDLE CEzLcdPage::AddProgressBar(LGProgressBarType type)
{
    LCDUIASSERT(LG_FILLED == type || LG_CURSOR == type || LG_DOT_CURSOR == type);
    CLCDProgressBar *pProgressBar_ = new CLCDProgressBar();
    LCDUIASSERT(NULL != pProgressBar_);
    pProgressBar_->Initialize();
    pProgressBar_->SetOrigin(0, 0);
    pProgressBar_->SetSize(m_iLcdWidth, LG_PROGRESS_BAR_INITIAL_HEIGHT);
    pProgressBar_->SetRange(LG_PROGRESS_BAR_RANGE_MIN, LG_PROGRESS_BAR_RANGE_MAX );
    pProgressBar_->SetPos(static_cast<FLOAT>(LG_PROGRESS_BAR_RANGE_MIN));
    pProgressBar_->SetObjectType(LG_PROGRESS_BAR);

        // Map the progress style into what the UI classes understand
        CLCDProgressBar::ePROGRESS_STYLE eStyle = CLCDProgressBar::ePROGRESS_STYLE::STYLE_FILLED;
        switch (type)
        {
                case LG_FILLED:
                        eStyle = CLCDProgressBar::ePROGRESS_STYLE::STYLE_FILLED;
                        break;
                case LG_CURSOR:
                        eStyle = CLCDProgressBar::ePROGRESS_STYLE::STYLE_CURSOR;
                        break;
                case LG_DOT_CURSOR:
                        eStyle = CLCDProgressBar::ePROGRESS_STYLE::STYLE_DASHED_CURSOR;
                        break;
        }

        pProgressBar_->SetProgressStyle(eStyle);

    AddObject(pProgressBar_);

    return pProgressBar_;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::SetProgressBarPosition
 * NAME
 *  HRESULT CEzLcdPage::SetProgressBarPosition -- Set position of the 
 *  progress bar's cursor
 * INPUTS
 *  hHandle          - handle to the object.
 *  fPercentage      - percentage of progress (0 to 100).
 * RETURN VALUE 
 *  E_FAIL if there was an error or if handle does not correspond to a
 *  progress bar.
 *  S_OK if no error.
 ******
 */
HRESULT CEzLcdPage::SetProgressBarPosition(HANDLE hHandle, FLOAT fPercentage)
{
    CLCDBase* pMyObject_ = GetObject(hHandle);

    if (NULL != pMyObject_)
    {
        LCDUIASSERT(LG_PROGRESS_BAR == pMyObject_->GetObjectType());
        // only allow this function for progress bars
        if (LG_PROGRESS_BAR == pMyObject_->GetObjectType())
        {
            CLCDProgressBar *progressBar_ = static_cast<CLCDProgressBar*>(pMyObject_);
            LCDUIASSERT(NULL != progressBar_);
            progressBar_->SetPos(fPercentage);
            return S_OK;
        }
    }

    return E_FAIL;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::SetProgressBarSize
 * NAME
 *  HRESULT CEzLcdPage::SetProgressBarSize -- Set size of progress bar
 * INPUTS
 *  hHandle          - handle to the object.
 *  iWidth           - x-axis part of the size
 *  iHeight          - y-axis part of the size (a good default value is 5).
 * RETURN VALUE 
 *  E_FAIL if there was an error or if handle does not correspond to a
 *  progress bar.
 *  S_OK if no error.
 ******
 */
HRESULT CEzLcdPage::SetProgressBarSize(HANDLE hHandle, INT iWidth, INT iHeight)
{
    CLCDBase* ppMyObject_ = GetObject(hHandle);
    LCDUIASSERT(NULL != ppMyObject_);

    if (NULL != ppMyObject_)
    {
        LCDUIASSERT(LG_PROGRESS_BAR == ppMyObject_->GetObjectType());
        // only allow this function for progress bars
        if (LG_PROGRESS_BAR == ppMyObject_->GetObjectType())
        {
            ppMyObject_->SetSize(iWidth, iHeight);
            return S_OK;
        }
    }

    return E_FAIL;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::AddBitmap
 * NAME
 *  HANDLE CEzLcdPage::AddBitmap() -- Add a bitmap object to the LCD.
 * COMMENTS
 *  A bitmap's size currently must always be 160x43 pixels.
 * RETURN VALUE 
 *  Handle for this object.
 * SEE ALSO
 *  CEzLcdPage::AddText
 *  CEzLcdPage::AddIcon
 ******
 */
HANDLE CEzLcdPage::AddBitmap(void)
{
    CLCDBitmap *hBitmap_ = new CLCDBitmap();
    LCDUIASSERT(NULL != hBitmap_);
    hBitmap_->Initialize();
    hBitmap_->SetOrigin(0, 0);

    AddObject(hBitmap_);

    return hBitmap_;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::SetBitmap
 * NAME
 *  HRESULT CEzLcdPage::SetBitmap(HANDLE handle, HBITMAP bitmap) -- Set the bitmap.
 * INPUTS
 *  handle          - handle to the object.
 *  bitmap          - 160x43 1bpp bitmap.
 * RETURN VALUE 
 *  E_FAIL if there was an error or if handle does not correspond to a
 *  bitmap.
 *  S_OK if no error.
 ******
 */
HRESULT CEzLcdPage::SetBitmap(HANDLE hHandle, HBITMAP hBitmap)
{
    if (NULL == hBitmap)
        return E_FAIL;

    CLCDBase* pMyObject_ = GetObject(hHandle);

    if (NULL != pMyObject_)
    {
        CLCDBitmap* hBitmap_ = static_cast<CLCDBitmap*>(pMyObject_);
        LCDUIASSERT(hBitmap_);
        hBitmap_->SetBitmap(hBitmap);
        return S_OK;
    }

    return S_OK;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::SetOrigin
 * NAME
 *  HRESULT CEzLcdPage::SetOrigin -- Set the origin of an object. The 
 *                  origin corresponds to the furthest pixel on the 
 *                  upper left corner of an object.
 * INPUTS
 *  hHandle          - handle to the object.
 *  iOriginX         - x-axis part of the origin.
 *  iOriginY         - y-axis part of the origin.
 * RETURN VALUE 
 *  E_FAIL if there was an error.
 *  S_OK if no error.
 ******
 */
HRESULT CEzLcdPage::SetOrigin(HANDLE hHandle, INT iOriginX, INT iOriginY)
{
    CLCDBase* pMyObject_ = GetObject(hHandle);
    LCDUIASSERT(NULL != pMyObject_);
    LCDUIASSERT(NULL != pMyObject_);

    if (NULL != pMyObject_ && NULL != pMyObject_)
    {
        pMyObject_->SetOrigin(iOriginX, iOriginY);
        return S_OK;
    }

    return E_FAIL;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::SetVisible
 * NAME
 *  HRESULT CEzLcdPage::SetVisible -- set corresponding object to be 
 *  visible or invisible.
 * INPUTS
 *  hHandle          - handle to the object.
 *  bVisible         - set to FALSE to make object invisible, TRUE to 
 *                     make it visible (default).
 * RETURN VALUE 
 *  E_FAIL if there was an error.
 *  S_OK if no error.
 ******
 */
HRESULT CEzLcdPage::SetVisible(HANDLE hHandle, BOOL bVisible)
{
    CLCDBase* pMyObject_ = GetObject(hHandle);
    LCDUIASSERT(NULL != pMyObject_);
    LCDUIASSERT(NULL != pMyObject_);

    if (NULL != pMyObject_ && NULL != pMyObject_)
    {        
        pMyObject_->Show(bVisible);
        return S_OK;
    }

    return E_FAIL;
}

/****f* EZ.LCD.SDK.Wrapper/CEzLcdPage::Update
 * NAME
 *  VOID CEzLcdPage::Update -- Update LCD display
 * FUNCTION
 *  Updates the display. Must be called every loop.
 ******
 */
VOID CEzLcdPage::Update()
{
// Save copy of button state
    for (INT ii = 0; ii < NUMBER_SOFT_BUTTONS; ii++)
    {
        m_bButtonWasPressed[ii] = m_bButtonIsPressed[ii];
    }
}

CLCDBase* CEzLcdPage::GetObject(HANDLE hHandle)
{
    LCD_OBJECT_LIST::iterator it_ = m_Objects.begin();
    while(it_ != m_Objects.end())
    {
        CLCDBase *pObject_ = *it_;
        LCDUIASSERT(NULL != pObject_);

        if (pObject_ == hHandle)
        {
            return pObject_;
        }
        ++it_;
    }

    return NULL;
}

VOID CEzLcdPage::Init(INT iWidth, INT iHeight)
{
    m_iLcdWidth = iWidth;
    m_iLcdHeight = iHeight;

    for (INT ii = 0; ii < NUMBER_SOFT_BUTTONS; ii++)
    {
        m_bButtonIsPressed[ii] = FALSE;
        m_bButtonWasPressed[ii] = FALSE;
    }
}

void CEzLcdPage::OnLCDButtonDown(int iButton)
{
    switch(iButton)
    {
    case LGLCDBUTTON_BUTTON0:
        m_bButtonIsPressed[LG_BUTTON_1] = TRUE;
        break;
    case LGLCDBUTTON_BUTTON1:
        m_bButtonIsPressed[LG_BUTTON_2] = TRUE;
        break;
    case LGLCDBUTTON_BUTTON2:
        m_bButtonIsPressed[LG_BUTTON_3] = TRUE;
        break;
    case LGLCDBUTTON_BUTTON3:
        m_bButtonIsPressed[LG_BUTTON_4] = TRUE;
        break;
    default:
        LCDUITRACE(_T("ERROR: unknown button was pressed\n"));
        break;
    }

        m_pContainer->OnLCDButtonDown(iButton);
}

void CEzLcdPage::OnLCDButtonUp(int iButton)
{
    switch(iButton)
    {
    case LGLCDBUTTON_BUTTON0:
        m_bButtonIsPressed[LG_BUTTON_1] = FALSE;
        break;
    case LGLCDBUTTON_BUTTON1:
        m_bButtonIsPressed[LG_BUTTON_2] = FALSE;
        break;
    case LGLCDBUTTON_BUTTON2:
        m_bButtonIsPressed[LG_BUTTON_3] = FALSE;
        break;
    case LGLCDBUTTON_BUTTON3:
        m_bButtonIsPressed[LG_BUTTON_4] = FALSE;
        break;
    default:
        LCDUITRACE(_T("ERROR: unknown button was pressed\n"));
        break;
    }

        m_pContainer->OnLCDButtonUp(iButton);
}