From 162e60d66c78bd51aa44c691fe4f4e2f1deb990f Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sat, 19 May 2012 14:24:27 +0000 Subject: added Quotes git-svn-id: http://svn.miranda-ng.org/main/trunk@76 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Quotes/QuotesProviderFinance.cpp | 318 +++++++++++++++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100644 plugins/Quotes/QuotesProviderFinance.cpp (limited to 'plugins/Quotes/QuotesProviderFinance.cpp') diff --git a/plugins/Quotes/QuotesProviderFinance.cpp b/plugins/Quotes/QuotesProviderFinance.cpp new file mode 100644 index 0000000000..442869deeb --- /dev/null +++ b/plugins/Quotes/QuotesProviderFinance.cpp @@ -0,0 +1,318 @@ +#include "stdafx.h" +#include "QuotesProviderFinance.h" +#include "EconomicRateInfo.h" +#include "DBUtils.h" +#include "QuotesProviderVisitor.h" +#include "ModuleInfo.h" +#include "QuotesProviders.h" +#include "CommonOptionDlg.h" +#include "resource.h" +#include "WinCtrlHelper.h" + +void CQuotesProviderFinance::GetWatchedQuotes(TQuotes& raQuotes)const +{ + raQuotes.clear(); + BOOST_FOREACH(HANDLE hContact,m_aContacts) + { + tstring sID = Quotes_DBGetStringT(hContact,QUOTES_MODULE_NAME,DB_STR_QUOTE_ID); + tstring sSymbol = Quotes_DBGetStringT(hContact,QUOTES_MODULE_NAME,DB_STR_QUOTE_SYMBOL,sID.c_str()); + tstring sDescr = Quotes_DBGetStringT(hContact,QUOTES_MODULE_NAME,DB_STR_QUOTE_DESCRIPTION); + CQuotesProviderBase::CQuote quote(sID,sSymbol,sDescr); + + raQuotes.push_back(quote); + } +} + +namespace +{ + inline tstring get_quote_id(HANDLE hContact) + { + return Quotes_DBGetStringT(hContact,QUOTES_MODULE_NAME,DB_STR_QUOTE_ID); + } + + inline bool is_quote_id_equal(HANDLE hContact,const tstring& sID) + { + return sID == get_quote_id(hContact); + } +} + +bool CQuotesProviderFinance::WatchForQuote(const CQuote& rQuote,bool bWatch) +{ + const tstring& sQuoteID = rQuote.GetID(); + TContracts::iterator i = std::find_if(m_aContacts.begin(),m_aContacts.end(), + boost::bind(is_quote_id_equal,_1,sQuoteID)); + + if((false == bWatch) && (i != m_aContacts.end())) + { + HANDLE hContact = *i; + {// for CCritSection + CGuard cs(m_cs); + m_aContacts.erase(i); + } + + CallService(MS_DB_CONTACT_DELETE,reinterpret_cast(hContact),0); + return true; + } + else if((true == bWatch) && (i == m_aContacts.end())) + { + HANDLE hContact = CreateNewContact(rQuote.GetSymbol()); + if(hContact) + { + DBWriteContactSettingTString(hContact,QUOTES_PROTOCOL_NAME,DB_STR_QUOTE_ID,sQuoteID.c_str()); + if(false == rQuote.GetName().empty()) + { + DBWriteContactSettingTString(hContact,QUOTES_PROTOCOL_NAME,DB_STR_QUOTE_DESCRIPTION,rQuote.GetName().c_str()); + } + + return true; + } + } + + return false; +} + +HANDLE CQuotesProviderFinance::GetContactByQuoteID(const tstring& rsQuoteID)const +{ + CGuard cs(m_cs); + + TContracts::const_iterator i = std::find_if(m_aContacts.begin(),m_aContacts.end(), + boost::bind(std::equal_to(),rsQuoteID,boost::bind(get_quote_id,_1))); + if(i != m_aContacts.end()) + { + return *i; + } + else + { + return NULL; + } +} + +void CQuotesProviderFinance::Accept(CQuotesProviderVisitor& visitor)const +{ + CQuotesProviderBase::Accept(visitor); + visitor.Visit(*this); +} + +namespace +{ + inline tstring make_quote_name(const CQuotesProviderBase::CQuote& rQuote) + { + const tstring& rsDesc = rQuote.GetName(); + return((false == rsDesc.empty()) ? rsDesc : rQuote.GetSymbol()); + } + + int add_quote_to_wnd(const CQuotesProviderBase::CQuote& rQuote,HWND hwnd) + { + tstring sName = make_quote_name(rQuote); + int nIndex = ::SendMessage(hwnd,LB_ADDSTRING,0,reinterpret_cast(sName.c_str())); + if(nIndex >= 0) + { + CQuotesProviderBase::CQuote* pQuote = new CQuotesProviderBase::CQuote(rQuote); + if(LB_ERR == ::SendMessage(hwnd,LB_SETITEMDATA,nIndex,reinterpret_cast(pQuote))) + { + delete pQuote; + } + } + return nIndex; + } + +// typedef CQuotesProviderFinance::TQuotes TQuotes; +// TQuotes g_aWatchedQuotes; + +// inline bool cmp_quotes(const tstring& rsQuoteId,const CQuotesProviderBase::CQuote& quote) +// { +// return (0 == quotes_stricmp(rsQuoteId.c_str(),quote.GetID().c_str())); +// } + + CQuotesProviderBase::CQuote* get_quote_ptr_from_lb_index(HWND hwndListBox,int nIndex) + { + LRESULT lResult = ::SendMessage(hwndListBox,LB_GETITEMDATA,nIndex,0); + return (((LB_ERR != lResult) && (0 != lResult)) ? (reinterpret_cast(lResult)) : nullptr); + } + + int is_quote_added(HWND hwndList,const tstring& rsQuoteID) + { + int cItems = ::SendMessage(hwndList,LB_GETCOUNT,0,0); + for(int i = 0;i < cItems;++i) + { + const CQuotesProviderBase::CQuote* pQuote = get_quote_ptr_from_lb_index(hwndList,i); + if((nullptr != pQuote) + && ((0 == quotes_stricmp(rsQuoteID.c_str(),pQuote->GetID().c_str())) + || (0 == quotes_stricmp(rsQuoteID.c_str(),pQuote->GetName().c_str())) + || (0 == quotes_stricmp(rsQuoteID.c_str(),pQuote->GetSymbol().c_str())))) + { + return i; + } + } + return LB_ERR; + } + + INT_PTR CALLBACK GoogleFinanceOptDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) + { + CQuotesProviderFinance* pProvider = nullptr; + if(WM_INITDIALOG == message) + { + pProvider = reinterpret_cast(lParam); + SetWindowLongPtr(hDlg,GWLP_USERDATA,lParam); + } + else + { + pProvider = reinterpret_cast(GetWindowLongPtr(hDlg,GWLP_USERDATA)); + } + + CCommonDlgProcData d(pProvider); + CommonOptionDlgProc(hDlg,message,wParam,lParam,d); + + switch(message) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hDlg); + + CQuotesProviderFinance::TQuotes aQuotes; + pProvider->GetWatchedQuotes(aQuotes); + + HWND hwndList = GetDlgItem(hDlg,IDC_LIST_RATES); + std::for_each(aQuotes.begin(),aQuotes.end(), + boost::bind(add_quote_to_wnd,_1,hwndList)); + + ::EnableWindow(::GetDlgItem(hDlg,IDC_BUTTON_ADD),FALSE); + ::EnableWindow(::GetDlgItem(hDlg,IDC_BUTTON_REMOVE),FALSE); + } + return (TRUE); + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_EDIT_QUOTE: + if(EN_CHANGE == HIWORD(wParam)) + { + ::EnableWindow(::GetDlgItem(hDlg,IDC_BUTTON_ADD),GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT_QUOTE)) > 0); + } + return (TRUE); + case IDC_BUTTON_ADD: + if(BN_CLICKED == HIWORD(wParam)) + { + HWND hEdit = GetDlgItem(hDlg,IDC_EDIT_QUOTE); + tstring sQuoteSymbol = get_window_text(hEdit); + assert(false == sQuoteSymbol.empty()); + HWND hwndList = GetDlgItem(hDlg,IDC_LIST_RATES); + if(LB_ERR == is_quote_added(hwndList,sQuoteSymbol)) + { + CQuotesProviderBase::CQuote quote(sQuoteSymbol,sQuoteSymbol); + if(add_quote_to_wnd(quote,hwndList) >= 0) + { + SetDlgItemText(hDlg,IDC_EDIT_QUOTE,_T("")); + SetFocus(hEdit); + PropSheet_Changed(::GetParent(hDlg),hDlg); + } + else + { + ::MessageBeep(MB_ICONERROR); + } + } + } + return (TRUE); + case IDC_BUTTON_REMOVE: + if(BN_CLICKED == HIWORD(wParam)) + { + HWND hWnd = ::GetDlgItem(hDlg,IDC_LIST_RATES); + int nSel = ::SendMessage(hWnd,LB_GETCURSEL,0,0); + if(LB_ERR != nSel) + { + CQuotesProviderBase::CQuote* pQuote = get_quote_ptr_from_lb_index(hWnd,nSel); + delete pQuote; + if(LB_ERR != ::SendMessage(hWnd,LB_DELETESTRING,nSel,0)) + { + PropSheet_Changed(::GetParent(hDlg),hDlg); + } + } + + nSel = ::SendMessage(hWnd,LB_GETCURSEL,0,0); + ::EnableWindow(::GetDlgItem(hDlg,IDC_BUTTON_REMOVE),(LB_ERR != nSel)); + } + return (TRUE); + case IDC_LIST_RATES: + if(CBN_SELCHANGE == HIWORD(wParam)) + { + int nSel = ::SendMessage(::GetDlgItem(hDlg,IDC_LIST_RATES),LB_GETCURSEL,0,0); + ::EnableWindow(::GetDlgItem(hDlg,IDC_BUTTON_REMOVE),(LB_ERR != nSel)); + } + return (TRUE); + } + return (FALSE); + + case WM_NOTIFY: + { + LPNMHDR pNMHDR = reinterpret_cast(lParam); + switch(pNMHDR->code) + { + case PSN_APPLY: + if(pProvider) + { + CQuotesProviderFinance::TQuotes aTemp; + pProvider->GetWatchedQuotes(aTemp); + + typedef std::vector TQuotesPtr; + TQuotesPtr apCurrent; + HWND hwndListBox = GetDlgItem(hDlg,IDC_LIST_RATES); + int cItems = ::SendMessage(hwndListBox,LB_GETCOUNT,0,0); + for(int i = 0;i < cItems;++i) + { + const CQuotesProviderBase::CQuote* pQuote = get_quote_ptr_from_lb_index(hwndListBox,i); + if(pQuote) + { + apCurrent.push_back(pQuote); + } + } + + std::for_each(aTemp.begin(),aTemp.end(), + [&apCurrent,pProvider](const CQuotesProviderBase::CQuote& quote) + { + if(apCurrent.end() == std::find_if(apCurrent.begin(),apCurrent.end(), + ["e](const CQuotesProviderBase::CQuote* pQuote){return 0 == quotes_stricmp(pQuote->GetID().c_str(),quote.GetID().c_str());})) + { + pProvider->WatchForQuote(quote,false); + } + }); + + std::for_each(apCurrent.begin(),apCurrent.end(), + [&aTemp,pProvider](const CQuotesProviderBase::CQuote* pQuote) + { + if(aTemp.end() == + std::find_if(aTemp.begin(),aTemp.end(), + [pQuote](const CQuotesProviderBase::CQuote& quote){return 0 == quotes_stricmp(pQuote->GetID().c_str(),quote.GetID().c_str());})) + { + pProvider->WatchForQuote(*pQuote,true); + } + + }); + + pProvider->RefreshAll(); + } + + return (TRUE); + } + } + return (FALSE); + case WM_DESTROY: + HWND hwndListBox = GetDlgItem(hDlg,IDC_LIST_RATES); + int cItems = ::SendMessage(hwndListBox,LB_GETCOUNT,0,0); + for(int i = 0;i < cItems;++i) + { + const CQuotesProviderBase::CQuote* pQuote = get_quote_ptr_from_lb_index(hwndListBox,i); + delete pQuote; + } + return (FALSE); + } + return (FALSE); + } +} + +void CQuotesProviderFinance::ShowPropertyPage(WPARAM wp,OPTIONSDIALOGPAGE& odp) +{ + odp.pszTemplate = MAKEINTRESOURCEA(IDD_DIALOG_OPT_FINANCE); + odp.pfnDlgProc = GoogleFinanceOptDlgProc; + odp.dwInitParam = reinterpret_cast(static_cast(this)); + odp.ptszTab = const_cast(GetInfo().m_sName.c_str()); + CallService(MS_OPT_ADDPAGE,wp,reinterpret_cast(&odp)); +} -- cgit v1.2.3