#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;
}