aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/toolbarProgress.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/omBrowser/toolbarProgress.cpp')
-rw-r--r--Src/omBrowser/toolbarProgress.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/Src/omBrowser/toolbarProgress.cpp b/Src/omBrowser/toolbarProgress.cpp
new file mode 100644
index 00000000..3e544711
--- /dev/null
+++ b/Src/omBrowser/toolbarProgress.cpp
@@ -0,0 +1,197 @@
+#include "main.h"
+#include "./toolbarProgress.h"
+#include "./toolbar.h"
+#include "./graphics.h"
+#include "./resource.h"
+#include "../Plugins/General/gen_ml/ml_ipc_0313.h"
+#include "./ifc_imageloader.h"
+#include <strsafe.h>
+
+#define PROGRESS_FRAMECOUNT 9
+
+static ATOM TOOLBARPROGRESS_PROP = 0;
+#define TIMER_PROGRESSSTEP_ID 111
+#define TIMER_PROGRESSSTEP_INTERVAL 120
+
+
+ToolbarProgress::ToolbarProgress(LPCSTR pszName, UINT nStyle, LPCWSTR pszText, LPCWSTR pszDescription)
+ : ToolbarItem(pszName, nStyle, ICON_NONE, pszText, pszDescription),
+ bitmap(NULL), frame(0), hTimer(NULL)
+
+{
+}
+
+ToolbarProgress::~ToolbarProgress()
+{
+ if (NULL != hTimer)
+ Animate(hTimer, FALSE);
+
+ if (NULL != bitmap)
+ DeleteObject(bitmap);
+}
+
+static void CALLBACK ToolbarProgress_TimerElapsed(HWND hwnd, UINT uMsg, UINT_PTR eventId, DWORD dwTime)
+{
+ ToolbarProgress *item = (ToolbarProgress*)GetProp(hwnd, MAKEINTATOM(TOOLBARPROGRESS_PROP));
+ if (NULL == item || 0 != ((ToolbarItem::stateDisabled | ToolbarItem::stateHidden) & item->GetStyle()))
+ {
+ if (NULL != item)
+ item->Animate(hwnd, FALSE);
+ else
+ KillTimer(hwnd, TIMER_PROGRESSSTEP_ID);
+ return;
+ }
+ item->Animate(hwnd, TRUE);
+}
+
+
+ToolbarItem* CALLBACK ToolbarProgress::CreateInstance(ToolbarItem::Template *item)
+{
+ if (NULL == item)
+ return NULL;
+
+ return new ToolbarProgress( (NULL != item->name) ? item->name : TOOLCLS_PROGRESS,
+ item->style | styleNoChevron,
+ item->text,
+ item->description);
+}
+
+void ToolbarProgress::SetStyle(HWND hToolbar, UINT newStyle, UINT styleMask)
+{
+ __super::SetStyle(hToolbar, newStyle, styleMask);
+
+ if (0 == ((stateDisabled | stateHidden) & style))
+ {
+ Animate(hToolbar, TRUE);
+ }
+}
+
+BOOL ToolbarProgress::Animate(HWND hToolbar, BOOL fAnimate)
+{
+ if (FALSE == fAnimate)
+ {
+ if (NULL != hTimer)
+ {
+ RemoveProp(hTimer, MAKEINTATOM(TOOLBARPROGRESS_PROP));
+ KillTimer(hTimer, TIMER_PROGRESSSTEP_ID);
+ hTimer = NULL;
+ }
+
+ if (0 != frame)
+ {
+ frame = 0;
+ InvalidateRect(hToolbar, &rect, FALSE);
+ }
+
+
+ }
+ else
+ {
+ if (NULL == hTimer)
+ {
+ if (0 == TOOLBARPROGRESS_PROP)
+ {
+ TOOLBARPROGRESS_PROP = GlobalAddAtom(L"omToolbarProgressProp");
+ if (0 == TOOLBARPROGRESS_PROP) return FALSE;
+ }
+
+ if (!SetProp(hToolbar, MAKEINTATOM(TOOLBARPROGRESS_PROP), (HANDLE)this))
+ return FALSE;
+
+ if (!SetTimer(hToolbar, TIMER_PROGRESSSTEP_ID, TIMER_PROGRESSSTEP_INTERVAL,
+ ToolbarProgress_TimerElapsed))
+ {
+ RemoveProp(hToolbar, MAKEINTATOM(TOOLBARPROGRESS_PROP));
+ return FALSE;
+
+ }
+ hTimer = hToolbar;
+ }
+
+ if (++frame >= PROGRESS_FRAMECOUNT)
+ {
+ frame = 1;
+ }
+ InvalidateRect(hToolbar, &rect, FALSE);
+
+ }
+
+ return TRUE;
+}
+
+void ToolbarProgress::UpdateSkin(HWND hToolbar)
+{
+
+ if (NULL != bitmap)
+ {
+ DeleteObject(bitmap);
+ bitmap = NULL;
+ }
+
+ ifc_omimageloader *loader;
+
+ if (SUCCEEDED(Plugin_QueryImageLoader(Plugin_GetInstance(), MAKEINTRESOURCE(IDR_TOOLBARPROGRESS_IMAGE), TRUE, &loader)))
+ {
+ BITMAPINFOHEADER headerInfo;
+ BYTE *pixelData;
+ if (SUCCEEDED(loader->LoadBitmapEx(&bitmap, &headerInfo, (void**)&pixelData)))
+ {
+ if (headerInfo.biHeight < 0) headerInfo.biHeight = -headerInfo.biHeight;
+
+ Image_Colorize(pixelData, headerInfo.biWidth, headerInfo.biHeight, headerInfo.biBitCount,
+ Toolbar_GetBkColor(hToolbar), Toolbar_GetFgColor(hToolbar), TRUE);
+ }
+ loader->Release();
+ }
+
+}
+
+BOOL ToolbarProgress::AdjustRect(HWND hToolbar, RECT *proposedRect)
+{
+ BITMAP bm;
+ if (NULL == bitmap || sizeof(BITMAP) != GetObject(bitmap, sizeof(BITMAP), &bm))
+ return FALSE;
+
+ if (bm.bmHeight < 0) bm.bmHeight = -bm.bmHeight;
+ bm.bmHeight /= PROGRESS_FRAMECOUNT;
+ proposedRect->right = proposedRect->left + bm.bmWidth;
+ proposedRect->top += (((proposedRect->bottom - proposedRect->top) - bm.bmHeight)/2);
+ proposedRect->bottom = proposedRect->top + bm.bmHeight;
+
+ return TRUE;
+}
+
+BOOL ToolbarProgress::Paint(HWND hToolbar, HDC hdc, const RECT *paintRect, UINT state)
+{
+ BITMAP bm;
+ if (NULL == bitmap || sizeof(BITMAP) != GetObject(bitmap, sizeof(BITMAP), &bm))
+ return FALSE;
+
+ if (bm.bmHeight < 0) bm.bmHeight = -bm.bmHeight;
+ bm.bmHeight /= PROGRESS_FRAMECOUNT;
+
+ RECT blitRect;
+ if (!IntersectRect(&blitRect, paintRect))
+ return TRUE;
+
+ BOOL success = FALSE;
+ HDC hdcSrc = CreateCompatibleDC(hdc);
+
+ if (NULL != hdcSrc)
+ {
+ HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcSrc, bitmap);
+
+ success = BitBlt(hdc, blitRect.left, blitRect.top,
+ blitRect.right - blitRect.left, blitRect.bottom - blitRect.top,
+ hdcSrc,
+ blitRect.left - rect.left,
+ bm.bmHeight * frame + (blitRect.top - rect.top),
+ SRCCOPY);
+
+ SelectObject(hdcSrc, hbmpOld);
+ DeleteDC(hdcSrc);
+ }
+
+ return success;
+
+} \ No newline at end of file