// DlgSBPDisplay.cpp : implementation file
//

#include "stdafx.h"
#include "6046dryend.h"
#include "DlgSBPDisplay.h"
#include "6046DryEndDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgSBPDisplay dialog


CDlgSBPDisplay::CDlgSBPDisplay(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgSBPDisplay::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgSBPDisplay)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

	m_Palette = GREYSCALE;
}


void CDlgSBPDisplay::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgSBPDisplay)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgSBPDisplay, CDialog)
	//{{AFX_MSG_MAP(CDlgSBPDisplay)
	ON_WM_DESTROY()
	ON_WM_GETMINMAXINFO()
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_SBP_PALETTE_GREYSCALE, OnSbpPaletteGreyscale)
	ON_COMMAND(ID_SBP_PALETTE_MOSS, OnSbpPaletteMoss)
	ON_COMMAND(ID_SBP_PALETTE_RUST, OnSbpPaletteRust)
	ON_COMMAND(ID_SBP_IMAGE_BRIGHTNESS, OnSbpImageBrightness)
	ON_COMMAND(ID_SBP__PALETTE_INVERSEGREY, OnSbpPaletteInversegrey)
	ON_COMMAND(ID_SBP_PALETTE_SOIL, OnSbpPaletteSoil)
	ON_COMMAND(ID_PALETTE_RED, OnPaletteRed)
	ON_COMMAND(ID_PALETTE_GREEN, OnPaletteGreen)
	ON_COMMAND(ID_PALETTE_BLUE, OnPaletteBlue)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgSBPDisplay message handlers

BOOL CDlgSBPDisplay::OnInitDialog() 
{
	CDialog::OnInitDialog();

	HICON icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	SetIcon(icon, FALSE);
	
	m_menuSBP.LoadMenu(IDR_SBP_MENU);
	SetMenu(&m_menuSBP);

	pConfig = &((CMy6046DryEndApp*)AfxGetApp())->m_SystemConfig;
	
	LoadSettings();
	
	m_bSizing		= FALSE;
	m_bProperties	= FALSE;

	m_SBPDisplay.Configure(this, 0, MAX_SBP_PING_BYTES, 50, 5, RIGHT_LEFT);
	m_SBPDisplay.SetAttributes(m_Palette, MEAN);
	m_SBPDisplay.SetBrightness(m_uiBrightness, TRUE);
	m_SBPDisplay.SetContrast(m_uiContrast, TRUE);

	CRect rect;
	GetWindowRect(&rect);
	POINT p = {rect.right, rect.top};
	m_dlgProperties.pParent = this;
	m_dlgProperties.initPoint = p;
	
	m_dlgProperties.m_dBrightness = m_uiBrightness;
	m_dlgProperties.m_dContrast	  = m_uiContrast;
	
	m_dlgProperties.Create(IDD_DLG_WFPROPERTIES, this);
	
	m_dlgProperties.ShowWindow(SW_HIDE);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CDlgSBPDisplay::AddNewProfile(BYTE *data, int size)
{
	return m_SBPDisplay.AddImageLine8(data, size);
}
void CDlgSBPDisplay::OnDestroy() 
{
	
	SaveSettings();
	
	CDialog::OnDestroy();
	
	//m_SBPDisplay.Cleanup();
	m_menuSBP.DestroyMenu();
}

void CDlgSBPDisplay::SetType(DISPLAY_TYPE type)
{
	m_InternalType = type;
}

void CDlgSBPDisplay::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	m_SBPDisplay.Refresh();
	
	// Do not call CDialog::OnPaint() for painting messages
}


void CDlgSBPDisplay::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
{
	lpMMI->ptMinTrackSize.x = 225;
	lpMMI->ptMinTrackSize.y = 200;

	CDialog::OnPaint();
	CDialog::OnGetMinMaxInfo(lpMMI);
}

void CDlgSBPDisplay::OnLButtonDown(UINT nFlags, CPoint point) 
{
	//MAKE WINDOWS THINK WE CLICKED ON THE CAPTION BAR,
	//SO THE DIALOG CAN BE MOVED BY CLICKING ANYWHERE ON IT.
    PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y));	
	CDialog::OnLButtonDown(nFlags, point);
}

LRESULT CDlgSBPDisplay::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if(message == WM_EXITSIZEMOVE)
	{
		this->Invalidate(FALSE);
		if(m_bSizing){
			m_SBPDisplay.Resize();
			m_bSizing = FALSE;
		}
		else
			m_SBPDisplay.Refresh();

		SaveSettings();
			
	}
	if(message == WM_SIZING)
	{
		m_bSizing = TRUE;
	}
	if(message == REPAINT_BRIGHT)
	{
		m_SBPDisplay.SetBrightness((UINT)wParam, TRUE);
	}
	if(message == REPAINT_CONTRAST)
	{
		m_SBPDisplay.SetContrast((UINT)wParam, TRUE);
	}
	if(message == HIDE_PROP_DLG_OK)
	{
		m_SBPDisplay.SetBrightness((UINT)m_dlgProperties.m_dBrightness, TRUE);
		m_SBPDisplay.SetContrast((UINT)m_dlgProperties.m_dContrast, TRUE);

		m_uiBrightness = (UINT)m_dlgProperties.m_dBrightness;
		m_uiContrast   = (UINT)m_dlgProperties.m_dContrast;

		m_dlgProperties.ShowWindow(SW_HIDE);
		m_bProperties = !m_bProperties;

		SaveSettings();
	}
	if(message == HIDE_PROP_DLG_CANCEL)
	{
		m_SBPDisplay.SetBrightness((UINT)m_dlgProperties.m_dStartBrightness, TRUE);
		m_SBPDisplay.SetContrast((UINT)m_dlgProperties.m_dStartContrast, TRUE);

		m_uiBrightness = (UINT)m_dlgProperties.m_dStartBrightness;
		m_uiContrast   = (UINT)m_dlgProperties.m_dStartContrast;

		m_dlgProperties.ShowWindow(SW_HIDE);
		m_bProperties = !m_bProperties;
	}
	return CDialog::WindowProc(message, wParam, lParam);
}

