// ExplorerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Explorer.h"
#include "ExplorerDlg.h"
#include <direct.h>

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExplorerDlg dialog

CExplorerDlg::CExplorerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CExplorerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CExplorerDlg)
	m_lnTotalDimensiune = 0;
	m_nTotalDirectoare = 0;
	m_nTotalFisiere = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CExplorerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CExplorerDlg)
	DDX_Control(pDX, IDC_DIRECTOR, m_lbDirector);
	DDX_Control(pDX, IDC_FISIERE, m_lcFisiere);
	DDX_Control(pDX, IDC_DISC, m_cbDisc);
	DDX_Text(pDX, IDC_TOTAL_DIM, m_lnTotalDimensiune);
	DDX_Text(pDX, IDC_TOTAL_DIR, m_nTotalDirectoare);
	DDX_Text(pDX, IDC_TOTAL_FIS, m_nTotalFisiere);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CExplorerDlg, CDialog)
	//{{AFX_MSG_MAP(CExplorerDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_CBN_SELCHANGE(IDC_DISC, OnSelchangeDisc)
	ON_LBN_DBLCLK(IDC_DIRECTOR, OnDblclkDirector)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExplorerDlg message handlers

BOOL CExplorerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
   PopulezCombo();
   m_lcFisiere.InsertColumn(0," Nume ", LVCFMT_LEFT, 120);
   m_lcFisiere.InsertColumn(1," Dimensiune ",LVCFMT_LEFT, 100);
   m_lcFisiere.InsertColumn(2," Data creerii ",LVCFMT_LEFT, 180);
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CExplorerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CExplorerDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CExplorerDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CExplorerDlg::PopulezCombo()
{
   CString bufDisc,DiscCurent;

   for (int disc=0; disc<25;disc++) 
   {
      bufDisc.Format("%c:", disc+'A');
      if((GetDriveType(bufDisc+"\\")==DRIVE_REMOVABLE) ||
         (GetDriveType(bufDisc+"\\")==DRIVE_FIXED) ||
         (GetDriveType(bufDisc+"\\")==DRIVE_CDROM) ||
         (GetDriveType(bufDisc+"\\")==DRIVE_REMOTE))
         m_cbDisc.AddString(bufDisc);
   }
   DiscCurent.Format("%c",_getdrive()+'A'-1); 
   int nIndex=m_cbDisc.SelectString(-1,DiscCurent);
   if (nIndex==CB_ERR) 
   {
      CString ErrStr=" Disc "+DiscCurent+" nepregatit sau violare acces";
	  MessageBox(ErrStr, "EROARE",MB_ICONSTOP);
   }
   OnSelchangeDisc();
}

void CExplorerDlg::OnSelchangeDisc() 
{
	// TODO: Add your control notification handler code here
   int nIndex=m_cbDisc.GetCurSel();

   if (nIndex != CB_ERR)
   {
      m_cbDisc.GetLBText(nIndex,m_strDisc);
      m_strLista.RemoveAll();
      pos=m_strLista.GetHeadPosition();
      m_bInainte=TRUE;
      PopulezDirector();
   }
   else MessageBox(" Eroare selectie disc ","EROARE",MB_ICONSTOP);
	
}

void CExplorerDlg::PopulezDirector()
{
  m_lbDirector.ResetContent();
  m_nTotalDirectoare=0;
	
  HANDLE hGasesc;
  WIN32_FIND_DATA dataGasesc;
  BOOL bMaiSunt=TRUE;

  GetDlgItem(IDC_CALE)->SetWindowText(m_strDisc);

  if (m_bInainte) m_strLista.AddTail(m_strDisc);
  hGasesc=FindFirstFile(m_strDisc+"\\*.*",&dataGasesc);
  if (hGasesc==INVALID_HANDLE_VALUE) 
  {
     CString ErrStr=" Disc "+m_strDisc+" nepregatit sau violare acces";
     MessageBox(ErrStr, "EROARE",MB_ICONSTOP);
  }
  else 
  {
     while (bMaiSunt) 
	 {
       if (dataGasesc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
          if (strcmp(dataGasesc.cFileName,".")) 
		  {
            if ((m_strLista.GetCount()>1)||(strcmp(dataGasesc.cFileName,"..")))
               m_lbDirector.AddString(dataGasesc.cFileName);
 	        if (strcmp(dataGasesc.cFileName,".."))    
                m_nTotalDirectoare++;
		  }
          bMaiSunt=FindNextFile(hGasesc, &dataGasesc);
	 }

     FindClose(hGasesc);
     PopulezFisiere();
  }
}

void CExplorerDlg::PopulezFisiere()
{
   m_lcFisiere.DeleteAllItems();
   m_nTotalFisiere=0;
   m_lnTotalDimensiune=0;

   HANDLE hGasesc;
   WIN32_FIND_DATA dataGasesc;
   BOOL bMaiSunt=TRUE;
   int nItemi=0;
   long int nDimFis;
   CTime nCreTime;
   CString strBuffer;

   hGasesc=FindFirstFile(m_strDisc+"\\*.*", &dataGasesc);
   while (bMaiSunt)
   {
      if (!(dataGasesc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
	  {
         nDimFis=0;
		 nItemi=m_lcFisiere.InsertItem(0, dataGasesc.cFileName);
		 nDimFis += (dataGasesc.nFileSizeHigh*MAXWORD) + dataGasesc.nFileSizeLow;
		 m_lnTotalDimensiune += nDimFis;
		 strBuffer.Format("%d",nDimFis);
		 m_lcFisiere.SetItemText(nItemi, 1, strBuffer);
		 nCreTime=CTime(dataGasesc.ftLastWriteTime, 0);
		 strBuffer = nCreTime.Format("%A, %B %d, %Y");
		 m_lcFisiere.SetItemText(nItemi, 2, strBuffer);
		 m_nTotalFisiere++;
	  }
	  bMaiSunt=FindNextFile(hGasesc, &dataGasesc);
   }

   FindClose(hGasesc);
   UpdateData(FALSE);

}

void CExplorerDlg::OnDblclkDirector() 
{
	// TODO: Add your control notification handler code here
   CString strTemp;
   int nIndex=m_lbDirector.GetCurSel();
   if (nIndex != CB_ERR)
   {
      m_lbDirector.GetText(nIndex, strTemp);
      if (strcmp(strTemp,"..")) {
         m_bInainte=TRUE;
         m_strDisc += "\\" + strTemp;
	  }
	  else 
	  {
		  m_bInainte=FALSE;
		  pos=m_strLista.GetTailPosition();
		  m_strLista.GetPrev(pos);
		  m_strDisc=m_strLista.GetAt(pos);
		  m_strLista.RemoveTail();
	  }
   }
   else MessageBox(" Eroare selectie drive ","EROARE",MB_ICONSTOP);
   PopulezDirector();
}
