/*
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"