📄 mainwin.cpp
字号:
static char *mainwin_id =
"@(#)Copyright (C) H.Shirouzu 2004-2007 maindlg.cpp ver1.52";
/* ========================================================================
Project Name : Fast/Force copy file and directory
Create : 2004-09-15(Wed)
Update : 2007-02-06(Tue)
Copyright : H.Shirouzu
Reference :
======================================================================== */
#include "mainwin.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
/*=========================================================================
僋儔僗 丗 TFastCopyApp
奣 梫 丗 傾僾儕働乕僔儑儞僋儔僗
愢 柧 丗
拲 堄 丗
=========================================================================*/
TFastCopyApp::TFastCopyApp(HINSTANCE _hI, LPSTR _cmdLine, int _nCmdShow) : TApp(_hI, _cmdLine, _nCmdShow)
{
char title[100];
sprintf(title, "FastCopy %s", GetVersionStr());
InstallExceptionFilter(title, GetLoadStr(IDS_EXCEPTIONLOG));
LoadLibrary("RICHED20.DLL");
}
TFastCopyApp::~TFastCopyApp()
{
}
void TFastCopyApp::InitWindow(void)
{
TRegisterClass(FASTCOPY_CLASS);
TDlg *mainDlg = new TMainDlg();
mainWnd = mainDlg;
mainDlg->Create();
}
int WINAPI WinMain(HINSTANCE _hI, HINSTANCE, LPSTR arg, int show)
{
return TFastCopyApp(_hI, arg, show).Run();
}
/*=========================================================================
僋儔僗 丗 TMainDlg
奣 梫 丗 儊僀儞僟僀傾儘僌
愢 柧 丗
拲 堄 丗
=========================================================================*/
TMainDlg::TMainDlg() : TDlg(MAIN_DIALOG), aboutDlg(this), setupDlg(&cfg, this), shellExtDlg(&cfg, this), jobDlg(&cfg, this)
{
cfg.ReadIni();
if (cfg.lcid > 0)
TSetDefaultLCID(cfg.lcid);
isShellExt = FALSE;
isErrLog = cfg.isErrLog;
forceStart = cfg.forceStart;
isTaskTray = noConfirmDel = FALSE;
isNetPlaceSrc = FALSE;
skipEmptyDir = cfg.skipEmptyDir;
diskMode = cfg.diskMode;
curForeWnd = NULL;
// isRegExp = FALSE;
// isFilter = FALSE;
autoCloseLevel = NO_CLOSE;
curIconIndex = 0;
pathLogBuf = NULL;
isDelay = FALSE;
endTick = 0;
hErrLogFile = INVALID_HANDLE_VALUE;
hErrLogMutex = NULL;
memset(&ti, 0, sizeof(ti));
}
TMainDlg::~TMainDlg()
{
}
struct CopyInfo COPYINFO_LIST [] = {
{ IDS_ALLSKIP, NULL, IDS_CMD_NOEXIST_ONLY, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_NAME },
{ IDS_ATTRCMP, NULL, IDS_CMD_DIFF, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_ATTR },
{ IDS_UPDATECOPY, NULL, IDS_CMD_UPDATE, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_LASTEST },
{ IDS_FORCECOPY, NULL, IDS_CMD_FORCE_COPY, NULL, FastCopy::DIFFCP_MODE, FastCopy::BY_ALWAYS },
{ IDS_SYNCCOPY, NULL, IDS_CMD_SYNC, NULL, FastCopy::SYNCCP_MODE, FastCopy::BY_ATTR },
// { IDS_MOVEATTR, NULL, IDS_CMD_MOVE, NULL, FastCopy::MOVE_MODE, FastCopy::BY_ATTR },
{ IDS_MOVEFORCE, NULL, IDS_CMD_MOVE, NULL, FastCopy::MOVE_MODE, FastCopy::BY_ALWAYS },
{ IDS_DELETE, NULL, IDS_CMD_DELETE, NULL, FastCopy::DELETE_MODE, FastCopy::BY_ALWAYS },
{ 0, NULL, 0, NULL, (FastCopy::Mode)0, (FastCopy::OverWrite)0 }
};
void TMainDlg::SetPathHistory(void)
{
int item[] = { SRC_COMBO, DST_COMBO, 0 };
void **history[] = { cfg.srcPathHistory, cfg.dstPathHistory, NULL };
SetHistory(item, history);
}
void TMainDlg::SetFilterHistory(void)
{
int item[] = { INCLUDE_COMBO, EXCLUDE_COMBO, 0 };
void **history[] = { cfg.includeHistory, cfg.excludeHistory, NULL };
SetHistory(item, history);
}
void TMainDlg::SetHistory(int *item, void ***history)
{
for (int i=0; item[i]; i++) {
SendDlgItemMessage(item[i], CB_RESETCONTENT, 0, 0);
for (int j=0; j < cfg.maxHistory; j++) {
if (GetChar(history[i][j], 0))
SendDlgItemMessageV(item[i], CB_INSERTSTRING, j, (LPARAM)history[i][j]);
}
if (cfg.maxHistory > 0 && ::IsWindowEnabled(GetDlgItem(item[i])))
SetDlgItemTextV(item[i], history[i][0]);
}
}
BOOL TMainDlg::SetMiniWindow(void)
{
GetWindowRect(&rect);
int height = rect.bottom - rect.top - (isErrEditHide ? 0 : normalHeight - miniHeight);
isErrEditHide = TRUE;
MoveWindow(rect.left, rect.top, rect.right - rect.left, height, ::IsWindowVisible(hWnd));
return TRUE;
}
BOOL TMainDlg::SetNormalWindow(void)
{
if (::IsWindowVisible(hWnd)) {
GetWindowRect(&rect);
int height = rect.bottom - rect.top + (isErrEditHide ? normalHeight - miniHeight : 0);
isErrEditHide = FALSE;
MoveWindow(rect.left, rect.top, rect.right - rect.left, height, TRUE);
}
return TRUE;
}
BOOL TMainDlg::EvCreate(LPARAM lParam)
{
int i;
hAccel = LoadAccelerators(TApp::GetInstance(), (LPCSTR)IDR_ACCEL);
for (i=0; i < MAX_FASTCOPY_ICON; i++)
hMainIcon[i] = ::LoadIcon(TApp::GetInstance(), (LPCSTR)(FASTCOPY_ICON + i));
::SetClassLong(hWnd, GCL_HICON, (LONG)hMainIcon[FCNORMAL_ICON_INDEX]);
SetSize();
isErrEditHide = FALSE;
// 椺奜僼傿儖僞偺愝掕
SetWindowTitle("FastCopy %s", GetVersionStr());
TaskBarCreateMsg = ::RegisterWindowMessage("TaskbarCreated");
// 棜楌僙僢僩
SetPathHistory();
SetFilterHistory();
// 儊僢僙乕僕僙僢僩
SetDlgItemText(STATUS_EDIT, GetLoadStr(IDS_BEHAVIOR));
SetDlgItemInt(BUFSIZE_EDIT, cfg.bufSize);
// 僐僺乕儌乕僪儕僗僩嶌惉
for (i=0; COPYINFO_LIST[i].resId; i++) {
COPYINFO_LIST[i].list_str = GetLoadStr(COPYINFO_LIST[i].resId);
SendDlgItemMessage(MODE_COMBO, CB_ADDSTRING, 0, (LPARAM)COPYINFO_LIST[i].list_str);
COPYINFO_LIST[i].cmdline_name = GetLoadStrV(COPYINFO_LIST[i].cmdline_resId);
}
UpdateMenu();
// 僐僺乕儌乕僪儕僗僩偺僨僼僅儖僩慖戰
SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, cfg.copyMode, 0);
::CheckDlgButton(hWnd, IGNORE_CHECK, cfg.ignoreErr);
::CheckDlgButton(hWnd, ESTIMATE_CHECK, cfg.estimateMode);
::CheckDlgButton(hWnd, AUTOSLOW_CHECK, isAutoSlow = cfg.isAutoSlow);
::CheckDlgButton(hWnd, TOPLEVEL_CHECK, cfg.isTopLevel);
SetForegroundWindow();
if (cfg.isTopLevel)
SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE);
SendDlgItemMessage(STATUS_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
// SendDlgItemMessage(ERR_EDIT, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);
SendDlgItemMessage(ERR_EDIT, EM_SETTARGETDEVICE, 0, 0); // 愜傝曉偟
SendDlgItemMessage(ERR_EDIT, EM_LIMITTEXT, 0, 0);
SendDlgItemMessage(PATH_EDIT, EM_LIMITTEXT, 0, 0);
GetWindowRect(&rect);
int offset_x = (GetSystemMetrics(SM_CXFULLSCREEN) - (rect.right - rect.left)) / 2;
int offset_y = (GetSystemMetrics(SM_CYFULLSCREEN) - (rect.bottom - rect.top)) / 2;
SetWindowPos(NULL, offset_x, offset_y, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
RECT path_rect, err_rect;
GetWindowRect(&rect);
::GetWindowRect(GetDlgItem(PATH_EDIT), &path_rect);
::GetWindowRect(GetDlgItem(ERR_EDIT), &err_rect);
SendDlgItemMessage(PATH_EDIT, EM_SETBKGNDCOLOR, 0, ::GetSysColor(COLOR_3DFACE));
SendDlgItemMessage(ERR_EDIT, EM_SETBKGNDCOLOR, 0, ::GetSysColor(COLOR_3DFACE));
normalHeight = rect.bottom - rect.top;
miniHeight = normalHeight - (err_rect.bottom - path_rect.bottom);
SetMiniWindow();
int argc;
void **argv;
argv = CommandLineToArgvV(::GetCommandLineV(), &argc);
// command line mode
if (argc > 1) {
if (!CommandLineExecV(argc, argv) && (!isShellExt || autoCloseLevel >= NOERR_CLOSE)) {
if (::GetAsyncKeyState(VK_SHIFT) & 0x8000)
autoCloseLevel = NO_CLOSE;
else
PostMessage(WM_CLOSE, 0, 0);
}
}
else
Show();
return TRUE;
}
BOOL TMainDlg::EvNcDestroy(void)
{
TaskTray(NIM_DELETE);
PostQuitMessage(0);
return TRUE;
}
BOOL TMainDlg::CancelCopy()
{
if (!isDelay)
fastCopy.Suspend();
::KillTimer(hWnd, FASTCOPY_TIMER);
int ret = TMsgBox(this).Exec(GetLoadStr(IsListing() ? IDS_LISTCONFIRM : info.mode == FastCopy::DELETE_MODE ? IDS_DELSTOPCONFIRM : IDS_STOPCONFIRM), FASTCOPY, MB_OKCANCEL);
if (isDelay) {
isDelay = FALSE;
EndCopy();
}
else {
fastCopy.Resume();
if (ret == IDOK)
fastCopy.Aborting();
else
::SetTimer(hWnd, FASTCOPY_TIMER, 1000, NULL);
}
return ret == IDOK ? TRUE : FALSE;
}
BOOL TMainDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hwndCtl)
{
switch (wID) {
case IDOK: case LIST_BUTTON:
if (!fastCopy.IsStarting() && !isDelay) {
if ((::GetTickCount() - endTick) > 1000)
ExecCopy(wID == LIST_BUTTON ? LISTING_EXEC : NORMAL_EXEC);
}
else if (CancelCopy()) {
autoCloseLevel = NO_CLOSE;
}
return TRUE;
case IDCANCEL: case CLOSE_MENUITEM:
if (!fastCopy.IsStarting()) {
EndDialog(wID);
}
else if (fastCopy.IsAborting()) {
if (TMsgBox(this).Exec(GetLoadStr(IDS_CONFIRMFORCEEND), FASTCOPY, MB_OKCANCEL) == IDOK)
EndDialog(wID);
}
else {
CancelCopy();
autoCloseLevel = NOERR_CLOSE;
}
return TRUE;
case ATONCE_BUTTON:
isDelay = FALSE;
::KillTimer(hWnd, FASTCOPY_TIMER);
ExecCopyCore();
return TRUE;
case SRC_FILE_BUTTON:
BrowseDirDlgV(this, SRC_COMBO, GetLoadStrV(IDS_SRC_SELECT), BRDIR_VQUOTE|BRDIR_FILESELECT);
return TRUE;
case DST_FILE_BUTTON:
BrowseDirDlgV(this, DST_COMBO, GetLoadStrV(IDS_DST_SELECT), BRDIR_BACKSLASH);
return TRUE;
case TOPLEVEL_CHECK:
cfg.isTopLevel = IsDlgButtonChecked(TOPLEVEL_CHECK);
SetWindowPos(cfg.isTopLevel ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE);
cfg.WriteIni();
break;
case MODE_COMBO:
if (wNotifyCode == CBN_SELCHANGE) {
BOOL is_delete = GetCopyMode() == FastCopy::DELETE_MODE;
if (is_delete && isNetPlaceSrc) {
SetDlgItemTextV(SRC_COMBO, EMPTY_STR_V);
isNetPlaceSrc = FALSE;
}
SetItemEnable(is_delete);
}
return TRUE;
case FILTER_CHECK:
ReflectFilterCheck();
return TRUE;
case OPENDIR_MENUITEM:
::ShellExecute(NULL, NULL, cfg.execDir, 0, 0, SW_SHOW);
return TRUE;
case AUTOSLOW_CHECK:
isAutoSlow = IsDlgButtonChecked(AUTOSLOW_CHECK);
return TRUE;
case SETUP_MENUITEM:
if (setupDlg.Exec() == IDOK) {
SetDlgItemInt(BUFSIZE_EDIT, cfg.bufSize);
CheckDlgButton(IGNORE_CHECK, cfg.ignoreErr);
CheckDlgButton(ESTIMATE_CHECK, cfg.estimateMode);
CheckDlgButton(AUTOSLOW_CHECK, cfg.isAutoSlow);
isErrLog = cfg.isErrLog;
skipEmptyDir = cfg.skipEmptyDir;
forceStart = cfg.forceStart;
}
return TRUE;
case SHELLEXT_MENUITEM:
shellExtDlg.Exec();
return TRUE;
case ABOUT_MENUITEM:
aboutDlg.Exec();
return TRUE;
case FASTCOPYURL_MENUITEM:
::ShellExecute(NULL, NULL, GetLoadStr(IDS_FASTCOPYURL), NULL, NULL, SW_SHOW);
return TRUE;
case AUTODISK_MENUITEM: case SAMEDISK_MENUITEM: case DIFFDISK_MENUITEM:
diskMode = wID - AUTODISK_MENUITEM;
UpdateMenu();
break;
case IDR_DISKMODE:
diskMode = (diskMode + 1) % 3;
UpdateMenu();
break;
case JOB_MENUITEM:
jobDlg.Exec();
UpdateMenu();
return TRUE;
case HELP_BUTTON: case HELP_MENUITEM:
ShowHelp(hWnd, cfg.execDir, GetLoadStr(IDS_FASTCOPYHELP), wID == HELP_BUTTON ? "#usage" : NULL);
return TRUE;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -