From 6c3b0571f0678da0512069869afaa284c054377e Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Fri, 18 May 2012 21:57:05 +0000 Subject: Folders renamed git-svn-id: http://svn.miranda-ng.org/main/trunk@59 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Folders/folders/dlg_handlers.cpp | 413 +++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 plugins/Folders/folders/dlg_handlers.cpp (limited to 'plugins/Folders/folders/dlg_handlers.cpp') diff --git a/plugins/Folders/folders/dlg_handlers.cpp b/plugins/Folders/folders/dlg_handlers.cpp new file mode 100644 index 0000000000..74d3715835 --- /dev/null +++ b/plugins/Folders/folders/dlg_handlers.cpp @@ -0,0 +1,413 @@ +#include "dlg_handlers.h" + +PFolderItem lastItem = NULL; + +static int bInitializing = 0; + +int GetCurrentItemSelection(HWND hWnd) +{ + return SendDlgItemMessageW(hWnd, IDC_FOLDERS_ITEMS_LIST, LB_GETCURSEL, 0, 0); +} + +int GetCurrentSectionSelection(HWND hWnd) +{ + return SendDlgItemMessageW(hWnd, IDC_FOLDERS_SECTIONS_LIST, LB_GETCURSEL, 0, 0); +} + +PFolderItem GetSelectedItem(HWND hWnd) +{ + WCHAR section[MAX_FOLDER_SIZE]; + WCHAR item[MAX_FOLDER_SIZE]; + GetCurrentItemText(hWnd, item, MAX_FOLDER_SIZE); + GetCurrentSectionText(hWnd, section, MAX_FOLDER_SIZE); + return lstRegisteredFolders.GetTranslated(section, item); +} + +int GetCurrentItemText(HWND hWnd, WCHAR *buffer, int count) +{ + int index = GetCurrentItemSelection(hWnd); + if (index != LB_ERR) + { + SendDlgItemMessageW(hWnd, IDC_FOLDERS_ITEMS_LIST, LB_GETTEXT, index, (LPARAM) buffer); + return 1; + } + else{ + buffer[0] = L'\0'; + return 0; + } +} + +int GetCurrentSectionText(HWND hWnd, WCHAR *buffer, int count) +{ + int index = GetCurrentSectionSelection(hWnd); + if (index != LB_ERR) + { + SendDlgItemMessageW(hWnd, IDC_FOLDERS_SECTIONS_LIST, LB_GETTEXT, index, (LPARAM) buffer); + return 1; + } + else{ + buffer[0] = L'0'; + return 0; + } +} + +//void GetEditText(HWND hWnd, char *buffer, int size) +//{ +// GetWindowText(GetDlgItem(hWnd, IDC_FOLDER_EDIT), buffer, size); +// StrTrim(buffer, "\\\t \n"); +//} + +void GetEditTextW(HWND hWnd, wchar_t *buffer, int size) +{ + GetWindowTextW(GetDlgItem(hWnd, IDC_FOLDER_EDIT), buffer, size); +} + +//void SetEditText(HWND hWnd, const char *buffer) +//{ +// bInitializing = 1; +// SetWindowText(GetDlgItem(hWnd, IDC_FOLDER_EDIT), buffer); +// bInitializing = 0; +//// SendDlgItemMessage(hWnd, IDC_FOLDER_EDIT, WM_SETTEXT, 0, (LPARAM) buffer); +//} + +void SetEditTextW(HWND hWnd, const wchar_t *buffer) +{ + bInitializing = 1; + SetWindowTextW(GetDlgItem(hWnd, IDC_FOLDER_EDIT), buffer); + bInitializing = 0; +} + +int ContainsSection(HWND hWnd, const WCHAR *section) +{ + int index = SendDlgItemMessageW(hWnd, IDC_FOLDERS_SECTIONS_LIST, LB_FINDSTRINGEXACT, -1, (LPARAM) section); + return (index != LB_ERR); +} + +void LoadRegisteredFolderSections(HWND hWnd) +{ + for (int i = 0; i < lstRegisteredFolders.Count(); i++) + { + PFolderItem tmp = lstRegisteredFolders.Get(i + 1); + WCHAR *translated = mir_a2u(Translate(tmp->GetSection())); + if (!ContainsSection(hWnd, translated)) + { + SendDlgItemMessageW(hWnd, IDC_FOLDERS_SECTIONS_LIST, LB_ADDSTRING, 0, (LPARAM) translated); + } + mir_free(translated); + } +} + +void LoadRegisteredFolderItems(HWND hWnd) +{ + WCHAR buffer[MAX_FOLDER_SIZE]; + GetCurrentSectionText(hWnd, buffer, MAX_FOLDER_SIZE); + SendDlgItemMessageW(hWnd, IDC_FOLDERS_ITEMS_LIST, LB_RESETCONTENT, 0, 0); + for (int i = 0; i < lstRegisteredFolders.Count(); i++) + { + PFolderItem item = lstRegisteredFolders.Get(i + 1); + WCHAR *wide = mir_a2u(Translate(item->GetSection())); + if (wcscmp(buffer, wide) == 0) + { + mir_free(wide); + wide = mir_a2u(Translate(item->GetName())); + SendDlgItemMessageW(hWnd, IDC_FOLDERS_ITEMS_LIST, LB_ADDSTRING, 0, (LPARAM) wide); + } + mir_free(wide); + } + SendDlgItemMessageW(hWnd, IDC_FOLDERS_ITEMS_LIST, LB_SETCURSEL, 0, 0); //select the first item + PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDC_FOLDERS_ITEMS_LIST, LBN_SELCHANGE), 0); //tell the dialog to refresh the preview +} + +void LoadItem(HWND hWnd, PFolderItem item) +{ + if (item) + { + if (item->IsUnicode()) + { + SetEditTextW(hWnd, item->GetFormatW()); + } + else{ + WCHAR *buffer = mir_a2u(item->GetFormat()); + SetEditTextW(hWnd, buffer); + mir_free(buffer); + } + RefreshPreview(hWnd); + } +} + +void SaveItem(HWND hWnd, PFolderItem item, int bEnableApply) +{ + if (item) + { + if (item->IsUnicode()) + { + wchar_t buffer[MAX_FOLDER_SIZE]; + GetEditTextW(hWnd, buffer, MAX_FOLDER_SIZE); + item->SetFormatW(buffer); + } + else{ + WCHAR buffer[MAX_FOLDER_SIZE]; + char ansi[MAX_FOLDER_SIZE]; + GetEditTextW(hWnd, buffer, MAX_FOLDER_SIZE); + WideCharToMultiByte(CallService(MS_LANGPACK_GETCODEPAGE, 0, 0), 0, buffer, -1, ansi, MAX_FOLDER_SIZE, NULL, NULL); + item->SetFormat(ansi); + } + if (bEnableApply) + { + SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); + } + } +} + +int ChangesNotSaved(HWND hWnd, PFolderItem item) +{ + int res = 0; + if (item) + { + if (item->IsUnicode()) + { + wchar_t buffer[MAX_FOLDER_SIZE]; + GetEditTextW(hWnd, buffer, MAX_FOLDER_SIZE); + res = (wcscmp(item->GetFormatW(), buffer) != 0); + } + else{ + WCHAR buffer[MAX_FOLDER_SIZE]; + GetEditTextW(hWnd, buffer, MAX_FOLDER_SIZE); + char *ansi = mir_u2a(buffer); + + res = (strcmp(item->GetFormat(), ansi) != 0); + mir_free(ansi); + } + } + + return res; +} + +void CheckForChanges(HWND hWnd, int bNeedConfirmation = 1) +{ + if (ChangesNotSaved(hWnd, lastItem)) + { + if ((!bNeedConfirmation) || MessageBoxW(hWnd, TranslateW(L"Some changes weren't saved. Apply the changes now ?"), TranslateW(L"Changes not saved"), MB_YESNO | MB_ICONINFORMATION) == IDYES) + { + SaveItem(hWnd, lastItem); + } + } +} + +void RefreshPreview(HWND hWnd) +{ + wchar_t tmp[MAX_FOLDER_SIZE]; + wchar_t res[MAX_FOLDER_SIZE]; + GetEditTextW(hWnd, tmp, MAX_FOLDER_SIZE); + ExpandPathW(res, tmp, MAX_FOLDER_SIZE); + SetWindowTextW(GetDlgItem(hWnd, IDC_PREVIEW_EDIT), res); + //SendDlgItemMessage(hWnd, IDC_PREVIEW_EDIT, WM_SETTEXT, 0, (LPARAM) res); +} + + +void LoadHelp(HWND hWnd) +{ + SETTEXTEX tmp = {0}; + tmp.flags = ST_SELECTION; + tmp.codepage = CallService(MS_LANGPACK_GETCODEPAGE, 0, 0); + char *text = +#include "variablesHelp.inc" +; + + char buffer[2048]; + char line[2048]; + int len; + + char *p; + while ((p = strchr(text, '\n'))) + { + len = p - text + 1; + memcpy(line, text, len); + line[len] = 0; + + mir_snprintf(buffer, sizeof(buffer), "{\\rtf1\\ansi\\deff0\\pard\\li%u\\fi-%u\\ri%u\\tx%u\\fs19 %s\\par}", 60*15, 60*15, 5*15, 60*15, Translate(line)); + text = p + 1; + + SendDlgItemMessageW(hWnd, IDC_HELP_RICHEDIT, EM_SETTEXTEX, (WPARAM) &tmp, (LPARAM) buffer); + } + + +} + +/************************************** DIALOG HANDLERS *************************************/ +#include "commctrl.h" + +INT_PTR CALLBACK DlgProcOpts(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + bInitializing = 1; + lastItem = NULL; + TranslateDialogDefault(hWnd); + LoadRegisteredFolderSections(hWnd); + bInitializing = 0; + + break; + } + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_FOLDER_EDIT: + { + switch (HIWORD(wParam)) + { + case EN_CHANGE: + { + RefreshPreview(hWnd); + if (!bInitializing) + { + SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); //show the apply button. + } + + break; + } + } + + break; + } + + case IDC_REFRESH_BUTTON: + { + RefreshPreview(hWnd); + + break; + } + + case IDC_HELP_BUTTON: + { + HWND helpDlg = CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_VARIABLES_HELP), hWnd, DlgProcVariables); + ShowWindow(helpDlg, SW_SHOW); + + break; + } + + case IDC_FOLDERS_SECTIONS_LIST: + { + switch (HIWORD(wParam)) + { + case LBN_SELCHANGE: + { + CheckForChanges(hWnd); + LoadRegisteredFolderItems(hWnd); + lastItem = NULL; + SetEditTextW(hWnd, L""); + RefreshPreview(hWnd); + + break; + } + } + + break; + } + + case IDC_FOLDERS_ITEMS_LIST: + { + switch (HIWORD(wParam)) + { + case LBN_SELCHANGE: + { + PFolderItem item = GetSelectedItem(hWnd); + if (item != NULL) + { + CheckForChanges(hWnd); + LoadItem(hWnd, item); + } + lastItem = item; + + break; + } + } + + break; + } + } + + break; + } + + case WM_NOTIFY: + { +// Log("WM_NOTIFY %d %d", wParam, lParam); + switch(((LPNMHDR)lParam)->idFrom) + { + case 0: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + { + PFolderItem item = GetSelectedItem(hWnd); + if (item) + { + SaveItem(hWnd, item, FALSE); + LoadItem(hWnd, item); + } + + lstRegisteredFolders.Save(); + CallPathChangedEvents(); + + break; + } + } + + break; + } + } + + break; + + default: + { + + break; + } + } + + return 0; +} + +INT_PTR CALLBACK DlgProcVariables(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hWnd); + LoadHelp(hWnd); + + break; + } + + case WM_CLOSE: + { + DestroyWindow(hWnd); + + break; + } + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDCLOSE: + { + DestroyWindow(hWnd); + + break; + } + } + + break; + } + } + + return 0; +} \ No newline at end of file -- cgit v1.2.3