// ShowSelPhoto2.cpp : implementation file
//

#include "stdafx.h"
#include "ylgl.h"
#include "ShowSelPhoto2.h"
#include "ShowPic22.h"
#include "JPEG.h"
#include "ComparePhoto.h"
using namespace helper_coffs;

#define	THUMBNAIL_WIDTH		100
#define	THUMBNAIL_HEIGHT	90

unsigned __stdcall LoadThumbNail10(LPVOID lpParam);

ShowSelPhoto2::ShowSelPhoto2(CWnd* pParent /*=NULL*/) : CDialog(ShowSelPhoto2::IDD, pParent)
{
	m_bTerminate2 = false;
	m_bRunning2 = false;
	m_hThread2 = NULL;
}


void ShowSelPhoto2::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST4, m_List4);
}

BEGIN_MESSAGE_MAP(ShowSelPhoto2, CDialog)
	ON_WM_DESTROY()
	ON_NOTIFY(NM_DBLCLK, IDC_LIST4, OnDblclkList4)
END_MESSAGE_MAP()


BOOL ShowSelPhoto2::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CRect rc;
	rc = m_rc;
	rc.right -= m_rc.Width ()*0.5;
	MoveWindow(rc);
	GetClientRect(rc);
	m_List4.MoveWindow (rc); 

 	m_ImageListThumb2.Create(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, ILC_COLOR24, 0, 1);
	m_List4.SetImageList(&m_ImageListThumb2, LVSIL_NORMAL);

#if USE_SHARE_FLORD
	TCHAR szShare[MAX_PATH] = {0};
	TCHAR szOrdePath[MAX_PATH] = {0};
	CStringArray originalDirArr;			//ԭƬĿ¼
	CStringArray earlyDirArr;				//����Ŀ¼
#ifdef VC60
	sprintf(szShare, _T("\\\\%s\\%s"), g_serverbak, _T("�ͻ�ԭƬ(��������)$"));
	sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id);
#else
	_stprintf_s(szShare, MAX_PATH, _T("\\\\%s\\%s"), g_serverbak, _T("�ͻ�ԭƬ(��������)$"));
	_stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
#endif
	// ����ԭƬ;
	if ( PathFileExists(szOrdePath) )
		originalDirArr.Add(CString(szOrdePath));

	// 3.2.������������Ŀ¼;
	int nSize = g_aryOfSharePathInfo.GetSize();
	int i  = 0;
	for ( i  = 0; i < nSize; i++)
	{
		if ( 1 == atoi(g_aryOfSharePathInfo.ElementAt(i).ElementAt(5)) )
		{
			// ��һ������������Ŀ¼;
#ifdef VC60
			sprintf(szShare, "%s", g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
			sprintf(szOrdePath, "%s\\%s", szShare, m_id);
#else
			_stprintf_s(szShare, MAX_PATH, _T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
			_stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
#endif
			if ( PathFileExists(szOrdePath) )
				originalDirArr.Add(CString(szOrdePath));
		}
	}

	// ����dzɳ���ϵ����ϵ����Ϊ�ջ�ȫ��;
#ifdef VC60
	sprintf(szShare, _T("\\\\%s\\%s"), g_serverbak, "�޺õ�Ƭ(��������)$");
#else
	_stprintf_s(szShare, MAX_PATH, _T("\\\\%s\\%s"), g_serverbak, "�޺õ�Ƭ(��������)$");
#endif
	// ���dzɳ���ϵ,����Ƭ����Ŀ¼; ���ǻ�ɴ��,����û�˾�����Ŀ¼;
#ifdef VC60
	if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) )
		sprintf(szOrdePath, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
	else
		sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id);
#else
	if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) )
		_stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
	else
		_stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
#endif

	if ( PathFileExists(szOrdePath) )
		earlyDirArr.Add(CString(szOrdePath));
	
	// 2.3.������������Ŀ¼�µij��޶���Ŀ¼;
	nSize = g_aryOfSharePathInfo.GetSize();
	i=0;
	for (i = 0; i < nSize; i++)
	{
		if ( 2 == atoi(g_aryOfSharePathInfo.ElementAt(i).ElementAt(5)) )
		{
			// ��һ������������Ŀ¼;
			// ����dzɳ���ϵ����ϵ����Ϊ�ջ�ȫ��;
#ifdef VC60
			sprintf(szShare,_T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
			// ���dzɳ���ϵ,����Ƭ����Ŀ¼; ���ǻ�ɴ��,����û�˾�����Ŀ¼;
			if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) )
				sprintf(szOrdePath, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
			else
				sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id);
#else
			_stprintf_s(szShare, MAX_PATH, _T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
			// ���dzɳ���ϵ,����Ƭ����Ŀ¼; ���ǻ�ɴ��,����û�˾�����Ŀ¼;
			if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) )
				_stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
			else
				_stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
