📄 mainwin.cpp
字号:
if (ret) {
SetDlgItemText(IsListing() ? LIST_BUTTON : IDOK, GetLoadStr(IDS_CANCEL));
RefreshWindow(TRUE);
}
}
if (!ret && pathLogBuf) {
delete [] pathLogBuf;
pathLogBuf = NULL;
}
return ret;
}
BOOL TMainDlg::ExecCopyCore(void)
{
::GetLocalTime(&startTm);
BOOL ret = fastCopy.Start();
if (ret) {
RefreshWindow();
timerCnt = 0;
::GetCursorPos(&curPt);
::SetTimer(hWnd, FASTCOPY_TIMER, 500, NULL);
}
return ret;
}
BOOL TMainDlg::EndCopy(void)
{
char buf[1024];
::KillTimer(hWnd, FASTCOPY_TIMER);
BOOL is_starting = fastCopy.IsStarting();
if (is_starting) {
SetInfo(FALSE, TRUE);
if (isErrLog && !IsListing()) {
EnableLogFile(TRUE);
::SetFilePointer(hErrLogFile, 0, 0, FILE_END);
DWORD len = sprintf(buf, "-------------------------------------------------\r\n"
"FastCopy(%s) start at %d/%02d/%02d %02d:%02d:%02d\r\n\r\n",
GetVersionStr(),
startTm.wYear, startTm.wMonth, startTm.wDay,
startTm.wHour, startTm.wMinute, startTm.wSecond);
::WriteFile(hErrLogFile, buf, len, &len, 0);
::WriteFile(hErrLogFile, pathLogBuf, strlen(pathLogBuf), &len, 0);
if (errBufOffset) {
::WriteFile(hErrLogFile, ti.errBuf->Buf(), errBufOffset, &len, 0);
len = sprintf(buf, "%s", "\r\n\r\n");
::WriteFile(hErrLogFile, buf, len, &len, 0);
}
else {
char msg[] = " No Errors\r\n\r\n";
::WriteFile(hErrLogFile, msg, sizeof(msg) -1, &len, 0);
}
len = GetDlgItemText(STATUS_EDIT, buf, sizeof(buf));
len += sprintf(buf + len, "%s", "\r\n\r\nResult : ");
len += GetDlgItemText(ERRSTATUS_STATIC, buf + len, sizeof(buf) - len);
len += sprintf(buf + len, "%s", "\r\n\r\n");
::WriteFile(hErrLogFile, buf, len, &len, 0);
EnableLogFile(FALSE);
}
::EnableWindow(GetDlgItem(IsListing() ? LIST_BUTTON : IDOK), FALSE);
fastCopy.End();
::EnableWindow(GetDlgItem(IsListing() ? LIST_BUTTON : IDOK), TRUE);
}
else
SendDlgItemMessage(STATUS_EDIT, WM_SETTEXT, 0, (LPARAM)" ---- Canceled. ----");
delete [] pathLogBuf;
pathLogBuf = NULL;
endTick = ::GetTickCount();
SetDlgItemText(IsListing() ? LIST_BUTTON : IDOK, GetLoadStr(IsListing() ? IDS_LISTING : IDS_EXECUTE));
SetDlgItemText(SAMEDRV_STATIC, "");
if (autoCloseLevel == FORCE_CLOSE || autoCloseLevel == NOERR_CLOSE && (!is_starting || (ti.total.errFiles == 0 && ti.total.errDirs == 0)))
PostMessage(WM_CLOSE, 0, 0);
autoCloseLevel = NO_CLOSE;
RefreshWindow(TRUE);
UpdateMenu();
SetFocus(GetDlgItem(IsListing() ? LIST_BUTTON : IDOK));
if (isTaskTray)
TaskTray(NIM_MODIFY, hMainIcon[curIconIndex = FCNORMAL_ICON_INDEX], FASTCOPY);
return TRUE;
}
BOOL TMainDlg::EventUser(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_FASTCOPY_MSG:
if (wParam == FastCopy::END_NOTIFY) {
EndCopy();
}
else if (wParam == FastCopy::CONFIRM_NOTIFY) {
FastCopy::Confirm *confirm = (FastCopy::Confirm *)lParam;
switch (TConfirmDlg().Exec(confirm->message, confirm->allow_continue, this)) {
case IDIGNORE: confirm->result = FastCopy::Confirm::IGNORE_RESULT; break;
case IDCANCEL: confirm->result = FastCopy::Confirm::CANCEL_RESULT; break;
default: confirm->result = FastCopy::Confirm::CONTINUE_RESULT; break;
}
}
return TRUE;
case WM_FASTCOPY_NOTIFY:
switch (lParam) {
case WM_LBUTTONDOWN: case WM_RBUTTONDOWN:
SetForceForegroundWindow();
Show();
break;
case WM_LBUTTONUP: case WM_RBUTTONUP:
Show();
if (isErrEditHide && ti.errBuf && ti.errBuf->UsedSize())
SetNormalWindow();
TaskTray(NIM_DELETE);
break;
}
return TRUE;
case WM_FASTCOPY_HIDDEN:
Show(SW_HIDE);
TaskTray(NIM_ADD, hMainIcon[isDelay ? FCWAIT_ICON_INDEX : FCNORMAL_ICON_INDEX], FASTCOPY);
return TRUE;
default:
if (uMsg == TaskBarCreateMsg)
{
if (isTaskTray)
TaskTray(NIM_ADD, hMainIcon[isDelay ? FCWAIT_ICON_INDEX : FCNORMAL_ICON_INDEX], FASTCOPY);
return TRUE;
}
}
return FALSE;
}
BOOL TMainDlg::EvTimer(WPARAM timerID, TIMERPROC proc)
{
timerCnt++;
if (isDelay) {
if (fastCopy.TakeExclusivePriv()) {
::KillTimer(hWnd, FASTCOPY_TIMER);
isDelay = FALSE;
ExecCopyCore();
}
}
else {
DWORD waitCnt = fastCopy.GetAutoSlow();
if (isAutoSlow) {
POINT pt;
::GetCursorPos(&pt);
HWND foreWnd = ::GetForegroundWindow();
if (foreWnd == hWnd) {
waitCnt = 0;
}
else if (pt.x != curPt.x || pt.y != curPt.y || foreWnd != curForeWnd) {
curPt = pt;
curForeWnd = foreWnd;
waitCnt = cfg.autoSlow;
}
else if (waitCnt > 0 && timerCnt % 2) {
waitCnt -= 1;
}
fastCopy.SetAutoSlow(waitCnt);
}
else if (waitCnt) {
fastCopy.SetAutoSlow(0);
}
if (timerCnt % 2)
SetInfo(isTaskTray);
}
return TRUE;
}
BOOL TMainDlg::EnableLogFile(BOOL on)
{
if (on && hErrLogFile == INVALID_HANDLE_VALUE) {
hErrLogMutex = ::CreateMutex(NULL, TRUE, FASTCOPYLOG_MUTEX);
hErrLogFile = ::CreateFileV(cfg.logPath, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0);
}
else if (!on && hErrLogFile != INVALID_HANDLE_VALUE) {
::CloseHandle(hErrLogFile);
hErrLogFile = INVALID_HANDLE_VALUE;
::CloseHandle(hErrLogMutex);
hErrLogMutex = NULL;
}
return TRUE;
}
int GetArgOpt(void *arg, int default_value)
{
if (GetChar(arg, 0) == '=') {
arg = MakeAddr(arg, 1);
}
if (GetChar(arg, 0) == 0) {
return default_value;
}
if (lstrcmpiV(arg, TRUE_V) == 0)
return TRUE;
if (lstrcmpiV(arg, FALSE_V) == 0)
return FALSE;
if (GetChar(arg, 0) >= '0' && GetChar(arg, 0) <= '9')
return GetChar(arg, 0) - '0';
return default_value;
}
int CmdNameToComboIndex(void *cmd_name)
{
for (int i=0; COPYINFO_LIST[i].cmdline_name; i++) {
if (lstrcmpiV(cmd_name, COPYINFO_LIST[i].cmdline_name) == 0)
return i;
}
return -1;
}
BOOL TMainDlg::CommandLineExecV(int argc, void **argv)
{
VBuf shellExtBuf;
int len;
int job_idx = -1;
BOOL is_openwin = FALSE;
BOOL is_noexec = FALSE;
BOOL is_delete = FALSE;
BOOL is_estimate = FALSE;
BOOL is_filter = FALSE;
BOOL is_job_filter = FALSE;
void *CMD_STR = GetLoadStrV(IDS_CMD_OPT);
void *BUSIZE_STR = GetLoadStrV(IDS_BUFSIZE_OPT);
void *LOG_STR = GetLoadStrV(IDS_LOG_OPT);
void *FORCESTART_STR = GetLoadStrV(IDS_FORCESTART_OPT);
void *SKIPEMPTYDIR_STR = GetLoadStrV(IDS_SKIPEMPTYDIR_OPT);
void *ERRSTOP_STR = GetLoadStrV(IDS_ERRSTOP_OPT);
void *ESTIMATE_STR = GetLoadStrV(IDS_ESTIMATE_OPT);
void *AUTOSLOW_STR = GetLoadStrV(IDS_AUTOSLOW_OPT);
void *DISKMODE_STR = GetLoadStrV(IDS_DISKMODE_OPT);
void *DISKMODE_SAME_STR = GetLoadStrV(IDS_DISKMODE_SAME);
void *DISKMODE_DIFF_STR = GetLoadStrV(IDS_DISKMODE_DIFF);
void *DISKMODE_AUTO_STR = GetLoadStrV(IDS_DISKMODE_AUTO);
void *OPENWIN_STR = GetLoadStrV(IDS_OPENWIN_OPT);
void *AUTOCLOSE_STR = GetLoadStrV(IDS_AUTOCLOSE_OPT);
void *FORCECLOSE_STR = GetLoadStrV(IDS_FORCECLOSE_OPT);
void *NOEXEC_STR = GetLoadStrV(IDS_NOEXEC_OPT);
void *SHELLEXT1_STR = GetLoadStrV(IDS_SHEXT1_OPT);
void *SHELLEXT2_STR = GetLoadStrV(IDS_SHEXT2_OPT);
void *SHELLEXT4_STR = GetLoadStrV(IDS_SHEXT4_OPT);
void *FCSHEXT1_STR = GetLoadStrV(IDS_FCSHEXT1_OPT);
void *NOCONFIRMDEL_STR = GetLoadStrV(IDS_NOCONFIRMDEL_OPT);
void *INCLUDE_STR = GetLoadStrV(IDS_INCLUDE_OPT);
void *EXCLUDE_STR = GetLoadStrV(IDS_EXCLUDE_OPT);
void *REGEXP_STR = GetLoadStrV(IDS_REGEXP_OPT);
void *JOB_STR = GetLoadStrV(IDS_JOB_OPT);
void *TO_STR = GetLoadStrV(IDS_TO_OPT);
void *p;
argc--, argv++; // 幚峴僼傽僀儖柤偼 skip
while (*argv && GetChar(*argv, 0) == '/') {
if (strnicmpV(*argv, CMD_STR, len = strlenV(CMD_STR)) == 0) {
int idx = CmdNameToComboIndex(MakeAddr(*argv, len));
if (idx == -1)
return MessageBox(GetLoadStr(IDS_USAGE), "Illegal Command"), FALSE;
// 僐儅儞僪儌乕僪傪慖戰
SendDlgItemMessage(MODE_COMBO, CB_SETCURSEL, idx, 0);
}
else if (strnicmpV(*argv, JOB_STR, len = strlenV(JOB_STR)) == 0) {
if ((job_idx = cfg.SearchJobV(MakeAddr(*argv, len))) == -1)
return MessageBox(GetLoadStr(IDS_JOBNOTFOUND), "Illegal Command"), FALSE;
SetJob(job_idx);
if (GetChar(cfg.jobArray[job_idx]->includeFilter, 0) || GetChar(cfg.jobArray[job_idx]->excludeFilter, 0))
is_job_filter = TRUE;
}
else if (strnicmpV(*argv, BUSIZE_STR, len = strlenV(BUSIZE_STR)) == 0) {
SetDlgItemTextV(BUFSIZE_EDIT, MakeAddr(*argv, len));
}
else if (strnicmpV(*argv, LOG_STR, len = strlenV(LOG_STR)) == 0) {
isErrLog = GetArgOpt(MakeAddr(*argv, len), TRUE);
}
else if (strnicmpV(*argv, FORCESTART_STR, len = strlenV(FORCESTART_STR)) == 0) {
forceStart = GetArgOpt(MakeAddr(*argv, len), TRUE);
}
else if (strnicmpV(*argv, SKIPEMPTYDIR_STR, len = strlenV(SKIPEMPTYDIR_STR)) == 0) {
skipEmptyDir = GetArgOpt(MakeAddr(*argv, len), TRUE);
}
else if (strnicmpV(*argv, ERRSTOP_STR, len = strlenV(ERRSTOP_STR)) == 0) {
::CheckDlgButton(hWnd, IGNORE_CHECK, GetArgOpt(MakeAddr(*argv, len), FALSE) ? TRUE : FALSE);
}
else if (strnicmpV(*argv, ESTIMATE_STR, len = strlenV(ESTIMATE_STR)) == 0) {
is_estimate = GetArgOpt(MakeAddr(*argv, len), TRUE);
}
else if (strnicmpV(*argv, AUTOSLOW_STR, len = strlenV(AUTOSLOW_STR)) == 0) {
::CheckDlgButton(hWnd, AUTOSLOW_CHECK, isAutoSlow = (GetArgOpt(MakeAddr(*argv, len), TRUE) ? TRUE : FALSE));
}
else if (strnicmpV(*argv, OPENWIN_STR, len = strlenV(OPENWIN_STR)) == 0) {
is_openwin = GetArgOpt(MakeAddr(*argv, len), TRUE);
}
else if (strnicmpV(*argv, AUTOCLOSE_STR, len = strlenV(AUTOCLOSE_STR)) == 0) {
autoCloseLevel = (AutoCloseLevel)GetArgOpt(MakeAddr(*argv, len), NOERR_CLOSE);
}
else if (strnicmpV(*argv, FORCECLOSE_STR, strlenV(FORCECLOSE_STR)) == 0) {
autoCloseLevel = FORCE_CLOSE;
}
else if (strnicmpV(*argv, NOEXEC_STR, strlenV(NOEXEC_STR)) == 0) {
is_noexec = TRUE;
}
else if (strnicmpV(*argv, DISKMODE_STR, len = strlenV(DISKMODE_STR)) == 0) {
if (lstrcmpiV(MakeAddr(*argv, len), DISKMODE_SAME_STR) == 0)
diskMode = 1;
else if (lstrcmpiV(MakeAddr(*argv, len), DISKMODE_DIFF_STR) == 0)
diskMode = 2;
else
diskMode = 0;
}
else if (strnicmpV(*argv, INCLUDE_STR, len = strlenV(INCLUDE_STR)) == 0) {
is_filter = TRUE;
SetDlgItemTextV(INCLUDE_COMBO, strtok_pathV(MakeAddr(*argv, len), EMPTY_STR_V, &p));
}
else if (strnicmpV(*argv, EXCLUDE_STR, len = strlenV(EXCLUDE_STR)) == 0) {
is_filter = TRUE;
SetDlgItemTextV(EXCLUDE_COMBO, strtok_pathV(MakeAddr(*argv, len), EMPTY_STR_V, &p));
}
else if (strnicmpV(*argv, REGEXP_STR, strlenV(REGEXP_STR)) == 0) {
isRegExp = TRUE;
}
else if (strnicmpV(*argv, SHELLEXT1_STR, strlenV(SHELLEXT1_STR)) == 0
|| strnicmpV(*argv, SHELLEXT2_STR, strlenV(SHELLEXT2_STR)) == 0
|| strnicmpV(*argv, SHELLEXT4_STR, strlenV(SHELLEXT4_STR)) == 0) {
if (TMsgBox(this).Exec(GetLoadStr(IDS_UPDATE), FASTCOPY, MB_OKCANCEL) == IDOK)
UpdateShellExt(&cfg);
return FALSE;
}
else if (strnicmpV(*argv, FCSHEXT1_STR, strlenV(FCSHEXT1_STR)) == 0) {
isShellExt = TRUE;
is_openwin = !cfg.shextTaskTray;
autoCloseLevel = cfg.shextAutoClose ? NOERR_CLOSE : NO_CLOSE;
HANDLE hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
DWORD read_size;
BOOL convertErr = FALSE;
shellExtBuf.AllocBuf(SHELLEXT_MIN_ALLOC, SHELLEXT_MAX_ALLOC);
while (::ReadFile(hStdInput, shellExtBuf.Buf() + shellExtBuf.UsedSize(), shellExtBuf.RemainSize(), &read_size, 0) && read_size > 0) {
if (shellExtBuf.AddUsedSize(read_size) == shellExtBuf.Size())
shellExtBuf.Grow(SHELLEXT_MIN_ALLOC);
}
shellExtBuf.Buf()[shellExtBuf.UsedSize()] = 0;
if (convertErr)
return FALSE;
if ((argv = CommandLineToArgvV(shellExtBuf.Buf(), &argc)) == NULL)
break;
continue; // 嵞 parse
}
else if (strnicmpV(*argv, NOCONFIRMDEL_STR, strlenV(NOCONFIRMDEL_STR)) == 0) {
noConfirmDel = TRUE;
}
else
return MessageBoxV(GetLoadStrV(IDS_USAGE), *argv), FALSE;
argc--, argv++;
}
is_delete = GetCopyMode() == FastCopy::DELETE_MODE;
if (job_idx == -1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -