///////////////////////////////////////////////////////////////////////////////////////// // Miranda NG: the free IM client for Microsoft* Windows* // // Copyright (C) 2012-22 Miranda NG team, // Copyright (c) 2000-09 Miranda ICQ/IM project, // all portions of this codebase are copyrighted to the people // listed in contributors.txt. // // 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. // // part of tabSRMM messaging plugin for Miranda. // // (C) 2005-2010 by silvercircle _at_ gmail _dot_ com and contributors // // the info area for both im and chat sessions #ifndef __INFOPANEL_H #define __INFOPANEL_H class CInfoPanel; class CMsgDialog; struct CSkinItem; /* * configuration data for the info panel (fonts, colors) * this is global for all panels */ #define IPFONTCOUNT 6 // # of fonts needed for the info panel /* * command ids for the info panel contextual menus */ #define CMD_IP_USERDETAILS 20000 #define CMD_IP_USERPREFS 20001 #define CMD_IP_ROOMPREFS 20002 #define CMD_IP_HISTORY 20003 #define CMD_IP_COPY 21000 struct TInfoPanelConfig { HFONT hFonts[IPFONTCOUNT]; COLORREF clrs[IPFONTCOUNT]; UINT height1, height2; }; extern wchar_t *xStatusDescr[]; /** * a simple tooltip class using a richedit control to display its content. Allows * for formatted text and clickable hyperlinks * * Used by: Info panel to display status messages, topics etc. */ class CTip { public: enum { TOP_BORDER = 25, LEFT_BORDER = 2, RIGHT_BORDER = 2, BOTTOM_BORDER = 1, LEFT_BAR_WIDTH = 20 }; CTip(const HWND hwndParent, const MCONTACT hContact, const wchar_t *pszText = nullptr, const CInfoPanel *panel = nullptr); ~CTip() { mir_free(m_pszText); } void show(const RECT& rc, POINT& pt, const HICON hIcon = nullptr, const wchar_t *szTitle = nullptr); const HWND getHwnd() const { return(m_hwnd); } static void registerClass(); private: INT_PTR CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK WndProcStub(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK RichEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); HWND m_hwnd; // our window handle HWND m_hRich; // handle of the rich edit child HWND m_hwndParent; // parent window (used for position calculations and to send notifications) MCONTACT m_hContact; // contact handle char *m_pszText; // the richedit text SIZE m_szRich; // size of the richedit control (height auto-calculated to make it fit the text) RECT m_rcRich; // adjusted rectangle for the richedit control (client coordinates) HICON m_hIcon; // optional icon to show in the title line LPCTSTR m_szTitle; // optional text to show in the title int m_leftWidth; const CInfoPanel *m_panel; // the info panel parent (if any) }; /** * the info panel class definition. The panel itself is not a real window class - it * is implemented as a drawing canvas on the message window background. * * Each message session has its own info panel object */ class CInfoPanel { public: enum { DEGRADE_THRESHOLD = 37, // defines the height at which the infopanel will do the transition from 1 to 2 lines LEFT_OFFSET_LOGO = 3 }; enum { HOVER_NICK = 1, HOVER_STATUS = 2, HOVER_UIN = 4 }; enum { HTNICK = 1, HTUIN = 2, HTSTATUS = 3, HTNIRVANA = 0 }; CInfoPanel(CMsgDialog *dat); ~CInfoPanel(); __forceinline const LONG getHeight() const { return m_height; } __forceinline bool isActive() const { return m_active; } __forceinline bool isPrivateHeight() const { return m_fPrivateHeight; } __forceinline uint32_t isHovered() const { return m_active ? m_hoverFlags : 0; } __forceinline const CMsgDialog* getDat() const { return m_dat; } void setHeight(LONG newHeight, bool fBroadcast = false); void setActive(const int newActive); void loadHeight(); void saveHeight(bool fFlush = false); void Configure() const; void showHide() const; bool getVisibility(); void renderBG(const HDC hdc, RECT& rc, CSkinItem *item, bool bAero, bool fAutoCalc = true) const; void renderContent(const HDC hdcMem); void Invalidate(BOOL fErase = FALSE) const; void trackMouse(POINT& pt); int hitTest(POINT pt); void handleClick(const POINT& pt); void showTip(UINT ctrlId, const wchar_t *pwszTip); void hideTip(const HWND hWndNew); int invokeConfigDialog(const POINT& pt); void dismissConfig(bool fForced = false); public: static TInfoPanelConfig m_ipConfig; static LRESULT CALLBACK avatarParentSubclass(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); private: void mapRealRect(const RECT& rcSrc, RECT& rcDest, const SIZE& sz); void mapRealRectOnTop(const RECT& rcSrc, RECT& rcDest, const SIZE& sz); HFONT setUnderlinedFont(const HDC hdc, HFONT hFontOrig); void RenderIPNickname(const HDC hdc, RECT& rc); void RenderIPUIN(const HDC hdc, RECT& rcItem); void RenderIPStatus(const HDC hdc, RECT& rcItem); void Chat_RenderIPNickname(const HDC hdc, RECT& rcItem); void Chat_RenderIPSecondLine(const HDC hdc, RECT& rcItem); HMENU constructContextualMenu() const; LRESULT cmdHandler(UINT cmd); INT_PTR CALLBACK ConfigDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK ConfigDlgProcStub(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); private: bool m_isChat; // is MUC session bool m_active; // panel active and visible bool m_fPrivateHeight; bool m_fDialogCreated; CMsgDialog *m_dat; // this one OWNS us... LONG m_height; // height (determined by position of IDC_PANELSPLITTER) LONG m_defaultHeight, m_defaultMUCHeight; // global values for the info bar height HWND m_hwndConfig; // window handle of the config dialog window HFONT m_configDlgFont, m_configDlgBoldFont; SIZE m_szNick; // rectangle where the nick has been rendered, /* * these are used to store rectangles important to mouse tracking. */ RECT m_rcNick; RECT m_rcUIN; RECT m_rcStatus; uint32_t m_hoverFlags; CTip *m_tip; }; #endif /* __INFOPANEL_H */