?? senddlg.cpp
字號:
static char *senddlg_id =
"@(#)Copyright (C) H.Shirouzu 1996-2004 senddlg.cpp Ver2.05";
/* ========================================================================
Project Name : IP Messenger for Win32
Module Name : Send Dialog
Create : 1996-06-01(Sat)
Update : 2004-01-01(Thu)
Copyright : H.Shirouzu
Reference :
======================================================================== */
#include "tlib.h"
#include "resource.h"
#include "ipmsg.h"
#include "msgstr.h"
#include "blowfish.h"
/*
SendDialog 偺弶婜壔
*/
TSendDlg::TSendDlg(MsgMng *_msgmng, ShareMng *_shareMng, THosts *_hosts, Cfg *_cfg, LogMng *_logmng, HWND _hRecvWnd, MsgBuf *_msg)
: TListDlg(SEND_DIALOG), editSub(_cfg, this), separateSub(this), hostListView(this)
{
hRecvWnd = _hRecvWnd;
msgMng = _msgmng;
shareMng = _shareMng;
shareInfo = NULL;
shareStr = NULL;
hosts = _hosts;
hostArray = NULL;
cfg = _cfg;
logmng = _logmng;
memberCnt = 0;
sendEntry = NULL;
sendEntryNum = 0;
packetNo = msgMng->MakePacketNo();
retryCnt = 0;
timerID = 0;
hEditFont = NULL;
hListFont = NULL;
captureMode = FALSE;
listOperateCnt = 0;
hiddenDisp = FALSE;
*selectGroup = 0;
currentMidYdiff = cfg->SendMidYdiff;
memset(&orgFont, 0, sizeof(orgFont));
maxItems = 0;
lvStateEnable = FALSE;
sortItem = -1;
sortRev = FALSE;
findDlg = NULL;
msg.Init(_msg);
hAccel = ::LoadAccelerators(TApp::hI, (LPCSTR)IPMSG_ACCEL);
}
/*
SendDialog 偺廔椆
*/
TSendDlg::~TSendDlg()
{
if (findDlg)
delete findDlg;
// ListView 儊儌儕儕乕僋巄掕懳嶔...
SendDlgItemMessage(HOST_LIST, LVM_DELETEALLITEMS, 0, 0);
if (hListFont)
::DeleteObject(hListFont);
if (hEditFont)
::DeleteObject(hEditFont);
delete [] sendEntry;
delete [] shareStr;
if (hostArray)
free(hostArray);
}
/*
SendDialog 惗惉帪偺 CallBack
*/
BOOL TSendDlg::EvCreate(LPARAM lParam)
{
SetDlgIcon(hWnd);
if (msg.hostSub.addr) {
Host *host = cfg->priorityHosts.GetHostByName(&msg.hostSub);
if (host && host->priority <= 0)
hiddenDisp = TRUE;
}
HMENU hMenu = ::GetSystemMenu(hWnd, FALSE);
::AppendMenu(hMenu, MF_SEPARATOR, NULL, NULL);
SetMainMenu(hMenu);
if (cfg->AbnormalButton)
SetDlgItemText(IDOK, FIRE_MSGSTR);
if (cfg->SecretCheck)
SendDlgItemMessage(SECRET_CHECK, BM_SETCHECK, cfg->SecretCheck, 0);
else
::EnableWindow(GetDlgItem(PASSWORD_CHECK), FALSE);
SetFont();
SetSize();
DisplayMemberCnt();
if (IsNewShell() != TRUE)
{
ULONG style;
style = GetWindowLong(GWL_STYLE);
style &= 0xffffff0f;
style |= 0x00000080;
SetWindowLong(GWL_STYLE, style);
style = ::GetWindowLong(GetDlgItem(SEPARATE_STATIC), GWL_STYLE);
style &= 0xffffff00;
style |= 0x00000007;
::SetWindowLong(GetDlgItem(SEPARATE_STATIC), GWL_STYLE, style);
}
SetForegroundWindow();
PostMessage(WM_DELAYSETTEXT, 0, 0);
editSub.CreateByWnd(GetDlgItem(SEND_EDIT));
separateSub.CreateByWnd(GetDlgItem(SEPARATE_STATIC));
hostListView.CreateByWnd(GetDlgItem(HOST_LIST));
#if 0
SendDlgItemMessage(HOST_LIST, LVM_SETTEXTBKCOLOR, 0, 0x222222);
SendDlgItemMessage(HOST_LIST, LVM_SETTEXTCOLOR, 0, 0xeeeeee);
SendDlgItemMessage(HOST_LIST, LVM_SETBKCOLOR, 0, 0x222222);
#endif
InitializeHeader();
for (int cnt=0; cnt < hosts->HostCnt(); cnt++)
AddHost(hosts->GetHost(cnt));
::SetFocus(hostListView.hWnd);
if (msg.hostSub.addr)
SelectHost(&msg.hostSub);
return TRUE;
}
/*
Construct/Rebuild Column Header
*/
void TSendDlg::InitializeHeader(void)
{
int order[MAX_SENDWIDTH];
int revItems[MAX_SENDWIDTH];
// 僇儔儉僿僢僟傪慡嶍彍
while (maxItems > 0)
SendDlgItemMessage(HOST_LIST, LVM_DELETECOLUMN, --maxItems, 0);
ColumnItems = cfg->ColumnItems & ~(1 << SW_ABSENCE);
memcpy(FullOrder, cfg->SendOrder, sizeof(FullOrder));
for (int cnt=0; cnt < MAX_SENDWIDTH; cnt++) {
if (GetItem(ColumnItems, cnt)) {
items[maxItems] = cnt;
revItems[cnt] = maxItems++;
}
}
int orderCnt = 0;
for (cnt=0; cnt < MAX_SENDWIDTH; cnt++) {
if (GetItem(ColumnItems, FullOrder[cnt]))
order[orderCnt++] = revItems[FullOrder[cnt]];
}
// 忢偵慖戰
DWORD dw = ::GetWindowLong(GetDlgItem(HOST_LIST), GWL_STYLE) | LVS_SHOWSELALWAYS;
::SetWindowLong(GetDlgItem(HOST_LIST), GWL_STYLE, dw);
// 侾峴慡僇儔儉慖戰側偳
DWORD style = SendDlgItemMessage(HOST_LIST, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP;
if (cfg->GlidLineCheck)
style |= LVS_EX_GRIDLINES;
else
style &= ~LVS_EX_GRIDLINES;
SendDlgItemMessage(HOST_LIST, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, style);
static char *headerStr[MAX_SENDWIDTH];
if (headerStr[SW_NICKNAME] == NULL) {
headerStr[SW_NICKNAME] = USER_MSGSTR;
headerStr[SW_PRIORITY] = PRIORITY_MSGSTR;
headerStr[SW_ABSENCE] = ABSENCE_MSGSTR;
headerStr[SW_GROUP] = GROUP_MSGSTR;
headerStr[SW_HOST] = HOST_MSGSTR;
headerStr[SW_USER] = LOGON_MSGSTR;
headerStr[SW_IPADDR] = IPADDR_MSGSTR;
}
LV_COLUMN lvC;
memset(&lvC, 0, sizeof(lvC));
lvC.fmt = LVCFMT_LEFT;
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (cnt = 0; cnt < maxItems; cnt++) {
lvC.pszText = headerStr[items[cnt]];
lvC.cx = cfg->SendWidth[items[cnt]];
SendDlgItemMessage(HOST_LIST, LVM_INSERTCOLUMN, lvC.iSubItem=cnt, (LPARAM)&lvC);
}
SendDlgItemMessage(HOST_LIST, LVM_SETCOLUMNORDERARRAY, maxItems, (LPARAM)order);
}
/*
WM_COMMAND CallBack
*/
BOOL TSendDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
switch (wID)
{
case IDOK:
if (IsSending())
return TRUE;
if (findDlg && findDlg->hWnd)
return findDlg->SetForegroundWindow();
if (cfg->AbsenceCheck && cfg->Debug < 2)
{
if (MessageBox(ABSENCEQUERY_MSGSTR, MSG_STR, MB_OKCANCEL) != IDOK)
return TRUE;
::SendMessage(GetMainWnd(), WM_COMMAND, MENU_ABSENCE, 0);
}
SendMsg();
if (shareInfo && shareInfo->fileCnt == 0)
shareMng->DestroyShare(shareInfo), shareInfo = NULL;
return TRUE;
case IDCANCEL:
if (findDlg && findDlg->hWnd)
return findDlg->Destroy(), TRUE;
if ((GetAsyncKeyState(VK_ESCAPE) & 0x8000) == 0)
{
if (shareInfo)
shareMng->DestroyShare(shareInfo), shareInfo = NULL;
::PostMessage(GetMainWnd(), WM_SENDDLG_EXIT, 0, (LPARAM)this);
return TRUE;
}
break;
case REFRESH_BUTTON:
::PostMessage(GetMainWnd(), WM_REFRESH_HOST, (GetAsyncKeyState(VK_CONTROL) & 0x8000) ? TRUE : FALSE, 0);
return TRUE;
case SECRET_CHECK:
if (::IsDlgButtonChecked(hWnd, SECRET_CHECK) != 0)
::EnableWindow(GetDlgItem(PASSWORD_CHECK), TRUE);
else {
SendDlgItemMessage(PASSWORD_CHECK, BM_SETCHECK, 0, 0);
::EnableWindow(GetDlgItem(PASSWORD_CHECK), FALSE);
}
break;
case MENU_FILEADD:
{
char buf[MAX_PATH] = "";
if (TShareDlg::FileAddDlg(this, shareMng, shareInfo ? shareInfo : (shareInfo = shareMng->CreateShare(packetNo)), cfg))
{
SetFileButton(this, FILE_BUTTON, shareInfo);
EvSize(SIZE_RESTORED, 0, 0);
}
}
break;
case MENU_FOLDERADD:
{
for (int cnt=0; cnt < 5; cnt++)
{
if (*cfg->lastOpenDir && GetFileAttributes(cfg->lastOpenDir) == 0xffffffff)
if (PathToDir(cfg->lastOpenDir, cfg->lastOpenDir) == FALSE)
break;
}
if (BrowseDirDlg(this, FOLDERATTACH_MSGSTR, cfg->lastOpenDir, cfg->lastOpenDir))
{
shareMng->AddFileShare(shareInfo ? shareInfo : (shareInfo = shareMng->CreateShare(packetNo)), cfg->lastOpenDir);
SetFileButton(this, FILE_BUTTON, shareInfo);
EvSize(SIZE_RESTORED, 0, 0);
}
}
break;
case FILE_BUTTON:
TShareDlg(shareMng, shareInfo ? shareInfo : (shareInfo = shareMng->CreateShare(packetNo)), cfg, this).Exec();
SetFileButton(this, FILE_BUTTON, shareInfo);
EvSize(SIZE_RESTORED, 0, 0);
break;
case MISC_ACCEL:
case HIDE_ACCEL:
::PostMessage(GetMainWnd(), WM_COMMAND, wID, 0);
return TRUE;
case ALLSELECT_ACCEL:
SendDlgItemMessage(SEND_EDIT, EM_SETSEL, 0, (LPARAM)-1);
return TRUE;
case MENU_FINDDLG:
if (findDlg == NULL)
findDlg = new TFindDlg(cfg, this);
if (findDlg->hWnd == NULL)
findDlg->Create();
return TRUE;
case SEPARATE_STATIC:
return TRUE;
case MENU_SAVEPOS:
if ((cfg->SendSavePos = !cfg->SendSavePos) != 0)
{
GetWindowRect(&rect);
cfg->SendXpos = rect.left;
cfg->SendYpos = rect.top;
}
cfg->WriteRegistry(CFG_WINSIZE);
return TRUE;
case MENU_SAVESIZE:
GetWindowRect(&rect);
cfg->SendXdiff = (rect.right - rect.left) - (orgRect.right - orgRect.left);
cfg->SendYdiff = (rect.bottom - rect.top) - (orgRect.bottom - orgRect.top);
cfg->SendMidYdiff = currentMidYdiff;
cfg->WriteRegistry(CFG_WINSIZE);
return TRUE;
case MENU_SAVECOLUMN:
{
GetOrder();
for (int cnt=0; cnt < maxItems; cnt++)
cfg->SendWidth[items[cnt]] = SendDlgItemMessage(HOST_LIST, LVM_GETCOLUMNWIDTH, cnt, 0);
cfg->WriteRegistry(CFG_WINSIZE);
}
return TRUE;
case MENU_EDITFONT: case MENU_LISTFONT:
{
CHOOSEFONT cf;
LOGFONT tmpFont, *targetFont;
targetFont = wID == MENU_EDITFONT ? &cfg->SendEditFont : &cfg->SendListFont;
memset(&cf, 0, sizeof(cf));
cf.lStructSize = sizeof(cf);
cf.hwndOwner = hWnd;
cf.lpLogFont = &(tmpFont = *targetFont);
cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_SHOWHELP;
cf.nFontType = SCREEN_FONTTYPE;
if (::ChooseFont(&cf))
{
*targetFont = tmpFont;
SetFont();
::InvalidateRgn(hWnd, NULL, TRUE);
cfg->WriteRegistry(CFG_FONT);
}
}
return TRUE;
case MENU_DEFAULTFONT:
cfg->SendEditFont = cfg->SendListFont = orgFont;
#ifdef JAPANESE
strcpy(cfg->SendListFont.lfFaceName, PROPORTIONAL_FONT);
#endif
SetFont();
::InvalidateRgn(hWnd, NULL, TRUE);
cfg->WriteRegistry(CFG_FONT);
return TRUE;
case MENU_NORMALSIZE:
GetWindowRect(&rect);
currentMidYdiff = 0;
MoveWindow(rect.left, rect.top, orgRect.right - orgRect.left, orgRect.bottom - orgRect.top, TRUE);
return TRUE;
case MENU_MEMBERDISP:
if (TSortDlg(cfg, this).Exec()) {
GetOrder();
cfg->WriteRegistry(CFG_WINSIZE);
DelAllHost();
InitializeHeader();
for (int cnt=0; cnt < hosts->HostCnt(); cnt++)
AddHost(hosts->GetHost(cnt));
}
return TRUE;
default:
if (wID >= MENU_PRIORITY_RESET && wID < MENU_GROUP_START)
{
if (wID == MENU_PRIORITY_RESET)
{
if (MessageBox(DEFAULTSET_MSGSTR, MSG_STR, MB_OKCANCEL) != IDOK)
return TRUE;
while (cfg->priorityHosts.HostCnt() > 0)
{
Host *host = cfg->priorityHosts.GetHost(0);
cfg->priorityHosts.DelHost(host);
if (host->RefCnt() == 0)
delete host;
}
for (int cnt=0; cnt < hosts->HostCnt(); cnt++)
hosts->GetHost(cnt)->priority = DEFAULT_PRIORITY;
}
else if (wID == MENU_PRIORITY_HIDDEN)
{
hiddenDisp = !hiddenDisp;
}
else if (wID >= MENU_PRIORITY_START && wID < MENU_GROUP_START)
{
int priority = wID - MENU_PRIORITY_START;
for (int cnt=0; cnt < memberCnt; cnt++)
{
if (hostArray[cnt]->priority == priority || (SendDlgItemMessage(HOST_LIST, LVM_GETITEMSTATE, cnt, LVIS_SELECTED) & LVIS_SELECTED) == 0)
continue;
if (hostArray[cnt]->priority == DEFAULT_PRIORITY)
cfg->priorityHosts.AddHost(hostArray[cnt]);
else if (priority == DEFAULT_PRIORITY)
cfg->priorityHosts.DelHost(hostArray[cnt]);
hostArray[cnt]->priority = priority;
}
}
DelAllHost();
for (int cnt=0; cnt < hosts->HostCnt(); cnt++)
AddHost(hosts->GetHost(cnt));
if (wID != MENU_PRIORITY_HIDDEN)
cfg->WriteRegistry(CFG_HOSTINFO|CFG_DELHOST|CFG_DELCHLDHOST);
}
else if (wID >= MENU_GROUP_START && wID < MENU_GROUP_START + (UINT)memberCnt)
{
BOOL ctl_on = (GetAsyncKeyState(VK_CONTROL) & 0x8000) ? TRUE : FALSE;
BOOL ensure = FALSE;
LV_ITEM lvi;
memset(&lvi, 0, sizeof(lvi));
lvi.mask = LVIF_STATE;
for (lvi.iItem=0; lvi.iItem < memberCnt; lvi.iItem++)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -