From c6d2c013851f3337ab59a4413f7c7447af27142a Mon Sep 17 00:00:00 2001 From: sje Date: Mon, 13 Nov 2006 14:47:34 +0000 Subject: added always on top option (also in window system menu) added close tab miranda flat button set window icon to message icon if any tab has a new message git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@44 4f64403b-2f21-0410-a795-97e2b3489a10 --- justtabs/win.cpp | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 3 deletions(-) (limited to 'justtabs/win.cpp') diff --git a/justtabs/win.cpp b/justtabs/win.cpp index 75cb408..9ac8022 100644 --- a/justtabs/win.cpp +++ b/justtabs/win.cpp @@ -28,6 +28,8 @@ int message_icon_index = 0; #define WMU_SETTAB (WM_USER+0x300) +#define WMU_CALCWINICON (WM_USER+0x301) + HANDLE window_list = 0; typedef struct TabCtrlDataStruct @@ -130,6 +132,23 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { SubclassTabCtrl(tab_ctrl); active_window = 0; + + { + HMENU hMenu = GetSystemMenu( hwnd, FALSE ); + InsertMenu( hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, NULL ); + if (options.ontop) { + InsertMenu( hMenu, 0, MF_BYPOSITION | MF_ENABLED | MF_CHECKED | MF_STRING, IDM_TOPMOST, TranslateT("Always On Top")); + SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } else { + InsertMenu( hMenu, 0, MF_BYPOSITION | MF_ENABLED | MF_UNCHECKED | MF_STRING, IDM_TOPMOST, TranslateT("Always On Top")); + } + } + + SendDlgItemMessage(hwnd,IDC_CHAT_CLOSE, BUTTONSETASFLATBTN, 0, 0); + SendDlgItemMessage(hwnd, IDC_CHAT_CLOSE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CLOSE))); + //SendMessage(GetDlgItem(hwnd,IDC_CHAT_CLOSE), BUTTONADDTOOLTIP, (WPARAM)Translate("Close current tab"), 0); + SendMessage(hwnd, WM_SIZE, 0, 0); + return FALSE; } @@ -163,6 +182,10 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // static control is in front of the tab control. if(active_window) SetWindowPos(active_window, HWND_TOP, rc.left - 3, rc.top - 1, rc.right - rc.left + 4, rc.bottom - rc.top + 2, 0); + + GetClientRect(hwnd, &rc); + SetWindowPos(GetDlgItem(hwnd,IDC_CHAT_CLOSE), 0, rc.right - 19, 3, 16, 16, SWP_NOZORDER | SWP_NOACTIVATE); + RedrawWindow(GetDlgItem(hwnd, IDC_CHAT_CLOSE), 0, 0, RDW_INVALIDATE); } break; @@ -221,6 +244,8 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { SendMessage(hwnd, WMU_SETTAB, 0, 0); ShowWindow(hwnd, SW_SHOW); + RedrawWindow(GetDlgItem(hwnd, IDC_CHAT_CLOSE), 0, 0, RDW_INVALIDATE); + } } return TRUE; @@ -264,11 +289,13 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hContact = ((TabData *)tie.lParam)->hContact; if(active_window == child) return TRUE; + /* // use GETCONTACTICON service instead of tie.iImage, because tie.iImage may be -1 depending on options HANDLE hIcon = ImageList_GetIcon(clist_imagelist, (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0), 0); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); - + */ + if(active_window) { SetWindowPos(active_window, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); ShowWindow(active_window, SW_HIDE); @@ -287,6 +314,9 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { tie.iImage = options.tab_icon ? (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0) : -1; SendMessage(tab_ctrl, TCM_SETITEM, (WPARAM)iPage, (LPARAM)&tie); SetFocus(active_window); + + SendMessage(hwnd, WMU_CALCWINICON, (WPARAM)hContact, 0); + RedrawWindow(GetDlgItem(hwnd, IDC_CHAT_CLOSE), 0, 0, RDW_INVALIDATE); } return TRUE; case WM_NOTIFY: @@ -317,13 +347,14 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND child = WindowList_Find(window_list, hContact); if(child) { int t = GetTabFromHWND(tab_ctrl, child); - if(TabCtrl_GetCurSel(tab_ctrl) != t) { + if(IsIconic(hwnd) || TabCtrl_GetCurSel(tab_ctrl) != t) { //TabCtrl_HighlightItem(tab_ctrl, t, 1); TCITEM tie; tie.mask = TCIF_IMAGE; tie.iImage = message_icon_index; SendMessage(tab_ctrl, TCM_SETITEM, (WPARAM)t, (LPARAM)&tie); } + SendMessage(hwnd, WMU_CALCWINICON, 0, 0); } } return TRUE; @@ -379,12 +410,15 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { tci.iImage = options.tab_icon ? ici : -1; SendMessage(tab_ctrl, TCM_SETITEM, (WPARAM)t, (LPARAM)&tci); + /* if(t == TabCtrl_GetCurSel(tab_ctrl)) { // use GETCONTACTICON service instead of tie.iImage, because tie.iImage may be -1 depending on options HANDLE hIcon = ImageList_GetIcon(clist_imagelist, ici, 0); SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); } + */ + SendMessage(hwnd, WMU_CALCWINICON, 0, 0); } } else { int l, i; @@ -402,6 +436,70 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { } } return TRUE; + case WMU_CALCWINICON: + { + int l, i, s; + TCITEM tci; + HANDLE hContact = 0; + if(wParam) hContact = (HANDLE)wParam; + bool use_message_icon = false; + l = TabCtrl_GetItemCount(tab_ctrl); + s = TabCtrl_GetCurSel(tab_ctrl); + for (i = 0; i < l; i++) { + tci.mask = TCIF_IMAGE | TCIF_PARAM; + TabCtrl_GetItem(tab_ctrl, i, &tci); + if(tci.iImage == message_icon_index) + use_message_icon = true; + else if(i == s) { + hContact = ((TabData *)tci.lParam)->hContact; + } + } + + int ici = (use_message_icon ? message_icon_index : (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0)); + HANDLE hIcon = ImageList_GetIcon(clist_imagelist, ici, 0); + SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); + SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); + } + return TRUE; + case WM_ACTIVATE: + if (LOWORD(wParam) == WA_ACTIVE) { + TCITEM tci; + int s = TabCtrl_GetCurSel(tab_ctrl); + if(s != -1) { + tci.mask = TCIF_IMAGE | TCIF_PARAM; + TabCtrl_GetItem(tab_ctrl, s, &tci); + HANDLE hContact = ((TabData *)tci.lParam)->hContact; + SendMessage(hwnd, WM_RESETTABICONS, (WPARAM)hContact, lParam); + } + } + break; + case WM_SYSCOMMAND: + if (wParam == IDM_TOPMOST) { + HMENU hMenu = GetSystemMenu(hwnd, FALSE); + CheckMenuItem(hMenu, IDM_TOPMOST, MF_BYCOMMAND | (options.ontop ? MF_UNCHECKED : MF_CHECKED)); + SetWindowPos(hwnd, (options.ontop ? HWND_NOTOPMOST : HWND_TOPMOST), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + options.ontop = !options.ontop; + DBWriteContactSettingByte(0, MODULE, "OnTop", options.ontop ? 1 : 0); + return TRUE; + } + break; + case WM_COMMAND: + if ( HIWORD( wParam ) == BN_CLICKED ) { + switch( LOWORD( wParam )) { + case IDC_CHAT_CLOSE: + { + TCITEM tci; + int s = TabCtrl_GetCurSel(tab_ctrl); + if(s != -1) { + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(tab_ctrl, s, &tci); + SendMessage(((TabData *)tci.lParam)->hwndMsg, WM_CLOSE, 0, 0); + } + } + return TRUE; + } + } + break; } //return DefWindowProc(hwnd, msg, wParam, lParam); @@ -439,9 +537,10 @@ int CreateFrame(HWND parent, HINSTANCE hInst) { 0, 0, 800, 600, parent, NULL, hInst, NULL); */ pluginwind = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CONTAINER), 0, FrameProc, 0); - EnableTitleBar(); + FixWindowStyle(); + return 0; } @@ -681,3 +780,7 @@ BOOL CALLBACK TabCtrlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } return CallWindowProc(OldTabCtrlProc, hwnd, msg, wParam, lParam); } + +void FixWindowStyle() { + if(pluginwind) SetWindowPos(pluginwind, (options.ontop ? HWND_TOPMOST : HWND_NOTOPMOST), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); +} -- cgit v1.2.3