⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgtreeview.cpp

📁 局域网ICQ的源代码
💻 CPP
字号:
/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   copyright            : (C) 2002 by Zhang Yong                         *
 *   email                : z-yong163@163.com                              *
 ***************************************************************************/

// MsgTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "myicq.h"
#include "MsgTreeView.h"
#include "MsgListView.h"
#include "myicqDlg.h"
#include "serversession.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void writeMsgTxt(CStdioFile &file, uint32 uin)
{
	CString tmp, nick, str;
	tmp.LoadString(IDS_MSG_OBJ);

	if (uin) {
		IcqContact *c = icqLink->findContact(uin);
		if (c)
			nick = c->nick.c_str();
		else
			nick.Format("%lu", uin);

		str.Format("%s:%lu(%s)\n", (LPCTSTR) tmp, uin, (LPCTSTR) nick);
	} else {
		str.LoadString(IDS_SYSMSG);
		str = tmp + ":" + str + '\n';
	}

	file.WriteString("--------------------------------------------------\n");
	file.WriteString(str);
	file.WriteString("--------------------------------------------------\n");

	PtrList msgList;
	IcqDB::loadMsg(uin, msgList);
	while (!msgList.empty()) {
		IcqMsg *msg = (IcqMsg *) msgList.front();
		msgList.pop_front();

		if (!uin)
			nick.Format("%lu", msg->uin);
		exportMsgTxt(file, msg, nick);
		delete msg;
	}

	file.WriteString("\n");
}

void writeContact(CStdioFile &file, IcqContact *c) {
	FILE *fp = file.m_pStream;
	CString str, tmp;
	tmp.LoadString(IDS_MSG_OBJ);
	str.Format("%s:%lu(%s)\n", (LPCTSTR) tmp, c->uin, c->nick.c_str());

	file.WriteString("--------------------------------------------------\n");
	file.WriteString(str);
	file.WriteString("--------------------------------------------------\n");

	str.LoadString(IDS_UIN);
	tmp.Format("%lu", c->uin);
	file.WriteString(str + " " + tmp + "\n\n");
	str.LoadString(IDS_NICK);
	file.WriteString(str + " " + c->nick.c_str() + "\n\n");
	str.LoadString(IDS_AGE);
	tmp.Format("%d", c->age);
	file.WriteString(str + " " + tmp + "\n\n");
	str.LoadString(IDS_GENDER);
	file.WriteString(str + " " + getApp()->genderNames[c->gender] + "\n\n");
	str.LoadString(IDS_COUNTRY);
	file.WriteString(str + " " + c->country.c_str() + "\n\n");
	str.LoadString(IDS_PROVINCE);
	file.WriteString(str + " " + c->province.c_str() + "\n\n");
	str.LoadString(IDS_CITY);
	file.WriteString(str + " " + c->city.c_str() + "\n\n");

	str.LoadString(IDS_EMAIL);
	file.WriteString(str + " " + c->email.c_str() + "\n\n");
	str.LoadString(IDS_ADDRESS);
	file.WriteString(str + " " + c->address.c_str() + "\n\n");
	str.LoadString(IDS_ZIPCODE);
	file.WriteString(str + " " + c->zipcode.c_str() + "\n\n");
	str.LoadString(IDS_TEL);
	file.WriteString(str + " " + c->tel.c_str() + "\n\n");

	str.LoadString(IDS_REALNAME);
	file.WriteString(str + " " + c->name.c_str() + "\n\n");
	str.LoadString(IDS_BLOODTYPE);
	file.WriteString(str + " " + getApp()->bloodNames[c->blood] + "\n\n");
	str.LoadString(IDS_COLLEGE);
	file.WriteString(str + " " + c->college.c_str() + "\n\n");
	str.LoadString(IDS_PROFESSION);
	file.WriteString(str + " " + c->profession.c_str() + "\n\n");
	str.LoadString(IDS_HOMEPAGE);
	file.WriteString(str + " " + c->homepage.c_str() + "\n\n");
	str.LoadString(IDS_SELFINTRO);
	file.WriteString(str + " " + c->intro.c_str() + "\n\n");

	file.WriteString("\n");
}


#define NODE_FOLDER		0xffffffff

/////////////////////////////////////////////////////////////////////////////
// CMsgTreeView

IMPLEMENT_DYNCREATE(CMsgTreeView, CTreeView)

CMsgTreeView::CMsgTreeView()
{
	listView = NULL;
}

CMsgTreeView::~CMsgTreeView()
{
}

DWORD CMsgTreeView::getUIN()
{
	HTREEITEM item = GetTreeCtrl().GetSelectedItem();
	return (item ? GetTreeCtrl().GetItemData(item) : NODE_FOLDER);
}

void CMsgTreeView::save(DBOutStream &out)
{
	out << GetTreeCtrl().GetTextColor();
	out << GetTreeCtrl().GetBkColor();
}

void CMsgTreeView::load(DBInStream &in)
{
	COLORREF color;
	in >> color;
	GetTreeCtrl().SetTextColor(color);
	in >> color;
	GetTreeCtrl().SetBkColor(color);
}

