diff options
author | Vadim Dashevskiy <watcherhd@gmail.com> | 2012-05-15 10:38:20 +0000 |
---|---|---|
committer | Vadim Dashevskiy <watcherhd@gmail.com> | 2012-05-15 10:38:20 +0000 |
commit | 48540940b6c28bb4378abfeb500ec45a625b37b6 (patch) | |
tree | 2ef294c0763e802f91d868bdef4229b6868527de /plugins/Popup/src/popup_wnd2.h | |
parent | 5c350913f011e119127baeb32a6aedeb4f0d33bc (diff) |
initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Popup/src/popup_wnd2.h')
-rw-r--r-- | plugins/Popup/src/popup_wnd2.h | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/plugins/Popup/src/popup_wnd2.h b/plugins/Popup/src/popup_wnd2.h new file mode 100644 index 0000000000..8c5fd963e3 --- /dev/null +++ b/plugins/Popup/src/popup_wnd2.h @@ -0,0 +1,273 @@ +/*
+Popup Plus plugin for Miranda IM
+
+Copyright © 2002 Luca Santarelli,
+ © 2004-2007 Victor Pavlychko
+ © 2010 MPK
+ © 2010 Merlin_de
+
+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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+===============================================================================
+
+File name : $HeadURL: http://svn.miranda.im/mainrepo/popup/trunk/src/popup_wnd2.h $
+Revision : $Revision: 1620 $
+Last change on : $Date: 2010-06-23 21:31:05 +0300 (Ср, 23 июн 2010) $
+Last change by : $Author: Merlin_de $
+
+===============================================================================
+*/
+
+#ifndef __popup_wnd2_h__
+#define __popup_wnd2_h__
+
+#define UM_CALLMETHOD (WM_USER+2048)
+
+class PopupAvatar;
+
+#define POPUP_OBJECT_SIGNARURE 0x0B1A11BE
+
+class PopupWnd2
+{
+public:
+ typedef LRESULT (PopupWnd2::*MethodPtr)(LPARAM lParam);
+ enum TextType {TT_NONE, TT_ANSI, TT_UNICODE, TT_MTEXT};
+
+ struct ActionInfo
+ {
+ POPUPACTION actionA;
+ RECT rc;
+ bool hover;
+
+ ActionInfo(): hover(false) {}
+ };
+
+ DWORD m_signature;
+
+private:
+ // style
+ COLORREF m_clBack, m_clText, m_clTitle, m_clClock;
+ int m_iTimeout;
+
+ // content
+ TextType m_textType;
+ char *m_lpzTitle, *m_lpzText;
+ WCHAR *m_lpwzTitle, *m_lpwzText;
+ HANDLE m_mtTitle, m_mtText;
+ bool m_bTextEmpty;
+ HFONT m_hfnTitle, m_hfnText;
+ HICON m_hIcon;
+ HBITMAP m_hbmAvatar;
+ char m_time[2+1+2+1];
+ ActionInfo* m_actions;
+ int m_actionCount;
+ HANDLE m_hNotification;
+
+ // other data
+ Formula::Args m_args;
+ HANDLE m_hContact, m_hContactPassed;
+ WNDPROC m_PluginWindowProc;
+ void *m_PluginData;
+
+ // the window
+ LPTSTR m_lpzSkin;
+ bool m_customPopup;
+ HWND m_hwnd, m_hwndToolTip;
+ bool m_bPositioned;
+ POINT m_pos;
+ SIZE m_sz;
+ MyBitmap *m_bmpBase, *m_bmp, *m_bmpAnimate;
+ PopupAvatar *m_avatar;
+ int m_avatarFrameDelay;
+ bool m_bReshapeWindow;
+ HANDLE m_hhkAvatarChanged;
+ bool m_bIsPinned;
+
+ // show & hide
+// bool m_bIdleRequested;
+ bool m_bFade;
+// DWORD m_dwTmFade0, m_dwTmFade1;
+ BYTE m_btAlpha0, m_btAlpha1;
+ bool m_bSlide;
+// DWORD m_dwTmSlide0, m_dwTmSlide1;
+ POINT m_ptPosition0, m_ptPosition1;
+ bool m_bDestroy;
+ bool m_bIsHovered;
+
+ // prevent unwanted clicks
+ POINT m_ptPrevCursor;
+
+ // system
+ POPUPOPTIONS *m_options;
+ DWORD m_lockCount;
+
+ PopupSkin::RenderInfo m_renderInfo;
+
+ void fixDefaults();
+ void fixAvatar();
+ int fixActions(POPUPACTION *theActions, int count);
+ int fixActions(POPUPACTION *theActions, int count, int additional);
+
+public:
+// PopupWnd2(POPUPDATA *ppd, POPUPOPTIONS *theCustomOptions=NULL, bool renderOnly=false);
+// PopupWnd2(POPUPDATAEX_V2 *ppd, POPUPOPTIONS *theCustomOptions=NULL, bool renderOnly=false);
+// PopupWnd2(POPUPDATAW_V2 *ppd, POPUPOPTIONS *theCustomOptions=NULL, bool renderOnly=false);
+ PopupWnd2(POPUPDATA2 *ppd, POPUPOPTIONS *theCustomOptions=NULL, bool renderOnly=false);
+// PopupWnd2(HANDLE hNtf, POPUPOPTIONS *theCustomOptions=NULL, bool renderOnly=false);
+ ~PopupWnd2();
+
+ void startThread();
+
+ void create();
+ void updateLayered(BYTE opacity);
+ SIZE measure();
+ void update();
+ void animate();
+
+ void show();
+ void hide();
+ void idle();
+
+ DWORD lock() { return ++m_lockCount; }
+ DWORD unlock() { return m_lockCount = m_lockCount ? m_lockCount-1 : 0; }
+ bool isLocked() { return m_lockCount != 0; }
+
+ void updateData(POPUPDATA *ppd);
+ void updateData(POPUPDATAEX_V2 *ppd);
+ void updateData(POPUPDATAW_V2 *ppd);
+ void updateData(POPUPDATA2 *ppd);
+// void updateData(HANDLE hNtf);
+ void buildMText();
+ void updateText(char *text);
+ void updateText(WCHAR *text);
+ void updateTitle(char *title);
+ void updateTitle(WCHAR *title);
+
+ void updateTimer();
+
+ MyBitmap *getContent() { return m_bmp; }
+
+ COLORREF getTextColor() { return m_clText; }
+ COLORREF getTitleColor() { return m_clTitle; }
+ COLORREF getClockColor() { return m_clClock; }
+ COLORREF getBackColor() { return m_clBack; }
+
+ bool isTextEmpty() { return m_bTextEmpty; }
+ TextType getTextType() { return m_textType; }
+ char *getTextA() { return m_lpzText; }
+ WCHAR *getTextW() { return m_lpwzText; }
+ HANDLE getTextM() { return m_mtText; }
+ char *getTitleA() { return m_lpzTitle; }
+ WCHAR *getTitleW() { return m_lpwzTitle; }
+ HANDLE getTitleM() { return m_mtTitle; }
+
+ int getActionCount() { return m_actionCount; }
+ ActionInfo *getActions() { return m_actions; }
+
+ char *getTime() { return m_time; }
+ HICON getIcon() { return m_hIcon; }
+ HANDLE getContact() { return m_hContact; }
+ HANDLE getContactPassed() { return m_hContactPassed; }
+ int getTimeout() { return m_iTimeout; }
+// HBITMAP getAvatar() { return hbmAvatar; }
+ PopupAvatar *getAvatar() { return m_avatar; }
+ HWND getHwnd() { return m_hwnd; }
+ void *getData() { return m_PluginData; }
+
+ Formula::Args *getArgs() { return &m_args; }
+ PopupSkin::RenderInfo *getRenderInfo() { return &m_renderInfo; }
+
+ SIZE getSize() { return m_sz; }
+ void setSize(SIZE sz)
+ {
+ this->m_sz = sz;
+ if (m_hwnd)
+ {
+ SetWindowPos(m_hwnd, 0, 0, 0, sz.cx, sz.cy, SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE|SWP_DEFERERASE|SWP_NOSENDCHANGING);
+ if (!m_customPopup)
+ PopupThreadUpdateWindow(this);
+ }
+ }
+ bool isPositioned() { return m_bPositioned; }
+ POINT getPosition() { return m_pos; }
+ POINT getRealPosition() { return POINT(); }
+ void setPosition(POINT pt)
+ {
+ m_bPositioned = true;
+ m_pos = pt;
+ if (m_bSlide)
+ {
+ m_ptPosition1 = pt;
+ } else
+ {
+ SetWindowPos(m_hwnd, 0, pt.x, pt.y, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE|SWP_DEFERERASE|SWP_NOSENDCHANGING);
+ }
+ }
+
+ // Thread-related methods
+ void callMethodAsync(MethodPtr method, LPARAM lParam)
+ {
+ // we can't pass MethodPtr via WPARAM because it's size can differ! well, it's still 4 bytes on msvc but
+ // on gcc we will get 8 bytes...
+ MethodPtr *method_copy = new MethodPtr; *method_copy = method;
+ PostMessage(m_hwnd, UM_CALLMETHOD, (WPARAM)method_copy, (LPARAM)lParam);
+ }
+ void callMethodSync(MethodPtr method, LPARAM lParam)
+ {
+ // we can't pass MethodPtr via WPARAM because it's size can differ! well, it's still 4 bytes on msvc but
+ // on gcc we will get 8 bytes...
+ MethodPtr *method_copy = new MethodPtr; *method_copy = method;
+ SendMessage(m_hwnd, UM_CALLMETHOD, (WPARAM)method_copy, (LPARAM)lParam);
+ }
+
+ LRESULT m_updateData_POPUPDATA(LPARAM arg) { updateData((POPUPDATA *)arg); update(); return 0; }
+ LRESULT m_updateData_POPUPDATAEX_V2(LPARAM arg) { updateData((POPUPDATAEX_V2 *)arg); update(); return 0; }
+ LRESULT m_updateData_POPUPDATAW_V2(LPARAM arg) { updateData((POPUPDATAW_V2 *)arg); update(); return 0; }
+ LRESULT m_updateData_POPUPDATA2(LPARAM arg) { updateData((POPUPDATA2 *)arg); update(); return 0; }
+// LRESULT m_updateData_HNOTIFY(LPARAM arg) { updateData((HANDLE)arg); update(); return 0; }
+ LRESULT m_updateText(LPARAM arg) { updateText((char *)arg); update(); return 0; }
+ LRESULT m_updateTextW(LPARAM arg) { updateText((WCHAR *)arg); update(); return 0; }
+ LRESULT m_updateTitle(LPARAM arg) { updateTitle((char *)arg); update(); return 0; }
+ LRESULT m_updateTitleW(LPARAM arg) { updateTitle((WCHAR *)arg); update(); return 0; }
+ LRESULT m_show(LPARAM arg) { show(); return 0; }
+ LRESULT m_hide(LPARAM arg) { hide(); return 0; }
+
+ // window related stuff
+ LRESULT CALLBACK WindowProc(UINT, WPARAM, LPARAM);
+ static LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
+
+ // window creation flag
+ volatile bool m_bWindowCreated;
+};
+
+bool LoadPopupWnd2();
+void UnloadPopupWnd2();
+
+static inline bool IsValidPopupObject(PopupWnd2 *wnd)
+{
+ bool res = false;
+ __try
+ {
+ if (wnd->m_signature == POPUP_OBJECT_SIGNARURE)
+ res = true;
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ res = false;
+ }
+ return res;
+}
+
+#endif // __popup_wnd2_h__
|