/********************************************************************
created: 2008/07/22
created: 22:7:2008 10:23
filename: SelectDialog.h
file base: SelectDialog
file ext: h
author: Hojjat Bohlooli - software@tarhafarinin.ir
purpose: select multiple file and folders together in browse dialog
free for non commercial uses.
*********************************************************************/
#pragma once
#include <wtl/atlapp.h>
#include <wtl/atldlgs.h>
#include <wtl/atlctrls.h>
#include <atlstr.h>
#include <vector>
#include <dlgs.h> // for (MULTI)FILEOPENORD
#include <set>
using namespace std;
// CSelectDialog
class CSelectDialog : public CFileDialogImpl<CSelectDialog>
{
//DECLARE_DYNAMIC(CSelectDialog)
public:
CSelectDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |
OFN_EXPLORER & (~OFN_SHOWHELP),
LPCTSTR lpszFilter = NULL,
HWND pParentWnd = NULL);
virtual ~CSelectDialog();
BEGIN_MSG_MAP(CSelectDialog)
CHAIN_MSG_MAP(CFileDialogImpl<CSelectDialog>)
END_MSG_MAP()
public:
virtual void OnInitDone(LPOFNOTIFY /*lpon*/);
virtual void OnFolderChange(LPOFNOTIFY /*lpon*/);
virtual BOOL OnFileOK(LPOFNOTIFY /*lpon*/);
static LRESULT CALLBACK WindowProcNew(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam);
LRESULT OnSelChange(LPOFNOTIFY pnmh);
//DECLARE_MESSAGE_MAP()
public:
static CString m_strCurrendDirectory;
static vector<CString> m_SelectedItemList; /*this list includes files and folders
are selected by user. */
static WNDPROC m_wndProc;
};
/********************************************************************
created: 2008/07/22
created: 22:7:2008 10:25
filename: SelectDialog.cpp
file base: SelectDialog
file ext: cpp
author: Hojjat Bohlooli - software@tarhafarinin.ir
purpose:
*********************************************************************/
#include "stdafx.h"
#include "SelectDialog.h"
#pragma warning( push )
#pragma warning( disable : 4311 4312 )
// CSelectDialog
CString CSelectDialog::m_strCurrendDirectory;
vector<CString> CSelectDialog::m_SelectedItemList;
WNDPROC CSelectDialog::m_wndProc = NULL;
CSelectDialog::CSelectDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt,
LPCTSTR lpszFileName,
DWORD dwFlags,
LPCTSTR lpszFilter,
HWND hWndParent)
:CFileDialogImpl<CSelectDialog>(
bOpenFileDialog,
lpszDefExt,
lpszFileName,
dwFlags | OFN_EXPLORER | OFN_HIDEREADONLY & (~OFN_SHOWHELP),
lpszFilter,
hWndParent)
{
dwFlags |= (OFN_ENABLEINCLUDENOTIFY | OFN_EXPLORER | OFN_HIDEREADONLY & (~OFN_SHOWHELP));
};
CSelectDialog::~CSelectDialog()
{
};
// CSelectDialog message handlers
BOOL CSelectDialog::OnFileOK(LPOFNOTIFY /*lpon*/)
{
CWindow pWind = GetParent();
if (pWind)
{
CWindow pWnd = pWind.GetDlgItem(lst2); //getting list
if (pWnd == NULL)
return FALSE;
m_SelectedItemList.clear(); // emptying list
CListViewCtrl wndLst1 = (CListViewCtrl)(pWnd.GetDlgItem(1));
int nSelected = wndLst1.GetSelectedCount();
if (!nSelected) // nothing selected -- don't retrieve list
return FALSE;
CString strItemText, strDirectory = m_strCurrendDirectory;
if (strDirectory.Right(1) != _T("\\"))
strDirectory += _T("\\");
CString fileslist = _T("");
pWind.SendMessage(CDM_GETSPEC, (WPARAM)MAX_PATH,
(LPARAM)fileslist.GetBuffer(MAX_PATH));
fileslist.ReleaseBuffer();
strItemText = strDirectory + fileslist;
if(nSelected == 1 && fileslist != _T(""))
{
m_SelectedItemList.push_back(strItemText);
return TRUE;
}
}
::MessageBeep( MB_ICONQUESTION );
return 1; //don't let the dialog to close
};
LRESULT CSelectDialog::OnSelChange(LPOFNOTIFY pnmh)
{
ATLASSERT(::IsWindow(m_hWnd));
CString strFolderPath = _T("");
SendMessage(pnmh->hdr.hwndFrom, CDM_GETFILEPATH, (WPARAM)MAX_PATH, (LPARAM)strFolderPath.GetBuffer(MAX_PATH));
strFolderPath.ReleaseBuffer();
DWORD newSelAttr = GetFileAttributes(strFolderPath);
CString strLog1;
strLog1 = "======>1";
strLog1 += strFolderPath;
OutputDebugString(strLog1);
if ((newSelAttr != 0xFFFFFFFF) && (newSelAttr & FILE_ATTRIBUTE_DIRECTORY))
{
strFolderPath = strFolderPath.Left(strFolderPath.ReverseFind('\\'));
}
else
{
PathRemoveFileSpec(strFolderPath.GetBuffer(MAX_PATH));
strFolderPath.ReleaseBuffer();
}
if (m_strCurrendDirectory == "")
{
m_strCurrendDirectory = strFolderPath;
}
return 0;
}
void CSelectDialog::OnFolderChange(LPOFNOTIFY /*lpon*/)
{
WCHAR szPath[MAX_PATH]={0};
//m_strCurrendDirectory = GetFolderPath();
GetFolderPath(szPath,MAX_PATH);
m_strCurrendDirectory.Format(_T("%s"),szPath);
//CFileDialog::OnFolderChange();
};
void CSelectDialog::OnInitDone(LPOFNOTIFY /*lpon*/)
{
WCHAR szPath[MAX_PATH]={0};
//m_strCurrendDirectory = GetFolderPath();
//GetFolderPath(szPath,MAX_PATH);
//m_strCurrendDirectory.Format(_T("%s"),szPath);
CWindow pWind = GetParent();
////HWND hWnd = pWind.m_hWnd;
//HideControl(edt1);
//HideControl(cmb1);
//HideControl(stc2);
////HideControl(cmb13);
////HideControl(stc3);
//CRect rectCancel;
//pWind.GetDlgItem(IDCANCEL).GetWindowRect(&rectCancel);
//pWind.ScreenToClient(&rectCancel);
//CRect rectOK;
//pWind.GetDlgItem(IDOK).GetWindowRect(&rectOK);
//pWind.ScreenToClient(&rectOK);
//pWind.GetDlgItem(IDOK).SetWindowPos(0,rectCancel.left - rectOK.Width(), rectCancel.top, 0,0, SWP_NOZORDER | SWP_NOSIZE);
//CRect rectList2;
//pWind.GetDlgItem(lst1).GetWindowRect(&rectList2);
//pWind.ScreenToClient(&rectList2);
//pWind.GetDlgItem(lst1).SetWindowPos(0,0,0,rectList2.Width(), abs(rectList2.top - (rectCancel.top - 5)), SWP_NOMOVE | SWP_NOZORDER);
//CRect rectStatic;
//pWind.GetDlgItem(stc3).GetWindowRect(&rectStatic);
//pWind.ScreenToClient(&rectStatic);
//pWind.GetDlgItem(stc3).SetWindowPos(0,rectCancel.left - 375,rectCancel.top + 5, rectStatic.Width(), rectStatic.Height(), SWP_NOZORDER);
//CRect rectEdit1;
//pWind.GetDlgItem(cmb13).GetWindowRect(&rectEdit1);
//pWind.ScreenToClient(&rectEdit1);
//pWind.GetDlgItem(cmb13).SetWindowPos(0,rectCancel.left - 320,rectCancel.top, rectEdit1.Width() - 15, rectEdit1.Height(), SWP_NOZORDER);
//SetControlText(stc3, _T("Item name:"));
SetControlText(IDOK, _T("存入云盘"));
m_wndProc = (WNDPROC)::SetWindowLong(pWind.m_hWnd, GWL_WNDPROC, (long)WindowProcNew);
pWind.CenterWindow();
SetForegroundWindow(pWind.m_hWnd);
};
LRESULT CALLBACK CSelectDialog::WindowProcNew(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_COMMAND&& HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK)
{
if (m_strCurrendDirectory == "")
{
goto Exit;
}
m_SelectedItemList.clear();
HWND pWnd = ::GetDlgItem(hwnd,lst2);
if (pWnd == NULL)
{
return FALSE;
}
CListViewCtrl wndLst1 = (CListViewCtrl)(::GetDlgItem(pWnd,1));
int nSelected = wndLst1.GetSelectedCount();
if (!nSelected) // nothing selected -- don't retrieve list
return FALSE;
HWND pcmbWnd = ::GetDlgItem(hwnd, cmb13);
if (pcmbWnd)
::SetWindowTextW(pcmbWnd, _T(""));
int nItem = wndLst1.GetNextItem(-1,LVNI_SELECTED);
set<int> setSelected;
while((nSelected--) > 0)
{
setSelected.insert(nItem);
BOOL bRet = wndLst1.SetItemState(nItem, ~LVIS_SELECTED , LVIS_SELECTED);
nItem = wndLst1.GetNextItem(nItem, LVNI_SELECTED);
}
for (std::set<int>::iterator ite = setSelected.begin(); ite != setSelected.end(); ++ite)
{
wndLst1.SetItemState(*ite, LVIS_SELECTED, LVIS_SELECTED);
CString strFolderPath = _T("");
SendMessage(hwnd, CDM_GETFILEPATH, (WPARAM)MAX_PATH, (LPARAM)strFolderPath.GetBuffer(MAX_PATH));
strFolderPath.ReleaseBuffer();
DWORD newSelAttr = GetFileAttributes(strFolderPath);
CString strLog1;
strLog1 = "======>3";
strLog1 += strFolderPath;
OutputDebugString(strLog1);
wndLst1.SetItemState(*ite, ~LVIS_SELECTED, LVIS_SELECTED);
}
::EndDialog(hwnd,IDOK);
return NULL;
}
Exit:
return CallWindowProc(m_wndProc, hwnd, message, wParam, lParam);
}
#pragma warning( pop )