#include <user\dlg.h>
#include <commctrl.h>
#include <shlobj.h>
#include "resource.h"
#include "sharewareluncher.h"
#define DEL_CANCEL 90001
//#define IDC_HAND 99999 //hand cursor
typedef struct AAA
{
LPITEMIDLIST lpi;
LPSHELLFOLDER lpsfParent;
LPITEMIDLIST lpifq;
}TVITEMDATA,*LPTVITEMDATA;
typedef struct _STRRET1
{
UINT uType; // One of the STRRET_* values
union
{
LPWSTR pOleStr; // OLESTR that will be freed
LPSTR pStr; // ANSI string that will be freed (needed?)
UINT uOffset; // Offset into SHITEMID
char cStr[MAX_PATH]; // Buffer to fill in (ANSI)
} ;//DUMMYUNIONNAME;
} STRRET1, *LPSTRRET1;
typedef struct _FileOp
{
UINT uOp;
BOOL bUpdate;
BOOL bNoAsk;
BOOL bNoFolder;
}DOFILEOP,*LPDOFILEOP;
extern HINSTANCE hInst;
extern HWND hMainWnd;
extern char szRunCommand[300];
extern HBITMAP hbmBkg;
HWND hTreeWnd;
char szFoldername[MAX_PATH],szDestFolder[MAX_PATH],szShowDest[MAX_PATH];
char szSourceFile[MAX_PATH];
char szThisFolder[MAX_PATH]; //in listview-IDC_SELECTSEND's dir
char szForCheck[300]; //restore the szRunCommand
NM_TREEVIEW *pNmTv=NULL;
DOFILEOP dofileop={FO_COPY,FALSE,FALSE,FALSE};
BOOL bNoMsg=FALSE;
BOOL bDelNoAsk=FALSE;
HWND hTypeWnd;
HWND hBaseWnd=NULL,hExternWnd=NULL; //treeview hwnd and sendproc hwnd
RECT CDestRt; //change dest folder rect,in SendProc,for text control "目的文件夹"
BOOL bInText=FALSE; //check mouse in text control "目的文件夹"?
int nFocused=-1; //for in listview,if "shift" pressed,record the first item;
BOOL CALLBACK WINAPI BrowserProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
BOOL CALLBACK WINAPI MsgProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
BOOL CALLBACK WINAPI SendProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
BOOL CALLBACK WINAPI AskDelProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
void FillTreeView(HWND hwndTreeView,LPSHELLFOLDER lpsf,LPITEMIDLIST lpifq, HTREEITEM hParent);
BOOL GetName( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName) ;
LPITEMIDLIST CopyITEMID( LPMALLOC lpMalloc, LPITEMIDLIST lpi) ;
LPITEMIDLIST ConcatPidls( LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ;
LPITEMIDLIST GetFullyQualPidl( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi) ;
void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTV_ITEM lptvitem);
int GetIcon( LPITEMIDLIST lpi, UINT uFlags) ;
UINT GetSize(LPCITEMIDLIST pidl);
LPITEMIDLIST Create(UINT cbSize);
LPITEMIDLIST Next(LPCITEMIDLIST pidl);
int WINAPI BrowseProc( HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData);
int DelFile(LPSTR szfile);
void DoCopy(void);
void DoSend(void);
void ResetFileOp(void);
BOOL DoCheckCommand(void);
void ExpandTree(void);
void FillList(HWND hWnd);
void FillSend(HWND hWnd,LPSTR szFileType);
LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void InitCol(HWND hWnd);
void AddListview(HWND hWnd,LPSTR szDisplay,int i);
HICON GetFileIcon(LPSTR lpi);
void AddFileType(LPSTR s);
void RestoreCheckCommand(void); //restore szRunCommand
void UpdateDestFolder(void); //listview对话框“目的文件夹”
void ChangeShortcut(void)
{
//MessageBox(GetFocus(),"
}
void DelShortcut(void)
{
//Errmsg("del link will write later");
}
void SendToHD(void)
{
wsprintf(szForCheck,szRunCommand);
if(hBaseWnd==NULL)
{
if(DialogBox(hInst,MAKEINTRESOURCE(IDD_BROWSER),hMainWnd,(DLGPROC)BrowserProc))
DoCopy();
ResetFileOp();
}
else
{
SetForegroundWindow(hBaseWnd);
SendMessage(hBaseWnd,MYWM_ICON,0,0);
}
}
#pragma argsused
BOOL CALLBACK WINAPI BrowserProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
{
HIMAGELIST hImageList;
LPSHELLFOLDER lpsf = 0 ;
SHFILEINFO sfi;
HRESULT hr ;
hBaseWnd=hWnd;
hTreeWnd=GetDlgItem(hWnd,IDC_LISTALL);
hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ;
if( hImageList)
TreeView_SetImageList(hTreeWnd, hImageList, 0) ;
hr=SHGetDesktopFolder( &lpsf) ;
if( SUCCEEDED(hr))
{
TreeView_DeleteAllItems( hTreeWnd);
FillTreeView( hTreeWnd, lpsf, NULL, TVI_ROOT) ;
ExpandTree();
TreeView_SelectItem(hTreeWnd,TreeView_GetRoot(hTreeWnd));//,TVGN_FIRSTVISIBLE);
}
if( lpsf)
lpsf -> lpVtbl -> Release( lpsf) ;
}
break ;
case MYWM_ICON: //临时借用,该对话框运行时再有"send to sharewareluncher"
if(hExternWnd!=NULL) //可更新正运行(如果)的listview对话框内容
{
UpdateDestFolder();
SetDlgItemText(hExternWnd,IDC_DESTFOLDER,szDestFolder);
PostMessage(hExternWnd,MYWM_ICON,0,0);
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if(hExternWnd!=NULL)
{
SetForegroundWindow(hExternWnd);
break;
}
hBaseWnd=NULL;
EndDialog(hWnd,TRUE);
return TRUE;
case IDCANCEL:
if(hExternWnd!=NULL)
{
SetForegroundWindow(hExternWnd);
break;
}
hBaseWnd=NULL;
wsprintf(szDestFolder,"\0");
EndDialog(hWnd,FALSE);
return FALSE;
case IDHELP:
if(hExternWnd!=NULL)
{
SetForegroundWindow(hExternWnd);
break;
}
if(DialogBox(hInst,MAKEINTRESOURCE(IDD_SENDTO),hMainWnd,(DLGPROC)SendProc))
;//Errmsg("wait to complete");//DoCopy();
break;
case IDC_MOVE:
if(IsDlgButtonChecked(hWnd,IDC_MOVE)==BST_CHECKED)
{
dofileop.uOp=FO_MOVE;
if(hExternWnd!=NULL)
if(IsDlgButtonChecked(hExternWnd,IDC_MOVE)!=BST_CHECKED)
CheckDlgButton(hExternWnd,IDC_MOVE,BST_CHECKED);
}
else
{
dofileop.uOp=FO_COPY;
if(hExternWnd!=NULL)
if(IsDlgButtonChecked(hExternWnd,IDC_MOVE)==BST_CHECKED)
CheckDlgButton(hExternWnd,IDC_MOVE,BST_UNCHECKED);
}
break;
case IDC_NOFOLDER:
if(IsDlgButtonChecked(hWnd,IDC_NOFOLDER)==BST_CHECKED)
{
dofileop.bNoFolder=TRUE;
if(hExternWnd!=NULL)
{
CheckDlgButton(hExternWnd,IDC_NOFOLDER,BST_CHECKED);
ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE);
SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0);
ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW);
}
}
else
{
dofileop.bNoFolder=FALSE;
if(hExternWnd!=NULL)
{
CheckDlgButton(hExternWnd,IDC_NOFOLDER,BST_UNCHECKED);
ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE);
SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0);
ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW);
}
}
break;
case IDC_UPDATE:
if(IsDlgButtonChecked(hWnd,IDC_UPDATE)==BST_CHECKED)
{
dofileop.bUpdate=TRUE;
if(hExternWnd!=NULL)
i