/*
Miranda NG SmileyAdd Plugin
Copyright (C) 2012 - 2015 Miranda NG project (http://miranda-ng.org)
Copyright (C) 2005 - 2011 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 .
*/
#ifndef SMILEYADD_SMILEYS_H_
#define SMILEYADD_SMILEYS_H_
#define MS_SMILEYADD_CUSTOMCATMENU "SmileyAdd/CustomCatMenu"
const unsigned HiddenSmiley = 1;
const unsigned RegExSmiley = 2;
const unsigned ServiceSmiley = 4;
const unsigned TextSmiley = 8;
const unsigned SoundSmiley = 16;
class SmileyType
{
protected:
unsigned m_flags;
int m_index;
SIZE m_size;
HICON m_SmileyIcon;
ImageBase* m_xepimg;
CMString m_filepath;
void SetFlagsBit(unsigned flag, bool set)
{ if (set) m_flags |= flag; else m_flags &= ~flag; }
public:
CMString m_TriggerText;
CMString m_ToolText;
CMString m_InsertText;
SmileyType(void);
~SmileyType();
const CMString& GetTriggerText(void) const { return m_TriggerText; }
const CMString& GetToolText(void) const { return m_ToolText; }
const CMString& GetInsertText(void) const { return m_InsertText; }
const CMString& GetFilePath(void) const { return m_filepath; }
bool IsHidden(void) const { return (m_flags & HiddenSmiley) != 0; }
bool IsRegEx(void) const { return (m_flags & RegExSmiley) != 0; }
bool IsService(void) const { return (m_flags & ServiceSmiley) != 0; }
bool IsSound(void) const { return (m_flags & SoundSmiley) != 0; }
bool IsText(void) const { return (m_flags & TextSmiley) != 0; }
bool IsFileFound(void) { return _taccess(m_filepath.c_str(), 0) == 0; }
bool IsValid(void) { return m_size.cx != 0; }
ImageBase* CreateCachedImage(void);
void GetSize(SIZE& size);
int GetStaticFrame(void) const { return m_index; }
HICON GetIcon(void);
HICON GetIconDup(void);
HBITMAP GetBitmap(COLORREF bkgClr, int sizeX, int sizeY);
void CallSmileyService(MCONTACT hContact);
void SetHidden(bool hid) { SetFlagsBit(HiddenSmiley, hid); }
void SetRegEx(bool regex) { SetFlagsBit(RegExSmiley, regex); }
void SetService(bool service) { SetFlagsBit(ServiceSmiley, service); }
void SetSound(bool sound) { SetFlagsBit(SoundSmiley, sound); }
void SetText(bool text) { SetFlagsBit(TextSmiley, text); }
void SetImList(HIMAGELIST hImLst, long i);
bool LoadFromResource(const CMString& file, const int index);
bool LoadFromImage(IStream* pStream);
};
template struct SMOBJLIST : public OBJLIST
{
SMOBJLIST() : OBJLIST(5) {};
SMOBJLIST& operator = (const SMOBJLIST& lst)
{
OBJLIST::destroy();
return operator += (lst);
}
SMOBJLIST& operator += (const SMOBJLIST& lst)
{
for (int i=0; i < lst.getCount(); i++) {
T *p = new T(lst[i]);
insert(p);
}
return *this;
}
void splice(SMOBJLIST& lst)
{
for (int i=0; i < lst.getCount(); i++)
insert(&lst[i]);
lst.LIST::destroy();
}
};
class SmileyLookup
{
private:
_TPattern* m_pattern;
int m_ind;
CMString m_text;
bool m_valid;
public:
struct SmileyLocType
{
size_t pos, len;
SmileyLocType(size_t p, size_t l) : pos(p), len(l) {}
SmileyLocType() {}
};
typedef SMOBJLIST SmileyLocVecType;
SmileyLookup() { m_ind = 0; m_valid = false; m_pattern = NULL; };
SmileyLookup(const CMString& str, const bool regexs, const int ind, const CMString& smpt);
~SmileyLookup();
void Find(const CMString& str, SmileyLocVecType& smlcur, bool firstOnly) const;
int GetIndex(void) const { return m_ind; }
bool IsValid(void) const { return m_valid; }
};
class SmileyPackType
{
public:
typedef SMOBJLIST SmileyVectorType;
typedef SMOBJLIST SmileyLookupType;
POINT selec, win;
private:
CMString m_Filename; //used as identification
CMString m_Name;
CMString m_Author;
CMString m_Date;
CMString m_Version;
CMString m_ButtonSmiley;
HIMAGELIST m_hSmList;
int m_VisibleCount;
SmileyVectorType m_SmileyList;
SmileyLookupType m_SmileyLookup;
bool errorFound;
void InsertLookup(SmileyType& sml, CMString& lk, bool first);
void AddTriggersToSmileyLookup(void);
void ReplaceAllSpecials(const CMString& Input, CMString& Output);
bool LoadSmileyFileMSL(CMString& tbuf, bool onlyInfo, CMString& modpath);
bool LoadSmileyFileXEP(CMString& tbuf, bool onlyInfo, CMString& modpath);
public:
SmileyPackType();
~SmileyPackType();
SmileyVectorType& GetSmileyList(void) { return m_SmileyList; }
SmileyLookupType* GetSmileyLookup(void) { return &m_SmileyLookup; }
const CMString& GetFilename(void) const { return m_Filename; }
const CMString& GetName(void) const { return m_Name; }
const CMString& GetAuthor(void) const { return m_Author; }
const CMString& GetDate(void) const { return m_Date; }
const CMString& GetVersion(void) const { return m_Version; }
int SmileyCount(void) const { return m_SmileyList.getCount(); }
int VisibleSmileyCount(void) const { return m_VisibleCount; }
SmileyType* GetSmiley(unsigned index);
const TCHAR* GetButtonSmiley(void) const { return m_ButtonSmiley.c_str(); }
bool LoadSmileyFile(const CMString& filename, const CMString& packname, bool onlyInfo, bool noerr = false);
void Clear(void);
};
class SmileyPackListType
{
public:
typedef SMOBJLIST SmileyPackVectorType;
private:
SmileyPackVectorType m_SmileyPacks;
public:
int NumberOfSmileyPacks(void) { return m_SmileyPacks.getCount(); }
bool AddSmileyPack(CMString& filename, CMString& packname );
void ClearAndFreeAll(void);
SmileyPackType* GetSmileyPack(CMString& filename);
};
typedef enum
{
smcNone,
smcStd,
smcProto,
smcVirtualProto,
smcTransportProto,
smcPhysProto,
smcCustom,
smcExt
} SmcType;
class SmileyCategoryType
{
private:
CMString m_Name;
CMString m_DisplayName;
CMString m_Filename; //functions as identification
SmcType type;
SmileyPackListType* m_pSmileyPackStore;
bool visible;
public:
SmileyCategoryType() { type = smcNone; m_pSmileyPackStore = NULL; visible = true; };
SmileyCategoryType(SmileyPackListType* pSPS, const CMString& name,
const CMString& displayName, const CMString& defaultFilename, SmcType typ);
const CMString& GetDisplayName(void) const { return m_DisplayName; }
const CMString& GetName(void) const { return m_Name; }
const CMString& GetFilename(void) const { return m_Filename; }
bool IsCustom(void) { return type == smcCustom; }
bool IsProto(void) { return type == smcProto || type == smcPhysProto || type == smcTransportProto || type == smcVirtualProto; }
bool IsAcc(void) { return type == smcProto; }
bool IsVirtual(void) { return type == smcVirtualProto; }
bool IsPhysProto(void) { return type == smcPhysProto; }
bool IsTransportProto(void) { return type == smcTransportProto; }
bool IsExt(void) { return type == smcExt; }
bool IsVisible(void) { return visible; }
SmcType GetType(void) { return type; }
SmileyPackType* GetSmileyPack(void);
void SetFilename(CMString& name) { m_Filename = name; }
void SetDisplayName(CMString& name) { m_DisplayName = name; }
void SetVisible(bool vis) { visible = vis; }
void ClearFilename(void) { m_Filename.Empty(); }
void SaveSettings(void);
void Load(void);
};
class SmileyCategoryListType
{
public:
typedef SMOBJLIST SmileyCategoryVectorType;
private:
SmileyCategoryVectorType m_SmileyCategories;
SmileyPackListType* m_pSmileyPackStore;
public:
void SetSmileyPackStore(SmileyPackListType* pSPS) { m_pSmileyPackStore = pSPS; }
SmileyCategoryType* GetSmileyCategory(const CMString& name);
SmileyCategoryType* GetSmileyCategory(unsigned index);
SmileyPackType* GetSmileyPack(CMString& name);
SmileyCategoryVectorType* GetSmileyCategoryList(void) { return &m_SmileyCategories; };
int NumberOfSmileyCategories(void) { return m_SmileyCategories.getCount(); }
void AddCategory(const CMString& name, const CMString& displayName, SmcType typ,
const CMString& defaultFilename = CMString(_T("Smileys\\nova\\default.msl")));
void AddAndLoad(const CMString& name, const CMString& displayName);
void AddAllProtocolsAsCategory(void);
void AddAccountAsCategory(PROTOACCOUNT *acc, const CMString& defaultFile);
void AddProtoAsCategory(char *acc, const CMString& defaultFile);
void AddContactTransportAsCategory(MCONTACT hContact, const CMString& defaultFile);
void ClearAndLoadAll(void);
void ClearAll(void)
{ m_pSmileyPackStore->ClearAndFreeAll(); m_SmileyCategories.destroy(); }
bool DeleteCustomCategory(int index);
void DeleteAccountAsCategory(PROTOACCOUNT *acc);
void SaveSettings(void);
};
extern SmileyPackListType g_SmileyPacks;
extern SmileyCategoryListType g_SmileyCategories;
#endif //SMILEYADD_SMILEYS_H_