diff options
Diffstat (limited to 'plugins/Folders/dlg_handlers.cpp')
-rw-r--r-- | plugins/Folders/dlg_handlers.cpp | 413 |
1 files changed, 413 insertions, 0 deletions
diff --git a/plugins/Folders/dlg_handlers.cpp b/plugins/Folders/dlg_handlers.cpp new file mode 100644 index 0000000000..74d3715835 --- /dev/null +++ b/plugins/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 |