#include "StdAfx.h" // extern HANDLE g_hWindowListEditSettings; extern HGENMENU g_hMenuEditSettings; extern HGENMENU g_hMenuOpenLogFile; #ifdef CHART_IMPLEMENT extern HGENMENU g_hMenuChart; #endif extern HGENMENU g_hMenuRefresh; #define WINDOW_PREFIX_INFO "Quote Info" namespace { MCONTACT g_hContact; inline bool IsMyContact(MCONTACT hContact) { CQuotesProviders::TQuotesProviderPtr pProvider = CModuleInfo::GetQuoteProvidersPtr()->GetContactProviderPtr(hContact); return (NULL != pProvider); } inline MCONTACT get_contact(HWND hWnd) { return MCONTACT(GetWindowLongPtr(hWnd,GWLP_USERDATA)); } bool get_fetch_time(time_t& rTime,MCONTACT hContact) { DBVARIANT dbv; if (db_get(hContact, QUOTES_PROTOCOL_NAME, DB_STR_QUOTE_FETCH_TIME, &dbv) || (DBVT_DWORD != dbv.type)) return false; rTime = dbv.dVal; return true; } INT_PTR CALLBACK QuoteInfoDlgProcImpl(MCONTACT hContact,HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { assert(hContact); TranslateDialogDefault(hdlg); tstring sDescription = GetContactName(hContact); ::SetDlgItemText(hdlg,IDC_STATIC_QUOTE_NAME,sDescription.c_str()); double dRate = 0.0; if(true == Quotes_DBReadDouble(hContact,QUOTES_PROTOCOL_NAME,DB_STR_QUOTE_PREV_VALUE,dRate)) { tostringstream o; o.imbue(GetSystemLocale()); o << dRate; ::SetDlgItemText(hdlg,IDC_EDIT_PREVIOUS_RATE,o.str().c_str()); } dRate = 0.0; if(true == Quotes_DBReadDouble(hContact,QUOTES_PROTOCOL_NAME,DB_STR_QUOTE_CURR_VALUE,dRate)) { tostringstream o; o.imbue(GetSystemLocale()); o << dRate; ::SetDlgItemText(hdlg,IDC_EDIT_RATE,o.str().c_str()); } time_t nFetchTime; if(true == get_fetch_time(nFetchTime,hContact)) { TCHAR szTime[50]; if(0 == _tctime_s(szTime,50,&nFetchTime)) { szTime[::_tcslen(szTime)-1] = _T('\0'); ::SetDlgItemText(hdlg,IDC_EDIT_RATE_FETCH_TIME,szTime); } } CQuotesProviders::TQuotesProviderPtr pProvider = CModuleInfo::GetQuoteProvidersPtr()->GetContactProviderPtr(hContact); const IQuotesProvider::CProviderInfo& pi = pProvider->GetInfo(); tostringstream o; o << TranslateT("Info provided by") << _T(" ") << pi.m_sName << _T(""); ::SetDlgItemText(hdlg,IDC_SYSLINK_PROVIDER,o.str().c_str()); } return TRUE; case WM_NOTIFY: { LPNMHDR pNMHDR = reinterpret_cast(lParam); switch(pNMHDR->code) { case NM_CLICK: if(IDC_SYSLINK_PROVIDER == wParam) { PNMLINK pNMLink = reinterpret_cast(pNMHDR); ::ShellExecute(hdlg,_T("open"),pNMLink->item.szUrl,NULL,NULL,SW_SHOWNORMAL); } break; } } break; } return FALSE; } INT_PTR CALLBACK QuoteInfoDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) { return QuoteInfoDlgProcImpl(g_hContact,hdlg,msg,wParam,lParam); } } int QuotesEventFunc_OnUserInfoInit(WPARAM wp,LPARAM lp) { MCONTACT hContact = MCONTACT(lp); if(NULL == hContact) return 0; if(false == IsMyContact(hContact)) return 0; g_hContact = hContact; OPTIONSDIALOGPAGE odp = { sizeof(odp) }; odp.hInstance = g_hInstance; odp.hIcon = Quotes_LoadIconEx(ICON_STR_MAIN); odp.pfnDlgProc = QuoteInfoDlgProc; odp.position = -2000000000; odp.pszTemplate = MAKEINTRESOURCEA(IDD_DIALOG_QUOTE_INFO); odp.pszTitle = LPGEN("Quote"); UserInfo_AddPage(wp, &odp); return 0; } INT_PTR QuotesMenu_EditSettings(WPARAM wp,LPARAM lp) { MCONTACT hContact = MCONTACT(wp); if(NULL == hContact) { return 0; } ShowSettingsDlg(hContact); return 0; } namespace { bool get_log_file(MCONTACT hContact,tstring& rsLogfile) { rsLogfile = GetContactLogFileName(hContact); return ((rsLogfile.empty()) ? false : true); } } INT_PTR QuotesMenu_OpenLogFile(WPARAM wp,LPARAM lp) { MCONTACT hContact = MCONTACT(wp); if(NULL == hContact) { return 0; } tstring sLogFileName; if ((true == get_log_file(hContact,sLogFileName)) && (false == sLogFileName.empty())) { ::ShellExecute(NULL,_T("open"),sLogFileName.c_str(),NULL,NULL,SW_SHOWNORMAL); } return 0; } INT_PTR QuotesMenu_RefreshContact(WPARAM wp,LPARAM lp) { MCONTACT hContact = MCONTACT(wp); if(NULL == hContact) { return 0; } CQuotesProviders::TQuotesProviderPtr pProvider = CModuleInfo::GetQuoteProvidersPtr()->GetContactProviderPtr(hContact); if (!pProvider) { return 0; } pProvider->RefreshContact(hContact); return 0; } namespace { INT_PTR CALLBACK QuoteInfoDlgProc1(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) { MCONTACT hContact = NULL; switch(msg) { case WM_INITDIALOG: { hContact = MCONTACT(lParam); HANDLE hWL = CModuleInfo::GetInstance().GetWindowList(WINDOW_PREFIX_INFO,false); assert(hWL); WindowList_Add(hWL,hdlg,hContact); ::SetWindowLongPtr(hdlg, GWLP_USERDATA, hContact); Utils_RestoreWindowPositionNoSize(hdlg, hContact, QUOTES_MODULE_NAME, WINDOW_PREFIX_INFO); ::ShowWindow(hdlg,SW_SHOW); } break; case WM_CLOSE: DestroyWindow(hdlg); return FALSE; case WM_DESTROY: { MCONTACT hContact = get_contact(hdlg); if(hContact) { SetWindowLongPtr(hdlg,GWLP_USERDATA,0); HANDLE hWL = CModuleInfo::GetInstance().GetWindowList(WINDOW_PREFIX_INFO,false); assert(hWL); WindowList_Remove(hWL,hdlg); Utils_SaveWindowPosition(hdlg,hContact,QUOTES_MODULE_NAME,WINDOW_PREFIX_INFO); } } return FALSE; case WM_COMMAND: if(LOWORD(wParam) == IDOK) { ::DestroyWindow(hdlg); return FALSE; } default: hContact = get_contact(hdlg); break; } return QuoteInfoDlgProcImpl(hContact,hdlg,msg,wParam,lParam); } } int Quotes_OnContactDoubleClick(WPARAM wp,LPARAM/* lp*/) { MCONTACT hContact = MCONTACT(wp); if(CModuleInfo::GetQuoteProvidersPtr()->GetContactProviderPtr(hContact)) { HANDLE hWL = CModuleInfo::GetInstance().GetWindowList(WINDOW_PREFIX_INFO,true); assert(hWL); HWND hWnd = WindowList_Find(hWL,hContact); if(NULL != hWnd) { SetForegroundWindow(hWnd); SetFocus(hWnd); } else if(true == IsMyContact(hContact)) CreateDialogParam(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG_QUOTE_INFO_1), NULL, QuoteInfoDlgProc1, LPARAM(hContact)); return 1; } return 0; } namespace { void enable_menu(HGENMENU hMenu,bool bEnable) { CLISTMENUITEM clmi = { sizeof(clmi) }; clmi.flags = CMIM_FLAGS; if(false == bEnable) clmi.flags |= CMIF_GRAYED; Menu_ModifyItem(hMenu, &clmi); } } int Quotes_PrebuildContactMenu(WPARAM wp,LPARAM lp) { enable_menu(g_hMenuEditSettings,false); enable_menu(g_hMenuOpenLogFile,false); #ifdef CHART_IMPLEMENT enable_menu(g_hMenuChart,false); #endif enable_menu(g_hMenuRefresh,false); MCONTACT hContact = MCONTACT(wp); if(NULL == hContact) { return 0; } enable_menu(g_hMenuEditSettings,true); enable_menu(g_hMenuRefresh,true); tstring sLogFileName; bool bThereIsLogFile = (true == get_log_file(hContact,sLogFileName)) && (false == sLogFileName.empty()) && (0 == _taccess(sLogFileName.c_str(),04)); if(true == bThereIsLogFile) { #ifdef CHART_IMPLEMENT enable_menu(g_hMenuChart,true); #endif enable_menu(g_hMenuOpenLogFile,true); } return 0; }