diff options
Diffstat (limited to 'Src/Plugins/Library/ml_local/editquery.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_local/editquery.cpp | 1013 |
1 files changed, 1013 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_local/editquery.cpp b/Src/Plugins/Library/ml_local/editquery.cpp new file mode 100644 index 00000000..e1d4ca23 --- /dev/null +++ b/Src/Plugins/Library/ml_local/editquery.cpp @@ -0,0 +1,1013 @@ +#include "main.h" +#include "ml_local.h" +#include <windowsx.h> +#include "editquery.h" +#include "../nde/NDE.h" +#include "resource.h" +#include "..\..\General\gen_ml/gaystring.h" +#include "time.h" +#include "../Agave/Language/api_language.h" +#include "../replicant/nu/AutoChar.h" +#define ListBox_GetTextLenW(hwndCtl, index) ((int)(DWORD)SendMessageW((hwndCtl), LB_GETTEXTLEN, (WPARAM)(int)(index), 0L)) +#define ListBox_GetTextW(hwndCtl, index, lpszBuffer) ((int)(DWORD)SendMessageW((hwndCtl), LB_GETTEXT, (WPARAM)(int)(index), (LPARAM)(LPCWSTR)(lpszBuffer))) + +int myatoi(wchar_t *p, int len) { + wchar_t *w = (wchar_t *)calloc((len+1), sizeof(wchar_t)); + if (w) + { + wcsncpy(w, p, len); + w[len] = 0; + int a = _wtoi(w); + free(w); + return a; + } + return 0; +} + +static wchar_t *monthtable[12] = {L"January", L"February", L"March", L"April", L"May", L"June", L"July", L"August", L"September", L"October", L"November", L"December" }; +INT_PTR CALLBACK editQueryDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam); +INT_PTR CALLBACK editDateTimeDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam); +static wchar_t *qe_field = NULL; + +static GayStringW qe_curquery; +static GayStringW qe_curexpr; +static GayStringW qe_origquery; +static GayStringW qe_curorigin; +static GayStringW qe_curdate; + +void qe_freeStuff() { + qe_curquery.Set(L""); + qe_curquery.Compact(); + qe_curexpr.Set(L""); + qe_curexpr.Compact(); + qe_curorigin.Set(L""); + qe_curorigin.Compact(); + qe_origquery.Set(L""); + qe_origquery.Compact(); +} + +static GayStringW te_ret; +static GayStringW te_result; +int te_cur_selected_month=0; + +const wchar_t *editTime(HWND wnd, const wchar_t *curfield) { + te_ret.Set(curfield); + + TimeParse tp; + NDE_Time_ApplyConversion(0, curfield, &tp); + + if (tp.relative_day == -2 || tp.relative_kwday != -1) { + wchar_t titleStr[64] = {0}; + int r = MessageBoxW(wnd, WASABI_API_LNGSTRINGW(IDS_DATE_TIME_IS_TOO_COMPLEX), + WASABI_API_LNGSTRINGW_BUF(IDS_DATE_TIME_EDITOR_QUESTION,titleStr,64), MB_YESNO); + if (r == IDNO) { + return curfield; + } + } + + INT_PTR r = WASABI_API_DIALOGBOXW(IDD_TIMEEDITOR, wnd, editDateTimeDialogProc); + if (r == IDOK) { + te_ret.Set(te_result.Get()); + return te_ret.Get(); + } + + return NULL; +} + +const wchar_t *editQuery(HWND wnd, const wchar_t *curquery, wchar_t *newQuery, size_t len) +{ + qe_field = NULL; + + qe_curquery.Set(curquery); + qe_origquery.Set(curquery); + + INT_PTR r = WASABI_API_DIALOGBOXW(IDD_EDIT_QUERY, wnd, editQueryDialogProc); + + if (qe_field) free(qe_field); + + if (r == IDOK) + { + lstrcpynW(newQuery, qe_curquery.Get(), len); + qe_freeStuff(); + return newQuery; + } + qe_freeStuff(); + return NULL; +} + +static bool FillListProc(Record *record, Field *entry, void *context) +{ + HWND hwndDlg = (HWND)context; + SendMessage(hwndDlg, LB_ADDSTRING, 0, (LPARAM)NDE_ColumnField_GetFieldName((nde_field_t)entry)); + return true; +} + +void qe_fillFieldsList( HWND hwndDlg ) +{ + ListBox_ResetContent( hwndDlg ); + + Record *cr = ( (Table *)g_table )->GetColumns(); // TODO: don't use C++ NDE API + if ( cr ) + { + cr->WalkFields( FillListProc, (void *)hwndDlg ); + } + + int len = ListBox_GetTextLenW( hwndDlg, 0 ); + + if ( qe_field != NULL ) + free( qe_field ); + + qe_field = (wchar_t *)calloc( ( len + 1 ), sizeof( wchar_t ) ); + ListBox_GetTextW( hwndDlg, 0, qe_field ); + + qe_field[ len ] = 0; + ListBox_SetCurSel( hwndDlg, 0 ); +} + +void qe_doEnableDisable( HWND hwndDlg, int *n, int num, int how ) +{ + for ( int i = 0; i < num; i++ ) + EnableWindow( GetDlgItem( hwndDlg, n[ i ] ), how ); +} + +void qe_enableDisableItem( HWND hwndDlg, int id, int tf ) +{ + EnableWindow( GetDlgItem( hwndDlg, id ), tf ); +} + +void qe_fallback( HWND hwndDlg, int disabling, int enabled ) +{ + if ( IsDlgButtonChecked( hwndDlg, disabling ) ) + { + CheckDlgButton( hwndDlg, disabling, BST_UNCHECKED ); + CheckDlgButton( hwndDlg, enabled, BST_CHECKED ); + } +} + +int ctrls_datetime[] = {IDC_STATIC_DATETIME, IDC_EDIT_DATETIME, IDC_BUTTON_EDITDATETIME, IDC_STATIC_CURDATETIME}; +int ctrls_datetime_base[] = {IDC_STATIC_DATETIME, IDC_CHECK_ABSOLUTE, IDC_CHECK_RELATIVE}; +int ctrls_datetime_relative[] = {IDC_CHECK_SELECTIVE, IDC_CHECK_TIMEAGO, IDC_STATIC_QUERYTIME, IDC_STATIC_RESULT}; +int ctrls_datetime_relative_ago[] = {IDC_STATIC_TIMEAGO, IDC_EDIT_TIMEAGO, IDC_RADIO_TIMEAGO_Y, + IDC_RADIO_TIMEAGO_H, IDC_RADIO_TIMEAGO_M, IDC_RADIO_TIMEAGO_MIN, IDC_RADIO_TIMEAGO_W, IDC_RADIO_TIMEAGO_S, + IDC_RADIO_TIMEAGO_D}; +int ctrls_datetime_relative_ago_direction[] = {IDC_STATIC_DIRECTION, IDC_RADIO_AFTER, IDC_RADIO_BEFORE}; +int ctrls_datetime_relative_selective[] = {IDC_STATIC_SELECTIVE, IDC_STATIC_YEAR, IDC_RADIO_THISYEAR, + IDC_RADIO_YEAR, IDC_EDIT_YEAR, IDC_STATIC_MONTH, IDC_RADIO_THISMONTH, IDC_RADIO_MONTH, IDC_BUTTON_MONTH, + IDC_STATIC_DAY, IDC_RADIO_THISDAY, IDC_RADIO_DAY, IDC_EDIT_DAY, IDC_STATIC_TIME, IDC_RADIO_THISTIME, + IDC_RADIO_TIME, IDC_RADIO_NOON, IDC_RADIO_MIDNIGHT, IDC_BUTTON_NOW, IDC_BUTTON_PICK, IDC_DATETIMEPICKER2}; +int ctrls_datetime_absolute[] = {IDC_STATIC_ABSOLUTE, IDC_DATETIMEPICKER, IDC_DATETIMEPICKER1, IDC_STATIC_RELATIVE}; +int ctrls_string_ops[] = {IDC_RADIO_ISLIKE, IDC_RADIO_BEGINS, IDC_RADIO_ENDS, IDC_RADIO_CONTAINS}; + +int ctrls_string[] = {IDC_STATIC_STRING, IDC_EDIT_STRING}; + +void qe_showHideOperators(HWND hwndDlg) { + if (!qe_curquery.Get() || !*qe_curquery.Get()) { + ShowWindow(GetDlgItem(hwndDlg, IDC_BUTTON_AND), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_BUTTON_OR), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, ID_BUTTON_SENDTOQUERY), SW_SHOW); + } else { + ShowWindow(GetDlgItem(hwndDlg, IDC_BUTTON_AND), SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_BUTTON_OR), SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, ID_BUTTON_SENDTOQUERY), SW_HIDE); + } +} + +void qe_updateResultingDate(HWND hwndDlg) { + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT_DATETIME)) && !IsDlgButtonChecked(hwndDlg, IDC_RADIO_ISEMPTY)) { + time_t t = NDE_Time_ApplyConversion(0, qe_curdate.Get(), 0); + struct tm *ts = localtime(&t); + wchar_t qe_tempstr[4096] = {0}; + if (ts) + wsprintfW(qe_tempstr, L"%02d/%d/%04d %02d:%02d:%02d", ts->tm_mon+1, ts->tm_mday, ts->tm_year+1900, ts->tm_hour, ts->tm_min, ts->tm_sec); + else + wcsncpy(qe_tempstr, L"DATE_OUTOFRANGE", 4096); + SetDlgItemTextW(hwndDlg, IDC_STATIC_CURDATETIME, qe_tempstr); + } else { + SetDlgItemTextW(hwndDlg, IDC_STATIC_CURDATETIME, L"N/A"); + } +} + +void te_updateResultingDate(HWND hwndDlg) { + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RELATIVE)) { + time_t t = NDE_Time_ApplyConversion(0, qe_curorigin.Get(), 0); + struct tm *ts = localtime(&t); + wchar_t qe_tempstr[4096] = {0}; + if (ts) + wsprintfW(qe_tempstr, L"%02d/%d/%04d %02d:%02d:%02d", ts->tm_mon+1, ts->tm_mday, ts->tm_year+1900, ts->tm_hour, ts->tm_min, ts->tm_sec); + else + wcsncpy(qe_tempstr, L"DATE_OUTOFRANGE", 4096); + SetDlgItemTextW(hwndDlg, IDC_STATIC_QUERYTIME, qe_tempstr); + } else { + SetDlgItemTextW(hwndDlg, IDC_STATIC_QUERYTIME, L"N/A"); + } +} + +void qe_enableDisable(HWND hwndDlg) { + if (!*qe_field) return; + nde_field_t field = NDE_Table_GetColumnByName(g_table, AutoChar(qe_field)); + if (!field) return; + int type = NDE_ColumnField_GetDataType(field); + + qe_showHideOperators(hwndDlg); + + switch (type) { + case FIELD_DATETIME: { + qe_fallback(hwndDlg, IDC_RADIO_ISLIKE, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_BEGINS, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_ENDS, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_CONTAINS, IDC_RADIO_EQUAL); + qe_doEnableDisable(hwndDlg, ctrls_string, sizeof(ctrls_string)/sizeof(int), 0); + qe_doEnableDisable(hwndDlg, ctrls_string_ops, sizeof(ctrls_string_ops)/sizeof(int), 0); + SetDlgItemTextW(hwndDlg,IDC_STATIC_STRING,WASABI_API_LNGSTRINGW(IDS_COMPARE_TO_STRING)); + qe_doEnableDisable(hwndDlg, ctrls_datetime, sizeof(ctrls_datetime)/sizeof(int), 1); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVE, WASABI_API_LNGSTRINGW(IDS_AFTER)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOW, WASABI_API_LNGSTRINGW(IDS_BEFORE)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVEOREQUAL, WASABI_API_LNGSTRINGW(IDS_SINCE)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOWOREQUAL, WASABI_API_LNGSTRINGW(IDS_UNTIL)); + break; + } + case FIELD_LENGTH: { + qe_fallback(hwndDlg, IDC_RADIO_ISLIKE, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_BEGINS, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_ENDS, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_CONTAINS, IDC_RADIO_EQUAL); + qe_doEnableDisable(hwndDlg, ctrls_string, sizeof(ctrls_string)/sizeof(int), 1); + qe_doEnableDisable(hwndDlg, ctrls_string_ops, sizeof(ctrls_string_ops)/sizeof(int), 0); + SetDlgItemTextW(hwndDlg,IDC_STATIC_STRING,WASABI_API_LNGSTRINGW(IDS_COMPARE_TO_LENGTH)); + qe_doEnableDisable(hwndDlg, ctrls_datetime, sizeof(ctrls_datetime)/sizeof(int), 0); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVE, WASABI_API_LNGSTRINGW(IDS_ABOVE)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOW, WASABI_API_LNGSTRINGW(IDS_BELOW)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVEOREQUAL, WASABI_API_LNGSTRINGW(IDS_ABOVE_OR_EQUAL)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOWOREQUAL, WASABI_API_LNGSTRINGW(IDS_BELOW_OR_EQUAL)); + break; + } + case FIELD_FILENAME: + case FIELD_STRING: { + qe_doEnableDisable(hwndDlg, ctrls_string, sizeof(ctrls_string)/sizeof(int), 1); + qe_doEnableDisable(hwndDlg, ctrls_string_ops, sizeof(ctrls_string_ops)/sizeof(int), 1); + SetDlgItemTextW(hwndDlg,IDC_STATIC_STRING,WASABI_API_LNGSTRINGW(IDS_COMPARE_TO_STRING)); + qe_doEnableDisable(hwndDlg, ctrls_datetime, sizeof(ctrls_datetime)/sizeof(int), 0); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVE, WASABI_API_LNGSTRINGW(IDS_ABOVE)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOW, WASABI_API_LNGSTRINGW(IDS_BELOW)); + SetDlgItemTextW(hwndDlg,IDC_RADIO_ABOVEOREQUAL, WASABI_API_LNGSTRINGW(IDS_ABOVE_OR_EQUAL)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOWOREQUAL, WASABI_API_LNGSTRINGW(IDS_BELOW_OR_EQUAL)); + break; + } + case FIELD_INTEGER: { + qe_fallback(hwndDlg, IDC_RADIO_ISLIKE, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_BEGINS, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_ENDS, IDC_RADIO_EQUAL); + qe_fallback(hwndDlg, IDC_RADIO_CONTAINS, IDC_RADIO_EQUAL); + SetDlgItemTextW(hwndDlg,IDC_STATIC_STRING,WASABI_API_LNGSTRINGW(IDS_COMPARE_TO_NUMBER)); + qe_doEnableDisable(hwndDlg, ctrls_string, sizeof(ctrls_string)/sizeof(int), 1); + qe_doEnableDisable(hwndDlg, ctrls_string_ops, sizeof(ctrls_string_ops)/sizeof(int), 0); + qe_doEnableDisable(hwndDlg, ctrls_datetime, sizeof(ctrls_datetime)/sizeof(int), 0); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVE, WASABI_API_LNGSTRINGW(IDS_ABOVE)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOW, WASABI_API_LNGSTRINGW(IDS_BELOW)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_ABOVEOREQUAL, WASABI_API_LNGSTRINGW(IDS_ABOVE_OR_EQUAL)); + SetDlgItemTextW(hwndDlg, IDC_RADIO_BELOWOREQUAL, WASABI_API_LNGSTRINGW(IDS_BELOW_OR_EQUAL)); + break; + } + } + + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_ISEMPTY)) { + qe_doEnableDisable(hwndDlg, ctrls_string, sizeof(ctrls_string)/sizeof(int), 0); + qe_doEnableDisable(hwndDlg, ctrls_datetime, sizeof(ctrls_datetime)/sizeof(int), 0); + return; + } +} + +void te_enableDisable(HWND hwndDlg) { + qe_doEnableDisable(hwndDlg, ctrls_datetime_relative, sizeof(ctrls_datetime_relative)/sizeof(int), IsDlgButtonChecked(hwndDlg, IDC_CHECK_RELATIVE)); + qe_doEnableDisable(hwndDlg, ctrls_datetime_absolute, sizeof(ctrls_datetime_absolute)/sizeof(int), IsDlgButtonChecked(hwndDlg, IDC_CHECK_ABSOLUTE)); + qe_doEnableDisable(hwndDlg, ctrls_datetime_relative_ago, sizeof(ctrls_datetime_relative_ago)/sizeof(int), IsDlgButtonChecked(hwndDlg, IDC_CHECK_RELATIVE) && IsDlgButtonChecked(hwndDlg, IDC_CHECK_TIMEAGO)); + qe_doEnableDisable(hwndDlg, ctrls_datetime_relative_ago_direction, sizeof(ctrls_datetime_relative_ago_direction)/sizeof(int), !IsDlgButtonChecked(hwndDlg, IDC_CHECK_ABSOLUTE) && IsDlgButtonChecked(hwndDlg, IDC_CHECK_SELECTIVE) && IsDlgButtonChecked(hwndDlg, IDC_CHECK_TIMEAGO)); + qe_doEnableDisable(hwndDlg, ctrls_datetime_relative_selective, sizeof(ctrls_datetime_relative_selective)/sizeof(int), IsDlgButtonChecked(hwndDlg, IDC_CHECK_RELATIVE) && IsDlgButtonChecked(hwndDlg, IDC_CHECK_SELECTIVE)); + int origin = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SELECTIVE) && IsDlgButtonChecked(hwndDlg, IDC_CHECK_RELATIVE); + qe_enableDisableItem(hwndDlg, IDC_EDIT_YEAR, origin && IsDlgButtonChecked(hwndDlg, IDC_RADIO_YEAR)); + qe_enableDisableItem(hwndDlg, IDC_BUTTON_MONTH, origin && IsDlgButtonChecked(hwndDlg, IDC_RADIO_MONTH)); + qe_enableDisableItem(hwndDlg, IDC_EDIT_DAY, origin && IsDlgButtonChecked(hwndDlg, IDC_RADIO_DAY)); + qe_enableDisableItem(hwndDlg, IDC_DATETIMEPICKER2, origin && IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIME)); + + SetDlgItemTextW(hwndDlg, IDC_CHECK_TIMEAGO, WASABI_API_LNGSTRINGW((IsDlgButtonChecked(hwndDlg, IDC_CHECK_SELECTIVE) ? IDS_OFFSET_BY : IDS_TIME_AGO))); + SetWindowTextW(GetDlgItem(hwndDlg, IDC_BUTTON_MONTH), monthtable[te_cur_selected_month]); + + InvalidateRect(GetDlgItem(hwndDlg, IDC_CHECK_ABSOLUTE), NULL, TRUE); + InvalidateRect(GetDlgItem(hwndDlg, IDC_CHECK_RELATIVE), NULL, TRUE); + InvalidateRect(GetDlgItem(hwndDlg, IDC_CHECK_TIMEAGO), NULL, TRUE); + InvalidateRect(GetDlgItem(hwndDlg, IDC_CHECK_SELECTIVE), NULL, TRUE); + InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_DIRECTION), NULL, TRUE); +} + +const wchar_t *te_getDateTime(HWND hwndDlg) { + static GayStringW str; + wchar_t qe_tempstr[4096] = {0}; + str.Set(L""); + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_ABSOLUTE)) { + GayStringW sd; + SYSTEMTIME st={0,0,0,0,0,0,0,0}; + DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER), &st); + if (st.wYear != 0) { + wsprintfW(qe_tempstr, L"%02d/%d/%02d", st.wMonth, st.wDay, st.wYear); + sd.Append(qe_tempstr); + } + SYSTEMTIME stt={0,0,0,0,0,0,0,0}; + DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER1), &stt); + if (stt.wYear != 0) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + wsprintfW(qe_tempstr, L"%02d:%02d:%02d", stt.wHour, stt.wMinute, stt.wSecond); + sd.Append(qe_tempstr); + } + if (sd.Get() && *sd.Get()) { + str.Set(sd.Get()); + return str.Get(); + } + } else if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RELATIVE)) { + GayStringW sd; + int gotshit = 0; + int gotmonth = 0; + int gotthismonth = 0; + int gotday = 0; + int lgotthistime = 0; + int lgotthisday = 0; + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_TIMEAGO)) { + int v = GetDlgItemInt(hwndDlg, IDC_EDIT_TIMEAGO, NULL, TRUE); + wsprintfW(qe_tempstr, L"%d", v); + sd.Append(qe_tempstr); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_Y)) { sd.Append(L" year"); if (v > 1) sd.Append(L"s"); } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_M)) { sd.Append(L" month"); if (v > 1) sd.Append(L"s"); } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_W)) { sd.Append(L" week"); if (v > 1) sd.Append(L"s"); } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_D)) { sd.Append(L" day"); if (v > 1) sd.Append(L"s"); } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_H)) sd.Append(L" h"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_MIN)) sd.Append(L" mn"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIMEAGO_S)) sd.Append(L" s"); + } + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SELECTIVE)) { + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_TIMEAGO) && IsDlgButtonChecked(hwndDlg, IDC_RADIO_AFTER)) sd.Append(L" after"); + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_TIMEAGO) && IsDlgButtonChecked(hwndDlg, IDC_RADIO_BEFORE)) sd.Append(L" before"); + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISDAY) && + IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + int v = GetDlgItemInt(hwndDlg, IDC_EDIT_DAY, NULL, TRUE); + wsprintfW(qe_tempstr, L"%s%d", !gotmonth ? L"the " : L"", v); + int u = (v - ((int)((double)v/10.0)) * 10); + if (v < 1 || v > 31) { + sd.Append(L"DAY_OUTOFRANGE"); + gotshit = 1; + } else { + sd.Append(qe_tempstr); + switch (u) { + case 1: sd.Append(L"st"); gotshit = 1; break; + case 2: sd.Append(L"nd"); gotshit = 1; break; + case 3: sd.Append(L"rd"); gotshit = 1; break; + default: sd.Append(L"th"); gotshit = 1; break; + } + } + if (!gotthismonth && IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH)) { + sd.Append(L" of this month"); + gotthismonth = 1; + } + gotshit = 1; + gotday = 1; + } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISYEAR) && + IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH) && + IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISDAY) && + IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISTIME)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + sd.Append(L"now"); + gotshit = 1; + } else { + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISYEAR) && + IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH) && + IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISDAY)) { + if (gotshit) sd.Append(L","); + if (sd.Get() && *sd.Get()) sd.Append(L" "); + sd.Append(L"this date"); + gotshit = 1; + } else { + if (!gotthismonth && IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH) && !IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISYEAR)) { + if (gotshit) sd.Append(L","); + if (sd.Get() && *sd.Get()) sd.Append(L" "); + sd.Append(L"this month"); + gotthismonth = 1; + gotshit = 1; + } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISDAY)) { + if (gotshit) sd.Append(L","); + if (sd.Get() && *sd.Get()) sd.Append(L" "); + sd.Append(L"this day"); + lgotthisday = 1; + gotshit = 1; + } + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISTIME)) { + if (gotshit) sd.Append(L","); + if (sd.Get() && *sd.Get()) sd.Append(L" "); + sd.Append(L"this time"); + lgotthistime = 1; + lgotthisday = 0; + gotshit = 1; + } + } + } + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + if (lgotthistime) { + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISDAY)) + sd.Append(L"on "); + else { + sd.Append(L"in "); + } + } else if (lgotthisday) sd.Append(L"of "); + switch (te_cur_selected_month) { + case 0: sd.Append(L"Jan"); gotshit = 1; gotmonth = 1; break; + case 1: sd.Append(L"Feb"); gotshit = 1; gotmonth = 1; break; + case 2: sd.Append(L"Mar"); gotshit = 1; gotmonth = 1; break; + case 3: sd.Append(L"Apr"); gotshit = 1; gotmonth = 1; break; + case 4: sd.Append(L"May"); gotshit = 1; gotmonth = 1; break; + case 5: sd.Append(L"Jun"); gotshit = 1; gotmonth = 1; break; + case 6: sd.Append(L"Jul"); gotshit = 1; gotmonth = 1; break; + case 7: sd.Append(L"Aug"); gotshit = 1; gotmonth = 1; break; + case 8: sd.Append(L"Sep"); gotshit = 1; gotmonth = 1; break; + case 9: sd.Append(L"Oct"); gotshit = 1; gotmonth = 1; break; + case 10: sd.Append(L"Nov"); gotshit = 1; gotmonth = 1; break; + case 11: sd.Append(L"Dec"); gotshit = 1; gotmonth = 1; break; + default: sd.Append(L"MONTH_OUTOFRANGE"); gotshit = 1; gotmonth = 1; break; + } + } + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISDAY) && + !IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + int v = GetDlgItemInt(hwndDlg, IDC_EDIT_DAY, NULL, TRUE); + wsprintfW(qe_tempstr, L"%s%d", !gotmonth ? L"the " : L"", v); + int u = (v - ((int)((double)v/10.0)) * 10); + if (v < 1 || v > 31) { + sd.Append(L"DAY_OUTOFRANGE"); + gotshit = 1; + } else { + sd.Append(qe_tempstr); + switch (u) { + case 1: sd.Append(L"st"); gotshit = 1; break; + case 2: sd.Append(L"nd"); gotshit = 1; break; + case 3: sd.Append(L"rd"); gotshit = 1; break; + default: sd.Append(L"th"); gotshit = 1; break; + } + } + if (!gotthismonth && IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISMONTH)) { + sd.Append(L" of this month"); + } + gotthismonth = 1; + gotshit = 1; + gotday = 1; + } + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISYEAR)) { + + if ((gotshit || gotday) && !gotmonth) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + sd.Append(L"in "); + } else if (gotmonth && gotday) sd.Append(L", "); + else if (sd.Get() && *sd.Get()) sd.Append(L" "); + int v = GetDlgItemInt(hwndDlg, IDC_EDIT_YEAR, NULL, TRUE); + if (v <= 69) v += 2000; + else if (v > 69 && v < 100) v += 1900; + if (v <= 1969 || v >= 2038) + wcsncpy(qe_tempstr, L"YEAR_OUTOFRANGE", 4096); + else + wsprintfW(qe_tempstr, L"%d", v); + sd.Append(qe_tempstr); + gotshit = 1; + } + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISTIME)) { + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_NOON)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + if (gotshit) sd.Append(L"at "); + sd.Append(L"noon"); + } else if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_MIDNIGHT)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + if (gotshit) sd.Append(L"at "); + sd.Append(L"midnight"); + } else if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_TIME)) { + if (sd.Get() && *sd.Get()) sd.Append(L" "); + if (gotshit) sd.Append(L"at "); + SYSTEMTIME stt={0,0,0,0,0,0,0,0}; + DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER2), &stt); + wsprintfW(qe_tempstr, L"%02d:%02d:%02d", stt.wHour, stt.wMinute, stt.wSecond); + sd.Append(qe_tempstr); + gotshit = 1; + } + } + } else { + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_TIMEAGO)) + sd.Append(L" ago"); + } + qe_curorigin.Set(sd.Get()); + if (sd.Get() && *sd.Get()) { + str.Set(sd.Get()); + return str.Get(); + } + } + return NULL; +} + +void qe_updateQuery(HWND hwndDlg) { + if (!*qe_field) return; + wchar_t qe_tempstr[4096] = {0}; + nde_field_t field = NDE_Table_GetColumnByName(g_table, AutoChar(qe_field)); + if (!field) return; + int type =NDE_ColumnField_GetDataType(field); + + *qe_tempstr = NULL; + GayStringW str; + + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_NOT)) + str.Append(L"!("); + str.Append(qe_field); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_EQUAL)) + str.Append(L" =="); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_ABOVE)) + str.Append(L" >"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_BELOW)) + str.Append(L" <"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_ABOVEOREQUAL)) + str.Append(L" >="); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_BELOWOREQUAL)) + str.Append(L" <="); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_ISLIKE)) + str.Append(L" like"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_ISEMPTY)) + str.Append(L" isempty"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_BEGINS)) + str.Append(L" begins"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_ENDS)) + str.Append(L" ends"); + if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_CONTAINS)) + str.Append(L" has"); + + if (!IsDlgButtonChecked(hwndDlg, IDC_RADIO_ISEMPTY)) { + switch(type) { + case FIELD_DATETIME: { + str.Append(L" ["); + GetDlgItemTextW(hwndDlg, IDC_EDIT_DATETIME, qe_tempstr, 4096); + qe_curdate.Set(qe_tempstr); + str.Append(qe_curdate.Get()); + str.Append(L"]"); + } + break; + case FIELD_INTEGER: { + wsprintfW(qe_tempstr, L" %d", GetDlgItemInt(hwndDlg, IDC_EDIT_STRING, NULL, 1)); + str.Append(qe_tempstr); + } + break; + case FIELD_FILENAME: + case FIELD_STRING: { + GetDlgItemTextW(hwndDlg, IDC_EDIT_STRING, qe_tempstr, 4096); + str.Append(L" \""); + GayStringW escaped; + queryStrEscape(qe_tempstr, escaped); + str.Append(escaped.Get()); + str.Append(L"\""); + } + break; + case FIELD_LENGTH: { + GetDlgItemTextW(hwndDlg, IDC_EDIT_STRING, qe_tempstr, 4096); + wchar_t *z = wcschr(qe_tempstr, L':'); + if (z) { + wchar_t *zz = wcschr(z+1, L':'); + int a, b, c=0,v=0; + a = myatoi(qe_tempstr, z-qe_tempstr); + if (zz) { b = myatoi(z+1, zz-(z+1)); c = _wtoi(zz+1); v = a * 3600 + b * 60 + c; } + else { b = _wtoi(z+1); v = a * 60 + b; } + + if (v < 60) + wsprintfW(qe_tempstr,L"%d",v); + else if (v < 60*60) + wsprintfW(qe_tempstr,L"%d:%02d",v/60,v%60); + else + wsprintfW(qe_tempstr,L"%d:%02d:%02d",v/60/60,(v/60)%60,v%60); + + str.Append(qe_tempstr); + } else { + wsprintfW(qe_tempstr, L" %d", GetDlgItemInt(hwndDlg, IDC_EDIT_STRING, NULL, 1)); + str.Append(qe_tempstr); + } + } + break; + } + } + + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_NOT)) + str.Append(L")"); + + qe_curexpr.Set(str.Get()); + SetDlgItemTextW(hwndDlg, IDC_EDIT_RESULT, str.Get()); + SetDlgItemTextW(hwndDlg, IDC_EDIT_QUERY, qe_curquery.Get()); + + qe_updateResultingDate(hwndDlg); +} + +void qe_update(HWND hwndDlg) { + qe_enableDisable(hwndDlg); + qe_updateQuery(hwndDlg); +} + +void te_updateResult(HWND hwndDlg) { + const wchar_t *s = te_getDateTime(hwndDlg); + te_result.Set(s == NULL ? L"":s); + SetDlgItemTextW(hwndDlg, IDC_EDIT_RESULT, te_result.Get()); +} + +void te_update(HWND hwndDlg) { + te_enableDisable(hwndDlg); + te_updateResult(hwndDlg); +} + +void qe_pushExpression(HWND hwndDlg, const wchar_t *op) { + GayStringW newq; + if (op && qe_curquery.Get() && *qe_curquery.Get()) { + newq.Append(L"("); + newq.Append(qe_curquery.Get()); + newq.Append(L") "); + newq.Append(op); + newq.Append(L" ("); + newq.Append(qe_curexpr.Get()); + newq.Append(L")"); + qe_curquery.Set(newq.Get()); + } else { + qe_curquery.Set(qe_curexpr.Get()); + } + qe_update(hwndDlg); +} + +SYSTEMTIME pickedtime; +SYSTEMTIME pickeddate; + +INT_PTR CALLBACK pickDateTimeDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) { + switch(uMsg) { + case WM_INITDIALOG: { + return TRUE; + } + case WM_COMMAND: { + switch (LOWORD(wParam)) { + case IDOK: + memset(&pickedtime, 0, sizeof(pickedtime)); + memset(&pickeddate, 0, sizeof(pickeddate)); + DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER), &pickeddate); + DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER1), &pickedtime); + EndDialog(hwndDlg, IDOK); + break; + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + break; + } + } + break; + } + return FALSE; +} + +INT_PTR CALLBACK editDateTimeDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) { + + switch(uMsg) { + case WM_INITDIALOG: { + const wchar_t *p = te_ret.Get(); + while (p) { + if (*p != L' ') break; + p++; + } + int empty = (p && *p == 0); + TimeParse tp; + NDE_Time_ApplyConversion(0, te_ret.Get(), &tp); + + if (!empty) { + CheckDlgButton(hwndDlg, IDC_RADIO_THISYEAR, tp.relative_year == -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_YEAR, tp.relative_year != -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISMONTH, tp.relative_month == -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_MONTH, tp.relative_month != -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISDAY, tp.relative_day == -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_DAY, tp.relative_day != -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISTIME, tp.relative_hour == -1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_NOON, (tp.relative_hour == 12 && tp.relative_min == 0 && tp.relative_sec == 0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_MIDNIGHT, (tp.relative_hour == 0 && tp.relative_min == 0 && tp.relative_sec == 0) ? BST_CHECKED : BST_UNCHECKED); + int timeyet = IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISTIME); + timeyet |= IsDlgButtonChecked(hwndDlg, IDC_RADIO_NOON); + timeyet |= IsDlgButtonChecked(hwndDlg, IDC_RADIO_MIDNIGHT); + CheckDlgButton(hwndDlg, IDC_RADIO_TIME, !timeyet ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_RELATIVE, tp.is_relative ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_ABSOLUTE, !tp.is_relative ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_BEFORE, tp.offset_whence == 1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_AFTER, tp.offset_whence == 0 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHECK_TIMEAGO, tp.offset_used == 1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_Y, tp.offset_what == 0 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_M, tp.offset_what == 1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_W, tp.offset_what == 2 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_D, tp.offset_what == 3 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_H, tp.offset_what == 4 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_MIN, tp.offset_what == 5 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_S, tp.offset_what == 6 ? BST_CHECKED : BST_UNCHECKED); + if (tp.is_relative && (tp.relative_year != -1 || tp.relative_month != -1 || tp.relative_day != -1 || tp.relative_hour != -1 || tp.relative_min != -1 || tp.relative_sec != -1)) + CheckDlgButton(hwndDlg, IDC_CHECK_SELECTIVE, BST_CHECKED); + else + CheckDlgButton(hwndDlg, IDC_CHECK_SELECTIVE, BST_UNCHECKED); + } + wchar_t t[64] = {0}; + wsprintfW(t, L"%d", tp.offset_value); + SetDlgItemTextW(hwndDlg, IDC_EDIT_TIMEAGO, t); + SetDlgItemTextW(hwndDlg, IDC_EDIT_RESULT, te_ret.Get()); + { + wchar_t qe_tempstr[4096] = {0}; + time_t now; + time(&now); + struct tm *ts = localtime(&now); + wsprintfW(qe_tempstr, L"%d", tp.relative_year != -1 ? tp.relative_year : ts->tm_year+1900); + SetDlgItemTextW(hwndDlg, IDC_EDIT_YEAR, qe_tempstr); + wsprintfW(qe_tempstr, L"%d", tp.relative_day != -1 ? tp.relative_day : ts->tm_mday); + SetDlgItemTextW(hwndDlg, IDC_EDIT_DAY, qe_tempstr); + te_cur_selected_month = tp.relative_month != -1 ? tp.relative_month : ts->tm_mon; + } + if (!empty && !IsDlgButtonChecked(hwndDlg, IDC_RADIO_THISTIME) && !IsDlgButtonChecked(hwndDlg, IDC_RADIO_NOON) && !IsDlgButtonChecked(hwndDlg, IDC_RADIO_MIDNIGHT)) { + SYSTEMTIME st={0}; + st.wHour = (WORD)tp.relative_hour; + st.wMinute = (WORD)tp.relative_min; + st.wSecond = (WORD)tp.relative_sec; + DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER2), GDT_VALID, &st); + } + if (!empty && !tp.is_relative) { + time_t o = tp.absolute_datetime; + struct tm *t = localtime(&o); + if (t) { + if (!tp.absolute_hasdate) + DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER), GDT_NONE, NULL); + else { + SYSTEMTIME st={0}; + st.wYear = (WORD)t->tm_year; + st.wDay = (WORD)t->tm_mday; + st.wMonth = (WORD)t->tm_mon; + DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER), GDT_VALID, &st); + } + if (!tp.absolute_hastime) + DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER1), GDT_NONE, NULL); + else { + SYSTEMTIME st2={0}; + GetSystemTime(&st2); + st2.wHour = (WORD)t->tm_hour; + st2.wMinute = (WORD)t->tm_min; + st2.wSecond = (WORD)t->tm_sec; + DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER1), GDT_VALID, &st2); + } + } + CheckDlgButton(hwndDlg, IDC_CHECK_TIMEAGO, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_W, 1); + SetDlgItemText(hwndDlg, IDC_EDIT_TIMEAGO, L"1"); + CheckDlgButton(hwndDlg, IDC_RADIO_BEFORE, 1); + } else if (!empty) { + if (!IsDlgButtonChecked(hwndDlg, IDC_CHECK_SELECTIVE)) { + CheckDlgButton(hwndDlg, IDC_RADIO_THISYEAR, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISMONTH, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISDAY, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISTIME, 1); + } + } else if (empty) { + CheckDlgButton(hwndDlg, IDC_CHECK_TIMEAGO, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_TIMEAGO_W, 1); + SetDlgItemText(hwndDlg, IDC_EDIT_TIMEAGO, L"1"); + CheckDlgButton(hwndDlg, IDC_RADIO_BEFORE, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISYEAR, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISMONTH, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISDAY, 1); + CheckDlgButton(hwndDlg, IDC_RADIO_THISTIME, 1); + CheckDlgButton(hwndDlg, IDC_CHECK_RELATIVE, 1); + } + te_enableDisable(hwndDlg); + SetTimer(hwndDlg, 0, 1000, NULL); + } + return 1; + case WM_COMMAND: { + switch (LOWORD(wParam)) { + case IDOK: EndDialog(hwndDlg, IDOK); break; + case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); break; + case IDC_EDIT_TIMEAGO: + case IDC_EDIT_YEAR: + case IDC_EDIT_DAY: + if (HIWORD(wParam) != EN_CHANGE) break; + case IDC_CHECK_ABSOLUTE: + case IDC_CHECK_RELATIVE: + case IDC_CHECK_TIMEAGO: + case IDC_CHECK_SELECTIVE: + case IDC_RADIO_THISYEAR: + case IDC_RADIO_THISMONTH: + case IDC_RADIO_THISDAY: + case IDC_RADIO_THISTIME: + case IDC_RADIO_YEAR: + case IDC_RADIO_MONTH: + case IDC_RADIO_DAY: + case IDC_RADIO_TIME: + case IDC_RADIO_NOON: + case IDC_RADIO_MIDNIGHT: + case IDC_RADIO_EQUAL: + case IDC_RADIO_ABOVE: + case IDC_RADIO_ABOVEOREQUAL: + case IDC_RADIO_BELOW: + case IDC_RADIO_BELOWOREQUAL: + case IDC_RADIO_ISLIKE: + case IDC_RADIO_ISEMPTY: + case IDC_RADIO_BEGINS: + case IDC_RADIO_ENDS: + case IDC_RADIO_CONTAINS: + case IDC_CHECK_NOT: + case IDC_RADIO_TIMEAGO_Y: + case IDC_RADIO_TIMEAGO_M: + case IDC_RADIO_TIMEAGO_D: + case IDC_RADIO_TIMEAGO_H: + case IDC_RADIO_TIMEAGO_MIN: + case IDC_RADIO_TIMEAGO_S: + case IDC_RADIO_TIMEAGO_W: + case IDC_RADIO_AFTER: + case IDC_RADIO_BEFORE: + te_update(hwndDlg); + return 0; + case IDC_BUTTON_PICK: { + INT_PTR r = WASABI_API_DIALOGBOXW(IDD_EDIT_QUERY_PICK, hwndDlg, pickDateTimeDialogProc); + if (r == IDOK) { + if (pickeddate.wYear != 0) { + SetDlgItemInt(hwndDlg, IDC_EDIT_YEAR, pickeddate.wYear, 0); + te_cur_selected_month = pickeddate.wMonth-1; + SetDlgItemInt(hwndDlg, IDC_EDIT_DAY, pickeddate.wDay, 0); + CheckDlgButton(hwndDlg, IDC_RADIO_THISYEAR, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_YEAR, BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISMONTH, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_MONTH, BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISDAY, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_DAY, BST_CHECKED); + } + if (pickedtime.wYear != 0) { + DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATETIMEPICKER2), GDT_VALID, &pickedtime); + CheckDlgButton(hwndDlg, IDC_RADIO_THISTIME, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIME, BST_CHECKED); + } + te_update(hwndDlg); + } + } + break; + case IDC_BUTTON_NOW: + CheckDlgButton(hwndDlg, IDC_RADIO_THISYEAR, BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_YEAR, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISMONTH, BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_MONTH, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISDAY, BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_DAY, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_THISTIME, BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_TIME, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_NOON, BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_RADIO_MIDNIGHT, BST_UNCHECKED); + te_update(hwndDlg); + return 0; + case IDC_BUTTON_MONTH: { + HMENU menu = CreatePopupMenu(); + for (int i=0;i<12;i++) + AppendMenuW(menu, MF_STRING|(te_cur_selected_month==i)?MF_CHECKED:MF_UNCHECKED, i+1, monthtable[i]); + POINT pt; + GetCursorPos(&pt); + int r = TrackPopupMenuEx(menu, TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_NONOTIFY|TPM_RETURNCMD|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, pt.x, pt.y, hwndDlg, NULL); + if (r) + { + te_cur_selected_month = r-1; + te_update(hwndDlg); + } + break; + } + } + } + case WM_TIMER: { + te_updateResultingDate(hwndDlg); + return 0; + } + case WM_NOTIFY: { + int idCtrl = (int)wParam; + NMHDR *hdr = (NMHDR*)lParam; + switch (idCtrl) { + case IDC_DATETIMEPICKER: + case IDC_DATETIMEPICKER1: + case IDC_DATETIMEPICKER2: + if (hdr->code == DTN_DATETIMECHANGE) + te_update(hwndDlg); + break; + } + } + break; + } + return 0; +} + +INT_PTR CALLBACK editQueryDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch ( uMsg ) + { + case WM_INITDIALOG: + { + qe_fillFieldsList( GetDlgItem( hwndDlg, IDC_LIST_FIELDS ) ); + SetDlgItemTextW( hwndDlg, IDC_EDIT_RESULT, qe_curquery.Get() ); + CheckDlgButton( hwndDlg, IDC_RADIO_EQUAL, MF_CHECKED ); + qe_update( hwndDlg ); + SetTimer( hwndDlg, 0, 1000, NULL ); + return 1; + } + case WM_TIMER: + { + qe_updateResultingDate( hwndDlg ); + return 0; + } + case WM_COMMAND: + { + switch ( LOWORD( wParam ) ) + { + case IDOK: + if ( !qe_curquery.Get() || !*qe_curquery.Get() && qe_curexpr.Get() && *qe_curexpr.Get() ) + { + wchar_t titleStr[ 32 ] = { 0 }; + int r = MessageBoxW( hwndDlg, WASABI_API_LNGSTRINGW( IDS_QUERY_FIELD_IS_EMPTY ), + WASABI_API_LNGSTRINGW_BUF( IDS_EMPTY_QUERY, titleStr, 32 ), MB_YESNOCANCEL ); + if ( r == IDYES ) + qe_curquery.Set( qe_curexpr.Get() ); + else if ( r == IDCANCEL ) break; + } + if ( qe_origquery.Get() && *qe_origquery.Get() && qe_curquery.Get() || *qe_curquery.Get() && qe_curexpr.Get() && *qe_curexpr.Get() ) + { + if ( !wcscmp( qe_curquery.Get(), qe_origquery.Get() ) ) + { + wchar_t titleStr[ 32 ] = { 0 }; + int r = MessageBoxW( hwndDlg, WASABI_API_LNGSTRINGW( IDS_NO_CHANGES_MADE_TO_QUERY ), + WASABI_API_LNGSTRINGW_BUF( IDS_QUERY_NOT_CHANGED, titleStr, 32 ), MB_YESNOCANCEL ); + if ( r == IDYES ) + qe_curquery.Set( qe_curexpr.Get() ); + else if ( r == IDCANCEL ) break; + } + } + EndDialog( hwndDlg, IDOK ); + break; + case IDCANCEL: EndDialog( hwndDlg, IDCANCEL ); break; + + case IDC_EDIT_STRING: + case IDC_EDIT_DATETIME: + if ( HIWORD( wParam ) != EN_CHANGE ) break; + case IDC_RADIO_EQUAL: + case IDC_RADIO_ABOVE: + case IDC_RADIO_ABOVEOREQUAL: + case IDC_RADIO_BELOW: + case IDC_RADIO_BELOWOREQUAL: + case IDC_RADIO_ISLIKE: + case IDC_RADIO_ISEMPTY: + case IDC_RADIO_BEGINS: + case IDC_RADIO_ENDS: + case IDC_RADIO_CONTAINS: + case IDC_CHECK_NOT: + qe_update( hwndDlg ); + return 0; + case IDC_LIST_FIELDS: + if ( HIWORD( wParam ) == CBN_SELCHANGE ) + { + HWND wnd = GetDlgItem( hwndDlg, IDC_LIST_FIELDS ); + int idx = ListBox_GetCurSel( wnd ); + int len = ListBox_GetTextLenW( wnd, idx ); + if ( qe_field != NULL ) free( qe_field ); + qe_field = (wchar_t *)calloc( ( len + 1 ), sizeof( wchar_t ) ); + ListBox_GetTextW( wnd, idx, qe_field ); + + qe_field[ len ] = 0; + qe_update( hwndDlg ); + } + break; + case IDC_BUTTON_AND: + qe_pushExpression( hwndDlg, L"AND" ); + break; + case IDC_BUTTON_OR: + qe_pushExpression( hwndDlg, L"OR" ); + break; + case ID_BUTTON_SENDTOQUERY: + qe_pushExpression( hwndDlg, NULL ); + break; + case IDC_BUTTON_EDITDATETIME: + { + const wchar_t *res = editTime( hwndDlg, qe_curdate.Get() ); + if ( res != NULL ) + { + SetDlgItemTextW( hwndDlg, IDC_EDIT_DATETIME, res ); + qe_curdate.Set( res ); + } + qe_update( hwndDlg ); + break; + } + case IDC_EDIT_QUERY: + if ( HIWORD( wParam ) == EN_CHANGE ) + { + wchar_t qe_tempstr[ 4096 ] = { 0 }; + GetDlgItemTextW( hwndDlg, IDC_EDIT_QUERY, qe_tempstr, 4096 ); + qe_curquery.Set( qe_tempstr ); + qe_showHideOperators( hwndDlg ); + } + break; + } + } + break; + } + return FALSE; +}
\ No newline at end of file |