/* Miranda SmileyAdd Plugin Copyright (C) 2005 - 2009 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 . */ #include #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 typedef struct { unsigned cbSize; //size of the structure 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", "MSN" //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 HANDLE hContact; //Contact handle } SMADD_RICHEDIT3; //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 MS_SMILEYADD_REPLACESMILEYS "SmileyAdd/ReplaceSmileys" typedef struct { unsigned cbSize; //size of the structure char* Protocolname; //protocol to use... if you have defined a protocol, you can //use your own protocol name. Smiley add will automatically //select the smileypack that is defined for your protocol. //Or, use "Standard" for standard smiley set. Or "ICQ", "MSN" //if you prefer those icons. //If not found or NULL: "Standard" will be used int xPosition; //Postition to place the selectwindow int yPosition; // " int Direction; //Direction (i.e. size upwards/downwards/etc) of the window 0, 1, 2, 3 HWND hwndTarget; //Window, where to send the message when smiley is selected. UINT targetMessage; //Target message, to be sent. LPARAM targetWParam; //Target WParam to be sent (LParam will be char* to select smiley) //see the example file. HWND hwndParent; //Parent window for smiley dialog HANDLE hContact; //Contact handle } SMADD_SHOWSEL3; //Show smiley selection window //wParam = (WPARAM) 0; not used //lParam = (LPARAM) (SMADD_SHOWSEL3*) &smre; //pointer to SMADD_SHOWSEL3 //return: TRUE if API succeeded (all parameters were valid) , FALSE if not. #define MS_SMILEYADD_SHOWSELECTION "SmileyAdd/ShowSmileySelection" typedef struct { unsigned cbSize; //size of the structure 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 HANDLE hContact; //Contact handle } SMADD_INFO2; //get 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. #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" #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 #if defined _UNICODE || defined UNICODE #define SAFL_TCHAR SAFL_UNICODE #else #define SAFL_TCHAR 0 #endif typedef struct { unsigned cbSize; //size of the structure 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", "MSN" //if you prefer those icons. //If not found or NULL: "Standard" will be used union { TCHAR* str; //String to parse char* astr; wchar_t* wstr; }; 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 HANDLE hContact; //Contact handle } SMADD_BATCHPARSE2; typedef struct { 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 TCHAR* filepath; const char* afilepath; const wchar_t* wfilepath; HICON hIcon; //User responsible for destroying icon handle }; } SMADD_BATCHPARSERES; //find 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 MS_SMILEYADD_BATCHPARSE "SmileyAdd/BatchParse" //Free 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" typedef struct { unsigned cbSize; //size of the structure char* name; //smiley category name for reference char* dispname; //smiley category name for display } SMADD_REGCAT; //Register smiley category //wParam = (WPARAM) 0; not used //lParam = (LPARAM) (SMADD_REGCAT*) &smgp; pointer to SMADD_REGCAT #define MS_SMILEYADD_REGISTERCATEGORY "SmileyAdd/RegisterCategory" //Register smiley category //wParam = (WPARAM) 0; not used //lParam = (LPARAM) Pointer to protocol name or NULL for all; #define MS_SMILEYADD_RELOAD "SmileyAdd/Reload" #ifndef MIID_SMILEY // {E03C71B2-6DEE-467e-A4F0-DD516745876A} #define MIID_SMILEY { 0xe03c71b2, 0x6dee, 0x467e, { 0xa4, 0xf0, 0xdd, 0x51, 0x67, 0x45, 0x87, 0x6a } } #endif /** 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_INVALIDATE 3 (not supported) //#define FVCA_SENDVIEWCHANGE 4 (not supported) #define FVCA_SKIPDRAW 5 // Extended NMHDR structure for WM_NOTIFY typedef struct { //NMHDR structure HWND hwndFrom; // Window of smiley host UINT idFrom; // ignored UINT code; // NM_FIREVIEWCHANGE size_t cbSize; 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 } FVCNDATA_NMHDR; // Code of WM_NOTIFY message (code) #define NM_FIREVIEWCHANGE NM_FIRST+1; typedef struct { unsigned cbSize; // size of the structure HANDLE hContact; int type; // 0 - directory, 1 - file; TCHAR* path; // smiley category name for reference } SMADD_CONT; //Loads all smileys for the contact //wParam = (WPARAM) 0; not used //lParam = (LPARAM) (SMADD_CONT*) &dir; // pointer to directory to load smiley from #define MS_SMILEYADD_LOADCONTACTSMILEYS "SmileyAdd/LoadContactSmileys"