// WIAPreview.cpp : implementation file
//

#include "stdafx.h"
#include "wiatest.h"
#include "WIAPreview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWIAPreview
/**************************************************************************\
* CWIAPreview::CWIAPreview()
*   
*   Constructor for the CWIAPreview class
*   
*   
* Arguments:
*   
*   none
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
CWIAPreview::CWIAPreview()
{
    m_PaintMode = PAINT_TOFIT;
    m_pDIB = NULL;
    m_Scrollpt.x = 0;
    m_Scrollpt.y = 0;
}
/**************************************************************************\
* CWIAPreview::~CWIAPreview()
*   
*   Destructor for the CWIAPreview class
*   
*   
* Arguments:
*   
*   none
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
CWIAPreview::~CWIAPreview()
{
}


BEGIN_MESSAGE_MAP(CWIAPreview, CWnd)
    //{{AFX_MSG_MAP(CWIAPreview)
    ON_WM_PAINT()
    ON_WM_HSCROLL()
    ON_WM_VSCROLL()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CWIAPreview message handlers
/**************************************************************************\
* CWIAPreview::OnPaint()
*   
*   Handles painting of the DIB
*   
*   
* Arguments:
*   
*   none
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    CleanBackground();
    PaintImage();
    // Do not call CWnd::OnPaint() for painting messages
}
/**************************************************************************\
* CWIAPreview::SetDIB()
*   
*   Initializes Preview window with a DIB pointer to data display.
*   
*   
* Arguments:
*   
*   pDib - DIB data to display
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::SetDIB(CDib *pDib)
{
    m_pDIB = pDib;
    if(pDib != NULL)
    {
        //
        // Set Scroll sizes according to DIB data size
        //
        SetScrollRange(SB_HORZ,0,pDib->Width(),TRUE);
        SetScrollRange(SB_VERT,0,pDib->Height(),TRUE);
    }
}
/**************************************************************************\
* CWIAPreview::SetPaintMode()
*   
*   Toggle the preview mode.  
*   
*   
* Arguments:
*   
*   modeflag - Toggle flag for setting display modes
*   PAINT_ACTUAL - actual size of image (1 to 1)
*   PAINT_TOFIT - scales image to fit window frame
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::SetPaintMode(int modeflag)
{
    m_PaintMode = modeflag;
    
}
/**************************************************************************\
* CWIAPreview::OnHScroll()
*   
*   Handles Horizontal scroll messages
*   
*   
* Arguments:
*   
*   nSBCode - Scroll bar code
*   nPos - Scroll position (valid only is SB_THUMBTRACK,SB_THUMBPOSITION)
*   pScrollBar - pointer to Scrollbar control
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{   
    switch(nSBCode)
    {
    case SB_LINELEFT:
        m_Scrollpt.x +=1;
        if(m_Scrollpt.x >0)
            m_Scrollpt.x = 0;
        SetScrollPos(SB_HORZ,-m_Scrollpt.x,TRUE);
        break;
    case SB_LINERIGHT:
        m_Scrollpt.x -=1;
        SetScrollPos(SB_HORZ,-m_Scrollpt.x,TRUE);
        break;
    case SB_PAGERIGHT:
        m_Scrollpt.x -=5;
        SetScrollPos(SB_HORZ,-m_Scrollpt.x,TRUE);
        break;
    case SB_PAGELEFT:
        m_Scrollpt.x +=5;
        if(m_Scrollpt.x >0)
            m_Scrollpt.x = 0;
        SetScrollPos(SB_HORZ,-m_Scrollpt.x,TRUE);
        break;
    case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
        m_Scrollpt.x = (nPos * -1);
        SetScrollPos(SB_HORZ,nPos,TRUE);
        break;
    case SB_ENDSCROLL:
        // OutputDebugString("END SCROLL\n");
        break;
    default:
        // OutputDebugString("Default????\n");
        break;
    }
    PaintImage();
    CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
/**************************************************************************\
* CWIAPreview::OnVScroll()
*   
*   Handles Vertical scroll messages
*   
*   
* Arguments:
*   
*   nSBCode - Scroll bar code
*   nPos - Scroll position (valid only is SB_THUMBTRACK,SB_THUMBPOSITION)
*   pScrollBar - pointer to Scrollbar control
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    switch(nSBCode)
    {
    case SB_LINEUP:
        m_Scrollpt.y +=1;
        if(m_Scrollpt.y >0)
            m_Scrollpt.y = 0;
        SetScrollPos(SB_VERT,-m_Scrollpt.y,TRUE);
        break;
    case SB_LINEDOWN:
        m_Scrollpt.y -=1;
        SetScrollPos(SB_VERT,-m_Scrollpt.y,TRUE);
        break;
    case SB_PAGEUP:
        m_Scrollpt.y +=5;
        if(m_Scrollpt.y >0)
            m_Scrollpt.y = 0;
        SetScrollPos(SB_VERT,-m_Scrollpt.y,TRUE);
        break;
    case SB_PAGEDOWN:
        
        m_Scrollpt.y -=5;
        SetScrollPos(SB_VERT,-m_Scrollpt.y,TRUE);
        break;
    case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
        m_Scrollpt.y = (nPos * -1);
        SetScrollPos(SB_VERT,nPos,TRUE);
        break;
    case SB_ENDSCROLL:
        // OutputDebugString("END SCROLL\n");
        break;
    default:
        // OutputDebugString("Default????\n");
        break;
    }
    PaintImage();
    CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
/**************************************************************************\
* CWIAPreview::PaintImage()
*   
*   Handles image painting according to set mode
*   
*   
* Arguments:
*   
*   none
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::PaintImage()
{
    if(m_pDIB != NULL)
    {
        RECT ImageRect;
        RECT WindowRect;
        DWORD ScaleFactor = 0;
        CDC* pDC = NULL;
        pDC = GetDC();
        if(m_pDIB->GotImage())
        {
            if(m_PaintMode == PAINT_TOFIT)
            {
                ImageRect.top = 0;
                ImageRect.left = 0;
                ImageRect.right = m_pDIB->Width();
                ImageRect.bottom = m_pDIB->Height();
                
                GetWindowRect(&WindowRect);
                ScreenToClient(&WindowRect);
                WindowRect.bottom-=1;
                WindowRect.left+=1;
                WindowRect.right-=1;
                WindowRect.top+=1;
                m_pDIB->Paint(pDC->m_hDC,&WindowRect,&ImageRect);
                ShowScrollBar(SB_BOTH,FALSE);
            }
            else
            {
                ImageRect.top = 0;
                ImageRect.left = 0;
                ImageRect.right = m_pDIB->Width();
                ImageRect.bottom = m_pDIB->Height();

                WindowRect.bottom   = ImageRect.bottom;
                WindowRect.left     = m_Scrollpt.x;
                WindowRect.right    = ImageRect.right;
                WindowRect.top      = m_Scrollpt.y;

                m_pDIB->Paint(pDC->m_hDC,&WindowRect,&ImageRect);
                ShowScrollBar(SB_BOTH,TRUE);
            }
        }
        else
        {
            GetWindowRect(&WindowRect);
            ScreenToClient(&WindowRect);
            WindowRect.bottom-=1;
            WindowRect.left+=1;
            WindowRect.right-=1;
            WindowRect.top+=1;
            
            HBRUSH hBrush = CreateSolidBrush(GetBkColor(pDC->m_hDC));
            FillRect(pDC->m_hDC,&WindowRect,hBrush);
            DeleteObject(hBrush);
        }
    }
}
/**************************************************************************\
* CWIAPreview::CleanBackground()
*   
*   Wipes the surface for a repaint to take place (WHITE)
*   
*   
* Arguments:
*   
*   none
*
* Return Value:
*
*    none
*
* History:
*
*    2/14/1999 Original Version
*
\**************************************************************************/
void CWIAPreview::CleanBackground()
{
    RECT WindowRect;
    CDC* pDC = NULL;
    pDC = GetDC();

    GetWindowRect(&WindowRect);
    ScreenToClient(&WindowRect);
    WindowRect.bottom-=1;
    WindowRect.left+=1;
    WindowRect.right-=1;
    WindowRect.top+=1;
    
    HBRUSH hBrush = CreateSolidBrush(GetBkColor(pDC->m_hDC));
    FillRect(pDC->m_hDC,&WindowRect,hBrush);
    DeleteObject(hBrush);
}