1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef _FWL_NOTE_H 8 #define _FWL_NOTE_H 9 class IFWL_Target; 10 class IFWL_Widget; 11 class IFWL_NoteThread; 12 class IFWL_ThemeProvider; 13 class CFWL_Note; 14 class CFWL_Message; 15 class CFWL_MsgActivate; 16 class CFWL_MsgDeactivate; 17 class CFWL_MsgMouse; 18 class CFWL_MsgMouseWheel; 19 class CFWL_MsgKey; 20 class CFWL_MsgSetFocus; 21 class CFWL_MsgKillFocus; 22 class CFWL_MsgCursor; 23 class CFWL_MsgSize; 24 class CFWL_MsgWindowMove; 25 class CFWL_MsgDropFiles; 26 class CFWL_MsgTaskClicked; 27 class CFWL_MsgClose; 28 class CFWL_MsgWindowWillMove; 29 class CFWL_Event; 30 class CFWL_EvtMouse; 31 class CFWL_EvtMouseWheel; 32 class CFWL_EvtKey; 33 class CFWL_EvtSetFocus; 34 class CFWL_EvtKillFocus; 35 class CFWL_EvtDraw; 36 class CFWL_EvtClick; 37 class CFWL_EvtScroll; 38 class CFWL_EvtClose; 39 class CFWL_EvtContextMenu; 40 class CFWL_EvtMenuCommand; 41 class CFWL_EvtSizeChanged; 42 class CFWL_EvtIdle; 43 class IFWL_NoteDriver; 44 class IFWL_NoteLoop; 45 #define FWL_MSG_Activate L"FWL_MESSAGE_Activate" 46 #define FWL_MSG_Deactivate L"FWL_MESSAGE_Deactivate" 47 #define FWL_MSG_SetFocus L"FWL_MESSAGE_SetFocus" 48 #define FWL_MSG_KillFocus L"FWL_MESSAGE_KillFocus" 49 #define FWL_MSG_Mouse L"FWL_MESSAGE_Mouse" 50 #define FWL_MSG_MouseWheel L"FWL_MESSAGE_MouseWheel" 51 #define FWL_MSG_Key L"FWL_MESSAGE_Key" 52 #define FWL_MSG_Cursor L"FWL_MESSAGE_Cursor" 53 #define FWL_MSG_Size L"FWL_MESSAGE_Size" 54 #define FWL_MSG_WindowMove L"FWL_MESSAGE_WindowMove" 55 #define FWL_MSG_DropFiles L"FWL_MESSAGE_DropFiles" 56 #define FWL_MSG_TaskClicked L"FWL_MESSAGE_TaskClicked" 57 #define FWL_MSG_Close L"FWL_MESSAGE_Close" 58 #define FWL_MSG_Post L"FWL_MESSAGE_Post" 59 #define FWL_MSG_WindowWillMove L"FWL_MESSAGE_WindowWillMove" 60 #define FWL_MSGHASH_Activate 2410369469 61 #define FWL_MSGHASH_Deactivate 1184214790 62 #define FWL_MSGHASH_SetFocus 4174512504 63 #define FWL_MSGHASH_KillFocus 1557903832 64 #define FWL_MSGHASH_Mouse 706128309 65 #define FWL_MSGHASH_MouseWheel 893703466 66 #define FWL_MSGHASH_Key 3751372405 67 #define FWL_MSGHASH_Cursor 3182626218 68 #define FWL_MSGHASH_Size 160077735 69 #define FWL_MSGHASH_WindowMove 1032269377 70 #define FWL_MSGHASH_DropFiles 2004165236 71 #define FWL_MSGHASH_TaskClicked 3128231086 72 #define FWL_MSGHASH_Close 2977563906 73 #define FWL_MSGHASH_Post 1969633074 74 #define FWL_MSGHASH_WindowWillMove 2229175763 75 #define FWL_EVT_Mouse L"FWL_EVENT_Mouse" 76 #define FWL_EVT_MouseWheel L"FWL_EVENT_MouseWheel" 77 #define FWL_EVT_Key L"FWL_EVENT_Key" 78 #define FWL_EVT_SetFocus L"FWL_EVENT_SetFocus" 79 #define FWL_EVT_KillFocus L"FWL_EVENT_KillFocus" 80 #define FWL_EVT_Click L"FWL_EVENT_Click" 81 #define FWL_EVT_Draw L"FWL_EVENT_Draw" 82 #define FWL_EVT_Scroll L"FWL_EVENT_Scroll" 83 #define FWL_EVT_Close L"FWL_EVENT_Close" 84 #define FWL_EVT_ContextMenu L"FWL_EVENT_ContextMenu" 85 #define FWL_EVT_MenuCommand L"FWL_EVENT_MenuCommand" 86 #define FWL_EVT_SizeChanged L"FWL_EVENT_SizeChanged" 87 #define FWL_EVTHASH_Mouse 1765258002 88 #define FWL_EVTHASH_MouseWheel 3907114407 89 #define FWL_EVTHASH_Key 2408354450 90 #define FWL_EVTHASH_SetFocus 3909721269 91 #define FWL_EVTHASH_KillFocus 1779363253 92 #define FWL_EVTHASH_Draw 2430713303 93 #define FWL_EVTHASH_Click 4026328783 94 #define FWL_EVTHASH_Scroll 2965158968 95 #define FWL_EVTHASH_Close 4036693599 96 #define FWL_EVTHASH_ContextMenu 2717307715 97 #define FWL_EVTHASH_MenuCommand 497763741 98 #define FWL_EVTHASH_SizeChanged 3083958510 99 #define FWL_EVTHASH_Idle 839546759 100 #define FWL_MSGMOUSECMD_LButtonDown 1 101 #define FWL_MSGMOUSECMD_LButtonUp 2 102 #define FWL_MSGMOUSECMD_LButtonDblClk 3 103 #define FWL_MSGMOUSECMD_RButtonDown 4 104 #define FWL_MSGMOUSECMD_RButtonUp 5 105 #define FWL_MSGMOUSECMD_RButtonDblClk 6 106 #define FWL_MSGMOUSECMD_MButtonDown 7 107 #define FWL_MSGMOUSECMD_MButtonUp 8 108 #define FWL_MSGMOUSECMD_MButtonDblClk 9 109 #define FWL_MSGMOUSECMD_MouseMove 10 110 #define FWL_MSGMOUSECMD_MouseEnter 11 111 #define FWL_MSGMOUSECMD_MouseLeave 12 112 #define FWL_MSGMOUSECMD_MouseHover 13 113 #define FWL_MSGKEYCMD_KeyDown 1 114 #define FWL_MSGKEYCMD_KeyUp 2 115 #define FWL_MSGKEYCMD_Char 3 116 #define FWL_KEYFLAG_Ctrl (1 << 0) 117 #define FWL_KEYFLAG_Alt (1 << 1) 118 #define FWL_KEYFLAG_Shift (1 << 2) 119 #define FWL_KEYFLAG_Command (1 << 3) 120 #define FWL_KEYFLAG_LButton (1 << 4) 121 #define FWL_KEYFLAG_RButton (1 << 5) 122 #define FWL_KEYFLAG_MButton (1 << 6) 123 124 // Separate hierarchy not related to IFWL_* hierarchy. These should not 125 // get cast to IFWL_* types. 126 class CFWL_Note { 127 public: 128 virtual FX_DWORD Release() { 129 m_dwRefCount--; 130 FX_DWORD dwRefCount = m_dwRefCount; 131 if (!m_dwRefCount) { 132 delete this; 133 } 134 return dwRefCount; 135 } 136 virtual CFWL_Note* Retain() { 137 m_dwRefCount++; 138 return this; 139 } 140 virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const { 141 wsClass = L"CFWL_Note"; 142 return FWL_ERR_Succeeded; 143 } 144 virtual FX_DWORD GetClassID() const { return 0; } 145 virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const { 146 return TRUE; 147 } 148 virtual CFWL_Note* Clone() { return NULL; } 149 FX_BOOL IsEvent() const { return m_bIsEvent; } 150 IFWL_Widget* m_pSrcTarget; 151 IFWL_Widget* m_pDstTarget; 152 153 protected: 154 CFWL_Note(FX_BOOL bIsEvent) 155 : m_pSrcTarget(NULL), 156 m_pDstTarget(NULL), 157 m_dwRefCount(1), 158 m_bIsEvent(bIsEvent), 159 m_dwExtend(0) {} 160 virtual ~CFWL_Note() {} 161 virtual FX_BOOL Initialize() { return TRUE; } 162 virtual int32_t Finalize() { return 0; } 163 FX_DWORD m_dwRefCount; 164 FX_BOOL m_bIsEvent; 165 166 public: 167 FX_DWORD m_dwExtend; 168 }; 169 class CFWL_Message : public CFWL_Note { 170 public: 171 CFWL_Message() : CFWL_Note(FALSE) {} 172 virtual ~CFWL_Message() {} 173 }; 174 #define BEGIN_FWL_MESSAGE_DEF(classname, msghashcode) \ 175 class classname : public CFWL_Message { \ 176 public: \ 177 classname() : CFWL_Message() {} \ 178 virtual CFWL_Note* Clone() { return new classname(*this); } \ 179 virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const { \ 180 wsClass = L## #classname; \ 181 return FWL_ERR_Succeeded; \ 182 } \ 183 virtual FX_DWORD GetClassID() const { return msghashcode; } 184 #define END_FWL_MESSAGE_DEF \ 185 } \ 186 ; 187 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgActivate, FWL_MSGHASH_Activate) 188 END_FWL_MESSAGE_DEF 189 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgDeactivate, FWL_MSGHASH_Deactivate) 190 END_FWL_MESSAGE_DEF 191 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgMouse, FWL_MSGHASH_Mouse) 192 FX_FLOAT m_fx; 193 FX_FLOAT m_fy; 194 FX_DWORD m_dwFlags; 195 FX_DWORD m_dwCmd; 196 END_FWL_MESSAGE_DEF 197 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgMouseWheel, FWL_MSGHASH_MouseWheel) 198 FX_FLOAT m_fx; 199 FX_FLOAT m_fy; 200 FX_FLOAT m_fDeltaX; 201 FX_FLOAT m_fDeltaY; 202 FX_DWORD m_dwFlags; 203 END_FWL_MESSAGE_DEF 204 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgSetFocus, FWL_MSGHASH_SetFocus) 205 IFWL_Widget* m_pKillFocus; 206 END_FWL_MESSAGE_DEF 207 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgKillFocus, FWL_MSGHASH_KillFocus) 208 IFWL_Widget* m_pSetFocus; 209 END_FWL_MESSAGE_DEF 210 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgKey, FWL_MSGHASH_Key) 211 FX_DWORD m_dwKeyCode; 212 FX_DWORD m_dwFlags; 213 FX_DWORD m_dwCmd; 214 END_FWL_MESSAGE_DEF 215 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgCursor, FWL_MSGHASH_Cursor) 216 END_FWL_MESSAGE_DEF 217 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgSize, FWL_MSGHASH_Size) 218 int32_t m_iWidth; 219 int32_t m_iHeight; 220 END_FWL_MESSAGE_DEF 221 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgWindowMove, FWL_MSGHASH_WindowMove) 222 FX_FLOAT m_fx; 223 FX_FLOAT m_fy; 224 END_FWL_MESSAGE_DEF 225 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgDropFiles, FWL_MSGHASH_DropFiles) 226 CFWL_MsgDropFiles(const CFWL_MsgDropFiles& copy) { 227 m_pDstTarget = copy.m_pDstTarget; 228 m_pSrcTarget = copy.m_pSrcTarget; 229 m_fx = copy.m_fx; 230 m_fy = copy.m_fy; 231 m_files.Append(copy.m_files); 232 } 233 FX_FLOAT m_fx; 234 FX_FLOAT m_fy; 235 CFX_WideStringArray m_files; 236 END_FWL_MESSAGE_DEF 237 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgTaskClicked, FWL_MSGHASH_TaskClicked) 238 FX_FLOAT m_fx; 239 FX_FLOAT m_fy; 240 END_FWL_MESSAGE_DEF 241 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgClose, FWL_MSGHASH_Close) 242 END_FWL_MESSAGE_DEF 243 BEGIN_FWL_MESSAGE_DEF(CFWL_MsgWindowWillMove, FWL_MSGHASH_WindowWillMove) 244 END_FWL_MESSAGE_DEF 245 class CFWL_Event : public CFWL_Note { 246 public: 247 CFWL_Event() : CFWL_Note(TRUE) {} 248 virtual ~CFWL_Event() {} 249 }; 250 #define BEGIN_FWL_EVENT_DEF(classname, eventhashcode) \ 251 class classname : public CFWL_Event { \ 252 public: \ 253 classname() : CFWL_Event() {} \ 254 virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const { \ 255 wsClass = L## #classname; \ 256 return FWL_ERR_Succeeded; \ 257 } \ 258 virtual FX_DWORD GetClassID() const { return eventhashcode; } 259 #define END_FWL_EVENT_DEF \ 260 } \ 261 ; 262 BEGIN_FWL_EVENT_DEF(CFWL_EvtMouse, FWL_EVTHASH_Mouse) 263 FX_FLOAT m_fx; 264 FX_FLOAT m_fy; 265 FX_DWORD m_dwFlags; 266 FX_DWORD m_dwCmd; 267 END_FWL_EVENT_DEF 268 BEGIN_FWL_EVENT_DEF(CFWL_EvtMouseWheel, FWL_EVTHASH_MouseWheel) 269 FX_FLOAT m_fx; 270 FX_FLOAT m_fy; 271 FX_FLOAT m_fDeltaX; 272 FX_FLOAT m_fDeltaY; 273 FX_DWORD m_dwFlags; 274 END_FWL_EVENT_DEF 275 BEGIN_FWL_EVENT_DEF(CFWL_EvtKey, FWL_EVTHASH_Key) 276 FX_DWORD m_dwKeyCode; 277 FX_DWORD m_dwFlags; 278 FX_DWORD m_dwCmd; 279 END_FWL_EVENT_DEF 280 BEGIN_FWL_EVENT_DEF(CFWL_EvtSetFocus, FWL_EVTHASH_SetFocus) 281 IFWL_Widget* m_pSetFocus; 282 END_FWL_EVENT_DEF 283 BEGIN_FWL_EVENT_DEF(CFWL_EvtKillFocus, FWL_EVTHASH_KillFocus) 284 IFWL_Widget* m_pKillFocus; 285 END_FWL_EVENT_DEF 286 BEGIN_FWL_EVENT_DEF(CFWL_EvtDraw, FWL_EVTHASH_Draw) 287 CFX_Graphics* m_pGraphics; 288 IFWL_Widget* m_pWidget; 289 END_FWL_EVENT_DEF 290 BEGIN_FWL_EVENT_DEF(CFWL_EvtClick, FWL_EVTHASH_Click) 291 END_FWL_EVENT_DEF 292 BEGIN_FWL_EVENT_DEF(CFWL_EvtScroll, FWL_EVTHASH_Scroll) 293 FX_DWORD m_iScrollCode; 294 FX_FLOAT m_fPos; 295 FX_BOOL* m_pRet; 296 END_FWL_EVENT_DEF 297 BEGIN_FWL_EVENT_DEF(CFWL_EvtClose, FWL_EVTHASH_Close) 298 END_FWL_EVENT_DEF 299 BEGIN_FWL_EVENT_DEF(CFWL_EvtContextMenu, FWL_EVTHASH_ContextMenu) 300 FX_FLOAT m_fPosX; 301 FX_FLOAT m_fPosY; 302 IFWL_Widget* m_pOwner; 303 END_FWL_EVENT_DEF 304 BEGIN_FWL_EVENT_DEF(CFWL_EvtMenuCommand, FWL_EVTHASH_MenuCommand) 305 int32_t m_iCommand; 306 void* m_pData; 307 END_FWL_EVENT_DEF 308 BEGIN_FWL_EVENT_DEF(CFWL_EvtSizeChanged, FWL_EVTHASH_SizeChanged) 309 IFWL_Widget* m_pWidget; 310 CFX_RectF m_rtOld; 311 CFX_RectF m_rtNew; 312 END_FWL_MESSAGE_DEF 313 BEGIN_FWL_EVENT_DEF(CFWL_EvtIdle, FWL_EVTHASH_Idle) 314 END_FWL_EVENT_DEF 315 typedef enum { 316 FWL_EVENT_MOUSE_MASK = 1 << 0, 317 FWL_EVENT_MOUSEWHEEL_MASK = 1 << 1, 318 FWL_EVENT_KEY_MASK = 1 << 2, 319 FWL_EVENT_FOCUSCHANGED_MASK = 1 << 3, 320 FWL_EVENT_DRAW_MASK = 1 << 4, 321 FWL_EVENT_CLOSE_MASK = 1 << 5, 322 FWL_EVENT_SIZECHANGED_MASK = 1 << 6, 323 FWL_EVENT_IDLE_MASK = 1 << 7, 324 FWL_EVENT_CONTROL_MASK = 1 << 8, 325 FWL_EVENT_ALL_MASK = 0xFF 326 } FWLEventMask; 327 class IFWL_NoteDriver { 328 public: 329 virtual ~IFWL_NoteDriver() {} 330 virtual FX_BOOL SendNote(CFWL_Note* pNote) = 0; 331 virtual FX_BOOL PostMessage(CFWL_Message* pMessage) = 0; 332 virtual FWL_ERR RegisterEventTarget( 333 IFWL_Widget* pListener, 334 IFWL_Widget* pEventSource = NULL, 335 FX_DWORD dwFilter = FWL_EVENT_ALL_MASK) = 0; 336 virtual FWL_ERR UnregisterEventTarget(IFWL_Widget* pListener) = 0; 337 virtual void ClearEventTargets(FX_BOOL bRemoveAll) = 0; 338 virtual int32_t GetQueueMaxSize() const = 0; 339 virtual FWL_ERR SetQueueMaxSize(const int32_t size) = 0; 340 virtual IFWL_NoteThread* GetOwnerThread() const = 0; 341 virtual FWL_ERR PushNoteLoop(IFWL_NoteLoop* pNoteLoop) = 0; 342 virtual IFWL_NoteLoop* PopNoteLoop() = 0; 343 virtual IFWL_Widget* GetFocus() = 0; 344 virtual FX_BOOL SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify = FALSE) = 0; 345 virtual void SetGrab(IFWL_Widget* pGrab, FX_BOOL bSet) = 0; 346 virtual FWL_ERR Run() = 0; 347 }; 348 IFWL_Widget* FWL_GetCurrentThreadModalWidget(IFWL_NoteThread* pNoteThread); 349 class IFWL_NoteLoop { 350 public: 351 virtual ~IFWL_NoteLoop() {} 352 virtual FX_BOOL PreProcessMessage(CFWL_Message* pMessage) = 0; 353 virtual FWL_ERR Idle(int32_t count) = 0; 354 }; 355 class IFWL_ToolTipTarget { 356 public: 357 virtual ~IFWL_ToolTipTarget() {} 358 virtual IFWL_Widget* GetWidget() = 0; 359 virtual FX_BOOL IsShowed() = 0; 360 virtual FWL_ERR DrawToolTip(CFX_Graphics* pGraphics, 361 const CFX_Matrix* pMatrix, 362 IFWL_Widget* pToolTip) = 0; 363 virtual FX_BOOL UseDefaultTheme() = 0; 364 virtual FWL_ERR GetCaption(CFX_WideString& wsCaption) = 0; 365 virtual FWL_ERR GetToolTipSize(CFX_SizeF& sz) = 0; 366 virtual FWL_ERR GetToolTipPos(CFX_PointF& pt) { return FWL_ERR_Indefinite; } 367 }; 368 FWL_ERR FWL_AddToolTipTarget(IFWL_ToolTipTarget* pTarget); 369 FWL_ERR FWL_RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget); 370 FWL_ERR FWL_SetToolTipInitialDelay(int32_t iDelayTime); 371 FWL_ERR FWL_SetToolTipAutoPopDelay(int32_t iDelayTime); 372 typedef FX_BOOL (*FWLMessageHookCallback)(CFWL_Message* msg, void* info); 373 FWL_ERR FWL_SetHook(IFWL_NoteDriver* driver, 374 FWLMessageHookCallback callback, 375 void* info); 376 #endif 377