#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 = { 0 }; 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) { 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) { 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) { 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) { 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; }