/* Miranda SmileyAdd Plugin Copyright (C) 2005 - 2010 Boris Krasnovskiy Copyright (C) 2003 - 2004 Rein-Peter de Boer 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 version 2 of the License. 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, see . */ #pragma once #include ///////////////////////////////////////////////////////////////////////////////////////// // Replace smileys in a rich edit control... // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_RICHEDIT3*) &smre; //pointer to SMADD_RICHEDIT3 // return: TRUE if API succeeded (all parameters were valid) , FALSE if not. #define SAFLRE_INSERTEMF 2 // insert smiley as EMF into RichEdit, otherwise bitmap inserted // this flag allows "true" transparency #define SAFLRE_OUTGOING 4 // Parsing outgoing message #define SAFLRE_NOCUSTOM 8 // Do not use custom smileys #define SAFLRE_FIREVIEW 16 // use NM_FIREVIEWCHANGE messages struct SMADD_RICHEDIT { HWND hwndRichEditControl; // handle to the rich edit control CHARRANGE *rangeToReplace; // same meaning as for normal Richedit use (NULL = replaceall) const char *Protocolname; // protocol to use... if you have defined a protocol, u can // use your own protocol name. SmileyAdd will automatically // select the smileypack that is defined for your protocol. // Or, use "Standard" for standard smiley set. Or "ICQ" // if you prefer those icons. // If not found or NULL, "Standard" will be used unsigned flags; // Flags (SAFLRE_*) that define the behaivior BOOL disableRedraw; // Parameter have been depricated, have no effect on operation MCONTACT hContact; // Contact handle }; #define MS_SMILEYADD_REPLACESMILEYS "SmileyAdd/ReplaceSmileys" ///////////////////////////////////////////////////////////////////////////////////////// // gets button smiley icon // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_INFO2*) &smgi; //pointer to SMADD_INFO2 // return: TRUE if API succeeded (all parameters were valid) , FALSE if not. struct SMADD_INFO { char *Protocolname; HICON ButtonIcon; // RETURN VALUE: this is filled with the icon handle // of the smiley that can be used on the button // if used with GETINFO2 handle must be destroyed by user! // NULL if the buttonicon is not defined... int NumberOfVisibleSmileys; // Number of visible smileys defined. int NumberOfSmileys; // Number of total smileys defined }; #define MS_SMILEYADD_GETINFO "SmileyAdd/GetInfo" #define MS_SMILEYADD_GETINFO2 "SmileyAdd/GetInfo2" ///////////////////////////////////////////////////////////////////////////////////////// // Event notifies that SmileyAdd options have changed // Message dialogs usually need to redraw it's content on reception of this event // wParam = Contact handle which options have changed, NULL if global options changed // lParam = (LPARAM) 0; not used #define ME_SMILEYADD_OPTIONSCHANGED "SmileyAdd/OptionsChanged" ///////////////////////////////////////////////////////////////////////////////////////// // finds all smileys in text, API parses the provided text and returns all smileys found // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_BATCHPARSE2*) &smgp; //pointer to SMADD_BATCHPARSE2 // function returns pointer to array SMADD_BATCHPARSERES records for each smiley found // if no smileys found NULL is returned // if non NULL value returned pointer must be freed with MS_SMILEYADD_BATCHFREE API #define SAFL_PATH 1 // provide smiley file path, icon otherwise #define SAFL_UNICODE 2 // string fields in OPTIONSDIALOGPAGE are WCHAR* #define SAFL_OUTGOING 4 // Parsing outgoing message #define SAFL_NOCUSTOM 8 // Do not use custom smileys struct SMADD_BATCHPARSE { const char *Protocolname; // protocol to use... if you have defined a protocol, u can // use your own protocol name. Smiley add wil automatically // select the smileypack that is defined for your protocol. // Or, use "Standard" for standard smiley set. Or "ICQ" // if you prefer those icons. // If not found or NULL: "Standard" will be used MAllCStrings str; // A text to parse unsigned flag; // One of the SAFL_ flags specifies parsing requirements // This parameter should be filled by the user unsigned numSmileys; // Number of Smileys found, this parameter filled by SmileyAdd unsigned oflag; // One of the SAFL_ flags specifies content of the parse results // this parameter filled by SmileyAdd MCONTACT hContact; // Contact handle }; struct SMADD_BATCHPARSERES { unsigned startChar; // Starting smiley character // Because of iterative nature of the API caller should set this // parameter to correct value unsigned size; // Number of characters in smiley (0 if not found) // Because of iterative nature of the API caller should set this // parameter to correct value union { const wchar_t *filepath; HICON hIcon; // User is responsible for destroying icon handle }; }; #define MS_SMILEYADD_BATCHPARSE "SmileyAdd/BatchParse" ///////////////////////////////////////////////////////////////////////////////////////// // Frees memory allocated by MS_SMILEYADD_BATCHPARSE // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_BATCHPARSERES*) &smgp; //pointer to SMADD_BATCHPARSERES #define MS_SMILEYADD_BATCHFREE "SmileyAdd/BatchFree" ///////////////////////////////////////////////////////////////////////////////////////// // Register smiley category // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_REGCAT*) &smgp; pointer to SMADD_REGCAT struct SMADD_REGCAT { char *name; // smiley category name for reference char *dispname; // smiley category name for display }; #define MS_SMILEYADD_REGISTERCATEGORY "SmileyAdd/RegisterCategory" ///////////////////////////////////////////////////////////////////////////////////////// // Reloads smiley category // wParam = (WPARAM) 0; not used // lParam = (LPARAM) Pointer to protocol name or NULL for all; #define MS_SMILEYADD_RELOAD "SmileyAdd/Reload" /** NM_FIREVIEWCHANGE is WM_NOTIFY Message for notify parent of host window about smiley are going to be repaint The proposed action is next: Owner of RichEdit windows received NM_FIREVIEWCHANGE through WM_NOTIFY twice first time before painting|invalidating (FVCN_PREFIRE) and second time - after (FVCN_POSTFIRE). The Owner window may change any values of received FVCNDATA_NMHDR structure in order to raise needed action. For example it may substitute FVCA_INVALIDATE to FVCA_CUSTOMDRAW event to force painting on self offscreen context. It can be: FVCA_CUSTOMDRAW - in this case you need to provide valid HDC to draw on and valid RECT of smiley FVCA_INVALIDATE - to invalidate specified rect of window FVCA_NONE - skip any action. But be aware - animation will be stopped till next repainting of smiley. FVCA_SENDVIEWCHANGE - to notify richedit ole about object changed. Be aware Richedit will fully reconstruct itself Another point is moment of received smiley rect - it is only valid if FVCA_DRAW is initially set, and it is PROBABLY valid if FVCA_INVALIDATE is set. And it most probably invalid in case of FVCA_SENDVIEWCHANGE. The smiley position is relative last full paint HDC. Usually it is relative to top-left corner of host richedit (NOT it client area) in windows coordinates. */ // Type of Event one of #define FVCN_PREFIRE 1 #define FVCN_POSTFIRE 2 // Action of event are going to be done #define FVCA_NONE 0 #define FVCA_DRAW 1 // do not modify hdc in case of _DRAW, Use _CUSTOMDRAW #define FVCA_CUSTOMDRAW 2 #define FVCA_SKIPDRAW 5 // Extended NMHDR structure for WM_NOTIFY struct FVCNDATA_NMHDR { //NMHDR structure HWND hwndFrom; // Window of smiley host UINT_PTR idFrom; // ignored UINT code; // NM_FIREVIEWCHANGE BYTE bEvent; // FVCN_ value - pre- or post- painting BYTE bAction; // FVCA_ keys HDC hDC; // Canvas to draw on RECT rcRect; // Valid/should be in case of FVCA_DRAW COLORREF clrBackground; // color to fill background if fTransparent is not set BOOL fTransparent; // if need to fill back color (not supported) LPARAM lParam; // used by host window PreFire and PostFire event }; // Code of WM_NOTIFY message (code) #define NM_FIREVIEWCHANGE NM_FIRST+1; ///////////////////////////////////////////////////////////////////////////////////////// // Loads all smileys for the contact // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_CONT*) &dir; // pointer to directory to load smiley from #define SMADD_SMILEPACK 0 #define SMADD_FILE 1 #define SMADD_FOLDER 2 struct SMADD_CONT { int type; // SMADD_* constant const char *pszModule; // module name const wchar_t *path; // smiley category name for reference }; void __forceinline SmileyAdd_LoadContactSmileys(int type, const char *pszModule, const wchar_t *path) { SMADD_CONT cont = { type, pszModule, path }; CallService("SmileyAdd/LoadContactSmileys", 0, LPARAM(&cont)); } ///////////////////////////////////////////////////////////////////////////////////////// // Displays SmileyTool window to choose a smiley // wParam = (WPARAM) 0; not used // lParam = (LPARAM) (SMADD_SELECTSMILEY*) ¶m; struct SMADD_SELECTSMILEY { const char *pszSmileys; // list of smileys or zero to display all pack int xPosition; int yPosition; int direction; HWND hWndTarget; HWND hWndParent; UINT targetMessage; WPARAM targetWParam; }; #define MS_SMILEYADD_SELECTSMILEY "SmileyAdd/SelectSmiley"