#endif
			
			if ( PathFileExists(szOrdePath) )
				earlyDirArr.Add(CString(szOrdePath));
		}
	}

	//ԭƬ
	for(i=0; i<originalDirArr.GetSize(); i++)
		LoadPhotos(originalDirArr.ElementAt(i), &m_originalPathArr, &m_originalNameArr);

	//����
	for(i=0; i<earlyDirArr.GetSize(); i++)
		LoadPhotos(earlyDirArr.ElementAt(i), &m_earlyPathArr, &m_earlyNameArr);

	if(m_bRunning2)
		return TRUE;

	//��������Ƭ���ӵ�һ��������
	CString filePath = _T("");
	m_vFileName2.clear();
	i = 0;
	BOOL bOriginalFinish = FALSE;
	BOOL bEarlyFinish = FALSE;
	while(1)
	{
		//ԭƬ
		if(i < m_originalPathArr.GetSize())
		{
			CString strPath = m_originalPathArr.ElementAt(i);
			m_patharray1.Add(strPath);
			m_vFileName2.push_back(strPath);
			m_patharray2.Add(m_originalNameArr.ElementAt(i));
		}
		else
			bOriginalFinish = TRUE;

		//����
		if(i < m_earlyPathArr.GetSize())
		{
			CString strPath = m_earlyPathArr.ElementAt(i);
			m_patharray1.Add(strPath);
			m_vFileName2.push_back(strPath);
			m_patharray2.Add(m_earlyNameArr.ElementAt(i) + _T("-����"));
		}
		else
			bEarlyFinish = TRUE;

		if(bOriginalFinish && bEarlyFinish)
			break;
		++i;
	}
	
	TerminateThread2();
	m_hThread2 = (HANDLE)_beginthreadex(NULL,0, LoadThumbNail10,(LPVOID)this,0/* CREATE_SUSPENDED*/,&m_dwThreadID2); 
	m_bRunning2 = true;
#else
	m_path=g_path1+"\\";
	m_path+=m_id;
	m_path +="\\";
	LoadPhotos(m_path);
#endif //#if USE_SHARE_FLORD
	return TRUE;
}
 
unsigned __stdcall LoadThumbNail10(LPVOID lpParam)
{	
	ShowSelPhoto2 *pDlg=(ShowSelPhoto2*)lpParam;
	CImageList* pImgList=&pDlg->m_ImageListThumb2;
	CListCtrl   *ListCtrl=&pDlg->m_List4;
	try
	{
		// reset our image list
		for(int i=0; i<pImgList->GetImageCount(); i++)
			pImgList->Remove(i);	

		// remove all items from list view
		ListCtrl->DeleteAllItems();

 		pImgList->SetImageCount(pDlg->m_vFileName2.size());

		TCHAR path[MAX_PATH];
		vector<CString>::iterator iter;
		
		// Set redraw to FALSE to avoid flickering during adding new items
		ListCtrl->SetRedraw(FALSE);
		int nIndex=0;
		CString str, spath;	
		
		for(iter=pDlg->m_vFileName2.begin(); iter!=pDlg->m_vFileName2.end() && pDlg->m_bTerminate2!=true; iter++, nIndex++)
		{
			ListCtrl->InsertItem(nIndex, pDlg->m_patharray2.ElementAt (nIndex), nIndex);
		}

		ListCtrl->SetRedraw(TRUE);
		ListCtrl->Invalidate();

		const float fRatio=(float)THUMBNAIL_HEIGHT/THUMBNAIL_WIDTH;

		int XDest, YDest, nDestWidth, nDestHeight;
		nIndex=0;
		  
		SolidBrush whitebrush(Color(255,255,255,255));
		for(iter=pDlg->m_vFileName2.begin(); iter!=pDlg->m_vFileName2.end() && pDlg->m_bTerminate2!=true; iter++, nIndex++)
		{
			// Load Image File
			Image *image=NULL;
			Bitmap *pBmp=NULL;
			str=*iter;
			spath=str.Left (str.ReverseFind ('\\')+1);
			spath+="s";
			spath+=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1);
			if (PathFileExists(spath))
				::LoadImageFromBuf (&image, spath);
			else
				::LoadImageFromBuf (&image, str);


    		int orientation=GetOrientation(image);
			if(orientation==8)
				image->RotateFlip( Rotate270FlipNone );
			else if(orientation==6)
				image->RotateFlip( Rotate90FlipNone );
 
			if(image->GetWidth()==0)
				continue;

			// Calculate Rect to fit to canvas
				
			const float fImgRatio=(float)image->GetHeight()/image->GetWidth();
			if(fImgRatio > fRatio)
			{
				nDestWidth=THUMBNAIL_HEIGHT/fImgRatio;
				XDest=(THUMBNAIL_WIDTH-nDestWidth)/2;
				YDest=0;
				nDestHeight=THUMBNAIL_HEIGHT;
			}
			else
			{
				XDest=0;
				nDestWidth=THUMBNAIL_WIDTH;
				nDestHeight=THUMBNAIL_WIDTH*fImgRatio;
				YDest=(THUMBNAIL_HEIGHT-nDestHeight)/2;
			}
			pBmp=new Bitmap(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, PixelFormat24bppRGB );
			Graphics graph2(pBmp);
			graph2.Clear(Color(255,192,192,192));
 
			graph2.FillRectangle (&whitebrush,1, 1, THUMBNAIL_WIDTH-2, THUMBNAIL_HEIGHT-2); 



 			Graphics graph(pBmp);
			Rect desRect(XDest, YDest, nDestWidth, nDestHeight); 
			// Draw Image
		 
			graph.DrawImage(image, desRect, 0,0,image->GetWidth(),image->GetHeight(),UnitPixel);

			 delete image;

			// Attach to Bitmap and Replace image in CImageList
			CBitmap bitmap;
			HBITMAP hbmp;
			pBmp->GetHBITMAP(Color(255,255,255,255), &hbmp);
			bitmap.Attach(hbmp);
			 pImgList->Replace(nIndex, &bitmap, NULL);
			 delete pBmp;
			// Redraw only a current item for removing flickering and fast speed.
			ListCtrl->RedrawItems(nIndex, nIndex);

			// Release used DC and Object
		}
 
		ListCtrl->Invalidate();
		pDlg->m_bRunning2=false;
		pDlg->m_bTerminate2=false;
		_endthreadex( 0 );

		return 0;
	}
	catch(...)
	{
		ListCtrl->Invalidate();
		pDlg->m_bRunning2=false;
		pDlg->m_bTerminate2=false;
		_endthreadex( 0 );
	}

	return true;
}

