reman3/Rayman_X/cpa/tempgrp/Tut/Src/dlginput.cpp

315 lines
8.6 KiB
C++

// dlginput.cpp : implementation file
//
#include "stdafx.h"
#include <direct.h>
#include <shlobj.h>
#include "ACP_Base.h"
#include "ITF.h"
#include "dlginput.hpp"
#include "TUT.h"
#include "..\Main\Inc\_EditID.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDialogInput dialog
#define M_DeleteOnEnd( string, charact )\
{\
if( string . GetLength() )\
{\
string . MakeReverse();\
while( string[0] == charact ) string = string . Mid( 1 );\
string . MakeReverse();\
}\
}
CDialogInput::CDialogInput(const CString _csStaticText, const CString _csPathText /*=""*/,
const CString _csFileText /*=""*/, BOOL _bRecursive /*=FALSE*/, CWnd* pParent /*=NULL*/)
: CDialog(CDialogInput::IDD, pParent)
{
//{{AFX_DATA_INIT(CDialogInput)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_csStaticText = _csStaticText;
m_csPathText = _csPathText;
m_csFileText = _csFileText;
m_bRecursive = _bRecursive;
}
void CDialogInput::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialogInput)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDialogInput, CDialog)
//{{AFX_MSG_MAP(CDialogInput)
ON_WM_DRAWITEM()
ON_WM_DESTROY()
ON_WM_CANCELMODE()
ON_BN_CLICKED(IDC_BUTTON_READ, OnBtRead)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnBtBrowse)
ON_LBN_SELCHANGE(IDC_LIST_FILE, OnSelChange)
ON_LBN_DBLCLK(IDC_LIST_FILE, OnDoubleClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDialogInput message handlers
void CDialogInput::OnOK()
{
// TODO: Add extra validation here
GetDlgItem( IDC_EDIT_TEXT ) -> GetWindowText( m_csEditText );
if( m_csEditText . GetLength() )
{
GetDlgItem( IDC_EDIT_PATH ) -> GetWindowText( m_csPathText );
m_bRecursive = ((CButton*) GetDlgItem( IDC_CHECK_RECURSIVE )) -> GetCheck();
CDialog::OnOK();
}
}
BOOL CDialogInput::OnInitDialog()
{
CDialog::OnInitDialog();
GetDlgItem( IDC_EDIT_TEXT ) -> SetWindowText( m_csFileText );
GetDlgItem( IDC_EDIT_PATH ) -> SetWindowText( m_csPathText );
GetDlgItem( IDC_STATIC_TEXT ) -> SetWindowText( m_csStaticText );
((CButton*) GetDlgItem( IDC_CHECK_RECURSIVE )) -> SetCheck( m_bRecursive );
GetDlgItem( IDC_EDIT_TEXT ) -> SetFocus();
if( m_csPathText . GetLength() )
m_fn_vFillList();
//
TUT_M_vGetTutDll();
TUT_M_vRegisterControlID( IDC_EDIT_TEXT, "TUT_INPUT_TEXT", TUT_e_TextEdit );
TUT_M_vRegisterControlID( IDOK, "TUT_INPUT_OK", TUT_e_Button );
TUT_M_vRegisterControlID( IDCANCEL, "TUT_INPUT_CANCEL", TUT_e_Button );
TUT_M_vRegisterControlID( IDC_BUTTON_READ, "TUT_INPUT_READ", TUT_e_Button );
TUT_M_vRegisterControlID( IDC_BUTTON_BROWSE,"TUT_INPUT_BROWSE", TUT_e_Button );
TUT_M_vRegisterControlID( IDC_LIST_FILE, "TUT_INPUT_LIST", TUT_e_ListBox );
TUT_M_vRegisterControlID( IDC_EDIT_PATH, "TUT_INPUT_PATH", TUT_e_TextEdit );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDialogInput::OnDestroy()
{
TUT_M_vGetTutDll();
TUT_M_vUnregisterControlID( IDC_EDIT_TEXT );
TUT_M_vUnregisterControlID( IDOK );
TUT_M_vUnregisterControlID( IDCANCEL );
TUT_M_vUnregisterControlID( IDC_BUTTON_READ );
TUT_M_vUnregisterControlID( IDC_BUTTON_BROWSE );
TUT_M_vUnregisterControlID( IDC_LIST_FILE );
TUT_M_vUnregisterControlID( IDC_EDIT_PATH );
CDialog::OnDestroy();
}
void CDialogInput::OnBtBrowse()
{
// TODO: Add your control notification handler code here
BROWSEINFO bi;
LPSTR lpBuffer = (LPSTR)malloc(_MAX_PATH);
LPITEMIDLIST pidlBrowse; // PIDL selected by user
// Fill in the BROWSEINFO structure.
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = lpBuffer;
bi.lpszTitle = "Choose a Path";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
// Browse for a folder and return its PIDL.
pidlBrowse = SHBrowseForFolder(&bi);
if (pidlBrowse != NULL)
{
if (SHGetPathFromIDList(pidlBrowse, lpBuffer))
{
GetDlgItem( IDC_EDIT_PATH ) -> SetWindowText( lpBuffer );
}
}
// Clean up.
free(lpBuffer);
}
void CDialogInput::OnBtRead()
{
m_fn_vFillList();
}
void CDialogInput::OnSelChange()
{
CListBox *pLB = (CListBox*) GetDlgItem( IDC_LIST_FILE );
int iIndex = pLB -> GetCurSel();
if( iIndex != LB_ERR )
{
CString csText;
CString csPath;
GetDlgItem( IDC_EDIT_PATH ) -> GetWindowText( csPath );
M_DeleteOnEnd( csPath, '\\' )
pLB -> GetText( iIndex, csText );
if( csText [0] == '\\' )
{
GetDlgItem( IDC_EDIT_TEXT ) -> SetWindowText( csPath + csText + ".tut" );
}
else
{
GetDlgItem( IDC_EDIT_TEXT ) -> SetWindowText( csPath + "\\" + csText + ".tut" );
}
}
}
void CDialogInput::OnDoubleClick()
{
CListBox *pLB = (CListBox*) GetDlgItem( IDC_LIST_FILE );
int iIndex = pLB -> GetCurSel();
if( iIndex != LB_ERR )
OnOK();
}
void CDialogInput::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
if ( (nIDCtl == IDC_LIST_FILE) &&
(GetDlgItem( IDC_LIST_FILE )->IsWindowEnabled() ) &&
(lpDIS->itemID != LB_ERR) )
{
CDC *pDC = CDC::FromHandle( lpDIS->hDC );
CString csText , csPath;
CListBox *pLB = (CListBox*) GetDlgItem( IDC_LIST_FILE );
BOOL bSelected = (lpDIS->itemState & ODS_SELECTED );
int iPos;
CSize oSize;
pLB -> GetText(lpDIS->itemID, csText ) ;
iPos = csText . ReverseFind( '\\' );
if( iPos != -1 )
{
iPos++;
csPath = csText . Left( iPos );
oSize = pDC -> GetTextExtent( csPath );
pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW ));
pDC->SetBkMode( TRANSPARENT);
pDC->SetTextColor( RGB(0, 0, 255) );
lpDIS->rcItem.left += 1;
pDC->DrawText( csPath , &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER );
lpDIS->rcItem.left += oSize . cx;
pDC->SetTextColor( RGB(255, 0, 0) );
pDC->DrawText( csText . Mid( iPos ) , &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER );
lpDIS->rcItem.left -= oSize . cx;
lpDIS->rcItem.left -= 1;
}
else
{
lpDIS->rcItem.left += 1;
pDC->SetTextColor( RGB(255, 0, 0) );
pDC->DrawText( csText , &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER );
lpDIS->rcItem.left -= 1;
}
if (bSelected)
pDC->InvertRect( &lpDIS->rcItem );
}
else
CDialog::OnDrawItem(nIDCtl, lpDIS);
}
void CDialogInput::m_fn_vFillList()
{
CListBox *pLB = (CListBox*) GetDlgItem( IDC_LIST_FILE );
pLB -> ResetContent();
// get path
CString csPath;
BOOL bRecursive;
GetDlgItem( IDC_EDIT_PATH ) -> GetWindowText( csPath );
bRecursive = ((CButton*) GetDlgItem( IDC_CHECK_RECURSIVE )) -> GetCheck();
M_DeleteOnEnd( csPath, '\\' )
if( ! csPath . IsEmpty() )
m_fn_vRecurFillList( csPath , "" , bRecursive );
else
MessageBox( "The Path is empty" , "Error" , MB_OK + MB_ICONERROR );
}
void CDialogInput::m_fn_vRecurFillList( const CString _csBeginPathName , const CString _csCurrentPathName, BOOL _bRecursive )
{
WIN32_FIND_DATA stWFD; // structure for searching file
HANDLE hFD;
BOOL bContinue; // handle for searching file
CListBox *pLB = (CListBox*) GetDlgItem( IDC_LIST_FILE );
// search for files
hFD = FindFirstFile( _csBeginPathName + _csCurrentPathName + "\\*.tut", &stWFD );
bContinue = ( hFD != INVALID_HANDLE_VALUE );
while( bContinue )
{
if ( !(stWFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
{
CString csFileName;
if( _csCurrentPathName . GetLength() )
csFileName = _csCurrentPathName + "\\" + stWFD.cFileName;
else
csFileName = stWFD.cFileName;
pLB -> AddString( csFileName . Left( csFileName . GetLength() - 4 ) );
}
bContinue = FindNextFile( hFD, &stWFD);
}
// close FindData handle
FindClose(hFD);
// search for directory
if( _bRecursive )
{
hFD = FindFirstFile( _csBeginPathName + _csCurrentPathName + "\\*", &stWFD );
bContinue = ( hFD != INVALID_HANDLE_VALUE );
while( bContinue )
{
if ((stWFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (stWFD.cFileName[0] != '.') )
{
// appel recursif
m_fn_vRecurFillList( _csBeginPathName , _csCurrentPathName + "\\" + stWFD.cFileName, TRUE );
}
bContinue = FindNextFile( hFD, &stWFD);
}
// close FindData handle
FindClose(hFD);
}
}