From 6b3ded37e4a4825be2df3612bdcbb7dfc00a1800 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 4 Mar 2014 20:41:13 +0000 Subject: HistoryStats sources git-svn-id: http://svn.miranda-ng.org/main/trunk@8397 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- .../HistoryStats/dlgoption_subexclude.cpp | 349 +++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 plugins/!NotAdopted/HistoryStats/dlgoption_subexclude.cpp (limited to 'plugins/!NotAdopted/HistoryStats/dlgoption_subexclude.cpp') diff --git a/plugins/!NotAdopted/HistoryStats/dlgoption_subexclude.cpp b/plugins/!NotAdopted/HistoryStats/dlgoption_subexclude.cpp new file mode 100644 index 0000000000..ee9c0a59de --- /dev/null +++ b/plugins/!NotAdopted/HistoryStats/dlgoption_subexclude.cpp @@ -0,0 +1,349 @@ +#include "_globals.h" +#include "dlgoption.h" + +#include "iconlib.h" +#include "main.h" + +/* + * DlgOption::SubExclude + */ + +DlgOption::SubExclude::SubExclude() + : m_hItemAll(NULL), m_bChanged(false) +{ +} + +DlgOption::SubExclude::~SubExclude() +{ + // unlock exlucde contacts + g_bExcludeLock = false; +} + +BOOL DlgOption::SubExclude::handleMsg(UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_WINDOWPOSCHANGED: + { + RECT rClient, rWnd; + + GetClientRect(getHWnd(), &rClient); + + // clist + rWnd = utils::getWindowRect(getHWnd(), IDC_CONTACTS); + rWnd.right = rClient.right; + rWnd.bottom = rClient.bottom; + utils::moveWindow(getHWnd(), IDC_CONTACTS, rWnd); + } + break; + + case WM_NOTIFY: + { + NMHDR* p = reinterpret_cast(lParam); + + if (p->idFrom != IDC_CONTACTS) + { + break; + } + + HWND hCList = GetDlgItem(getHWnd(), IDC_CONTACTS); + + switch (p->code) + { + case CLN_NEWCONTACT: + case CLN_LISTREBUILT: + updateAllContacts(hCList); + updateAllGroups(hCList, reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_ROOT, 0)), m_hItemAll); + break; + + case CLN_CONTACTMOVED: + updateAllGroups(hCList, reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_ROOT, 0)), m_hItemAll); + break; + + case CLN_OPTIONSCHANGED: + customizeList(hCList); + break; + + case NM_CLICK: + { + NMCLISTCONTROL* pNM = reinterpret_cast(p); + + if (pNM->iColumn == -1) + { + break; + } + + DWORD dwHitFlags = 0; + HANDLE hItem = reinterpret_cast(SendMessage(hCList, CLM_HITTEST, reinterpret_cast(&dwHitFlags), MAKELPARAM(pNM->pt.x, pNM->pt.y))); + + if (!hItem || !(dwHitFlags & CLCHT_ONITEMEXTRA)) + { + break; + } + + int iImage = SendMessage(hCList, CLM_GETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(pNM->iColumn, 0)); + + if (iImage != 0xFF) + { + iImage = (iImage == 0) ? 1 : 0; + + int itemType = SendMessage(hCList, CLM_GETITEMTYPE, reinterpret_cast(hItem), 0); + + if (itemType == CLCIT_CONTACT) + { + setAll(hCList, hItem, iImage, false); + } + else if (itemType == CLCIT_INFO) + { + setAll(hCList, hItem, iImage, true); + } + else if (itemType == CLCIT_GROUP) + { + if (hItem = reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_CHILD, reinterpret_cast(hItem)))) + { + setAll(hCList, hItem, iImage, true); + } + } + + // update groups + updateAllGroups(hCList, reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_ROOT, 0)), m_hItemAll); + + // mark as dirty + m_bChanged = true; + getParent()->settingsChanged(); + } + } + break; + } + } + break; + + case WM_DESTROY: + IconLib::unregisterCallback(staticRecreateIcons, reinterpret_cast(this)); + ImageList_Destroy(reinterpret_cast(SendDlgItemMessage(getHWnd(), IDC_CONTACTS, CLM_GETEXTRAIMAGELIST, 0, 0))); + break; + } + + return FALSE; +} + +void DlgOption::SubExclude::onWMInitDialog() +{ + mu::langpack::translateDialog(getHWnd()); + + // init clist + HWND hCList = GetDlgItem(getHWnd(), IDC_CONTACTS); + HIMAGELIST hIml = ImageList_Create(OS::smIconCX(), OS::smIconCY(), OS::imageListColor() | ILC_MASK, 2, 0); + SendMessage(hCList, CLM_SETEXTRAIMAGELIST, 0, reinterpret_cast(hIml)); + + staticRecreateIcons(reinterpret_cast(this)); + IconLib::registerCallback(staticRecreateIcons, reinterpret_cast(this)); + + customizeList(hCList); + SendMessage(hCList, CLM_SETEXTRACOLUMNS, 1, 0); + + CLCINFOITEM cii = { 0 }; + + cii.cbSize = sizeof(cii); + cii.flags = CLCIIF_GROUPFONT; + cii.pszText = i18n(muT("** All contacts **")); + m_hItemAll = reinterpret_cast(SendMessage(hCList, CLM_ADDINFOITEM, 0, reinterpret_cast(&cii))); + + // lock exlucde contacts + g_bExcludeLock = true; +} + +void DlgOption::SubExclude::staticRecreateIcons(LPARAM lParam) +{ + SubExclude* pDlg = reinterpret_cast(lParam); + HIMAGELIST hIml = reinterpret_cast(SendDlgItemMessage(pDlg->getHWnd(), IDC_CONTACTS, CLM_GETEXTRAIMAGELIST, 0, 0)); + + static IconLib::IconIndex ExtraIcons[] = { + IconLib::iiExcludeNo, + IconLib::iiExcludeYes, + }; + + ImageList_RemoveAll(hIml); + + array_each_(i, ExtraIcons) + { + ImageList_AddIcon(hIml, IconLib::getIcon(ExtraIcons[i])); + } +} + +void DlgOption::SubExclude::loadSettings() +{ + HWND hCList = GetDlgItem(getHWnd(), IDC_CONTACTS); + + updateAllContacts(hCList); + updateAllGroups(hCList, reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_ROOT, 0)), m_hItemAll); + + // reset dirty flag + m_bChanged = false; +} + +void DlgOption::SubExclude::saveSettings() +{ + if (m_bChanged) + { + // update db + HWND hCList = GetDlgItem(getHWnd(), IDC_CONTACTS); + MirandaSettings db; + + db.setModule(con::ModHistoryStats); + + HANDLE hContact = mu::db_contact::findFirst(); + + while (hContact) + { + HANDLE hItem = reinterpret_cast(SendMessage(hCList, CLM_FINDCONTACT, reinterpret_cast(hContact), 0)); + + if (hItem) + { + db.setContact(hContact); + + int iImage = SendMessage(hCList, CLM_GETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, 0)); + bool bExcludeOld = db.settingExists(con::SettExclude); + + if (bExcludeOld && iImage == 0) + { + db.delSetting(con::SettExclude); + } + else if (!bExcludeOld && iImage == 1) + { + db.writeBool(con::SettExclude, true); + } + } + + hContact = mu::db_contact::findNext(hContact); + } + + // reset dirty flag + m_bChanged = false; + } +} + +void DlgOption::SubExclude::customizeList(HWND hCList) +{ + SendMessage(hCList, CLM_SETBKBITMAP, 0, NULL); + SendMessage(hCList, CLM_SETBKCOLOR, GetSysColor(COLOR_WINDOW), 0); + SendMessage(hCList, CLM_SETGREYOUTFLAGS, 0, 0); + SendMessage(hCList, CLM_SETLEFTMARGIN, 2, 0); + SendMessage(hCList, CLM_SETINDENT, 10, 0); + + for(int i = 0; i <= FONTID_MAX; ++i) + { + SendMessage(hCList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT)); + } + + SetWindowLong(hCList, GWL_STYLE, GetWindowLong(hCList, GWL_STYLE) | CLS_SHOWHIDDEN); +} + +void DlgOption::SubExclude::updateAllGroups(HWND hCList, HANDLE hFirstItem, HANDLE hParentItem) +{ + bool bIconOn = true; + bool bHasChilds = false; + + int typeOfFirst = SendMessage(hCList, CLM_GETITEMTYPE, reinterpret_cast(hFirstItem), 0); + + // groups + HANDLE hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, reinterpret_cast(hFirstItem))); + + // MEMO: no short-circuit, otherwise subgroups won't be updated + while (hItem /* && (bIconOn || !bHasChilds) */) + { + HANDLE hChildItem = reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_CHILD, reinterpret_cast(hItem))); + + if (hChildItem) + { + updateAllGroups(hCList, hChildItem, hItem); + } + + int iImage = SendMessage(hCList, CLM_GETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, 0)); + + bIconOn = bIconOn && (iImage != 0); + bHasChilds = bHasChilds || (iImage != 0xFF); + + hItem = reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, reinterpret_cast(hItem))); + } + + // contacts + hItem = (typeOfFirst == CLCIT_CONTACT) ? hFirstItem : reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, reinterpret_cast(hFirstItem))); + + while (hItem && (bIconOn || !bHasChilds)) + { + int iImage = SendMessage(hCList, CLM_GETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, 0)); + + bIconOn = bIconOn && (iImage != 0); + bHasChilds = bHasChilds || (iImage != 0xFF); + + hItem = reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, reinterpret_cast(hItem))); + } + + //set icon + SendMessage(hCList, CLM_SETEXTRAIMAGE, reinterpret_cast(hParentItem), MAKELPARAM(0, bHasChilds ? (bIconOn ? 1 : 0) : 0xFF)); +} + +void DlgOption::SubExclude::updateAllContacts(HWND hCList) +{ + MirandaSettings db; + + db.setModule(con::ModHistoryStats); + + HANDLE hContact = mu::db_contact::findFirst(); + + while (hContact) + { + HANDLE hItem = reinterpret_cast(SendMessage(hCList, CLM_FINDCONTACT, reinterpret_cast(hContact), 0)); + + if (hItem) + { + db.setContact(hContact); + + if (SendMessage(hCList, CLM_GETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, 0)) == 0xFF) + { + SendMessage(hCList, CLM_SETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, db.settingExists(con::SettExclude) ? 1 : 0)); + } + } + + hContact = mu::db_contact::findNext(hContact); + } +} + +void DlgOption::SubExclude::setAll(HWND hCList, HANDLE hFirstItem, int iImage, bool bIterate) +{ + int typeOfFirst = SendMessage(hCList, CLM_GETITEMTYPE, reinterpret_cast(hFirstItem), 0); + + if (bIterate) + { + // check groups + HANDLE hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, reinterpret_cast(hFirstItem))); + + while (hItem) + { + HANDLE hChildItem = reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_CHILD, reinterpret_cast(hItem))); + + if (hChildItem) + { + setAll(hCList, hChildItem, iImage, true); + } + + hItem = reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, reinterpret_cast(hItem))); + } + } + + // check contacts + HANDLE hItem = (typeOfFirst == CLCIT_CONTACT) ? hFirstItem : reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, reinterpret_cast(hFirstItem))); + + while (hItem) + { + int iOldIcon = SendMessage(hCList, CLM_GETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, 0)); + + if (iOldIcon != 0xFF && iOldIcon != iImage) + { + SendMessage(hCList, CLM_SETEXTRAIMAGE, reinterpret_cast(hItem), MAKELPARAM(0, iImage)); + } + + hItem = bIterate ? reinterpret_cast(SendMessage(hCList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, reinterpret_cast(hItem))) : NULL; + } +} -- cgit v1.2.3