void ShowSelPhoto2::OnDestroy() 
{
	TerminateThread2();	
	CDialog::OnDestroy();
}

#if USE_SHARE_FLORD
void ShowSelPhoto2::LoadPhotos(CString& strDir, CStringArray* pPathArr, CStringArray* pPhotoNameArr)
{
	if(strDir == _T("") || pPathArr == NULL || pPhotoNameArr == NULL)
		return;
	
	pPathArr->RemoveAll();
	pPhotoNameArr->RemoveAll();
	strDir.MakeLower();
	CStringArray dirarray; 
	CString str = _T("");

	{
		//����Ŀ¼
		ffsco o;
		o.dirs(1);			//1������Ŀ¼, 0��������Ŀ¼
		o.find(LPCSTR(strDir), LPCSTR("*.*"));
		ffsco::typeT coo;
		ffsco::typeT::iterator it;
		coo = o.co_dir();
		for (it = coo.begin(); coo.end() != it;	it ++)
		{
			str=(*it).c_str();
			if(FindArray(&dirarray, str) == -1)
				dirarray.Add (str);
		}
	}
	
	{
		//������Ƭ
		CString spath(_T("")), name(_T(""));
		for(int i=0; i<dirarray.GetSize (); i++)
		{
			ffsco o;
			o.dirs(1);
			o.find(LPCSTR(dirarray.ElementAt (i)), LPCSTR("*.jpg"));
			ffsco::typeT coo;
			ffsco::typeT::iterator it;
			coo = o.co_file();
			for (it = coo.begin(); coo.end() != it; it++)
			{
				str = (*it).c_str();
				if(str.GetAt(str.ReverseFind('\\') + 1) == 's')continue;
				if(str.GetAt(str.ReverseFind('\\') + 1) == 'm')continue;
				
				str.MakeLower();
				pPathArr->Add(str); 
				{
					spath.Empty();
					spath = str.Left(str.ReverseFind('\\'));
					if(spath != strDir)
					{
						spath = spath.Right(spath.GetLength() - strDir.GetLength() - 1);
						name = str.Right(str.GetLength() - str.ReverseFind('\\'));
						name = spath + name.Left (name.ReverseFind('.'));
					}
					else
					{
						name = str.Right(str.GetLength() - str.ReverseFind('\\') - 1);
						name = name.Left (name.ReverseFind('.'));
					}
					pPhotoNameArr->Add(name);
				}
			}
		}
	}
}
#else
void ShowSelPhoto2::LoadPhotos(CString& strDir)
{
	if(strDir == _T(""))
		return;

	m_patharray1.RemoveAll ();
	strDir.MakeLower ();
	CStringArray dirarray; 
	CString str;
	if(1)
	{
		//����Ŀ¼
		ffsco o;
		o.dirs(1);			//1������Ŀ¼, 0��������Ŀ¼
		o.find(LPCSTR(strDir), LPCSTR("*.*"));
		ffsco::typeT coo;
		ffsco::typeT::iterator it;
		coo = o.co_dir();
		for (it = coo.begin(); coo.end() != it;	it ++)
		{
			str=(*it).c_str();
			if(FindArray(&dirarray, str)==-1)
				dirarray.Add (str);
		}
	}

	if(1)
	{
		//������Ƭ
		CString spath,name;
		for(int i=0; i<dirarray.GetSize (); i++)
		{
			ffsco o;
			o.dirs(1);
			o.find(LPCSTR(dirarray.ElementAt (i)), LPCSTR("*.jpg"));
			ffsco::typeT coo;
			ffsco::typeT::iterator it;
			coo = o.co_file();
			for (it = coo.begin(); coo.end() != it; it++)
			{
				str=(*it).c_str();
				if(str.GetAt (str.ReverseFind ('\\')+1)=='s')continue;
				if(str.GetAt (str.ReverseFind ('\\')+1)=='m')continue;
				
				str.MakeLower ();
				m_patharray1.Add(str); 
				{
					spath.Empty ();
					if(str.Left (str.ReverseFind ('\\')+1) != strDir)
					{
						spath=str.Left (str.ReverseFind ('\\')+1);
						spath= spath.Right (spath.GetLength ()-strDir.GetLength ());
					}
					name=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1);
					name=spath+name.Left (name.GetLength ()-4);
					m_patharray2.Add(name);
				}

				str.Replace ("�ͻ�ԭƬ", "�޺õ�Ƭ");
				int pos1=str.Find (m_id);
				pos1+=m_id.GetLength ();
				int pos2=str.ReverseFind ('\\');
				str=str.Left (pos1)+str.Right (str.GetLength ()-pos2);

				if(::PathFileExists (str))
				{
					m_patharray1.Add  (str); 
					m_patharray2.Add  (name+"-��Ƭ"); 
				}
			}
		}
	}

	if(m_bRunning2)return;
	CStringArray *pArray=&m_patharray1;
	m_vFileName2.clear();
	for(int i=0; i<pArray->GetSize (); i++)
	{
		CString filePath=pArray->ElementAt (i);
		filePath.MakeLower();
		m_vFileName2.push_back(filePath);
	}

 	TerminateThread2();
	m_hThread2 = (HANDLE)_beginthreadex(NULL,0, LoadThumbNail10,(LPVOID)this,0/* CREATE_SUSPENDED*/,&m_dwThreadID2); 
	m_bRunning2=true;
}
#endif //#if USE_SHARE_FLORD

BOOL ShowSelPhoto2::TerminateThread2()
{
	if ( !m_bRunning2 )
    return TRUE;
  
  m_bTerminate2=true;
 
  for( ; ; )
  {
    if ( ::WaitForSingleObject(m_hThread2, 0) == WAIT_OBJECT_0 )
      break;
 
    MSG msg;
    while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) 
    { 
      if (!AfxGetApp()->PumpMessage()) 
        break; 
    } 
  }
  ::CloseHandle(m_hThread2);
  return TRUE;
}

void ShowSelPhoto2::OnDblclkList4(NMHDR* pNMHDR, LRESULT* pResult) 
{
    POSITION pos;
	pos=m_List4.GetFirstSelectedItemPosition();	
	if(pos==NULL)
	{
		return;
	}
	int iItem=m_List4.GetNextSelectedItem(pos);	
	ShowPic22 dlg;
	dlg.m_nCurImgPos=iItem;
	dlg.m_AryOfImgPath=&m_patharray1;
	dlg.DoModal ();
	*pResult = 0;
}

BOOL ShowSelPhoto2::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message==WM_KEYDOWN)
	{
		switch (pMsg->wParam)
		{
		case VK_F1:
			{
				ShowWindow(0);
			}
			break;
		case VK_RETURN:
			{
    POSITION pos;
	pos=m_List4.GetFirstSelectedItemPosition();	
	if(pos==NULL)
	{
		return 1;
	}
	CArray<int,int>posarray;
	int iItem=m_List4.GetNextSelectedItem(pos);
	posarray.Add (iItem);
	while (pos)
	{
		int iItem=m_List4.GetNextSelectedItem(pos);	
		posarray.Add (iItem);
		if(posarray.GetSize ()>1)break;
	}
	if(posarray.GetSize ()>=2)
	{
		CComparePhoto dlg;
		dlg.m_path1=m_patharray1.ElementAt (posarray.ElementAt(0));
		dlg.m_path2=m_patharray1.ElementAt (posarray.ElementAt(1));
		dlg.DoModal();
		return 1;
	}
			}
			return 1;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}