HTREEITEM CMsgTreeView::findItem(HTREEITEM item, DWORD uin)
{
	CTreeCtrl &tree = GetTreeCtrl();
	if (tree.ItemHasChildren(item)) {
		HTREEITEM child = tree.GetChildItem(item);
		while (child) {
			HTREEITEM ret = findItem(child, uin);
			if (ret)
				return ret;
			child = tree.GetNextSiblingItem(child);
		}
	} else if (tree.GetItemData(item) == uin)
		return item;

	return NULL;
}

void CMsgTreeView::expand(DWORD uin)
{
	CTreeCtrl &tree = GetTreeCtrl();
	HTREEITEM root = tree.GetRootItem();

	if (uin) {
		HTREEITEM item = findItem(root, uin);
		if (item) {
			tree.SelectItem(item);
			while ((item = tree.GetParentItem(item)) != NULL)
				tree.Expand(item, TVE_EXPAND);
		}
	} else
		tree.Expand(root, TVE_EXPAND);
}

void CMsgTreeView::delMsg(HTREEITEM item)
{
	CTreeCtrl &tree = GetTreeCtrl();
	uint32 uin = tree.GetItemData(item);
	if (uin == NODE_FOLDER) {
		HTREEITEM child = tree.GetChildItem(item);
		while (child) {
			delMsg(child);
			child = tree.GetNextSiblingItem(child);
		}
	} else {
		uin = tree.GetItemData(item);
		IcqDB::delMsg(uin);
	}
}

void CMsgTreeView::exportTxt(CStdioFile &file, HTREEITEM item)
{
	CTreeCtrl &tree = GetTreeCtrl();
	uint32 uin = tree.GetItemData(item);

	if (uin == NODE_FOLDER) {
		HTREEITEM child = tree.GetChildItem(item);
		while (child) {
			exportTxt(file, child);
			child = tree.GetNextSiblingItem(child);
		}
	} else
		writeMsgTxt(file, uin);
}

void CMsgTreeView::exportContact(CStdioFile &file, HTREEITEM item)
{
	CTreeCtrl &tree = GetTreeCtrl();
	uint32 uin = tree.GetItemData(item);

	if (uin == NODE_FOLDER) {
		HTREEITEM child = tree.GetChildItem(item);
		while (child) {
			exportContact(file, child);
			child = tree.GetNextSiblingItem(child);
		}
	} else if (uin) {
		CString nick;
		IcqContact *c = icqLink->findContact(uin);
		if (c)
			writeContact(file, c);
	}
}

void CMsgTreeView::exportBak(const char *fileName, HTREEITEM item)
{
	CTreeCtrl &tree = GetTreeCtrl();
	uint32 uin = tree.GetItemData(item);

	if (uin == NODE_FOLDER) {
		HTREEITEM child = tree.GetChildItem(item);
		while (child) {
			exportBak(fileName, child);
			child = tree.GetNextSiblingItem(child);
		}
	} else
		IcqDB::exportMsg(fileName, uin);
}

void CMsgTreeView::exportTxt(CStdioFile &file)
{
	HTREEITEM item = GetTreeCtrl().GetSelectedItem();
	if (item)
		exportTxt(file, item);
}

void CMsgTreeView::exportContact(CStdioFile &file)
{
	HTREEITEM item = GetTreeCtrl().GetSelectedItem();
	if (item)
		exportContact(file, item);
}

void CMsgTreeView::delSelectedMsg()
{
	CTreeCtrl &tree = GetTreeCtrl();
	HTREEITEM item = tree.GetSelectedItem();
	if (item) {
		delMsg(item);
		listView->clear();
	}
}

BEGIN_MESSAGE_MAP(CMsgTreeView, CTreeView)
	//{{AFX_MSG_MAP(CMsgTreeView)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_UPDATE_COMMAND_UI(ID_EDIT_DEL, OnUpdateEditDel)
	ON_UPDATE_COMMAND_UI(ID_EXPORT_CONTACT, OnUpdateExportContact)
	ON_UPDATE_COMMAND_UI(ID_EXPORT_BAK, OnUpdateExportBak)
	ON_COMMAND(ID_EXPORT_BAK, OnExportBak)
	ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
	ON_COMMAND(ID_EXPORT_BACKUP, OnExportBackup)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMsgTreeView diagnostics

#ifdef _DEBUG
void CMsgTreeView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CMsgTreeView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMsgTreeView message handlers

BOOL CMsgTreeView::PreCreateWindow(CREATESTRUCT& cs) 
{
	cs.style |= TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_HASBUTTONS | TVS_HASLINES;
	return CTreeView::PreCreateWindow(cs);
}

int CMsgTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CTreeCtrl &tree = GetTreeCtrl();
	tree.SetImageList(&getApp()->smallImageList, TVSIL_NORMAL);
	tree.SetItemHeight(24);

	IcqUser &myInfo = icqLink->myInfo;
	CString str;
	str.Format("%lu(%s)", myInfo.uin, myInfo.nick.c_str());
	HTREEITEM root = tree.InsertItem(str, getApp()->getImageIndex(myInfo.face),
		getApp()->getImageIndex(myInfo.face, STATUS_AWAY), NULL);
	tree.SetItemData(root, NODE_FOLDER);

	MyICQCtrl &outbar = ((CIcqDlg *) AfxGetMainWnd())->outbarCtrl;
	int n = outbar.getFolderCount();
	CString name;
	int image;
	HTREEITEM stranger = NULL;

	UinList msgUinList;
	IcqDB::getMsgUinList(msgUinList);

	for (int i = 0; i < n; ++i) {
		outbar.getFolderName(i, name);
		image = getApp()->iconIndex(ICON_FOLDER);
		HTREEITEM parent = tree.InsertItem(name, image, image, root);
		tree.SetItemData(parent, NODE_FOLDER);

		int nrItems = outbar.getItemCount(i);
		for (int j = 0; j < nrItems; ++j) {
			IcqContact *c = outbar.contact(i, j);
			str.Format("%lu(%s)", c->uin, c->nick.c_str());
			HTREEITEM hItem = tree.InsertItem(str, getApp()->getImageIndex(c->face),
				getApp()->getImageIndex(c->face, STATUS_AWAY), parent);
			tree.SetItemData(hItem, c->uin);

			msgUinList.remove(c->uin);
		}

		if (i == n - 2)
			stranger = parent;
	}

	// add the remaining UINs to the stranger folder
	UinList::iterator it;
	for (it = msgUinList.begin(); it != msgUinList.end(); ++it) {
		uint32 uin = *it;
		if (uin) {
			str.Format("%lu", uin);
			HTREEITEM item = tree.InsertItem(str, getApp()->getImageIndex(0),
				getApp()->getImageIndex(0, STATUS_AWAY), stranger);
			tree.SetItemData(item, uin);
		}
	}

	str.LoadString(IDS_SYSMSG);
	image = getApp()->iconIndex(ICON_SYSMSG);
	tree.InsertItem(str, image, image, root);
	
	return 0;
}

void CMsgTreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CMenu menu;
	menu.LoadMenu(IDR_MSGMGR_POPUP);
	CPoint pt;
	GetCursorPos(&pt);
	ScreenToClient(&pt);
	UINT flags;
	HTREEITEM item = GetTreeCtrl().HitTest(pt, &flags);
	GetTreeCtrl().SelectItem(item);

	GetCursorPos(&pt);
	menu.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, GetParentFrame());

	*pResult = 0;
}

void CMsgTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	HTREEITEM item = pNMTreeView->itemNew.hItem;
	uint32 uin = (item ? GetTreeCtrl().GetItemData(item) : NODE_FOLDER);
	listView->showMsg(uin);

	*pResult = 0;
}

void CMsgTreeView::OnUpdateEditDel(CCmdUI* pCmdUI) 
{
	if (GetParentFrame()->GetActiveView() == this)
		pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
}

void CMsgTreeView::OnUpdateExportContact(CCmdUI* pCmdUI) 
{
	if (GetParentFrame()->GetActiveView() == this) {
		CTreeCtrl &tree = GetTreeCtrl();
		HTREEITEM item = tree.GetSelectedItem();
		if (item) {
			uint32 uin = tree.GetItemData(item);
			pCmdUI->Enable(uin != 0);
		}
	}
}

void CMsgTreeView::OnUpdateExportBak(CCmdUI* pCmdUI) 
{
	if (GetParentFrame()->GetActiveView() == this)
		pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
}

void CMsgTreeView::OnExportBak() 
{
	CTreeCtrl &tree = GetTreeCtrl();
	HTREEITEM item = tree.GetSelectedItem();
	uint32 uin = tree.GetItemData(item);

	CString fileName;
	if (uin > 0 && uin <= 0xfffffff0)
		fileName.Format("%lu", uin);
	CString filter;
	filter.LoadString(IDS_FILTER_BAK);
	CFileDialog dlg(FALSE, "bak", fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);
	if (dlg.DoModal() == IDOK)
		exportBak(dlg.GetPathName(), item);
}

void CMsgTreeView::OnFileImport() 
{
	CString filter;
	filter.LoadString(IDS_FILTER_BAK);
	CFileDialog dlg(TRUE, "bak", NULL, OFN_HIDEREADONLY, filter);
	if (dlg.DoModal() == IDOK) {
		IcqDB::importRecord(dlg.GetPathName());

		// refresh
		CTreeCtrl &tree = GetTreeCtrl();
		HTREEITEM item = tree.GetSelectedItem();
		uint32 uin = (item ? tree.GetItemData(item) : NODE_FOLDER);
		listView->showMsg(uin);
	}
}

void CMsgTreeView::OnExportBackup() 
{
	CString filter;
	filter.LoadString(IDS_FILTER_BAK);
	CFileDialog dlg(FALSE, "bak", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);
	if (dlg.DoModal() == IDOK) {
		CString pathName = dlg.GetPathName();
		CFile::Remove(pathName);
		exportBak(pathName, GetTreeCtrl().GetRootItem());
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -