summaryrefslogtreecommitdiff
path: root/protocols/Skype/src/skype_bookmarks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Skype/src/skype_bookmarks.cpp')
-rw-r--r--protocols/Skype/src/skype_bookmarks.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/protocols/Skype/src/skype_bookmarks.cpp b/protocols/Skype/src/skype_bookmarks.cpp
new file mode 100644
index 0000000000..e95b9c7e84
--- /dev/null
+++ b/protocols/Skype/src/skype_bookmarks.cpp
@@ -0,0 +1,203 @@
+#include "skype.h"
+#include "skype_chat.h"
+
+INT_PTR CSkypeProto::SetBookmarkCommand(WPARAM wParam, LPARAM)
+{
+ HANDLE hContact = (HANDLE)wParam;
+ if (this->IsOnline() && this->IsChatRoom(hContact))
+ this->BookmarkChatRoom(hContact);
+
+ return 0;
+}
+
+static WNDPROC oldWndProc = NULL;
+
+static LRESULT CALLBACK BookmarkListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ if (msg == WM_LBUTTONDOWN)
+ {
+ LVHITTESTINFO hi;
+ hi.pt.x = LOWORD(lParam); hi.pt.y = HIWORD(lParam);
+ ListView_SubItemHitTest(hwnd, &hi);
+ if (hi.iSubItem == 1)
+ {
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_GROUPID;
+ lvi.stateMask = -1;
+ lvi.iItem = hi.iItem;
+ if (ListView_GetItem(hwnd, &lvi) && lvi.iGroupId == 1)
+ {
+ CConversation *convo = (CConversation *)lvi.lParam;
+
+ if (convo->SetBookmark(false))
+ ListView_DeleteItem(hwnd, lvi.iItem);
+ }
+ }
+ }
+
+ return ::CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam);
+}
+
+int ImageList_AddIconFromIconLib(HIMAGELIST hIml, const char *name)
+{
+ HICON icon = ::Skin_GetIconByHandle(::Skin_GetIconHandle(name));
+ int res = ImageList_AddIcon(hIml, icon);
+ ::Skin_ReleaseIcon(icon);
+ return res;
+}
+
+INT_PTR CALLBACK CSkypeProto::SkypeBookmarksProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ CSkypeProto *ppro = (CSkypeProto *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ if (lParam)
+ {
+ ppro = (CSkypeProto *)lParam;
+ ::TranslateDialogDefault(hwndDlg);
+
+ ::SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+
+ ::SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)::Skin_GetIcon("Skype_bookmark", ICON_BIG));
+ ::SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)::Skin_GetIcon("Skype_bookmark"));
+
+ HWND hwndList = ::GetDlgItem(hwndDlg, IDC_BM_LIST);
+ { // IDC_BM_LIST setup
+ oldWndProc = (WNDPROC)::SetWindowLongPtr(hwndList, GWLP_WNDPROC, (LONG_PTR)BookmarkListWndProc);
+
+ HIMAGELIST hIml = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 4, 0);
+ ImageList_AddIconFromIconLib(hIml, "Skype_bookmark");
+ ImageList_AddIconFromIconLib(hIml, "Skype_delete");
+ ListView_SetImageList(hwndList, hIml, LVSIL_SMALL);
+
+ ///
+ LVCOLUMN lvc = {0};
+ lvc.mask = LVCF_WIDTH | LVCF_TEXT;
+
+ //lvc.fmt = LVCFMT_JUSTIFYMASK;
+ lvc.pszText = TranslateT("Name");
+ lvc.cx = 220; // width of column in pixels
+ ListView_InsertColumn(hwndList, 0, &lvc);
+
+ //lvc.fmt = LVCFMT_RIGHT;
+ lvc.pszText = L"";
+ lvc.cx = 32 - GetSystemMetrics(SM_CXVSCROLL); // width of column in pixels
+ ListView_InsertColumn(hwndList, 1, &lvc);
+
+ ///
+ LVGROUP lvg;
+ lvg.cbSize = sizeof(LVGROUP);
+ lvg.mask = LVGF_HEADER | LVGF_GROUPID;
+
+ lvg.pszHeader = ::TranslateT("Conferences");
+ lvg.iGroupId = 1;
+ ListView_InsertGroup(hwndList, 0, &lvg);
+
+ /*lvg.pszHeader = ::TranslateT("Contacts");
+ lvg.iGroupId = 2;
+ ListView_InsertGroup(hwndList, 0, &lvg);*/
+
+ ListView_EnableGroupView(hwndList, TRUE);
+
+ ::SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
+
+ if ( !ppro->IsOnline())
+ ::EnableWindow(hwndList, FALSE);
+ }
+
+ SEString data;
+ ConversationRefs conversations;
+ ppro->GetConversationList(conversations, Conversation::BOOKMARKED_CONVERSATIONS);
+ for (size_t i = 0; i < conversations.size(); i++)
+ {
+ auto conversation = conversations[i];
+
+ uint type = conversation->GetUintProp(Conversation::P_TYPE);
+ if (type != Conversation::CONFERENCE)
+ continue;
+
+ conversation->GetPropDisplayname(data);
+ ptrW name = ::mir_utf8decodeW(data);
+
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_GROUPID | LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+ lvi.iItem = i;
+ lvi.iGroupId = 1;
+ lvi.iImage = 0;
+ lvi.lParam = (LPARAM)conversation.fetch();
+ lvi.pszText = name;
+ int iRow = ListView_InsertItem(hwndList, &lvi);
+
+ if (iRow != -1)
+ {
+ lvi.iItem = iRow;
+ lvi.mask = LVIF_IMAGE;
+ lvi.iSubItem = 1;
+ lvi.iImage = 1;
+ ListView_SetItem(hwndList, &lvi);
+ }
+ };
+
+ ::Utils_RestoreWindowPosition(hwndDlg, 0, MODULE, "BookmarksWindow");
+ }
+ break;
+
+ case WM_NOTIFY:
+ switch(LOWORD(wParam))
+ {
+ case IDC_BM_LIST:
+ if (((LPNMHDR)lParam)->code == NM_DBLCLK)
+ {
+ HWND hwndList = ::GetDlgItem(hwndDlg, IDC_BM_LIST);
+ int iItem = ListView_GetNextItem(hwndList, -1, LVNI_ALL | LVNI_SELECTED);
+ if (iItem < 0) break;
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_PARAM;
+ lvi.stateMask = -1;
+ lvi.iItem = iItem;
+ if (ListView_GetItem(hwndList, &lvi))
+ {
+ //ppro->FindChatRoom
+
+ CConversation *conversation = (CConversation *)lvi.lParam;
+
+ SEString data;
+ conversation->GetPropIdentity(data);
+ ptrW cid = ::mir_utf8decodeW(data);
+ CSkypeProto::ReplaceSpecialChars(cid);
+
+ ChatRoom *room = ppro->FindChatRoom(cid);
+ if (room != NULL)
+ ::CallProtoService(ppro->m_szModuleName, PS_JOINCHAT, (WPARAM)room->GetContactHandle(), 0);
+ else
+ {
+ conversation->GetPropDisplayname(data);
+ ptrW name = ::mir_utf8decodeW(data);
+
+ ChatRoom *room = new ChatRoom(cid, name, ppro);
+ room->Start(conversation->ref(), true);
+ }
+ }
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ if (HIWORD( wParam ) == BN_CLICKED)
+ {
+ switch(LOWORD(wParam))
+ {
+ case IDCANCEL:
+ ::Utils_SaveWindowPosition(hwndDlg, NULL, MODULE, "BookmarksWindow");
+ ::Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0));
+ ::Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0));
+ ::DestroyWindow(hwndDlg);
+ return TRUE;
+ }
+ }
+ break;
+ }
+ return FALSE;
+} \ No newline at end of file