From 3b8d44fb4646951be55b3777cbe30d3280867067 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 11 Jul 2012 15:51:11 +0000 Subject: - antiflicker effect for TTB resizing (thx to FYR for writing it) - TTB visual part extracted to the separate module git-svn-id: http://svn.miranda-ng.org/main/trunk@904 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/TopToolBar/TopToolBar.vcxproj | 1 + plugins/TopToolBar/TopToolBar.vcxproj.filters | 3 + plugins/TopToolBar/common.h | 8 +- plugins/TopToolBar/toolbar.cpp | 398 +++++--------------------- plugins/TopToolBar/toolbarwnd.cpp | 329 +++++++++++++++++++++ plugins/TopToolBar/ttbopt.cpp | 13 +- 6 files changed, 424 insertions(+), 328 deletions(-) create mode 100644 plugins/TopToolBar/toolbarwnd.cpp (limited to 'plugins/TopToolBar') diff --git a/plugins/TopToolBar/TopToolBar.vcxproj b/plugins/TopToolBar/TopToolBar.vcxproj index 978fc4bfcc..312bf92d2c 100644 --- a/plugins/TopToolBar/TopToolBar.vcxproj +++ b/plugins/TopToolBar/TopToolBar.vcxproj @@ -271,6 +271,7 @@ Create + diff --git a/plugins/TopToolBar/TopToolBar.vcxproj.filters b/plugins/TopToolBar/TopToolBar.vcxproj.filters index fca64531d0..500784079b 100644 --- a/plugins/TopToolBar/TopToolBar.vcxproj.filters +++ b/plugins/TopToolBar/TopToolBar.vcxproj.filters @@ -90,5 +90,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/plugins/TopToolBar/common.h b/plugins/TopToolBar/common.h index 23c0bcb2f0..5a189df73b 100644 --- a/plugins/TopToolBar/common.h +++ b/plugins/TopToolBar/common.h @@ -93,12 +93,12 @@ char __inline *AS(char *str, const char *setting, char *addstr); TopButtonInt* CreateButton(TTBButton* but); -int ttbOptionsChanged(); +int LoadBackgroundOptions(); int ArrangeButtons(); #define DEFBUTTWIDTH 20 -#define DEFBUTTHEIGHT 16 +#define DEFBUTTHEIGHT 20 #define DEFBUTTGAP 1 #define SEPWIDTH 3 @@ -106,12 +106,12 @@ int ArrangeButtons(); extern TTBCtrl* g_ctrl; extern LIST Buttons; -extern bool bStopArrange; extern HINSTANCE hInst; extern HBITMAP hBmpBackground, hBmpSeparator; extern CRITICAL_SECTION csButtonsHook; extern pfnCustomProc g_CustomProc; extern LPARAM g_CustomProcParam; +extern HANDLE hTTBModuleLoaded, hTTBInitButtons; void AddToOptions(TopButtonInt* b); void RemoveFromOptions(int id); @@ -128,6 +128,8 @@ char *AS(char *str, const char *setting, char *addstr) #define TTB_LAUNCHSERVICE "TTB/LaunchService" +TopButtonInt* idtopos(int id, int* pPos=NULL); + INT_PTR TTBAddButton(WPARAM, LPARAM); INT_PTR TTBRemoveButton(WPARAM, LPARAM); diff --git a/plugins/TopToolBar/toolbar.cpp b/plugins/TopToolBar/toolbar.cpp index a40804efd8..70d3f02daa 100644 --- a/plugins/TopToolBar/toolbar.cpp +++ b/plugins/TopToolBar/toolbar.cpp @@ -7,20 +7,15 @@ pfnCustomProc g_CustomProc = NULL; LPARAM g_CustomProcParam = 0; TTBCtrl *g_ctrl = NULL; +INT_PTR OnEventFire(WPARAM wParam, LPARAM lParam); + HWND hwndContactList = 0; -bool bStopArrange, bEventFired = false; int nextButtonId = 200; -static HANDLE hTTBModuleLoaded, hTTBInitButtons; -static TCHAR pluginname[] = _T("TopToolBar"); +HANDLE hTTBModuleLoaded, hTTBInitButtons; static WNDPROC buttonWndProc; -//------------ options ------------- -COLORREF bkColour; -HBITMAP hBmpBackground, hBmpSeparator; -int backgroundBmpUse; - CRITICAL_SECTION csButtonsHook; int sortfunc(const TopButtonInt* a, const TopButtonInt* b) @@ -37,7 +32,7 @@ static void SetAllBitmaps() Buttons[i]->SetBitmap(); } -static TopButtonInt* idtopos(int id, int* pPos=NULL) +TopButtonInt* idtopos(int id, int* pPos) { for ( int i = 0; i < Buttons.getCount(); i++) if (Buttons[i]->id == id) { @@ -139,32 +134,6 @@ int SaveAllButtonsOptions() return 0; } -int ttbOptionsChanged() -{ - //load options - bkColour = DBGetContactSettingDword(NULL, TTB_OPTDIR, "BkColour", TTBDEFAULT_BKCOLOUR); - if (hBmpBackground) { - DeleteObject(hBmpBackground); - hBmpBackground = NULL; - } - - if (DBGetContactSettingByte(NULL, TTB_OPTDIR, "UseBitmap", TTBDEFAULT_USEBITMAP)) { - DBVARIANT dbv; - if (!DBGetContactSetting(NULL, TTB_OPTDIR, "BkBitmap", &dbv)) { - hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAP, 0, (LPARAM)dbv.pszVal); - DBFreeVariant(&dbv); - } - } - backgroundBmpUse = DBGetContactSettingWord(NULL, TTB_OPTDIR, "BkBmpUse", TTBDEFAULT_BKBMPUSE); - - RECT rc; - GetClientRect(g_ctrl->hWnd, &rc); - InvalidateRect(g_ctrl->hWnd, &rc, TRUE); - UpdateWindow(g_ctrl->hWnd); - - return 0; -} - INT_PTR TTBRemoveButton(WPARAM wParam, LPARAM lParam) { mir_cslock lck(csButtonsHook); @@ -310,56 +279,84 @@ INT_PTR TTBAddButton(WPARAM wParam, LPARAM lParam) int ArrangeButtons() { - if (bStopArrange == TRUE) - return 0; - mir_cslock lck(csButtonsHook); - RECT winrc; - GetClientRect(g_ctrl->hWnd, &winrc); - winrc.left = winrc.right-winrc.left; - if (winrc.left == 0) - return 0; - int newheight; - - bStopArrange = true; - int ypos = 1; - int xpos = g_ctrl->nButtonSpace; - newheight = g_ctrl->nButtonHeight+1; - CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, g_ctrl->hFrame), g_ctrl->nButtonHeight+2); + RECT rcClient; + GetClientRect(g_ctrl->hWnd, &rcClient); + int nBarSize = rcClient.right - rcClient.left; + if (nBarSize == 0) + return g_ctrl->nButtonHeight; - int uFlags; + g_ctrl->nLineCount = 0; - for (int i = 0; i < Buttons.getCount(); i++) { - TopButtonInt *b = Buttons[i]; + int i, ypos = 1, xpos = g_ctrl->nButtonSpace, nextX = 0, y = 0; + int newheight = g_ctrl->nButtonHeight+1; - // not visible - hide and skip - if ( !(b->dwFlags & TTBBF_VISIBLE)) { + LIST tmpList = Buttons; + for (i=tmpList.getCount()-1; i >= 0; i--) { + TopButtonInt *b = tmpList[i]; + if (b->hwnd == NULL || !(b->dwFlags & TTBBF_VISIBLE)) { ShowWindow(b->hwnd, SW_HIDE); - continue; + tmpList.remove(i); } + } + + if (tmpList.getCount() == 0) + return g_ctrl->nButtonHeight; + + HDWP hdwp = BeginDeferWindowPos(tmpList.getCount()); + + bool bWasButttonBefore; + int nUsedWidth, iFirstButtonId = 0, iLastButtonId = 0; + + do + { + g_ctrl->nLineCount++; + bWasButttonBefore = false; + nUsedWidth = 0; + + for (i=iFirstButtonId; i < tmpList.getCount(); i++) { + TopButtonInt *b = tmpList[i]; - if ( b->isSep()) - uFlags = SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW; - else - uFlags = SWP_NOZORDER | SWP_SHOWWINDOW; - - // check, if need to move to next line - if (xpos+g_ctrl->nButtonWidth+g_ctrl->nButtonSpace > winrc.left) { - xpos = g_ctrl->nButtonSpace; - ypos += g_ctrl->nButtonHeight+2; - newheight = ypos+g_ctrl->nButtonHeight+1; - CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, g_ctrl->hFrame), newheight); + int width = (b->isSep()) ? SEPWIDTH+2 : g_ctrl->nButtonWidth + ((bWasButttonBefore) ? g_ctrl->nButtonSpace : 0); + if (nUsedWidth + width > nBarSize) + break; + + nUsedWidth += width; + iLastButtonId = i+1; + bWasButttonBefore = !b->isSep(); } - SetWindowPos(b->hwnd, 0, xpos, ypos, g_ctrl->nButtonWidth, g_ctrl->nButtonHeight, uFlags); - InvalidateRect(b->hwnd, NULL, TRUE); + int nFreeSpace = nBarSize - nUsedWidth; + + for (i=iFirstButtonId; i < iLastButtonId; i++) { + TopButtonInt *b = tmpList[i]; + + hdwp = DeferWindowPos(hdwp, b->hwnd, NULL, nextX, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); + if ( b->isSep()) + nextX += SEPWIDTH+2; + else + nextX += g_ctrl->nButtonWidth + g_ctrl->nButtonSpace; + } - xpos += (b->isSep()) ? SEPWIDTH+2 : g_ctrl->nButtonWidth+g_ctrl->nButtonSpace; + if (iFirstButtonId == iLastButtonId) + break; + iFirstButtonId = iLastButtonId; + y += g_ctrl->nButtonHeight + g_ctrl->nButtonSpace; + nextX = 0; + if (g_ctrl->bSingleLine) + break; } - bStopArrange = false; - return 1; + while (iFirstButtonId < tmpList.getCount() && y >= 0 && (g_ctrl->bAutoSize || (y + g_ctrl->nButtonHeight <= rcClient.bottom - rcClient.top))); + + for (i=iFirstButtonId; i < tmpList.getCount(); i++) + hdwp = DeferWindowPos(hdwp, tmpList[i]->hwnd, NULL, nextX, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_HIDEWINDOW); + + if (hdwp) + EndDeferWindowPos(hdwp); + + return (g_ctrl->nButtonHeight + g_ctrl->nButtonSpace)*g_ctrl->nLineCount - g_ctrl->nButtonSpace; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -532,247 +529,6 @@ INT_PTR TTBSetOptions(WPARAM wParam, LPARAM lParam) return retval; } -///////////////////////////////////////////////////////////////////////////////////////// -// Toolbar window procedure - -static void PaintToolbar(HWND hwnd) -{ - InvalidateRect(hwnd, 0, FALSE); - - PAINTSTRUCT paintst; - HDC hdc = BeginPaint(hwnd, &paintst); - RECT *rcPaint = &paintst.rcPaint; - - RECT clRect; - GetClientRect(hwnd, &clRect); - if (rcPaint == NULL) rcPaint = &clRect; - - int yScroll = 0; - int y = -yScroll; - - HDC hdcMem = CreateCompatibleDC(hdc); - HBITMAP hBmpOsb = CreateBitmap(clRect.right, clRect.bottom, 1, GetDeviceCaps(hdc, BITSPIXEL), NULL); - HBITMAP hOldBmp = (HBITMAP)SelectObject(hdcMem, hBmpOsb); - SetBkMode(hdcMem, TRANSPARENT); - - HBRUSH hBrush = CreateSolidBrush(bkColour); - HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem, hBrush); - FillRect(hdcMem, rcPaint, hBrush); - SelectObject(hdcMem, hoBrush); - DeleteObject(hBrush); - if (hBmpBackground) { - BITMAP bmp; - HDC hdcBmp; - int x, y; - int maxx, maxy; - int destw, desth; - - GetObject(hBmpBackground, sizeof(bmp), &bmp); - hdcBmp = CreateCompatibleDC(hdcMem); - SelectObject(hdcBmp, hBmpBackground); - y = backgroundBmpUse & CLBF_SCROLL ? -yScroll : 0; - maxx = backgroundBmpUse & CLBF_TILEH ? clRect.right : 1; - maxy = backgroundBmpUse & CLBF_TILEV ? maxy = rcPaint->bottom : y+1; - switch(backgroundBmpUse & CLBM_TYPE) { - case CLB_STRETCH: - if (backgroundBmpUse&CLBF_PROPORTIONAL) { - if (clRect.right*bmp.bmHeightnButtonHeight+2; - } - else { - destw = clRect.right; - desth = bmp.bmHeight; - } - break; - case CLB_STRETCHV: - if (backgroundBmpUse&CLBF_PROPORTIONAL) { - desth = clRect.bottom; - destw = desth*bmp.bmWidth/bmp.bmHeight; - } - else { - destw = bmp.bmWidth; - desth = clRect.bottom; - } - break; - default: //clb_topleft - destw = bmp.bmWidth; - desth = bmp.bmHeight; - if (backgroundBmpUse&CLBF_TILEVTOROWHEIGHT) - desth = g_ctrl->nButtonHeight+2; - break; - } - - for (; y < maxy; y += desth) { - if (y < rcPaint->top - desth) - continue; - - for (x = 0; x < maxx; x += destw) - StretchBlt(hdcMem, x, y, destw, desth, hdcBmp, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); - } - DeleteDC(hdcBmp); - } - BitBlt(hdc, rcPaint->left, rcPaint->top, rcPaint->right-rcPaint->left, rcPaint->bottom-rcPaint->top, hdcMem, rcPaint->left, rcPaint->top, SRCCOPY); - SelectObject(hdcMem, hOldBmp); - DeleteDC(hdcMem); - DeleteObject(hBmpOsb); - - paintst.fErase = FALSE; - EndPaint(hwnd, &paintst); -} - -LRESULT CALLBACK TopToolBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - if (g_ctrl->fnWindowProc != NULL) - if ( g_ctrl->fnWindowProc(hwnd, msg, wParam, lParam)) - return g_ctrl->lResult; - - switch(msg) { - case WM_CREATE: - g_ctrl->hWnd = hwnd; - return FALSE; - - case WM_MOVE: - return 0; - - case WM_WINDOWPOSCHANGING: - case WM_SIZE: - ArrangeButtons(); - return 0; - - case WM_NCPAINT: - case WM_PAINT: - PaintToolbar(hwnd); - return 0; - - case WM_LBUTTONDOWN: - if (DBGetContactSettingByte(NULL, "CLUI", "ClientAreaDrag", 0)) { - POINT pt; - GetCursorPos(&pt); - return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION, MAKELPARAM(pt.x, pt.y)); - } - return 0; - - case WM_COMMAND: - switch (HIWORD(wParam)) { - case BN_CLICKED: - case BN_DOUBLECLICKED: - { - int id = GetWindowLongPtr((HWND)lParam, GWLP_USERDATA); - if (id != 0) { - mir_cslock lck(csButtonsHook); - TopButtonInt* b = idtopos(id); - if (b == NULL || b->isSep()) - return 0; - - if (b->dwFlags & TTBBF_ASPUSHBUTTON) - b->bPushed = !b->bPushed; - - if (b->bPushed) { //Dn -> Up - if (!(b->dwFlags & TTBBF_ISLBUTTON)) // must be always true - if (b->pszService != NULL) - CallService(b->pszService, b->wParamUp, b->lParamUp); - } - else { //Up -> Dn - if (b->pszService != NULL) - CallService(b->pszService, b->wParamDown, b->lParamDown); - } - - b->SetBitmap(); - } - } - break; - } - break; - - case TTB_SETCUSTOM: - { - TTBCtrlCustomize *pCustom = (TTBCtrlCustomize*)lParam; - if (pCustom == NULL || g_ctrl->fnWindowProc) - break; - - g_ctrl = (TTBCtrl*)mir_realloc(g_ctrl, pCustom->cbLen); - if (pCustom->cbLen > sizeof(TTBCtrl)) - memset(g_ctrl+1, 0, pCustom->cbLen - sizeof(TTBCtrl)); - - g_ctrl->fnWindowProc = pCustom->fnWindowProc; - SetWindowLongPtr(hwnd, 0, (LONG_PTR)g_ctrl); - } - break; - - default: - return DefWindowProc(hwnd, msg, wParam, lParam); - } - return(TRUE); -} - -static INT_PTR OnEventFire(WPARAM wParam, LPARAM lParam) -{ - CallService(MS_SYSTEM_REMOVEWAIT, wParam, 0); - bStopArrange = FALSE; - - HWND parent = (HWND)CallService(MS_CLUI_GETHWND, 0, 0); - if (parent == NULL) // no clist, no buttons - return -1; - - WNDCLASS wndclass = { 0 }; - wndclass.lpfnWndProc = TopToolBarProc; - wndclass.cbWndExtra = sizeof(void*); - wndclass.hInstance = hInst; - wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); - wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);//NULL;//(HBRUSH)(COLOR_3DFACE+1); - wndclass.lpszClassName = pluginname; - RegisterClass(&wndclass); - - g_ctrl->pButtonList = (SortedList*)&Buttons; - g_ctrl->hWnd = CreateWindow(pluginname, _T("Toolbar"), - WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, - 0, 0, 0, 0, parent, NULL, hInst, NULL); - SetWindowLongPtr(g_ctrl->hWnd, 0, (LPARAM)g_ctrl); - - // if we're working in skinned clist, receive the standard buttons & customizations - if (g_CustomProc && g_ctrl->hWnd) - g_CustomProc(TTB_WINDOW_HANDLE, g_ctrl->hWnd, g_CustomProcParam); - - // if there's no customized frames, create our own - if (g_ctrl->hFrame == NULL) { - CLISTFrame Frame = { 0 }; - Frame.cbSize = sizeof(Frame); - Frame.tname = _T("Toolbar"); - Frame.hWnd = g_ctrl->hWnd; - Frame.align = alTop; - Frame.Flags = F_VISIBLE | F_NOBORDER | F_LOCKED | F_TCHAR; - Frame.height = 18; - g_ctrl->hFrame = (HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME, (WPARAM)&Frame, 0); - } - - // receive all buttons - NotifyEventHooks(hTTBInitButtons, 0, 0); - NotifyEventHooks(hTTBModuleLoaded, 0, 0); - - ttbOptionsChanged(); - - bEventFired = true; - return 0; -} - int OnIconChange(WPARAM wParam, LPARAM lParam) { ReloadIcons(); @@ -782,7 +538,7 @@ int OnIconChange(WPARAM wParam, LPARAM lParam) static int OnBGChange(WPARAM wParam, LPARAM lParam) { - ttbOptionsChanged(); + LoadBackgroundOptions(); return 0; } @@ -805,7 +561,6 @@ int OnModulesLoad(WPARAM wParam, LPARAM lParam) LoadAllSeparators(); LoadAllLButs(); - bStopArrange = FALSE; ArrangeButtons(); HANDLE hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);//anonymous event @@ -838,9 +593,16 @@ static LRESULT CALLBACK TTBButtonWndProc(HWND hwnd, UINT msg, WPARAM wParam, LP int LoadToolbarModule() { g_ctrl = (TTBCtrl*)mir_calloc( sizeof(TTBCtrl)); + g_ctrl->nButtonHeight = db_get_dw(0, TTB_OPTDIR, "BUTTHEIGHT", DEFBUTTHEIGHT); + g_ctrl->nButtonWidth = db_get_dw(0, TTB_OPTDIR, "BUTTWIDTH", DEFBUTTWIDTH); + g_ctrl->nButtonSpace = db_get_dw(0, TTB_OPTDIR, "BUTTGAP", DEFBUTTGAP); + g_ctrl->nLastHeight = db_get_dw(0, TTB_OPTDIR, "LastHeight", DEFBUTTHEIGHT); + + g_ctrl->bFlatButtons = db_get_b(0, TTB_OPTDIR, "UseFlatButton", true); + g_ctrl->bSingleLine = db_get_b(0, TTB_OPTDIR, "SingleLine", true); + g_ctrl->bAutoSize = db_get_b(0, TTB_OPTDIR, "AutoSize", true); InitializeCriticalSection(&csButtonsHook); - bStopArrange = TRUE; hBmpSeparator = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SEP)); HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoad); @@ -875,10 +637,6 @@ int LoadToolbarModule() wc.hbrBackground = 0; wc.style = CS_GLOBALCLASS; RegisterClassEx(&wc); - - g_ctrl->nButtonHeight = db_get_b(0, TTB_OPTDIR, "BUTTHEIGHT", DEFBUTTHEIGHT); - g_ctrl->nButtonWidth = db_get_b(0, TTB_OPTDIR, "BUTTWIDTH", DEFBUTTWIDTH); - g_ctrl->nButtonSpace = db_get_b(0, TTB_OPTDIR, "BUTTGAP", DEFBUTTGAP); return 0; } diff --git a/plugins/TopToolBar/toolbarwnd.cpp b/plugins/TopToolBar/toolbarwnd.cpp new file mode 100644 index 0000000000..52eff7deac --- /dev/null +++ b/plugins/TopToolBar/toolbarwnd.cpp @@ -0,0 +1,329 @@ + +#include "common.h" + +COLORREF bkColour; +HBITMAP hBmpBackground, hBmpSeparator; +int backgroundBmpUse; + +static TCHAR pluginname[] = _T("TopToolBar"); + +#define TTB_REPOSBUTTONS (WM_USER+10) +#define TTB_UPDATEFRAMEVISIBILITY (WM_USER+11) + +///////////////////////////////////////////////////////////////////////////////////////// +// Toolbar window procedure + +static void PaintToolbar(HWND hwnd) +{ + InvalidateRect(hwnd, 0, FALSE); + + PAINTSTRUCT paintst; + HDC hdc = BeginPaint(hwnd, &paintst); + RECT *rcPaint = &paintst.rcPaint; + + RECT clRect; + GetClientRect(hwnd, &clRect); + if (rcPaint == NULL) rcPaint = &clRect; + + int yScroll = 0; + int y = -yScroll; + + HDC hdcMem = CreateCompatibleDC(hdc); + HBITMAP hBmpOsb = CreateBitmap(clRect.right, clRect.bottom, 1, GetDeviceCaps(hdc, BITSPIXEL), NULL); + HBITMAP hOldBmp = (HBITMAP)SelectObject(hdcMem, hBmpOsb); + SetBkMode(hdcMem, TRANSPARENT); + + HBRUSH hBrush = CreateSolidBrush(bkColour); + HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem, hBrush); + FillRect(hdcMem, rcPaint, hBrush); + SelectObject(hdcMem, hoBrush); + DeleteObject(hBrush); + if (hBmpBackground) { + BITMAP bmp; + GetObject(hBmpBackground, sizeof(bmp), &bmp); + + HDC hdcBmp = CreateCompatibleDC(hdcMem); + SelectObject(hdcBmp, hBmpBackground); + int y = backgroundBmpUse & CLBF_SCROLL ? -yScroll : 0; + int maxx = backgroundBmpUse & CLBF_TILEH ? clRect.right : 1; + int maxy = backgroundBmpUse & CLBF_TILEV ? maxy = rcPaint->bottom : y+1; + + int destw, desth; + switch(backgroundBmpUse & CLBM_TYPE) { + case CLB_STRETCH: + if (backgroundBmpUse&CLBF_PROPORTIONAL) { + if (clRect.right * bmp.bmHeight < clRect.bottom * bmp.bmWidth) { + desth = clRect.bottom; + destw = desth * bmp.bmWidth/bmp.bmHeight; + } + else { + destw = clRect.right; + desth = destw * bmp.bmHeight/bmp.bmWidth; + } + } + else { + destw = clRect.right; + desth = clRect.bottom; + } + break; + case CLB_STRETCHH: + if (backgroundBmpUse & CLBF_PROPORTIONAL) { + destw = clRect.right; + desth = destw * bmp.bmHeight/bmp.bmWidth; + if (backgroundBmpUse & CLBF_TILEVTOROWHEIGHT) + desth = g_ctrl->nButtonHeight+2; + } + else { + destw = clRect.right; + desth = bmp.bmHeight; + } + break; + case CLB_STRETCHV: + if (backgroundBmpUse & CLBF_PROPORTIONAL) { + desth = clRect.bottom; + destw = desth*bmp.bmWidth/bmp.bmHeight; + } + else { + destw = bmp.bmWidth; + desth = clRect.bottom; + } + break; + default: //clb_topleft + destw = bmp.bmWidth; + desth = bmp.bmHeight; + if (backgroundBmpUse & CLBF_TILEVTOROWHEIGHT) + desth = g_ctrl->nButtonHeight+2; + break; + } + + for (; y < maxy; y += desth) { + if (y < rcPaint->top - desth) + continue; + + for (int x = 0; x < maxx; x += destw) + StretchBlt(hdcMem, x, y, destw, desth, hdcBmp, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); + } + DeleteDC(hdcBmp); + } + BitBlt(hdc, rcPaint->left, rcPaint->top, rcPaint->right-rcPaint->left, rcPaint->bottom-rcPaint->top, hdcMem, rcPaint->left, rcPaint->top, SRCCOPY); + SelectObject(hdcMem, hOldBmp); + DeleteDC(hdcMem); + DeleteObject(hBmpOsb); + + paintst.fErase = FALSE; + EndPaint(hwnd, &paintst); +} + +///////////////////////////////////////////////////////////////////////////////////////// + +LRESULT CALLBACK TopToolBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static bool supressRepos = false; + + if (g_ctrl->fnWindowProc != NULL) + if ( g_ctrl->fnWindowProc(hwnd, msg, wParam, lParam)) + return g_ctrl->lResult; + + switch(msg) { + case WM_CREATE: + g_ctrl->hWnd = hwnd; + PostMessage(hwnd, TTB_UPDATEFRAMEVISIBILITY, 1, 0); + return FALSE; + + case WM_MOVE: + return 0; + + case WM_WINDOWPOSCHANGING: + case WM_SIZE: + if (g_ctrl->nLastHeight != HIWORD(lParam)) { + db_set_dw(0, TTB_OPTDIR, "LastHeight", g_ctrl->nLastHeight = HIWORD(lParam)); + ArrangeButtons(); + } + if (supressRepos) { + supressRepos = false; + break; + } + // fall through + + case TTB_REPOSBUTTONS: + if (g_ctrl->hWnd == hwnd) { + int iHeight = ArrangeButtons(); + if ( g_ctrl->bAutoSize) { + RECT rcClient; + GetClientRect(g_ctrl->hWnd, &rcClient); + if (rcClient.bottom - rcClient.top != iHeight && iHeight) { + supressRepos = true; + PostMessage(hwnd, TTB_UPDATEFRAMEVISIBILITY, -1, 0); + } + } + return 0; + } + break; + + case WM_NCPAINT: + case WM_PAINT: + PaintToolbar(hwnd); + return 0; + + case WM_LBUTTONDOWN: + if (DBGetContactSettingByte(NULL, "CLUI", "ClientAreaDrag", 0)) { + POINT pt; + GetCursorPos(&pt); + return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION, MAKELPARAM(pt.x, pt.y)); + } + return 0; + + case WM_COMMAND: + switch (HIWORD(wParam)) { + case BN_CLICKED: + case BN_DOUBLECLICKED: + { + int id = GetWindowLongPtr((HWND)lParam, GWLP_USERDATA); + if (id != 0) { + mir_cslock lck(csButtonsHook); + TopButtonInt* b = idtopos(id); + if (b == NULL || b->isSep()) + return 0; + + if (b->dwFlags & TTBBF_ASPUSHBUTTON) + b->bPushed = !b->bPushed; + + if (b->bPushed) { //Dn -> Up + if (!(b->dwFlags & TTBBF_ISLBUTTON)) // must be always true + if (b->pszService != NULL) + CallService(b->pszService, b->wParamUp, b->lParamUp); + } + else { //Up -> Dn + if (b->pszService != NULL) + CallService(b->pszService, b->wParamDown, b->lParamDown); + } + + b->SetBitmap(); + } + } + break; + } + break; + + case TTB_UPDATEFRAMEVISIBILITY: + { + BOOL vis=(BOOL)wParam; + BOOL curvis = IsWindowVisible(hwnd); + bool bResize = false; + int Height = ArrangeButtons(); + + if (g_ctrl->bAutoSize) { + INT_PTR frameopt = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, g_ctrl->hFrame), 0); + if (Height != frameopt) { + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, g_ctrl->hFrame), Height); + bResize = TRUE; + } + } + + if ((curvis != vis || bResize) && vis != -1) { + INT_PTR frameopt = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, g_ctrl->hFrame), 0); + frameopt &= ~F_VISIBLE; + frameopt |= vis ? F_VISIBLE : 0; + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, g_ctrl->hFrame), frameopt); + } + } + break; + + case TTB_SETCUSTOM: + { + TTBCtrlCustomize *pCustom = (TTBCtrlCustomize*)lParam; + if (pCustom == NULL || g_ctrl->fnWindowProc) + break; + + g_ctrl = (TTBCtrl*)mir_realloc(g_ctrl, pCustom->cbLen); + if (pCustom->cbLen > sizeof(TTBCtrl)) + memset(g_ctrl+1, 0, pCustom->cbLen - sizeof(TTBCtrl)); + + g_ctrl->fnWindowProc = pCustom->fnWindowProc; + SetWindowLongPtr(hwnd, 0, (LONG_PTR)g_ctrl); + } + break; + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + return(TRUE); +} + +///////////////////////////////////////////////////////////////////////////////////////// + +INT_PTR OnEventFire(WPARAM wParam, LPARAM lParam) +{ + CallService(MS_SYSTEM_REMOVEWAIT, wParam, 0); + + HWND parent = (HWND)CallService(MS_CLUI_GETHWND, 0, 0); + if (parent == NULL) // no clist, no buttons + return -1; + + WNDCLASS wndclass = { 0 }; + wndclass.lpfnWndProc = TopToolBarProc; + wndclass.cbWndExtra = sizeof(void*); + wndclass.hInstance = hInst; + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); + wndclass.lpszClassName = pluginname; + RegisterClass(&wndclass); + + g_ctrl->pButtonList = (SortedList*)&Buttons; + g_ctrl->hWnd = CreateWindow(pluginname, _T("Toolbar"), + WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + 0, 0, 0, g_ctrl->nLastHeight, parent, NULL, hInst, NULL); + SetWindowLongPtr(g_ctrl->hWnd, 0, (LPARAM)g_ctrl); + + LoadBackgroundOptions(); + + // if we're working in skinned clist, receive the standard buttons & customizations + if (g_CustomProc && g_ctrl->hWnd) + g_CustomProc(TTB_WINDOW_HANDLE, g_ctrl->hWnd, g_CustomProcParam); + + // if there's no customized frames, create our own + if (g_ctrl->hFrame == NULL) { + CLISTFrame Frame = { 0 }; + Frame.cbSize = sizeof(Frame); + Frame.tname = _T("Toolbar"); + Frame.hWnd = g_ctrl->hWnd; + Frame.align = alTop; + Frame.Flags = F_VISIBLE | F_NOBORDER | F_LOCKED | F_TCHAR; + Frame.height = g_ctrl->nLastHeight; + g_ctrl->hFrame = (HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME, (WPARAM)&Frame, 0); + } + + // receive all buttons + NotifyEventHooks(hTTBInitButtons, 0, 0); + NotifyEventHooks(hTTBModuleLoaded, 0, 0); + + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +int LoadBackgroundOptions() +{ + //load options + bkColour = DBGetContactSettingDword(NULL, TTB_OPTDIR, "BkColour", TTBDEFAULT_BKCOLOUR); + if (hBmpBackground) { + DeleteObject(hBmpBackground); + hBmpBackground = NULL; + } + + if (DBGetContactSettingByte(NULL, TTB_OPTDIR, "UseBitmap", TTBDEFAULT_USEBITMAP)) { + DBVARIANT dbv; + if (!DBGetContactSetting(NULL, TTB_OPTDIR, "BkBitmap", &dbv)) { + hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAP, 0, (LPARAM)dbv.pszVal); + DBFreeVariant(&dbv); + } + } + backgroundBmpUse = DBGetContactSettingWord(NULL, TTB_OPTDIR, "BkBmpUse", TTBDEFAULT_BKBMPUSE); + + RECT rc; + GetClientRect(g_ctrl->hWnd, &rc); + InvalidateRect(g_ctrl->hWnd, &rc, TRUE); + UpdateWindow(g_ctrl->hWnd); + + return 0; +} diff --git a/plugins/TopToolBar/ttbopt.cpp b/plugins/TopToolBar/ttbopt.cpp index 5fd2edef80..a63554f436 100644 --- a/plugins/TopToolBar/ttbopt.cpp +++ b/plugins/TopToolBar/ttbopt.cpp @@ -194,7 +194,8 @@ static INT_PTR CALLBACK ButOrderOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR SetDlgItemInt(hwndDlg, IDC_BUTTHEIGHT, g_ctrl->nButtonHeight, FALSE); SetDlgItemInt(hwndDlg, IDC_BUTTWIDTH, g_ctrl->nButtonWidth, FALSE); SetDlgItemInt(hwndDlg, IDC_BUTTGAP, g_ctrl->nButtonSpace, FALSE); - CheckDlgButton(hwndDlg, IDC_USEFLAT, DBGetContactSettingByte(0, TTB_OPTDIR, "UseFlatButton", 1)); + + CheckDlgButton(hwndDlg, IDC_USEFLAT, g_ctrl->bFlatButtons); BuildTree(hwndDlg); EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), FALSE); @@ -361,10 +362,12 @@ static INT_PTR CALLBACK ButOrderOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR g_ctrl->nButtonHeight = GetDlgItemInt(hwndDlg, IDC_BUTTHEIGHT, NULL, FALSE); g_ctrl->nButtonWidth = GetDlgItemInt(hwndDlg, IDC_BUTTWIDTH, NULL, FALSE); g_ctrl->nButtonSpace = GetDlgItemInt(hwndDlg, IDC_BUTTGAP, NULL, FALSE); - db_set_b(0, TTB_OPTDIR, "BUTTHEIGHT", g_ctrl->nButtonHeight); - db_set_b(0, TTB_OPTDIR, "BUTTWIDTH", g_ctrl->nButtonWidth); - db_set_b(0, TTB_OPTDIR, "BUTTGAP", g_ctrl->nButtonSpace); - db_set_b(0, TTB_OPTDIR, "UseFlatButton", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_USEFLAT)); + g_ctrl->bFlatButtons = (BYTE)IsDlgButtonChecked(hwndDlg, IDC_USEFLAT); + + db_set_dw(0, TTB_OPTDIR, "BUTTHEIGHT", g_ctrl->nButtonHeight); + db_set_dw(0, TTB_OPTDIR, "BUTTWIDTH", g_ctrl->nButtonWidth); + db_set_dw(0, TTB_OPTDIR, "BUTTGAP", g_ctrl->nButtonSpace); + db_set_b(0, TTB_OPTDIR, "UseFlatButton", g_ctrl->bFlatButtons); SaveTree(hwndDlg); RecreateWindows(); -- cgit v1.2.3