📄 wince_buddies.cpp
字号:
/*
This file is part of SWAIN (http://sourceforge.net/projects/swain).
Copyright (C) 2006 Daniel Lindstr鰉 and Daniel Nilsson
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "stdafx.h"
#include "wince_client.h"
#include "wince_buddies.h"
#include "../common/BuddyList.h"
#include "../common/BuddyListUI.h"
#include "../common/PacketConnect.h"
#include <commctrl.h>
#define BUDDY_FILE "buddies.txt"
#define SHMenuBar_GetMenu(hWndMB,idMenu) (HMENU)SendMessage((hWndMB), SHCMBM_GETSUBMENU, (WPARAM)0, (LPARAM)idMenu)
class WinCEBuddyListUI : public BuddyListUI {
private:
HWND hUserList;
HWND hGroupList;
int userCount;
int groupCount;
void initUserList(void);
void initGroupList(void);
public:
WinCEBuddyListUI(HWND hUL, HWND hGL);
virtual ~WinCEBuddyListUI(void);
virtual void clearUsers(void);
virtual void clearGroups(void);
virtual void addUser(int uid, WCHAR *name, int status);
virtual void changeUser(int uid, WCHAR *name, int status);
virtual void addGroup(int gid, WCHAR *name, int status, bool selected);
virtual void changeGroup(int gid, WCHAR *name, int status, bool selected);
int userListProc(HWND hDlg, LPNMHDR pnmh);
int groupListProc(HWND hDlg, LPNMHDR pnmh);
int getSelectedUser(void);
};
static BuddyList *buddyList;
static WinCEBuddyListUI *buddyListUI;
static HWND hBuddyMenuBar;
static int selected_uid = -1;
static void UpdateShowMenu(bool groups, bool fav);
static void UpdateShowMenuStatus(int idm);
WinCEBuddyListUI::WinCEBuddyListUI(HWND hUL, HWND hGL) {
hUserList = hUL;
hGroupList = hGL;
userCount = 0;
groupCount = 0;
initUserList();
initGroupList();
}
WinCEBuddyListUI::~WinCEBuddyListUI(void) {
}
void WinCEBuddyListUI::clearUsers(void) {
ListView_DeleteAllItems(hUserList);
}
void WinCEBuddyListUI::clearGroups(void) {
ListView_DeleteAllItems(hGroupList);
}
void WinCEBuddyListUI::addUser(int uid, WCHAR *name, int status) {
LVITEM lvI;
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.state = 0;
lvI.stateMask = 0;
lvI.iItem = userCount;
lvI.lParam = uid;
lvI.iSubItem = 0;
lvI.pszText = name;
lvI.cchTextMax = wcslen(name);
lvI.iImage = status;
if (ListView_InsertItem(hUserList, &lvI) == -1) {
printf("InsertItem failed!\n");
return;
}
userCount++;
}
void WinCEBuddyListUI::changeUser(int uid, WCHAR *name, int status) {
LVFINDINFO lvfi;
LVITEM lvI;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = uid;
int i = ListView_FindItem(hUserList, -1, &lvfi);
if (i == -1) {
printf("changeUser: Can't find user %d\n", uid);
return;
}
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.state = 0;
lvI.stateMask = 0;
lvI.iItem = i;
lvI.lParam = uid;
lvI.iSubItem = 0;
lvI.pszText = name;
lvI.cchTextMax = wcslen(name);
lvI.iImage = status;
if (!ListView_SetItem(hUserList, &lvI)) {
printf("changeUser: Can't set user info!\n");
return;
}
}
void WinCEBuddyListUI::addGroup(int gid, WCHAR *name, int status, bool selected) {
LVITEM lvI;
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.state = selected ? LVIS_SELECTED : 0;
lvI.stateMask = LVIS_SELECTED;
lvI.iItem = groupCount;
lvI.lParam = gid;
lvI.iSubItem = 0;
lvI.pszText = name;
lvI.cchTextMax = wcslen(name);
lvI.iImage = status;
if (ListView_InsertItem(hGroupList, &lvI) == -1) {
printf("InsertItem failed!\n");
return;
}
groupCount++;
}
int WinCEBuddyListUI::getSelectedUser(void){
LVITEM lvI;
int iSelect=SendMessage(hUserList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
if(iSelect == -1)
return(-1);
lvI.mask = LVIF_PARAM;
lvI.iItem = iSelect;
lvI.iSubItem = 0;
ListView_GetItem(hUserList, &lvI);
return(lvI.lParam);
}
void WinCEBuddyListUI::changeGroup(int gid, WCHAR *name, int status, bool selected) {
LVFINDINFO lvfi;
LVITEM lvI;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = gid;
int i = ListView_FindItem(hGroupList, -1, &lvfi);
if (i == -1) {
printf("changeGroup: Can't find group %d\n", gid);
return;
}
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.state = selected ? LVIS_SELECTED : 0;
lvI.stateMask = LVIS_SELECTED;
lvI.iItem = i;
lvI.lParam = gid;
lvI.iSubItem = 0;
lvI.pszText = name;
lvI.cchTextMax = wcslen(name);
lvI.iImage = status;
if (!ListView_SetItem(hGroupList, &lvI)) {
printf("changeGroup: Can't set group info!\n");
return;
}
}
static void UpdateShowMenu(bool groups, bool fav) {
HMENU hmnu = SHMenuBar_GetMenu(hBuddyMenuBar, IDM_BUDDIES_SHOW);
if (groups) {
CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_ALLGROUPS, MF_BYCOMMAND | fav ? MF_UNCHECKED : MF_CHECKED);
CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_FAVGROUPS, MF_BYCOMMAND | fav ? MF_CHECKED : MF_UNCHECKED);
} else {
CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_ALLUSERS, MF_BYCOMMAND | fav ? MF_UNCHECKED : MF_CHECKED);
CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_FAVUSERS, MF_BYCOMMAND | fav ? MF_CHECKED : MF_UNCHECKED);
}
}
static void UpdateShowMenuStatus(int idm) {
static int oldidm = IDM_BUDDIES_SHOW_AWAY;
HMENU hmnu = SHMenuBar_GetMenu(hBuddyMenuBar, IDM_BUDDIES_SHOW);
if (oldidm != -1) {
CheckMenuItem(hmnu, oldidm, MF_BYCOMMAND | MF_UNCHECKED);
}
CheckMenuItem(hmnu, idm, MF_BYCOMMAND | MF_CHECKED);
oldidm = idm;
}
// Message handler for buddies dialog.
INT_PTR CALLBACK Buddies(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int ret;
switch (message)
{
case WM_INITDIALOG:
{
// Create a Done button and size it.
SHINITDLGINFO shidi;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hDlg;
mbi.nToolBarId = IDR_BUDDIES_MENU;
mbi.hInstRes = g_hInst;
if (!SHCreateMenuBar(&mbi))
{
hBuddyMenuBar = NULL;
}
else
{
hBuddyMenuBar = mbi.hwndMB;
}
buddyListUI = new WinCEBuddyListUI(GetDlgItem(hDlg, IDC_USERLIST), GetDlgItem(hDlg, IDC_GROUPLIST));
buddyList->setUI(buddyListUI);
buddyList->refresh(true, true, true);
UpdateShowMenu(false, buddyList->getOnlyFavUsers());
UpdateShowMenu(true, buddyList->getOnlyFavGroups());
switch (buddyList->getLowestStatus()) {
case STATUS_ONLINE: UpdateShowMenuStatus(IDM_BUDDIES_SHOW_ONLINE); break;
case STATUS_AWAY: UpdateShowMenuStatus(IDM_BUDDIES_SHOW_AWAY); break;
case STATUS_OFFLINE:UpdateShowMenuStatus(IDM_BUDDIES_SHOW_OFFLINE); break;
}
}
return (INT_PTR)TRUE;
case WM_NOTIFY:
switch (wParam) {
case IDC_USERLIST:
ret = buddyListUI->userListProc(hDlg, (LPNMHDR) lParam);
SetWindowLong(hDlg, DWL_MSGRESULT, ret);
return TRUE;
case IDC_GROUPLIST:
ret = buddyListUI->groupListProc(hDlg, (LPNMHDR) lParam);
SetWindowLong(hDlg, DWL_MSGRESULT, ret);
return TRUE;
case 0: // Igore control 0 or output may be spammed by the printf below!
break;
default:
printf("WM_NOTIFY: Unknown control %d\n", wParam);
break;
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
selected_uid = buddyListUI->getSelectedUser();
if(selected_uid == -1){
MessageBox(hDlg, (TEXT("Select a user.")), (TEXT("Error")), MB_OK);
break;
}
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
case IDCANCEL:
selected_uid = -1;
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
case IDM_BUDDIES_MENU_REFRESH:
buddyList->refresh(true, true, true);
break;
case IDM_BUDDIES_SHOW_ALLGROUPS:
buddyList->showOnlyFavGroups(false);
buddyList->refresh(false, true, false);
UpdateShowMenu(true, false);
break;
case IDM_BUDDIES_SHOW_FAVGROUPS:
buddyList->showOnlyFavGroups(true);
buddyList->refresh(false, true, false);
UpdateShowMenu(true, true);
break;
case IDM_BUDDIES_SHOW_ALLUSERS:
buddyList->showOnlyFavUsers(false);
buddyList->refresh(true, false, false);
UpdateShowMenu(false, false);
break;
case IDM_BUDDIES_SHOW_FAVUSERS:
buddyList->showOnlyFavUsers(true);
buddyList->refresh(true, false, false);
UpdateShowMenu(false, true);
break;
case IDM_BUDDIES_SHOW_ONLINE:
buddyList->setLowestStatus(STATUS_ONLINE);
buddyList->refresh(true, false, true);
UpdateShowMenuStatus(IDM_BUDDIES_SHOW_ONLINE);
break;
case IDM_BUDDIES_SHOW_AWAY:
buddyList->setLowestStatus(STATUS_AWAY);
buddyList->refresh(true, false, true);
UpdateShowMenuStatus(IDM_BUDDIES_SHOW_AWAY);
break;
case IDM_BUDDIES_SHOW_OFFLINE:
buddyList->setLowestStatus(STATUS_OFFLINE);
buddyList->refresh(true, false, true);
UpdateShowMenuStatus(IDM_BUDDIES_SHOW_OFFLINE);
break;
}
break;
case WM_CLOSE:
EndDialog(hDlg, message);
return TRUE;
case WM_DESTROY:
delete buddyListUI;
return TRUE;
#ifdef _DEVICE_RESOLUTION_AWARE
case WM_SIZE:
{
DRA::RelayoutDialog(
g_hInst,
hDlg,
DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_BUDDIES_WIDE) : MAKEINTRESOURCE(IDD_BUDDIES));
}
break;
#endif
}
return (INT_PTR)FALSE;
}
int WinCEBuddyListUI::userListProc(HWND hDlg, LPNMHDR pnmh) {
NMRGINFO *pnmrgi;
int i;
LVITEM lvI;
LVHITTESTINFO htinfo;
HMENU hmnu;
switch (pnmh->code) {
case GN_CONTEXTMENU:
pnmrgi = (NMRGINFO *)pnmh;
htinfo.pt = pnmrgi->ptAction;
ScreenToClient(pnmh->hwndFrom, &(htinfo.pt));
ListView_HitTest(pnmh->hwndFrom, &htinfo);
if (!(htinfo.flags & LVHT_ONITEM) || htinfo.iItem < 0) {
break;
}
lvI.mask = LVIF_PARAM;
lvI.iItem = htinfo.iItem;
lvI.iSubItem = 0;
ListView_GetItem(pnmh->hwndFrom, &lvI);
hmnu = CreatePopupMenu();
if (!buddyList->isFavUser(lvI.lParam)) {
AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_ADD, L"Add to favorites");
} else {
AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_REMOVE, L"Remove from favorites");
}
i = TrackPopupMenu(hmnu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pnmrgi->ptAction.x, pnmrgi->ptAction.y, 0, hDlg, NULL);
switch (i) {
case IDM_BUDDIES_FAV_ADD:
buddyList->addFavUser(lvI.lParam);
break;
case IDM_BUDDIES_FAV_REMOVE:
buddyList->removeFavUser(lvI.lParam);
break;
}
DestroyMenu(hmnu);
return TRUE;
case NM_DBLCLK:
PostMessage(hDlg, WM_COMMAND, IDOK, 0);
break;
}
return FALSE;
}
int WinCEBuddyListUI::groupListProc(HWND hDlg, LPNMHDR pnmh) {
NMLISTVIEW *pnmlv;
NMRGINFO *pnmrgi;
unsigned int state, mask;
int i;
LVITEM lvI;
LVHITTESTINFO htinfo;
HMENU hmnu;
switch (pnmh->code) {
case LVN_ITEMCHANGING:
pnmlv = (NMLISTVIEW *)pnmh;
if (pnmlv->uChanged & LVIF_STATE) {
bool selected = buddyList->isSelectedGroup(pnmlv->lParam);
if (((pnmlv->uOldState & LVIS_SELECTED) && selected) ||
((pnmlv->uNewState & LVIS_SELECTED) && !selected)) {
mask = pnmlv->uOldState ^ pnmlv->uNewState; // old XOR new = the flags that changed
mask &= ~LVIS_SELECTED; // Mask out selected flag
if (mask) {
// Some other flags also changed so we need to change those
// because we are going to veto this change.
ListView_SetItemState(pnmh->hwndFrom, pnmlv->iItem, pnmlv->uNewState & ~LVIS_SELECTED, mask);
}
return TRUE;
}
}
break;
case GN_CONTEXTMENU:
pnmrgi = (NMRGINFO *)pnmh;
htinfo.pt = pnmrgi->ptAction;
ScreenToClient(pnmh->hwndFrom, &(htinfo.pt));
ListView_HitTest(pnmh->hwndFrom, &htinfo);
if (!(htinfo.flags & LVHT_ONITEM) || htinfo.iItem < 0) {
break;
}
lvI.mask = LVIF_PARAM;
lvI.iItem = htinfo.iItem;
lvI.iSubItem = 0;
ListView_GetItem(pnmh->hwndFrom, &lvI);
hmnu = CreatePopupMenu();
if (!buddyList->isFavGroup(lvI.lParam)) {
AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_ADD, L"Add to favorites");
} else {
AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_REMOVE, L"Remove from favorites");
}
i = TrackPopupMenu(hmnu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pnmrgi->ptAction.x, pnmrgi->ptAction.y, 0, hDlg, NULL);
switch (i) {
case IDM_BUDDIES_FAV_ADD:
buddyList->addFavGroup(lvI.lParam);
break;
case IDM_BUDDIES_FAV_REMOVE:
buddyList->removeFavGroup(lvI.lParam);
break;
}
DestroyMenu(hmnu);
return TRUE;
case NM_CLICK:
pnmlv = (NMLISTVIEW *)pnmh;
if (pnmlv->iItem < 0) {
printf("Item is < 0: %d\n", pnmlv->iItem);
break;
}
state = ListView_GetItemState(pnmh->hwndFrom, pnmlv->iItem, LVIS_SELECTED);
lvI.mask = LVIF_PARAM;
lvI.iItem = pnmlv->iItem;
lvI.iSubItem = pnmlv->iSubItem;
if (!ListView_GetItem(pnmh->hwndFrom, &lvI)) {
printf("GetItem failed!");
break;
}
if (lvI.lParam < 0) {
printf("bl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -