#include "StdAfx.h" #include "ExtraImages.h" #include "IconLib.h" #include "EconomicRateInfo.h" #include "ModuleInfo.h" #include "QuotesProviders.h" #include "IQuotesProvider.h" #include "Log.h" #include "DBUtils.h" namespace { inline HANDLE extra_add_icon(const char* psz) { return reinterpret_cast( CallService(MS_CLIST_EXTRA_ADD_ICON,reinterpret_cast(Quotes_LoadIconEx(psz)),0)); } const HANDLE INVALID_IMAGE_HANDLE = reinterpret_cast(-1); } CExtraImages::CExtraImages() : m_hExtraIcons(ExtraIcon_Register(ICON_STR_QUOTE,QUOTES_PROTOCOL_NAME,Quotes_MakeIconName(ICON_STR_MAIN).c_str())), m_bExtraImagesInit(false), m_nSlot(DBGetContactSettingWord(NULL,QUOTES_PROTOCOL_NAME,DB_STR_QUOTE_EXTRA_IMAGE_SLOT,EXTRA_ICON_ADV1)) { m_ahExtraImages[eiUp] = INVALID_IMAGE_HANDLE; m_ahExtraImages[eiDown] = INVALID_IMAGE_HANDLE; m_ahExtraImages[eiNotChanged] = INVALID_IMAGE_HANDLE; } CExtraImages::~CExtraImages() { } CExtraImages& CExtraImages::GetInstance() { static CExtraImages s_ei; return s_ei; } void CExtraImages::RebuildExtraImages() { if(NULL == m_hExtraIcons) { m_bExtraImagesInit = false; CGuard cs(m_lmExtraImages); m_ahExtraImages[eiUp] = extra_add_icon(ICON_STR_QUOTE_UP); m_ahExtraImages[eiDown] = extra_add_icon(ICON_STR_QUOTE_DOWN); m_ahExtraImages[eiNotChanged] = extra_add_icon(ICON_STR_QUOTE_NOT_CHANGED); m_bExtraImagesInit = true; } } bool CExtraImages::SetContactExtraImage(HANDLE hContact,EImageIndex nIndex)const { // tstring s = Quotes_DBGetStringT(hContact,LIST_MODULE_NAME,CONTACT_LIST_NAME); // tostringstream o; // o << _T("SetContactExtraImage for ") << s << _T("\nExtra image list init: ") << m_bExtraImagesInit << _T("\n"); bool bResult = false; if(m_hExtraIcons) { // o << "Using extra icon interface\n"; std::string sIconName; switch(nIndex) { case eiUp: sIconName = Quotes_MakeIconName(ICON_STR_QUOTE_UP); break; case eiDown: sIconName = Quotes_MakeIconName(ICON_STR_QUOTE_DOWN); break; case eiNotChanged: sIconName = Quotes_MakeIconName(ICON_STR_QUOTE_NOT_CHANGED); break; } bResult = (0 == ExtraIcon_SetIcon(m_hExtraIcons,hContact,sIconName.c_str())); } else if(m_bExtraImagesInit && ServiceExists(MS_CLIST_EXTRA_ADD_ICON)) { // o << "Using contact list interface index is "; IconExtraColumn iec = {0}; iec.cbSize = sizeof(iec); iec.ColumnType = m_nSlot; { CGuard cs(m_lmExtraImages); switch(nIndex) { case eiUp: // o << "up\n"; iec.hImage = m_ahExtraImages[eiUp]; break; case eiDown: // o << "down\n"; iec.hImage = m_ahExtraImages[eiDown]; break; case eiNotChanged: // o << "not changed\n"; iec.hImage = m_ahExtraImages[eiNotChanged]; break; default: // o << "invalid\n"; iec.hImage = INVALID_IMAGE_HANDLE; break; } } bResult = (0 == CallService(MS_CLIST_EXTRA_SET_ICON,reinterpret_cast(hContact),reinterpret_cast(&iec))); } // o << "Result is " << bResult; // LogIt(Info,o.str()); return bResult; } int QuotesEventFunc_onExtraImageListRebuild(WPARAM /*wp*/,LPARAM /*lp*/) { if (ServiceExists(MS_CLIST_EXTRA_ADD_ICON)) { CExtraImages::GetInstance().RebuildExtraImages(); } return 0; } int QuotesEventFunc_onExtraImageApply(WPARAM wp,LPARAM lp) { HANDLE hContact = reinterpret_cast(wp); const CModuleInfo::TQuotesProvidersPtr& pProviders = CModuleInfo::GetQuoteProvidersPtr(); CQuotesProviders::TQuotesProviderPtr pProvider = pProviders->GetContactProviderPtr(hContact); if(pProvider) { pProvider->SetContactExtraIcon(hContact); } return 0; }