void CDlgSBPDisplay::OnSbpPaletteGreyscale() 
{
	m_Palette = EPaletteType(GREYSCALE);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnPaletteRed() 
{
	m_Palette = EPaletteType(RED);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnPaletteGreen() 
{
	m_Palette = EPaletteType(GREEN);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnPaletteBlue() 
{
	m_Palette = EPaletteType(BLUE);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnSbpPaletteMoss() 
{
	m_Palette = EPaletteType(MOSS);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnSbpPaletteRust() 
{
	m_Palette = EPaletteType(RUST);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnSbpPaletteInversegrey() 
{
	m_Palette = EPaletteType(INVERSE);
	m_SBPDisplay.SetPalette(m_Palette);	
	SyncPaletteMenu();
	SaveSettings();
}

void CDlgSBPDisplay::OnSbpPaletteSoil() 
{
	m_Palette = EPaletteType(SOIL);
	m_SBPDisplay.SetPalette(m_Palette);
	SyncPaletteMenu();
	SaveSettings();	
}


void CDlgSBPDisplay::OnSbpImageBrightness() 
{	
	if(m_bProperties)
		m_dlgProperties.ShowWindow(SW_HIDE);
	else
		m_dlgProperties.ShowWindow(SW_SHOW);
	
	m_bProperties = !m_bProperties;
}


void CDlgSBPDisplay::Refresh()
{	
	m_SBPDisplay.Resize();
}

void CDlgSBPDisplay::LoadSettings()
{
	m_Palette		= (EPaletteType)pConfig->SBPWindowPalette;
	m_uiBrightness	= pConfig->SBPBrightness;
	m_uiContrast	= pConfig->SBPContrast;

	m_WindowRect	= pConfig->SBPWindowRect;	
	this->SetWindowPos(NULL,m_WindowRect.left,m_WindowRect.top,m_WindowRect.Width(),m_WindowRect.Height(),NULL);

	//This handles the initial menu item check
	//its a brute force approach!
	UINT results;
	switch(m_Palette)
	{
	case GREYSCALE: results = ID_SBP_PALETTE_GREYSCALE;break;
	case INVERSE:	results = ID_SBP__PALETTE_INVERSEGREY;break;
	case RED:		results = ID_PALETTE_RED;break;
	case GREEN:		results = ID_PALETTE_GREEN;break;
	case BLUE:		results = ID_PALETTE_BLUE;break;
	case RUST:		results = ID_SBP_PALETTE_RUST;break;
	case SOIL:		results = ID_SBP_PALETTE_MOSS;break;
	case MOSS:		results = ID_SBP_PALETTE_SOIL;break;
	default:break;					
	}	
	m_menuSBP.CheckMenuItem(results, MF_CHECKED);

}

void CDlgSBPDisplay::SaveSettings()
{
	CRect temp;
	GetWindowRect(&temp);

	pConfig->SBPWindowPalette	= m_Palette;
	pConfig->SBPWindowRect		= temp;
	pConfig->SBPBrightness		= m_uiBrightness;
	pConfig->SBPContrast		= m_uiContrast;

	if(pConfig->Open(CSystemConfig::accessWrite))
	{	
		pConfig->Save();
		pConfig->Close();
	}
}

void CDlgSBPDisplay::Cleanup()
{
	m_SBPDisplay.Cleanup();
}

BOOL CDlgSBPDisplay::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
	{
		return TRUE ;
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

void CDlgSBPDisplay::OnClose() 
{
	((CMy6046DryEndDlg*)AfxGetMainWnd())->ForceClose(WFSBP);	

	CDialog::OnClose();
}

void CDlgSBPDisplay::SyncPaletteMenu()
{

	m_menuSBP.CheckMenuItem(ID_SBP_PALETTE_GREYSCALE, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_SBP__PALETTE_INVERSEGREY, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_PALETTE_RED, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_PALETTE_GREEN, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_PALETTE_BLUE, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_SBP_PALETTE_RUST, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_SBP_PALETTE_MOSS, MF_UNCHECKED);
	m_menuSBP.CheckMenuItem(ID_SBP_PALETTE_SOIL, MF_UNCHECKED);

	UINT results;
	switch(m_Palette)
	{
	case GREYSCALE: results = ID_SBP_PALETTE_GREYSCALE;break;
	case INVERSE:	results = ID_SBP__PALETTE_INVERSEGREY;break;
	case RED:		results = ID_PALETTE_RED;break;
	case GREEN:		results = ID_PALETTE_GREEN;break;
	case BLUE:		results = ID_PALETTE_BLUE;break;
	case RUST:		results = ID_SBP_PALETTE_RUST;break;
	case SOIL:		results = ID_SBP_PALETTE_MOSS;break;
	case MOSS:		results = ID_SBP_PALETTE_SOIL;break;
	default:break;					
	}	
	m_menuSBP.CheckMenuItem(results, MF_CHECKED);

}