diff options
Diffstat (limited to 'protocols/Weather/src/weather_userinfo.cpp')
-rw-r--r-- | protocols/Weather/src/weather_userinfo.cpp | 409 |
1 files changed, 215 insertions, 194 deletions
diff --git a/protocols/Weather/src/weather_userinfo.cpp b/protocols/Weather/src/weather_userinfo.cpp index ecee919ce5..1207d01b4a 100644 --- a/protocols/Weather/src/weather_userinfo.cpp +++ b/protocols/Weather/src/weather_userinfo.cpp @@ -27,232 +27,252 @@ information #include "stdafx.h" -//============ BRIEF INFORMATION ============ -// -static int BriefDlgResizer(HWND, LPARAM, UTILRESIZECONTROL *urc) -{ - switch (urc->wId) { - case IDC_HEADERBAR: - return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH; - - case IDC_MTEXT: - case IDC_DATALIST: - return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT; +///////////////////////////////////////////////////////////////////////////////////////// +// dialog for more data in the user info window - case IDC_MUPDATE: - return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM; +static unsigned tabstops = 48; - case IDC_MTOGGLE: - case IDC_MWEBPAGE: - case IDCANCEL: - return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM; - } - return RD_ANCHORX_LEFT | RD_ANCHORY_TOP; +static int GetWeatherDataFromDB(const char *szSetting, void *lparam) +{ + auto *pList = (OBJLIST<char>*)lparam; + pList->insert(newStr(szSetting)); + return 0; } -// set the title of the dialog and on the which rectangle -// also load brief info into message box -static void LoadBriefInfoText(HWND hwndDlg, MCONTACT hContact) +class CBriefInfoDlg : public CWeatherDlgBase { - wchar_t str[4096]; + MCONTACT hContact; + wchar_t m_buf[4098]; + int iOldItem = -1; - // load weather information from the contact into the WEATHERINFO struct - WEATHERINFO winfo = LoadWeatherInfo(hContact); - // check if data exist. If not, display error message box - if (!g_plugin.getByte(hContact, "IsUpdated")) - SetDlgItemTextW(hwndDlg, IDC_MTEXT, TranslateT("No information available.\r\nPlease update weather condition first.")); - else { - // set the display text and show the message box - GetDisplay(&winfo, GetTextValue('B'), str); - SetDlgItemTextW(hwndDlg, IDC_MTEXT, str); - } + UI_MESSAGE_MAP(CBriefInfoDlg, CWeatherDlgBase); + UI_MESSAGE(WM_UPDATEDATA, OnUpdate); + UI_MESSAGE_MAP_END(); - GetDisplay(&winfo, L"%c, %t", str); - SetWindowTextW(hwndDlg, winfo.city); - SetDlgItemTextW(hwndDlg, IDC_HEADERBAR, str); -} + CTimer m_timer; + CCtrlButton btnUpdate, btnWebpage, btnToggle; + CCtrlListView m_list; -// dialog process for more data in the user info window -// lParam = contact handle -static INT_PTR CALLBACK DlgProcMoreData(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static const unsigned tabstops = 48; - MCONTACT hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); +public: + CBriefInfoDlg(CWeatherProto *ppro, MCONTACT _1) : + CWeatherDlgBase(ppro, IDD_BRIEF), + hContact(_1), + m_list(this, IDC_DATALIST), + m_timer(this, 1), + btnToggle(this, IDC_MTOGGLE), + btnUpdate(this, IDC_MUPDATE), + btnWebpage(this, IDC_MWEBPAGE) + { + SetMinSize(350, 300); - switch (msg) { - case WM_INITDIALOG: - // save the contact handle for later use - hContact = lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)hContact); + m_list.OnHotTrack = Callback(this, &CBriefInfoDlg::onList_Track); - SendDlgItemMessage(hwndDlg, IDC_MTEXT, EM_AUTOURLDETECT, (WPARAM)TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_MTEXT, EM_SETEVENTMASK, 0, ENM_LINK); - SendDlgItemMessage(hwndDlg, IDC_MTEXT, EM_SETMARGINS, EC_LEFTMARGIN, 5); - SendDlgItemMessage(hwndDlg, IDC_MTEXT, EM_SETTABSTOPS, 1, (LPARAM)&tabstops); + m_timer.OnEvent = Callback(this, &CBriefInfoDlg::onTimer); + + btnToggle.OnClick = Callback(this, &CBriefInfoDlg::onClick_Toggle); + btnUpdate.OnClick = Callback(this, &CBriefInfoDlg::onClick_Update); + btnWebpage.OnClick = Callback(this, &CBriefInfoDlg::onClick_Webpage); + } + + bool OnInitDialog() override + { + SendDlgItemMessage(m_hwnd, IDC_MTEXT, EM_AUTOURLDETECT, (WPARAM)TRUE, 0); + SendDlgItemMessage(m_hwnd, IDC_MTEXT, EM_SETEVENTMASK, 0, ENM_LINK); + SendDlgItemMessage(m_hwnd, IDC_MTEXT, EM_SETMARGINS, EC_LEFTMARGIN, 5); + SendDlgItemMessage(m_hwnd, IDC_MTEXT, EM_SETTABSTOPS, 1, (LPARAM)&tabstops); // get the list to display { - LV_COLUMN lvc = {}; - HWND hList = GetDlgItem(hwndDlg, IDC_DATALIST); RECT aRect = {}; - GetClientRect(hList, &aRect); + GetClientRect(m_list.GetHwnd(), &aRect); // managing styles - lvc.mask = LVCF_WIDTH | LVCF_TEXT; - ListView_SetExtendedListViewStyleEx(hList, - LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, - LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP); + DWORD dwStyle = LVS_EX_FULLROWSELECT; + m_list.SetExtendedListViewStyleEx(dwStyle, dwStyle); // inserting columns + LV_COLUMN lvc = {}; + lvc.mask = LVCF_WIDTH | LVCF_TEXT; + lvc.cx = LIST_COLUMN; lvc.pszText = TranslateT("Variable"); - ListView_InsertColumn(hList, 0, &lvc); + m_list.InsertColumn(0, &lvc); lvc.cx = aRect.right - LIST_COLUMN - GetSystemMetrics(SM_CXVSCROLL) - 3; lvc.pszText = TranslateT("Information"); - ListView_InsertColumn(hList, 1, &lvc); + m_list.InsertColumn(1, &lvc); - // inserting data - SendMessage(hwndDlg, WM_UPDATEDATA, 0, 0); + // insert data + OnUpdate(); } - TranslateDialogDefault(hwndDlg); // prevent dups of the window - WindowList_Add(hDataWindowList, hwndDlg, hContact); + WindowList_Add(hDataWindowList, m_hwnd, hContact); // restore window position - Utils_RestoreWindowPositionNoMove(hwndDlg, NULL, MODULENAME, "BriefInfo_"); - return TRUE; + Utils_RestoreWindowPositionNoMove(m_hwnd, NULL, MODULENAME, "BriefInfo_"); + return true; + } - case WM_UPDATEDATA: - ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_DATALIST)); - LoadBriefInfoText(hwndDlg, hContact); - DBDataManage(hContact, WDBM_DETAILDISPLAY, (WPARAM)hwndDlg, 0); + void OnDestroy() override + { + DestroyIcon((HICON)SendMessage(m_hwnd, WM_SETICON, ICON_BIG, 0)); + DestroyIcon((HICON)SendMessage(m_hwnd, WM_SETICON, ICON_SMALL, 0)); - // set icons - { - HICON hIcon = GetStatusIconBig(hContact); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, LPARAM(hIcon))); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, LPARAM(hIcon))); - } + Utils_SaveWindowPosition(m_hwnd, NULL, MODULENAME, "BriefInfo_"); + WindowList_Remove(hDataWindowList, m_hwnd); + } - RedrawWindow(GetDlgItem(hwndDlg, IDC_HEADERBAR), nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW); - break; + int Resizer(UTILRESIZECONTROL *urc) override + { + switch (urc->wId) { + case IDC_HEADERBAR: + return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH; - case WM_SIZE: - { - RECT rc; - HWND hList = GetDlgItem(hwndDlg, IDC_DATALIST); - GetWindowRect(hList, &rc); - ListView_SetColumnWidth(hList, 1, ListView_GetColumnWidth(hList, 1) + (int)LOWORD(lParam) - (rc.right - rc.left)); + case IDC_MTEXT: + return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT; + + case IDC_DATALIST: + m_list.SetColumnWidth(1, urc->dlgNewSize.cx - m_list.GetColumnWidth(0) - GetSystemMetrics(SM_CXVSCROLL)); + return RD_ANCHORX_LEFT | RD_ANCHORY_TOP | RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT; - Utils_ResizeDialog(hwndDlg, g_plugin.getInst(), MAKEINTRESOURCEA(IDD_BRIEF), BriefDlgResizer); + case IDC_MUPDATE: + return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM; + + case IDC_MTOGGLE: + case IDC_MWEBPAGE: + case IDCANCEL: + return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM; } - break; + return RD_ANCHORX_LEFT | RD_ANCHORY_TOP; + } - case WM_GETMINMAXINFO: - { - LPMINMAXINFO mmi = (LPMINMAXINFO)lParam; + INT_PTR OnUpdate(UINT = 0, WPARAM = 0, LPARAM = 0) + { + m_list.DeleteAllItems(); + + // load weather information from the contact into the WEATHERINFO struct + WEATHERINFO winfo = m_proto->LoadWeatherInfo(hContact); + // check if data exist. If not, display error message box + if (!m_proto->getByte(hContact, "IsUpdated")) + SetDlgItemTextW(m_hwnd, IDC_MTEXT, TranslateT("No information available.\r\nPlease update weather condition first.")); + else { + // set the display text and show the message box + SetDlgItemTextW(m_hwnd, IDC_MTEXT, GetDisplay(&winfo, m_proto->GetTextValue('B'))); + } - // The minimum width in points - mmi->ptMinTrackSize.x = 350; - // The minimum height in points - mmi->ptMinTrackSize.y = 300; + SetWindowTextW(m_hwnd, winfo.city); + SetDlgItemTextW(m_hwnd, IDC_HEADERBAR, GetDisplay(&winfo, L"%c, %t")); + + // get all the settings and store them in a temporary list + LIST<char> arSettings(10); + db_enum_settings(hContact, GetWeatherDataFromDB, WEATHERCONDITION, &arSettings); + + auto T = arSettings.rev_iter(); + for (auto &it: T) { + CMStringW wszText(db_get_wsm(hContact, WEATHERCONDITION, it)); + if (wszText.IsEmpty()) + continue; + + // skip the "WeatherInfo" variable + if (!mir_strcmp(it, "WeatherInfo") || !mir_strcmp(it, "Ignore") || it[0] == '#') + continue; + + wszText.Replace(L"; ", L";\r\n "); + + _A2T strW(it); + LV_ITEM lvi = {}; + lvi.mask = LVIF_TEXT | LVIF_PARAM; + lvi.lParam = T.indexOf(&it); + lvi.pszText = TranslateW(strW); + lvi.iItem = m_list.InsertItem(&lvi); + lvi.pszText = wszText.GetBuffer(); + m_list.SetItemText(lvi.iItem, 1, wszText); } - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDCANCEL: - // close the info window - DestroyWindow(hwndDlg); - break; + // set icons + HICON hIcon = m_proto->GetStatusIconBig(hContact); + DestroyIcon((HICON)SendMessage(m_hwnd, WM_SETICON, ICON_BIG, LPARAM(hIcon))); + DestroyIcon((HICON)SendMessage(m_hwnd, WM_SETICON, ICON_SMALL, LPARAM(hIcon))); - case IDC_MUPDATE: - { - HWND hList = GetDlgItem(hwndDlg, IDC_DATALIST); - - // update current data - // set the text to "updating" - SetDlgItemText(hwndDlg, IDC_MTEXT, TranslateT("Retrieving new data, please wait...")); - ListView_DeleteAllItems(hList); - - LV_ITEM lvi = {}; - lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.lParam = 1; - lvi.pszText = L""; - lvi.iItem = ListView_InsertItem(hList, &lvi); - lvi.pszText = TranslateT("Retrieving new data, please wait..."); - ListView_SetItemText(hList, lvi.iItem, 1, lvi.pszText); - UpdateSingleStation(hContact, 0); - break; - } + RedrawWindow(GetDlgItem(m_hwnd, IDC_HEADERBAR), nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW); + return 0; + } - case IDC_MWEBPAGE: - LoadForecast(hContact, 0); // read complete forecast - break; + void onList_Track(CCtrlListView::TEventInfo *ev) + { + auto *nlv = ev->nmlv; + if (nlv->iItem == -1 || nlv->iItem == iOldItem || nlv->iSubItem != 1) + return; - case IDC_MTOGGLE: - if (IsWindowVisible(GetDlgItem(hwndDlg, IDC_DATALIST))) - SetDlgItemText(hwndDlg, IDC_MTOGGLE, TranslateT("More Info")); - else - SetDlgItemText(hwndDlg, IDC_MTOGGLE, TranslateT("Brief Info")); - ShowWindow(GetDlgItem(hwndDlg, IDC_DATALIST), (int)!IsWindowVisible( - GetDlgItem(hwndDlg, IDC_DATALIST))); - ShowWindow(GetDlgItem(hwndDlg, IDC_MTEXT), (int)!IsWindowVisible(GetDlgItem(hwndDlg, IDC_MTEXT))); - break; - } - break; + iOldItem = nlv->iItem; - case WM_NOTIFY: - { - LPNMHDR pNmhdr = (LPNMHDR)lParam; - if (pNmhdr->idFrom == IDC_MTEXT && pNmhdr->code == EN_LINK) { - ENLINK *enlink = (ENLINK *)lParam; - switch (enlink->msg) { - case WM_LBUTTONUP: - TEXTRANGE tr; - tr.chrg = enlink->chrg; - tr.lpstrText = (wchar_t*)mir_alloc(sizeof(wchar_t)*(tr.chrg.cpMax - tr.chrg.cpMin + 8)); - SendMessage(pNmhdr->hwndFrom, EM_GETTEXTRANGE, 0, (LPARAM)&tr); - Utils_OpenUrlW(tr.lpstrText); - mir_free(tr.lpstrText); - break; - } - } - } - break; + m_list.GetItemText(nlv->iItem, nlv->iSubItem, m_buf, _countof(m_buf)); + m_timer.Start(100); + } - case WM_CLOSE: - DestroyWindow(hwndDlg); - break; + void onTimer(CTimer *pTimer) + { + pTimer->Stop(); - case WM_DESTROY: - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); + if (wcslen(m_buf) > 50) { + CLCINFOTIP ti = {}; + ti.cbSize = sizeof(TOOLINFO); + ti.hItem = (HANDLE)iOldItem; + Tipper_ShowTip(m_buf, &ti); + } + else Tipper_Hide(); + } - Utils_SaveWindowPosition(hwndDlg, NULL, MODULENAME, "BriefInfo_"); - WindowList_Remove(hDataWindowList, hwndDlg); - break; + void onClick_Update(CCtrlButton *) + { + // update current data + // set the text to "updating" + SetDlgItemText(m_hwnd, IDC_MTEXT, TranslateT("Retrieving new data, please wait...")); + m_list.DeleteAllItems(); + + LV_ITEM lvi = {}; + lvi.mask = LVIF_TEXT | LVIF_PARAM; + lvi.lParam = 1; + lvi.pszText = L""; + lvi.iItem = m_list.InsertItem(&lvi); + lvi.pszText = TranslateT("Retrieving new data, please wait..."); + m_list.SetItemText(lvi.iItem, 1, lvi.pszText); + m_proto->UpdateSingleStation(hContact, 0); } - return FALSE; -} + void onClick_Webpage(CCtrlButton *) + { + m_proto->LoadForecast(hContact, 0); // read complete forecast + } + + void onClick_Toggle(CCtrlButton *) + { + if (IsWindowVisible(m_list.GetHwnd())) + SetDlgItemText(m_hwnd, IDC_MTOGGLE, TranslateT("More Info")); + else + SetDlgItemText(m_hwnd, IDC_MTOGGLE, TranslateT("Brief Info")); + ShowWindow(m_list.GetHwnd(), (int)!IsWindowVisible(m_list.GetHwnd())); + ShowWindow(GetDlgItem(m_hwnd, IDC_MTEXT), (int)!IsWindowVisible(GetDlgItem(m_hwnd, IDC_MTEXT))); + } +}; -// show brief information dialog -// wParam = current contact -int BriefInfo(WPARAM wParam, LPARAM) +INT_PTR CWeatherProto::BriefInfo(WPARAM hContact, LPARAM) { // make sure that the contact is actually a weather one - if (!IsMyContact(wParam)) + if (!IsMyContact(hContact)) return 0; - HWND hMoreDataDlg = WindowList_Find(hDataWindowList, wParam); + HWND hMoreDataDlg = WindowList_Find(hDataWindowList, hContact); if (hMoreDataDlg != nullptr) { SetForegroundWindow(hMoreDataDlg); SetFocus(hMoreDataDlg); } - else hMoreDataDlg = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_BRIEF), nullptr, DlgProcMoreData, (LPARAM)wParam); + else { + auto *pDlg = new CBriefInfoDlg(this, hContact); + pDlg->Create(); + hMoreDataDlg = pDlg->GetHwnd(); + } ShowWindow(GetDlgItem(hMoreDataDlg, IDC_DATALIST), 0); ShowWindow(GetDlgItem(hMoreDataDlg, IDC_MTEXT), 1); @@ -260,12 +280,18 @@ int BriefInfo(WPARAM wParam, LPARAM) return 1; } +int CWeatherProto::BriefInfoEvt(WPARAM wParam, LPARAM) +{ + return BriefInfo(wParam, 0); +} + ///////////////////////////////////////////////////////////////////////////////////////// // User info dialog class WeatherUserInfoDlg : public CUserInfoPageDlg { CCtrlButton btnDetail; + CWeatherProto *ppro; public: WeatherUserInfoDlg() : @@ -278,13 +304,13 @@ public: bool OnInitDialog() override { SendDlgItemMessage(m_hwnd, IDC_MOREDETAIL, BUTTONSETASFLATBTN, TRUE, 0); + ppro = (CWeatherProto *)Proto_GetContactInstance(m_hContact); // load weather info for the contact - wchar_t str[MAX_TEXT_SIZE]; - WEATHERINFO w = LoadWeatherInfo(m_hContact); - SetDlgItemText(m_hwnd, IDC_INFO1, GetDisplay(&w, TranslateT("Current condition for %n"), str)); + WEATHERINFO w = ppro->LoadWeatherInfo(m_hContact); + SetDlgItemText(m_hwnd, IDC_INFO1, GetDisplay(&w, TranslateT("Current condition for %n"))); - SendDlgItemMessage(m_hwnd, IDC_INFOICON, STM_SETICON, (WPARAM)GetStatusIconBig(m_hContact), 0); + SendDlgItemMessage(m_hwnd, IDC_INFOICON, STM_SETICON, (WPARAM)ppro->GetStatusIconBig(m_hContact), 0); // bold and enlarge the current condition LOGFONT lf; @@ -296,19 +322,16 @@ public: SendDlgItemMessage(m_hwnd, IDC_INFO2, WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), 0); // set the text for displaying other current weather conditions data - GetDisplay(&w, L"%c %t", str); - SetDlgItemText(m_hwnd, IDC_INFO2, str); + SetDlgItemText(m_hwnd, IDC_INFO2, GetDisplay(&w, L"%c %t")); SetDlgItemText(m_hwnd, IDC_INFO3, w.feel); SetDlgItemText(m_hwnd, IDC_INFO4, w.pressure); - GetDisplay(&w, L"%i %w", str); - SetDlgItemText(m_hwnd, IDC_INFO5, str); + SetDlgItemText(m_hwnd, IDC_INFO5, GetDisplay(&w, L"%i %w")); SetDlgItemText(m_hwnd, IDC_INFO6, w.dewpoint); SetDlgItemText(m_hwnd, IDC_INFO7, w.sunrise); SetDlgItemText(m_hwnd, IDC_INFO8, w.sunset); SetDlgItemText(m_hwnd, IDC_INFO9, w.high); SetDlgItemText(m_hwnd, IDC_INFO10, w.low); - GetDisplay(&w, TranslateT("Last update on: %u"), str); - SetDlgItemText(m_hwnd, IDC_INFO11, str); + SetDlgItemText(m_hwnd, IDC_INFO11, GetDisplay(&w, TranslateT("Last update on: %u"))); SetDlgItemText(m_hwnd, IDC_INFO12, w.humid); SetDlgItemText(m_hwnd, IDC_INFO13, w.vis); return true; @@ -323,8 +346,11 @@ public: void onClick_Detail(CCtrlButton *) { HWND hMoreDataDlg = WindowList_Find(hDataWindowList, m_hContact); - if (hMoreDataDlg == nullptr) - hMoreDataDlg = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_BRIEF), nullptr, DlgProcMoreData, m_hContact); + if (hMoreDataDlg == nullptr) { + auto *pDlg = new CBriefInfoDlg(ppro, m_hContact); + pDlg->Create(); + hMoreDataDlg = pDlg->GetHwnd(); + } else { SetForegroundWindow(hMoreDataDlg); SetFocus(hMoreDataDlg); @@ -334,21 +360,16 @@ public: } }; -int UserInfoInit(WPARAM wParam, LPARAM hContact) +int CWeatherProto::UserInfoInit(WPARAM wParam, LPARAM hContact) { - USERINFOPAGE uip = {}; - uip.szTitle.a = MODULENAME; - uip.position = 100000000; - uip.flags = ODPF_ICON; - uip.dwInitParam = LPARAM(g_plugin.getIconHandle(IDI_ICON)); - - if (hContact == 0) { - uip.pDialog = new WeatherMyDetailsDlg(); - g_plugin.addUserInfo(wParam, &uip); - } - else if (IsMyContact(hContact)) { // check if it is a weather contact + // check if it is a weather contact + if (IsMyContact(hContact)) { + USERINFOPAGE uip = {}; + uip.szTitle.w = m_tszUserName; + uip.position = 100000000; + uip.flags = ODPF_ICON | ODPF_BOLDGROUPS | ODPF_UNICODE; + uip.dwInitParam = LPARAM(g_plugin.getIconHandle(IDI_ICON)); uip.pDialog = new WeatherUserInfoDlg(); - uip.flags |= ODPF_BOLDGROUPS; g_plugin.addUserInfo(wParam, &uip); } return 0; |