// ImportDlg.cpp : implementation file
//
#include "stdafx.h"
#include "dibmanager.h"
#include "MainFrm.h"
#include "ImportDlg.h"
#include "oxbmpfle.h"
#include "oxjpgfle.h"
#include "oxjpgcom.h"
#include "oxjpgdom.h"
#include "oxjpgexp.h"
#include "path.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImportDlg dialog
CImportDlg::CImportDlg(CWnd* pParent /*=NULL*/)
: CDialog(CImportDlg::IDD, pParent),
m_cbFileName(COXHistoryCombo::TBPHorizontalRightCenter,TRUE)
{
//{{AFX_DATA_INIT(CImportDlg)
m_bColors = FALSE;
m_bGrayscale = FALSE;
m_bNoSmooth = FALSE;
m_bOnePass = FALSE;
m_sFileName = _T("");
m_nColors = 0;
//}}AFX_DATA_INIT
}
void CImportDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CImportDlg)
DDX_Control(pDX, IDC_COLORS, m_ctlEditColors);
DDX_Control(pDX, IDC_SPIN_COLORS, m_ctlSpinColors);
DDX_Control(pDX, IDC_FILENAME, m_cbFileName);
DDX_Check(pDX, IDC_CHECK_COLORS, m_bColors);
DDX_Check(pDX, IDC_CHECK_GRAYSCALE, m_bGrayscale);
DDX_Check(pDX, IDC_CHECK_NO_SMOOTH, m_bNoSmooth);
DDX_Check(pDX, IDC_CHECK_ONE_PASS, m_bOnePass);
DDX_Text(pDX, IDC_FILENAME, m_sFileName);
DDX_Text(pDX, IDC_COLORS, m_nColors);
DDV_MinMaxInt(pDX, m_nColors, 8, 256);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CImportDlg, CDialog)
//{{AFX_MSG_MAP(CImportDlg)
ON_BN_CLICKED(IDC_CHECK_ONE_PASS, OnCheckOnePass)
ON_BN_CLICKED(IDC_CHECK_COLORS, OnCheckColors)
ON_BN_CLICKED(IDC_CHECK_GRAYSCALE, OnCheckGrayscale)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImportDlg message handlers
BOOL CImportDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_nColors = 256;
CheckRadioButton(IDC_RADIO_DM_FLOYD_STEIN,IDC_RADIO_DM_NONE,
IDC_RADIO_DM_FLOYD_STEIN);
CheckRadioButton(IDC_RADIO_ONE_TO_ONE,IDC_RADIO_ONE_TO_EIGHT,
IDC_RADIO_ONE_TO_ONE);
CheckRadioButton(IDC_RADIO_ONE_TO_ONE,IDC_RADIO_ONE_TO_EIGHT,
IDC_RADIO_ONE_TO_ONE);
CheckRadioButton(IDC_RADIO_DCT_INT,IDC_RADIO_DCT_FLOAT,
IDC_RADIO_DCT_INT);
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
m_ctlSpinColors.SetBuddy(&m_ctlEditColors);
m_ctlSpinColors.SetRange(8,256);
m_ctlSpinColors.SetPos(m_nColors);
// Set a default COXSpinCtrl method of delta value computation
// (Delta pixel = Delta value).
m_ctlSpinColors.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
// Use auto persistence
m_cbFileName.SetAutoPersistent(_T("History - Import"));
m_cbFileName.SetFileDialogParams(TRUE,_T("*.jpg"),NULL,
OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
_T("JPEG Images (*.jpg)|*.jpg|All Files (*.*)|*.*||"));
// set toolbar on the right with a little gap
COXHistoryCombo::EToolbarPosition eToolbarPosition=m_cbFileName.GetToolbarPosition();
// unimited number of items in combobox are could be saved
m_cbFileName.PositionToolbar(eToolbarPosition, TRUE);
m_cbFileName.SetMaxHistoryCount(-1);
UpdateData(FALSE);
ShowButtons();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CImportDlg::OnOK()
{
// TODO: Add extra validation here
if(UpdateData()==0 || !CheckFileName())
return;
// operation of exporting JPEG to DIB
// could be time-consuming
BeginWaitCursor();
COXBMPFile BMPFile(&m_tmpBMPFile);
COXJPEGFile jpgFile(m_sFileName);
COXJPEGDecompressor JDecompr;
JDecompr.SetGrayScale(m_bGrayscale);
JDecompr.SetNoSmooth(m_bNoSmooth);
JDecompr.SetOnePass(m_bOnePass);
EDiscreteCosTransf DCT;
switch(GetCheckedRadioButton(IDC_RADIO_DCT_INT,
IDC_RADIO_DCT_FLOAT))
{
case IDC_RADIO_DCT_INT:
{
DCT=DC_Int;
break;
}
case IDC_RADIO_DCT_FAST:
{
DCT=DC_FastInt;
break;
}
case IDC_RADIO_DCT_FLOAT:
{
DCT=DC_Float;
break;
}
default:
{
DCT=DC_Int;
break;
}
}
JDecompr.SetDisCosTranf(DCT);
EDitherMethod DM;
switch(GetCheckedRadioButton(IDC_RADIO_DM_FLOYD_STEIN,IDC_RADIO_DM_NONE))
{
case IDC_RADIO_DM_FLOYD_STEIN:
{
DM=DM_FloydStein;
break;
}
case IDC_RADIO_DM_ORDERED:
{
DM=DM_Ordered;
break;
}
case IDC_RADIO_DM_NONE:
{
DM=DM_None;
break;
}
default:
{
DM=DM_FloydStein;
break;
}
}
JDecompr.SetDitherMethod(DM);
EDecompScale DS;
switch(GetCheckedRadioButton(IDC_RADIO_ONE_TO_ONE,IDC_RADIO_ONE_TO_EIGHT))
{
case IDC_RADIO_ONE_TO_ONE:
{
DS=DS_OneOne;
break;
}
case IDC_RADIO_ONE_TO_TWO:
{
DS=DS_OneHalf;
break;
}
case IDC_RADIO_ONE_TO_FOUR:
{
DS=DS_OneFourth;
break;
}
case IDC_RADIO_ONE_TO_EIGHT:
{
DS=DS_OneEight;
break;
}
default:
{
DS=DS_OneOne;
break;
}
}
JDecompr.SetScale(DS);
if(m_bColors)
{
JDecompr.SetColors(m_nColors);
}
short nReturn(1);
TCHAR ErrorBuffer[SIZE_ERROR_BUF];
TRY
{
// the only line of code that we need to decompress JPEG to bitmap file
nReturn = JDecompr.DoDecompress(&jpgFile, &BMPFile);
if (nReturn == 2)
AfxMessageBox(JDecompr.GetWarningMessages());
}
CATCH(COXJPEGException, e)
{
// if something went wrong then notify about it
e->GetErrorMessage(ErrorBuffer, SIZE_ERROR_BUF);
AfxMessageBox(CString("Exception : ") + ErrorBuffer);
TRACE((LPCTSTR)ErrorBuffer);
}
END_CATCH
EndWaitCursor();
if(nReturn!=0)
return;
CDialog::OnOK();
}
void CImportDlg::OnCheckOnePass()
{
// TODO: Add your control notification handler code here
ShowButtons();
}
void CImportDlg::OnCheckColors()
{
// TODO: Add your control notification handler code here
ShowButtons();
}
void CImportDlg::OnCheckGrayscale()
{
// TODO: Add your control notification handler code here
ShowButtons();
}
LRESULT CImportDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
// we use this function to let buttons in HistoryCombo toolbar
// to get some notification
UNUSED(wParam);
UNUSED_ALWAYS(lParam);
ASSERT_VALID(this);
ASSERT(wParam == MSGF_DIALOGBOX);
BOOL bContinueIdle = TRUE;
// Pass on to the history combo
m_cbFileName.OnIdle();
return bContinueIdle;
}
void CImportDlg::ShowButtons()
{
// show buttons depending on some conditions
UpdateData();
ctlOnePass().EnableWindow(!m_bGrayscale && m_bColors);
if(m_bGrayscale)
{
ctlOnePass().SetCheck(1);
m_bOnePass=TRUE;
}
else
{
if(!m_bColors)
{
ctlOnePass().SetCheck(0);
m_bOnePass=FALSE;
}
}
if(!m_bOnePass)
{
CheckRadioButton(IDC_RADIO_DM_FLOYD_STEIN,IDC_RADIO_DM_NONE,
IDC_RADIO_DM_NONE);
}
ctlDitherMethodFS().EnableWindow(m_bOnePass);
ctlDitherMethodOrdered().EnableWindow(m_bOnePass);
ctlDitherMethodNone().EnableWindow(m_bOnePass);
}
BOOL CImportDlg::CheckFileName()
{
// check if typed file already opened
CMainFrame* pMainFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
if(pMainFrame->CheckFileAlreadyOpened(m_sFileName,TRUE))
{
return FALSE;
}
// check if typed directory exist
COXPathSpec path;
path.SetPath(m_sFileName);
if(path.IsEmpty() || !path.Exists())
{
AfxMessageBox(_T("Entered file doesn't exist!"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
else
{
return TRUE;
}
}