summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2015-05-20 18:21:33 +0000
committerGeorge Hazan <george.hazan@gmail.com>2015-05-20 18:21:33 +0000
commit80ecc6b2862c5de44432f930190ecfebb3030a30 (patch)
tree1d4411fc4b09fabc91be0d05eba802811c901be6 /src
parentb5bb7bfe0a4da1fb1e9664da06ec708c809dbe6d (diff)
Profile Manager -> CCtrlPages
git-svn-id: http://svn.miranda-ng.org/main/trunk@13720 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src')
-rw-r--r--src/modules/database/profilemanager.cpp1188
-rw-r--r--src/resource.rc7
2 files changed, 480 insertions, 715 deletions
diff --git a/src/modules/database/profilemanager.cpp b/src/modules/database/profilemanager.cpp
index b562089040..4228af9aa3 100644
--- a/src/modules/database/profilemanager.cpp
+++ b/src/modules/database/profilemanager.cpp
@@ -35,53 +35,8 @@ void EnsureCheckerLoaded(bool);
typedef BOOL (__cdecl *ENUMPROFILECALLBACK) (TCHAR *tszFullPath, TCHAR *profile, LPARAM lParam);
-struct DetailsPageInit
-{
- int pageCount;
- OPTIONSDIALOGPAGE *odp;
-};
-
-struct DetailsPageData
-{
- DLGTEMPLATE *pTemplate;
- HINSTANCE hInst;
- DLGPROC dlgProc;
- HWND hwnd;
- int changed;
-};
-
-struct DlgProfData
-{
- PROPSHEETHEADER *psh;
- HWND hwndOK;
- PROFILEMANAGERDATA *pd;
- HANDLE hFileNotify;
-};
-
-struct DetailsData
-{
- HINSTANCE hInstIcmp;
- HFONT hBoldFont;
- int pageCount;
- int currentPage;
- DetailsPageData *opd;
- RECT rcDisplay;
- DlgProfData *prof;
-};
-
-struct ProfileEnumData
-{
- HWND hwnd;
- TCHAR* szProfile;
-};
-
void SetServiceModePlugin(pluginEntry *p);
-static void ThemeDialogBackground(HWND hwnd)
-{
- EnableThemeDialogTexture(hwnd, ETDT_ENABLETAB);
-}
-
/////////////////////////////////////////////////////////////////////////////////////////
// Profile creator
@@ -114,47 +69,6 @@ static int findProfiles(TCHAR *szProfileDir, ENUMPROFILECALLBACK callback, LPARA
return 1;
}
-static int CreateProfile(TCHAR *profile, DATABASELINK *link, HWND hwndDlg)
-{
- TCHAR buf[256];
- int err = 0;
- // check if the file already exists
- TCHAR *file = _tcsrchr(profile, '\\');
- if (file) file++;
- if (_taccess(profile, 0) == 0) {
- // file already exists!
- mir_sntprintf(buf, SIZEOF(buf),
- TranslateT("The profile '%s' already exists. Do you want to move it to the Recycle Bin?\n\nWARNING: The profile will be deleted if Recycle Bin is disabled.\nWARNING: A profile may contain confidential information and should be properly deleted."),
- file);
- if (MessageBox(hwndDlg, buf, TranslateT("The profile already exists"), MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) != IDYES)
- return 0;
-
- // move the file
- SHFILEOPSTRUCT sf = {0};
- sf.wFunc = FO_DELETE;
- sf.pFrom = buf;
- sf.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT | FOF_ALLOWUNDO;
- mir_sntprintf(buf, SIZEOF(buf), _T("%s\0"), profile);
- if (SHFileOperation(&sf) != 0) {
- mir_sntprintf(buf, SIZEOF(buf), TranslateT("Couldn't move '%s' to the Recycle Bin. Please select another profile name."), file);
- MessageBox(0, buf, TranslateT("Problem moving profile"), MB_ICONINFORMATION|MB_OK);
- return 0;
- }
- // now the file should be gone!
- }
- // ask the database to create the profile
- CreatePathToFileT(profile);
- if ((err = link->makeDatabase(profile)) != ERROR_SUCCESS) {
- mir_sntprintf(buf, SIZEOF(buf), TranslateT("Unable to create the profile '%s', the error was %x"), file, err);
- MessageBox(hwndDlg, buf, TranslateT("Problem creating profile"), MB_ICONERROR|MB_OK);
- return 0;
- }
-
- // the profile has been created!
- g_bDbCreated = true;
- return 1;
-}
-
static LRESULT CALLBACK ProfileNameValidate(HWND edit, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_CHAR) {
@@ -165,726 +79,578 @@ static LRESULT CALLBACK ProfileNameValidate(HWND edit, UINT msg, WPARAM wParam,
return mir_callNextSubclass(edit, ProfileNameValidate, msg, wParam, lParam);
}
-static INT_PTR CALLBACK DlgProfileNew(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+class CCreateProfileDlg : public CDlgBase
{
- DlgProfData *dat = (DlgProfData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
- switch (msg) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
- dat = (DlgProfData*)lParam;
- {
- HWND hwndCombo = GetDlgItem(hwndDlg, IDC_PROFILEDRIVERS);
-
- // what, no plugins?!
- if (arDbPlugins.getCount() == 0) {
- EnableWindow(hwndCombo, FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILENAME), FALSE);
- ShowWindow(GetDlgItem(hwndDlg, IDC_NODBDRIVERS), TRUE);
- }
- else {
- for (int i = 0; i < arDbPlugins.getCount(); i++) {
- DATABASELINK *p = arDbPlugins[i];
- LRESULT index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)TranslateTS(p->szFullName));
- SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)p);
- }
+ CCtrlButton &m_btnOk;
+ PROFILEMANAGERDATA *m_pd;
+
+ int CreateProfile(TCHAR *profile, DATABASELINK *link)
+ {
+ TCHAR buf[256];
+ int err = 0;
+ // check if the file already exists
+ TCHAR *file = _tcsrchr(profile, '\\');
+ if (file) file++;
+ if (_taccess(profile, 0) == 0) {
+ // file already exists!
+ mir_sntprintf(buf, SIZEOF(buf),
+ TranslateT("The profile '%s' already exists. Do you want to move it to the Recycle Bin?\n\nWARNING: The profile will be deleted if Recycle Bin is disabled.\nWARNING: A profile may contain confidential information and should be properly deleted."),
+ file);
+ if (MessageBox(m_hwnd, buf, TranslateT("The profile already exists"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) != IDYES)
+ return 0;
+
+ // move the file
+ SHFILEOPSTRUCT sf = { 0 };
+ sf.wFunc = FO_DELETE;
+ sf.pFrom = buf;
+ sf.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT | FOF_ALLOWUNDO;
+ mir_sntprintf(buf, SIZEOF(buf), _T("%s\0"), profile);
+ if (SHFileOperation(&sf) != 0) {
+ mir_sntprintf(buf, SIZEOF(buf), TranslateT("Couldn't move '%s' to the Recycle Bin. Please select another profile name."), file);
+ MessageBox(m_hwnd, buf, TranslateT("Problem moving profile"), MB_ICONINFORMATION | MB_OK);
+ return 0;
}
+ // now the file should be gone!
+ }
+ // ask the database to create the profile
+ CreatePathToFileT(profile);
+ if ((err = link->makeDatabase(profile)) != ERROR_SUCCESS) {
+ mir_sntprintf(buf, SIZEOF(buf), TranslateT("Unable to create the profile '%s', the error was %x"), file, err);
+ MessageBox(m_hwnd, buf, TranslateT("Problem creating profile"), MB_ICONERROR | MB_OK);
+ return 0;
+ }
- // default item
- SendMessage(hwndCombo, CB_SETCURSEL, 0, 0);
+ // the profile has been created!
+ g_bDbCreated = true;
+ return 1;
+ }
- // subclass the profile name box
- mir_subclassWindow(GetDlgItem(hwndDlg, IDC_PROFILENAME), ProfileNameValidate);
+ CCtrlCombo m_driverList;
+ CCtrlEdit m_profileName;
+ CCtrlBase m_warning;
+
+public:
+ CCreateProfileDlg(CCtrlButton &_btn, PROFILEMANAGERDATA *_pd) :
+ CDlgBase(hInst, IDD_PROFILE_NEW),
+ m_btnOk(_btn),
+ m_pd(_pd),
+ m_driverList(this, IDC_PROFILEDRIVERS),
+ m_profileName(this, IDC_PROFILENAME),
+ m_warning(this, IDC_NODBDRIVERS)
+ {}
+
+ virtual void OnInitDialog()
+ {
+ // what, no plugins?!
+ if (arDbPlugins.getCount() == 0) {
+ m_driverList.Enable(false);
+ m_profileName.Enable(false);
+ ShowWindow(m_warning.GetHwnd(), TRUE);
+ }
+ else {
+ for (int i = 0; i < arDbPlugins.getCount(); i++) {
+ DATABASELINK *p = arDbPlugins[i];
+ m_driverList.AddString(TranslateTS(p->szFullName), (LPARAM)p);
+ }
}
+ // default item
+ m_driverList.SetCurSel(0);
+
+ // subclass the profile name box
+ mir_subclassWindow(m_profileName.GetHwnd(), ProfileNameValidate);
+
// decide if there is a default profile name given in the INI and if it should be used
- if (dat->pd->noProfiles || (shouldAutoCreate(dat->pd->ptszProfile) && _taccess(dat->pd->ptszProfile, 0))) {
- TCHAR *profile = _tcsrchr(dat->pd->ptszProfile, '\\');
+ if (m_pd->noProfiles || (shouldAutoCreate(m_pd->ptszProfile) && _taccess(m_pd->ptszProfile, 0))) {
+ TCHAR *profile = _tcsrchr(m_pd->ptszProfile, '\\');
if (profile) ++profile;
- else profile = dat->pd->ptszProfile;
+ else profile = m_pd->ptszProfile;
TCHAR *p = _tcsrchr(profile, '.');
TCHAR c = 0;
if (p) { c = *p; *p = 0; }
- SetDlgItemText(hwndDlg, IDC_PROFILENAME, profile);
+ m_profileName.SetText(profile);
if (c) *p = c;
}
// focus on the textbox
- PostMessage(hwndDlg, WM_FOCUSTEXTBOX, 0, 0);
- return TRUE;
+ PostMessage(m_hwnd, WM_FOCUSTEXTBOX, 0, 0);
+ }
- case WM_FOCUSTEXTBOX:
- SetFocus(GetDlgItem(hwndDlg, IDC_PROFILENAME));
- break;
+ virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
+ {
+ switch (msg) {
+ case WM_FOCUSTEXTBOX:
+ SetFocus(m_profileName.GetHwnd());
+ break;
- case WM_INPUTCHANGED: // when input in the edit box changes
- SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
- EnableWindow(dat->hwndOK, GetWindowTextLength(GetDlgItem(hwndDlg, IDC_PROFILENAME)) > 0);
- break;
+ case WM_INPUTCHANGED: // when input in the edit box changes
+ NotifyChange();
+ m_btnOk.Enable(GetWindowTextLength(m_profileName.GetHwnd()) > 0);
+ break;
- case WM_SHOWWINDOW:
- if (wParam) {
- SetWindowText(dat->hwndOK, TranslateT("&Create"));
- SendMessage(hwndDlg, WM_INPUTCHANGED, 0, 0);
+ case WM_SHOWWINDOW:
+ if (wParam) {
+ m_btnOk.SetText(TranslateT("&Create"));
+ SendMessage(m_hwnd, WM_INPUTCHANGED, 0, 0);
+ }
+ break;
}
- break;
-
- case WM_NOTIFY:
- NMHDR *hdr = (NMHDR*)lParam;
- if (hdr && hdr->code == PSN_APPLY && dat && IsWindowVisible(hwndDlg)) {
- TCHAR szName[MAX_PATH];
- LRESULT curSel = SendDlgItemMessage(hwndDlg, IDC_PROFILEDRIVERS, CB_GETCURSEL, 0, 0);
- if (curSel == CB_ERR)
- break; // should never happen
-
- GetDlgItemText(hwndDlg, IDC_PROFILENAME, szName, SIZEOF(szName));
- if (szName[0] == 0)
- break;
+ return CDlgBase::DlgProc(msg, wParam, lParam);
+ }
- // profile placed in "profile_name" subfolder
- mir_sntprintf(dat->pd->ptszProfile, MAX_PATH, _T("%s\\%s\\%s.dat"), dat->pd->ptszProfileDir, szName, szName);
- dat->pd->newProfile = 1;
- dat->pd->dblink = (DATABASELINK *)SendDlgItemMessage(hwndDlg, IDC_PROFILEDRIVERS, CB_GETITEMDATA, (WPARAM)curSel, 0);
+ virtual void OnApply()
+ {
+ LRESULT curSel = m_driverList.GetCurSel();
+ if (curSel == -1)
+ return; // should never happen
- if (CreateProfile(dat->pd->ptszProfile, dat->pd->dblink, hwndDlg) == 0)
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
- else
- dat->pd->bRun = true;
- }
- break;
- }
+ ptrT szName(m_profileName.GetText());
+ if (szName == 0)
+ return;
- return FALSE;
-}
+ // profile placed in "profile_name" subfolder
+ mir_sntprintf(m_pd->ptszProfile, MAX_PATH, _T("%s\\%s\\%s.dat"), m_pd->ptszProfileDir, szName, szName);
+ m_pd->newProfile = 1;
+ m_pd->dblink = (DATABASELINK *)m_driverList.GetItemData(curSel);
+
+ if (CreateProfile(m_pd->ptszProfile, m_pd->dblink) == 0)
+ SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
+ else
+ m_pd->bRun = true;
+ }
+};
/////////////////////////////////////////////////////////////////////////////////////////
// Profile selector
-BOOL EnumProfilesForList(TCHAR *tszFullPath, TCHAR *profile, LPARAM lParam)
+class CChooseProfileDlg : public CDlgBase
{
- ProfileEnumData *ped = (ProfileEnumData*)lParam;
- HWND hwndList = GetDlgItem(ped->hwnd, IDC_PROFILELIST);
-
- TCHAR sizeBuf[64];
- bool bFileLocked = true;
-
- TCHAR *p = _tcsrchr(profile, '.');
- _tcscpy(sizeBuf, _T("0 KB"));
- if (p != NULL) *p = 0;
-
- LVITEM item = { 0 };
- item.mask = LVIF_TEXT | LVIF_IMAGE;
- item.pszText = profile;
- item.iItem = 0;
-
- struct _stat statbuf;
- if (_tstat(tszFullPath, &statbuf) == 0) {
- if (statbuf.st_size > 1000000) {
- mir_sntprintf(sizeBuf, SIZEOF(sizeBuf), _T("%.3lf"), (double)statbuf.st_size / 1048576.0);
- _tcscpy(sizeBuf + 5, _T(" MB"));
+ CCtrlButton &m_btnOk;
+ PROFILEMANAGERDATA *m_pd;
+ HANDLE m_hFileNotify;
+
+ struct ProfileEnumData
+ {
+ CCtrlListView &list;
+ TCHAR* szProfile;
+ };
+
+ static BOOL EnumProfilesForList(TCHAR *tszFullPath, TCHAR *profile, LPARAM lParam)
+ {
+ ProfileEnumData *ped = (ProfileEnumData*)lParam;
+ CCtrlListView &list = ped->list;
+
+ TCHAR sizeBuf[64];
+ bool bFileLocked = true;
+
+ TCHAR *p = _tcsrchr(profile, '.');
+ _tcscpy(sizeBuf, _T("0 KB"));
+ if (p != NULL) *p = 0;
+
+ LVITEM item = { 0 };
+ item.mask = LVIF_TEXT | LVIF_IMAGE;
+ item.pszText = profile;
+ item.iItem = 0;
+
+ struct _stat statbuf;
+ if (_tstat(tszFullPath, &statbuf) == 0) {
+ if (statbuf.st_size > 1000000) {
+ mir_sntprintf(sizeBuf, SIZEOF(sizeBuf), _T("%.3lf"), (double)statbuf.st_size / 1048576.0);
+ _tcscpy(sizeBuf + 5, _T(" MB"));
+ }
+ else {
+ mir_sntprintf(sizeBuf, SIZEOF(sizeBuf), _T("%.3lf"), (double)statbuf.st_size / 1024.0);
+ _tcscpy(sizeBuf + 5, _T(" KB"));
+ }
+ bFileLocked = !fileExist(tszFullPath);
}
- else {
- mir_sntprintf(sizeBuf, SIZEOF(sizeBuf), _T("%.3lf"), (double)statbuf.st_size / 1024.0);
- _tcscpy(sizeBuf + 5, _T(" KB"));
+
+ DATABASELINK *dblink;
+ switch (touchDatabase(tszFullPath, &dblink)) {
+ case ERROR_SUCCESS:
+ item.iImage = bFileLocked;
+ break;
+
+ case EGROKPRF_OBSOLETE:
+ item.iImage = 2;
+ break;
+
+ default:
+ item.iImage = 3;
}
- bFileLocked = !fileExist(tszFullPath);
- }
- DATABASELINK *dblink;
- switch (touchDatabase(tszFullPath, &dblink)) {
- case ERROR_SUCCESS:
- item.iImage = bFileLocked;
- break;
+ int iItem = list.InsertItem(&item);
+ if (mir_tstrcmpi(ped->szProfile, tszFullPath) == 0)
+ list.SetItemState(iItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
+
+ list.SetItemText(iItem, 2, sizeBuf);
- case EGROKPRF_OBSOLETE:
- item.iImage = 2;
- break;
+ if (dblink != NULL) {
+ if (bFileLocked) // file locked
+ list.SetItemText(iItem, 1, TranslateT("<In use>"));
+ else
+ list.SetItemText(iItem, 1, TranslateTS(dblink->szFullName));
+ }
+ else list.SetItemText(iItem, 1, TranslateT("<Unknown format>"));
- default:
- item.iImage = 3;
+ return TRUE;
}
- int iItem = SendMessage(hwndList, LVM_INSERTITEM, 0, (LPARAM)&item);
- if (mir_tstrcmpi(ped->szProfile, tszFullPath) == 0)
- ListView_SetItemState(hwndList, iItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
+ void CheckProfile(int iItem)
+ {
+ if (iItem < 0)
+ return;
+
+ TCHAR profile[MAX_PATH], fullName[MAX_PATH];
+ LVITEM item = { 0 };
+ item.mask = LVIF_TEXT | LVIF_IMAGE;
+ item.iItem = iItem;
+ item.pszText = profile;
+ item.cchTextMax = SIZEOF(profile);
+ if (!m_profileList.GetItem(&item))
+ return;
+
+ mir_sntprintf(fullName, SIZEOF(fullName), _T("%s\\%s\\%s.dat"), m_pd->ptszProfileDir, profile, profile);
+ CallService(MS_DB_CHECKPROFILE, (WPARAM)fullName, item.iImage == 2);
+ }
- item.iItem = iItem;
- item.iSubItem = 2;
- item.pszText = sizeBuf;
- SendMessage(hwndList, LVM_SETITEMTEXT, iItem, (LPARAM)&item);
+ void DeleteProfile(int iItem)
+ {
+ if (iItem < 0)
+ return;
- if (dblink != NULL) {
- if (bFileLocked) // file locked
- item.pszText = TranslateT("<In use>");
- else
- item.pszText = TranslateTS(dblink->szFullName);
- }
- else item.pszText = TranslateT("<Unknown format>");
+ TCHAR profile[MAX_PATH], profilef[MAX_PATH * 2];
- item.iSubItem = 1;
- SendMessage(hwndList, LVM_SETITEMTEXT, iItem, (LPARAM)&item);
- return TRUE;
-}
+ LVITEM item = { 0 };
+ item.mask = LVIF_TEXT;
+ item.iItem = iItem;
+ item.pszText = profile;
+ item.cchTextMax = SIZEOF(profile);
+ if (!m_profileList.GetItem(&item))
+ return;
-void CheckProfile(HWND hwndList, int iItem, DlgProfData *dat)
-{
- if (iItem < 0)
- return;
-
- TCHAR profile[MAX_PATH], fullName[MAX_PATH];
- LVITEM item = { 0 };
- item.mask = LVIF_TEXT | LVIF_IMAGE;
- item.iItem = iItem;
- item.pszText = profile;
- item.cchTextMax = SIZEOF(profile);
- if (!ListView_GetItem(hwndList, &item))
- return;
-
- mir_sntprintf(fullName, SIZEOF(fullName), _T("%s\\%s\\%s.dat"), dat->pd->ptszProfileDir, profile, profile);
- CallService(MS_DB_CHECKPROFILE, (WPARAM)fullName, item.iImage == 2);
-}
+ mir_sntprintf(profilef, SIZEOF(profilef), TranslateT("Are you sure you want to remove profile \"%s\"?"), profile);
+ if (IDYES != MessageBox(NULL, profilef, _T("Miranda NG"), MB_YESNO | MB_TASKMODAL | MB_ICONWARNING))
+ return;
-void DeleteProfile(HWND hwndList, int iItem, DlgProfData *dat)
-{
- if (iItem < 0)
- return;
-
- TCHAR profile[MAX_PATH], profilef[MAX_PATH * 2];
-
- LVITEM item = { 0 };
- item.mask = LVIF_TEXT;
- item.iItem = iItem;
- item.pszText = profile;
- item.cchTextMax = SIZEOF(profile);
- if (!ListView_GetItem(hwndList, &item))
- return;
-
- mir_sntprintf(profilef, SIZEOF(profilef), TranslateT("Are you sure you want to remove profile \"%s\"?"), profile);
- if (IDYES != MessageBox(NULL, profilef, _T("Miranda NG"), MB_YESNO | MB_TASKMODAL | MB_ICONWARNING))
- return;
-
- mir_sntprintf(profilef, SIZEOF(profilef), _T("%s\\%s%c"), dat->pd->ptszProfileDir, profile, 0);
-
- SHFILEOPSTRUCT sf = { 0 };
- sf.wFunc = FO_DELETE;
- sf.pFrom = profilef;
- sf.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_ALLOWUNDO;
- SHFileOperation(&sf);
- ListView_DeleteItem(hwndList, item.iItem);
-}
+ mir_sntprintf(profilef, SIZEOF(profilef), _T("%s\\%s%c"), m_pd->ptszProfileDir, profile, 0);
-static void CheckRun(HWND hwndDlg, int uMsg)
-{
- DlgProfData *dat = (DlgProfData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
- if (dat == NULL)
- return;
-
- HWND hwndList = GetDlgItem(hwndDlg, IDC_PROFILELIST);
- EnableWindow(dat->hwndOK, ListView_GetSelectedCount(hwndList) == 1);
-
- TCHAR profile[MAX_PATH];
- LVITEM item = { 0 };
- item.mask = LVIF_TEXT | LVIF_IMAGE;
- item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED | LVNI_ALL);
- item.pszText = profile;
- item.cchTextMax = SIZEOF(profile);
- if (!ListView_GetItem(hwndList, &item))
- return;
-
- switch(item.iImage) {
- case 3:
- EnableWindow(dat->hwndOK, false);
- return;
-
- case 2:
- SetWindowText(dat->hwndOK, TranslateT("&Convert"));
- dat->pd->bRun = false;
- break;
-
- default:
- SetWindowText(dat->hwndOK, TranslateT("&Run"));
- dat->pd->bRun = true;
+ SHFILEOPSTRUCT sf = { 0 };
+ sf.wFunc = FO_DELETE;
+ sf.pFrom = profilef;
+ sf.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_ALLOWUNDO;
+ SHFileOperation(&sf);
+ m_profileList.DeleteItem(item.iItem);
}
- // profile is placed in "profile_name" subfolder
+ void CheckRun(int uMsg)
+ {
+ m_btnOk.Enable(m_profileList.GetSelectedCount() == 1);
+
+ TCHAR profile[MAX_PATH];
+ LVITEM item = { 0 };
+ item.mask = LVIF_TEXT | LVIF_IMAGE;
+ item.iItem = m_profileList.GetNextItem(-1, LVNI_SELECTED | LVNI_ALL);
+ item.pszText = profile;
+ item.cchTextMax = SIZEOF(profile);
+ if (!m_profileList.GetItem(&item))
+ return;
+
+ switch(item.iImage) {
+ case 3:
+ m_btnOk.Enable(false);
+ return;
+
+ case 2:
+ m_btnOk.SetText(TranslateT("&Convert"));
+ m_pd->bRun = false;
+ break;
- TCHAR tmpPath[MAX_PATH];
- mir_sntprintf(tmpPath, SIZEOF(tmpPath), _T("%s\\%s.dat"), dat->pd->ptszProfileDir, profile);
- if (_taccess(tmpPath, 2))
- mir_sntprintf(dat->pd->ptszProfile, MAX_PATH, _T("%s\\%s\\%s.dat"), dat->pd->ptszProfileDir, profile, profile);
- else
- _tcsncpy_s(dat->pd->ptszProfile, MAX_PATH, tmpPath, _TRUNCATE);
+ default:
+ m_btnOk.SetText(TranslateT("&Run"));
+ m_pd->bRun = true;
+ }
- if (uMsg == NM_DBLCLK)
- EndDialog(GetParent(hwndDlg), 1);
-}
+ // profile is placed in "profile_name" subfolder
-static void ExecuteMenu(HWND hwndDlg, LPARAM lParam)
-{
- HWND hwndList = GetDlgItem(hwndDlg, IDC_PROFILELIST);
- DlgProfData *dat = (DlgProfData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ TCHAR tmpPath[MAX_PATH];
+ mir_sntprintf(tmpPath, SIZEOF(tmpPath), _T("%s\\%s.dat"), m_pd->ptszProfileDir, profile);
+ if (_taccess(tmpPath, 2))
+ mir_sntprintf(m_pd->ptszProfile, MAX_PATH, _T("%s\\%s\\%s.dat"), m_pd->ptszProfileDir, profile, profile);
+ else
+ _tcsncpy_s(m_pd->ptszProfile, MAX_PATH, tmpPath, _TRUNCATE);
- LVHITTESTINFO lvht = { 0 };
- lvht.pt.x = GET_X_LPARAM(lParam);
- lvht.pt.y = GET_Y_LPARAM(lParam);
- ScreenToClient(hwndList, &lvht.pt);
+ if (uMsg == NM_DBLCLK)
+ EndDialog(GetParent(m_hwnd), 1);
+ }
+
+ void ExecuteMenu(LPARAM lParam)
+ {
+ LVHITTESTINFO lvht = { 0 };
+ lvht.pt.x = GET_X_LPARAM(lParam);
+ lvht.pt.y = GET_Y_LPARAM(lParam);
+ ScreenToClient(m_profileList.GetHwnd(), &lvht.pt);
- if (ListView_HitTest(hwndList, &lvht) == -1)
- return;
+ if (m_profileList.HitTest(&lvht) == -1)
+ return;
- if (lvht.iItem == -1)
- return;
+ if (lvht.iItem == -1)
+ return;
- LVITEM tvi = { 0 };
- tvi.mask = LVIF_IMAGE;
- tvi.iItem = lvht.iItem;
- if (!ListView_GetItem(hwndList, &tvi))
- return;
+ LVITEM tvi = { 0 };
+ tvi.mask = LVIF_IMAGE;
+ tvi.iItem = lvht.iItem;
+ if (!m_profileList.GetItem(&tvi))
+ return;
- bool bConvert = (tvi.iImage == 2);
+ bool bConvert = (tvi.iImage == 2);
- lvht.pt.x = GET_X_LPARAM(lParam);
- lvht.pt.y = GET_Y_LPARAM(lParam);
+ lvht.pt.x = GET_X_LPARAM(lParam);
+ lvht.pt.y = GET_Y_LPARAM(lParam);
- HMENU hMenu = CreatePopupMenu();
- if (tvi.iImage < 2) {
- AppendMenu(hMenu, MF_STRING, 1, TranslateT("Run"));
- AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
+ HMENU hMenu = CreatePopupMenu();
+ if (tvi.iImage < 2) {
+ AppendMenu(hMenu, MF_STRING, 1, TranslateT("Run"));
+ AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
+ }
+ if (tvi.iImage != 3 && ServiceExists(MS_DB_CHECKPROFILE)) {
+ if (bConvert)
+ AppendMenu(hMenu, MF_STRING, 2, TranslateT("Convert database"));
+ else
+ AppendMenu(hMenu, MF_STRING, 2, TranslateT("Check database"));
+ AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
+ }
+ AppendMenu(hMenu, MF_STRING, 3, TranslateT("Delete"));
+ int index = TrackPopupMenu(hMenu, TPM_RETURNCMD, lvht.pt.x, lvht.pt.y, 0, m_hwnd, NULL);
+ switch (index) {
+ case 1:
+ SendMessage(GetParent(m_hwnd), WM_COMMAND, IDOK, 0);
+ break;
+
+ case 2:
+ CheckProfile(lvht.iItem);
+ break;
+
+ case 3:
+ DeleteProfile(lvht.iItem);
+ break;
+ }
+ DestroyMenu(hMenu);
}
- if (tvi.iImage != 3 && ServiceExists(MS_DB_CHECKPROFILE)) {
- if (bConvert)
- AppendMenu(hMenu, MF_STRING, 2, TranslateT("Convert database"));
- else
- AppendMenu(hMenu, MF_STRING, 2, TranslateT("Check database"));
- AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
+
+ CCtrlListView m_profileList;
+
+public:
+ CChooseProfileDlg(CCtrlButton &_btn, PROFILEMANAGERDATA *_pd) :
+ CDlgBase(hInst, IDD_PROFILE_SELECTION),
+ m_btnOk(_btn),
+ m_pd(_pd),
+ m_profileList(this, IDC_PROFILELIST)
+ {}
+
+ virtual void OnInitDialog()
+ {
+ // set columns
+ LVCOLUMN col;
+ col.mask = LVCF_TEXT | LVCF_WIDTH;
+ col.pszText = TranslateT("Profile");
+ col.cx = 100;
+ m_profileList.InsertColumn(0, &col);
+
+ col.pszText = TranslateT("Driver");
+ col.cx = 150 - GetSystemMetrics(SM_CXVSCROLL);
+ m_profileList.InsertColumn(1, &col);
+
+ col.pszText = TranslateT("Size");
+ col.cx = 60;
+ m_profileList.InsertColumn(2, &col);
+
+ // icons
+ HIMAGELIST hImgList = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 2, 1);
+ ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_USERDETAILS));
+ ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_DELETE));
+ ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_MWARNING));
+ ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_MFATAL));
+
+ // LV will destroy the image list
+ m_profileList.SetImageList(hImgList, LVSIL_SMALL);
+ m_profileList.SetExtendedListViewStyle(m_profileList.GetExtendedListViewStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
+
+ // find all the profiles
+ ProfileEnumData ped = { m_profileList, m_pd->ptszProfile };
+ findProfiles(m_pd->ptszProfileDir, EnumProfilesForList, (LPARAM)&ped);
+ PostMessage(m_hwnd, WM_FOCUSTEXTBOX, 0, 0);
+
+ m_hFileNotify = FindFirstChangeNotification(m_pd->ptszProfileDir, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE);
+ if (m_hFileNotify != INVALID_HANDLE_VALUE)
+ SetTimer(m_hwnd, 0, 1200, NULL);
}
- AppendMenu(hMenu, MF_STRING, 3, TranslateT("Delete"));
- int index = TrackPopupMenu(hMenu, TPM_RETURNCMD, lvht.pt.x, lvht.pt.y, 0, hwndDlg, NULL);
- switch (index) {
- case 1:
- SendMessage(GetParent(hwndDlg), WM_COMMAND, IDOK, 0);
- break;
-
- case 2:
- CheckProfile(hwndList, lvht.iItem, dat);
- break;
-
- case 3:
- DeleteProfile(hwndList, lvht.iItem, dat);
- break;
+
+ virtual void OnDestroy()
+ {
+ KillTimer(m_hwnd, 0);
+ FindCloseChangeNotification(m_hFileNotify);
}
- DestroyMenu(hMenu);
-}
-static INT_PTR CALLBACK DlgProfileSelect(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- DlgProfData *dat = (DlgProfData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
- HWND hwndList = GetDlgItem(hwndDlg, IDC_PROFILELIST);
-
- switch (msg) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- {
- dat = (DlgProfData*)lParam;
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);
-
- // set columns
- LVCOLUMN col;
- col.mask = LVCF_TEXT | LVCF_WIDTH;
- col.pszText = TranslateT("Profile");
- col.cx = 100;
- ListView_InsertColumn(hwndList, 0, &col);
-
- col.pszText = TranslateT("Driver");
- col.cx = 150 - GetSystemMetrics(SM_CXVSCROLL);
- ListView_InsertColumn(hwndList, 1, &col);
-
- col.pszText = TranslateT("Size");
- col.cx = 60;
- ListView_InsertColumn(hwndList, 2, &col);
-
- // icons
- HIMAGELIST hImgList = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 2, 1);
- ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_USERDETAILS));
- ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_DELETE));
- ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_MWARNING));
- ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_MFATAL));
-
- // LV will destroy the image list
- SetWindowLongPtr(hwndList, GWL_STYLE, GetWindowLongPtr(hwndList, GWL_STYLE) | LVS_SORTASCENDING);
- ListView_SetImageList(hwndList, hImgList, LVSIL_SMALL);
- ListView_SetExtendedListViewStyle(hwndList,
- ListView_GetExtendedListViewStyle(hwndList) | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
-
- // find all the profiles
- ProfileEnumData ped = { hwndDlg, dat->pd->ptszProfile };
- findProfiles(dat->pd->ptszProfileDir, EnumProfilesForList, (LPARAM)&ped);
- PostMessage(hwndDlg, WM_FOCUSTEXTBOX, 0, 0);
-
- dat->hFileNotify = FindFirstChangeNotification(dat->pd->ptszProfileDir, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE);
- if (dat->hFileNotify != INVALID_HANDLE_VALUE)
- SetTimer(hwndDlg, 0, 1200, NULL);
- return TRUE;
- }
+ virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
+ {
+ switch (msg) {
+ case WM_TIMER:
+ if (WaitForSingleObject(m_hFileNotify, 0) == WAIT_OBJECT_0) {
+ m_profileList.DeleteAllItems();
+ ProfileEnumData ped = { m_profileList, m_pd->ptszProfile };
+ findProfiles(m_pd->ptszProfileDir, EnumProfilesForList, (LPARAM)&ped);
+ FindNextChangeNotification(m_hFileNotify);
+ }
+ break;
- case WM_DESTROY:
- KillTimer(hwndDlg, 0);
- FindCloseChangeNotification(dat->hFileNotify);
- break;
-
- case WM_TIMER:
- if (WaitForSingleObject(dat->hFileNotify, 0) == WAIT_OBJECT_0) {
- ListView_DeleteAllItems(hwndList);
- ProfileEnumData ped = { hwndDlg, dat->pd->ptszProfile };
- findProfiles(dat->pd->ptszProfileDir, EnumProfilesForList, (LPARAM)&ped);
- FindNextChangeNotification(dat->hFileNotify);
- }
- break;
-
- case WM_FOCUSTEXTBOX:
- SetFocus(hwndList);
- if (dat->pd->ptszProfile[0] == 0 || ListView_GetSelectedCount(hwndList) == 0)
- ListView_SetItemState(hwndList, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
- break;
-
- case WM_SHOWWINDOW:
- if (wParam)
- CheckRun(hwndDlg, 0);
- break;
-
- case WM_CONTEXTMENU:
- ExecuteMenu(hwndDlg, lParam);
- break;
-
- case WM_NOTIFY:
- LPNMHDR hdr = (LPNMHDR)lParam;
- if (hdr == NULL)
+ case WM_FOCUSTEXTBOX:
+ SetFocus(m_profileList.GetHwnd());
+ if (m_pd->ptszProfile[0] == 0 || m_profileList.GetSelectedCount() == 0)
+ m_profileList.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
break;
- if (hdr->idFrom == 0) {
- CheckRun(hwndDlg, 0);
+ case WM_SHOWWINDOW:
+ if (wParam)
+ CheckRun(0);
break;
- }
- if (hdr->idFrom == IDC_PROFILELIST) {
- switch (hdr->code) {
- case LVN_ITEMCHANGED:
- case NM_DBLCLK:
- CheckRun(hwndDlg, hdr->code);
- return TRUE;
+ case WM_CONTEXTMENU:
+ ExecuteMenu(lParam);
+ break;
- case LVN_KEYDOWN:
- if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_DELETE)
- DeleteProfile(hwndList, ListView_GetNextItem(hwndList, -1, LVNI_SELECTED | LVNI_ALL), dat);
+ case WM_NOTIFY:
+ LPNMHDR hdr = (LPNMHDR)lParam;
+ if (hdr == NULL)
break;
- case LVN_GETINFOTIP:
- NMLVGETINFOTIP *pInfoTip = (NMLVGETINFOTIP *)lParam;
- if (pInfoTip != NULL) {
- TCHAR profilename[MAX_PATH], tszFullPath[MAX_PATH];
- struct _stat statbuf;
- ListView_GetItemText(hwndList, pInfoTip->iItem, 0, profilename, SIZEOF(profilename));
- mir_sntprintf(tszFullPath, SIZEOF(tszFullPath), _T("%s\\%s\\%s.dat"), dat->pd->ptszProfileDir, profilename, profilename);
- _tstat(tszFullPath, &statbuf);
- mir_sntprintf(pInfoTip->pszText, pInfoTip->cchTextMax, _T("%s\n%s: %s\n%s: %s"), tszFullPath, TranslateT("Created"), rtrimt(NEWTSTR_ALLOCA(_tctime(&statbuf.st_ctime))), TranslateT("Modified"), rtrimt(NEWTSTR_ALLOCA(_tctime(&statbuf.st_mtime))));
+ if (hdr->idFrom == 0) {
+ CheckRun(0);
+ break;
+ }
+
+ if (hdr->idFrom == IDC_PROFILELIST) {
+ switch (hdr->code) {
+ case LVN_ITEMCHANGED:
+ case NM_DBLCLK:
+ CheckRun(hdr->code);
+ return TRUE;
+
+ case LVN_KEYDOWN:
+ if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_DELETE)
+ DeleteProfile(m_profileList.GetNextItem(-1, LVNI_SELECTED | LVNI_ALL));
+ break;
+
+ case LVN_GETINFOTIP:
+ NMLVGETINFOTIP *pInfoTip = (NMLVGETINFOTIP *)lParam;
+ if (pInfoTip != NULL) {
+ TCHAR profilename[MAX_PATH], tszFullPath[MAX_PATH];
+ struct _stat statbuf;
+ m_profileList.GetItemText(pInfoTip->iItem, 0, profilename, SIZEOF(profilename));
+ mir_sntprintf(tszFullPath, SIZEOF(tszFullPath), _T("%s\\%s\\%s.dat"), m_pd->ptszProfileDir, profilename, profilename);
+ _tstat(tszFullPath, &statbuf);
+ mir_sntprintf(pInfoTip->pszText, pInfoTip->cchTextMax, _T("%s\n%s: %s\n%s: %s"), tszFullPath, TranslateT("Created"), rtrimt(NEWTSTR_ALLOCA(_tctime(&statbuf.st_ctime))), TranslateT("Modified"), rtrimt(NEWTSTR_ALLOCA(_tctime(&statbuf.st_mtime))));
+ }
}
}
+ break;
}
- break;
- }
- return FALSE;
-}
+ return CDlgBase::DlgProc(msg, wParam, lParam);
+ }
+};
/////////////////////////////////////////////////////////////////////////////////////////
// Tab manager + its envelope
-static INT_PTR CALLBACK DlgProfileManager(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+class CProfileManager : public CDlgBase
{
- DetailsData *dat = (DetailsData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
-
- switch (msg) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- {
- DlgProfData *prof = (DlgProfData*)lParam;
- PROPSHEETHEADER *psh = prof->psh;
- SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_DETAILSLOGO), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
- SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_DETAILSLOGO), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0));
- dat = (DetailsData*)mir_alloc(sizeof(DetailsData));
- dat->prof = prof;
- prof->hwndOK = GetDlgItem(hwndDlg, IDOK);
- EnableWindow(prof->hwndOK, FALSE);
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);
-
- SetDlgItemText(hwndDlg, IDC_NAME, TranslateT("Manage your Miranda NG profile"));
-
- dat->currentPage = 0;
- dat->pageCount = psh->nPages;
- dat->opd = (DetailsPageData*)mir_calloc(sizeof(DetailsPageData)*dat->pageCount);
- OPTIONSDIALOGPAGE *odp = (OPTIONSDIALOGPAGE*)psh->ppsp;
-
- TCITEM tci;
- tci.mask = TCIF_TEXT;
- for (int i = 0; i < dat->pageCount; i++) {
- dat->opd[i].pTemplate = (DLGTEMPLATE*)LockResource(LoadResource(odp[i].hInstance, FindResourceA(odp[i].hInstance, odp[i].pszTemplate, MAKEINTRESOURCEA(5))));
- dat->opd[i].dlgProc = odp[i].pfnDlgProc;
- dat->opd[i].hInst = odp[i].hInstance;
- dat->opd[i].hwnd = NULL;
- dat->opd[i].changed = 0;
- tci.pszText = (TCHAR*)odp[i].ptszTitle;
- if (dat->prof->pd->noProfiles || shouldAutoCreate(dat->prof->pd->ptszProfile))
- dat->currentPage = 1;
- TabCtrl_InsertItem(GetDlgItem(hwndDlg, IDC_TABS), i, &tci);
- }
-
- GetWindowRect(GetDlgItem(hwndDlg, IDC_TABS), &dat->rcDisplay);
- TabCtrl_AdjustRect(GetDlgItem(hwndDlg, IDC_TABS), FALSE, &dat->rcDisplay);
-
- POINT pt = { 0, 0 };
- ClientToScreen(hwndDlg, &pt);
- OffsetRect(&dat->rcDisplay, -pt.x, -pt.y);
-
- TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TABS), dat->currentPage);
- dat->opd[dat->currentPage].hwnd = CreateDialogIndirectParam(dat->opd[dat->currentPage].hInst, dat->opd[dat->currentPage].pTemplate, hwndDlg, dat->opd[dat->currentPage].dlgProc, (LPARAM)dat->prof);
- ThemeDialogBackground(dat->opd[dat->currentPage].hwnd);
- SetWindowPos(dat->opd[dat->currentPage].hwnd, HWND_TOP, dat->rcDisplay.left, dat->rcDisplay.top, 0, 0, SWP_NOSIZE);
-
- PSHNOTIFY pshn;
- pshn.hdr.code = PSN_INFOCHANGED;
- pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
-
- // service mode combobox
- if (servicePlugins.getCount() == 0) {
- ShowWindow(GetDlgItem(hwndDlg, IDC_SM_LABEL), FALSE);
- ShowWindow(GetDlgItem(hwndDlg, IDC_SM_COMBO), FALSE);
- }
- else {
- HWND hwndCombo = GetDlgItem(hwndDlg, IDC_SM_COMBO);
- LRESULT index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)_T(""));
- SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)-1);
- SendMessage(hwndCombo, CB_SETCURSEL, 0, 0);
- for (int i = 0; i < servicePlugins.getCount(); i++) {
- pluginEntry *p = servicePlugins[i];
- index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)TranslateTS(p->pluginname));
- SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)i);
- }
- }
- ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOW);
- }
- return TRUE;
+ PROFILEMANAGERDATA *m_pd;
+
+ CCtrlPages m_tab;
+ CCtrlButton m_btnOk;
+ CCtrlCombo m_servicePlugs;
+ CCtrlBase m_warning;
+
+public:
+ CProfileManager(PROFILEMANAGERDATA *_pd) :
+ CDlgBase(hInst, IDD_PROFILEMANAGER),
+ m_btnOk(this, IDOK),
+ m_pd(_pd),
+ m_tab(this, IDC_TABS),
+ m_servicePlugs(this, IDC_SM_COMBO),
+ m_warning(this, IDC_SM_LABEL)
+ {
+ m_btnOk.OnClick = Callback(this, &CProfileManager::onOk);
+
+ m_tab.AddPage(LPGENT("My profiles"), NULL, new CChooseProfileDlg(m_btnOk, m_pd));
+ m_tab.AddPage(LPGENT("New profile"), NULL, new CCreateProfileDlg(m_btnOk, m_pd));
+ }
+
+ virtual void OnInitDialog()
+ {
+ SendMessage(m_hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_DETAILSLOGO), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendMessage(m_hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_DETAILSLOGO), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0));
- case WM_CTLCOLORSTATIC:
- switch (GetDlgCtrlID((HWND)lParam)) {
- case IDC_WHITERECT:
- SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
- return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
- }
- break;
+ if (m_pd->noProfiles || shouldAutoCreate(m_pd->ptszProfile))
+ m_tab.ActivatePage(1);
- case PSM_CHANGED:
- dat->opd[dat->currentPage].changed = 1;
- return TRUE;
+ m_btnOk.Enable(false);
- case PSM_FORCECHANGED:
- {
- PSHNOTIFY pshn;
- pshn.hdr.code = PSN_INFOCHANGED;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- for (int i = 0; i < dat->pageCount; i++) {
- pshn.hdr.hwndFrom = dat->opd[i].hwnd;
- if (dat->opd[i].hwnd != NULL)
- SendMessage(dat->opd[i].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
- }
+ // service mode combobox
+ if (servicePlugins.getCount() == 0) {
+ ShowWindow(m_warning.GetHwnd(), FALSE);
+ ShowWindow(m_servicePlugs.GetHwnd(), FALSE);
}
- break;
-
- case WM_NOTIFY:
- switch (wParam) {
- case IDC_TABS:
- switch (((LPNMHDR)lParam)->code) {
- case TCN_SELCHANGING:
- if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL) {
- PSHNOTIFY pshn;
- pshn.hdr.code = PSN_KILLACTIVE;
- pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- if (SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn)) {
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
- return TRUE;
- }
- }
- break;
+ else {
+ m_servicePlugs.AddStringA("", -1);
+ m_servicePlugs.SetCurSel(0);
- case TCN_SELCHANGE:
- if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL)
- ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE);
-
- dat->currentPage = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TABS));
- if (dat->currentPage != -1) {
- if (dat->opd[dat->currentPage].hwnd == NULL) {
- PSHNOTIFY pshn;
- dat->opd[dat->currentPage].hwnd = CreateDialogIndirectParam(dat->opd[dat->currentPage].hInst, dat->opd[dat->currentPage].pTemplate, hwndDlg, dat->opd[dat->currentPage].dlgProc, (LPARAM)dat->prof);
- ThemeDialogBackground(dat->opd[dat->currentPage].hwnd);
- SetWindowPos(dat->opd[dat->currentPage].hwnd, HWND_TOP, dat->rcDisplay.left, dat->rcDisplay.top, 0, 0, SWP_NOSIZE);
- pshn.hdr.code = PSN_INFOCHANGED;
- pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
- }
- ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOW);
- }
- break;
+ for (int i = 0; i < servicePlugins.getCount(); i++) {
+ pluginEntry *p = servicePlugins[i];
+ m_servicePlugs.AddString(TranslateTS(p->pluginname), i);
}
- break;
}
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDCANCEL:
- {
- PSHNOTIFY pshn;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- pshn.hdr.code = PSN_RESET;
- for (int i = 0; i < dat->pageCount; i++) {
- if (dat->opd[i].hwnd == NULL || !dat->opd[i].changed)
- continue;
-
- pshn.hdr.hwndFrom = dat->opd[i].hwnd;
- SendMessage(dat->opd[i].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
- }
- EndDialog(hwndDlg, 0);
- }
- break;
+ }
- case IDC_REMOVE:
- if (!dat->prof->pd->noProfiles) {
- HWND hwndList = GetDlgItem(dat->opd[0].hwnd, IDC_PROFILELIST);
- DeleteProfile(hwndList, ListView_GetNextItem(hwndList, -1, LVNI_SELECTED | LVNI_ALL), dat->prof);
+ virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
+ {
+ switch (msg) {
+ case WM_CTLCOLORSTATIC:
+ switch (GetDlgCtrlID((HWND)lParam)) {
+ case IDC_WHITERECT:
+ SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
+ return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
}
break;
-
- case IDOK:
- PSHNOTIFY pshn;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- if (dat->currentPage != -1) {
- pshn.hdr.code = PSN_KILLACTIVE;
- pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd;
- if (SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn))
- break;
- }
-
- pshn.hdr.code = PSN_APPLY;
- for (int i = 0; i < dat->pageCount; i++) {
- if (dat->opd[i].hwnd == NULL || !dat->opd[i].changed)
- continue;
-
- pshn.hdr.hwndFrom = dat->opd[i].hwnd;
- SendMessage(dat->opd[i].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn);
- if (GetWindowLongPtr(dat->opd[i].hwnd, DWLP_MSGRESULT) == PSNRET_INVALID_NOCHANGEPAGE) {
- TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TABS), i);
- if (dat->currentPage != -1)
- ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE);
- dat->currentPage = i;
- ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOW);
- return 0;
- }
- }
- EndDialog(hwndDlg, 1);
}
- break;
+ return CDlgBase::DlgProc(msg, wParam, lParam);
+ }
- case WM_DESTROY:
- LRESULT curSel = SendDlgItemMessage(hwndDlg, IDC_SM_COMBO, CB_GETCURSEL, 0, 0);
- if (curSel != CB_ERR) {
- int idx = SendDlgItemMessage(hwndDlg, IDC_SM_COMBO, CB_GETITEMDATA, (WPARAM)curSel, 0);
- if (idx != CB_ERR)
+ virtual void OnDestroy()
+ {
+ LRESULT curSel = m_servicePlugs.GetCurSel();
+ if (curSel != -1) {
+ int idx = m_servicePlugs.GetItemData(curSel);
+ if (idx != -1)
SetServiceModePlugin(servicePlugins[idx]);
}
- DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0));
- DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0));
- DeleteObject(dat->hBoldFont);
-
- for (int i = 0; i < dat->pageCount; i++)
- if (dat->opd[i].hwnd != NULL)
- DestroyWindow(dat->opd[i].hwnd);
-
- mir_free(dat->opd);
- mir_free(dat);
- break;
+ DestroyIcon((HICON)SendMessage(m_hwnd, WM_SETICON, ICON_SMALL, 0));
+ DestroyIcon((HICON)SendMessage(m_hwnd, WM_SETICON, ICON_BIG, 0));
}
- return FALSE;
-}
-static int AddProfileManagerPage(struct DetailsPageInit *opi, OPTIONSDIALOGPAGE *odp)
-{
- opi->odp = (OPTIONSDIALOGPAGE*)mir_realloc(opi->odp, sizeof(OPTIONSDIALOGPAGE)*(opi->pageCount + 1));
-
- OPTIONSDIALOGPAGE *p = opi->odp + opi->pageCount++;
- p->hInstance = odp->hInstance;
- p->pfnDlgProc = odp->pfnDlgProc;
- p->position = odp->position;
- p->ptszTitle = Langpack_PcharToTchar(odp->pszTitle);
- p->pszGroup = NULL;
- p->groupPosition = odp->groupPosition;
- p->hGroupIcon = odp->hGroupIcon;
- p->hIcon = odp->hIcon;
- if ((DWORD_PTR)odp->pszTemplate & 0xFFFF0000)
- p->pszTemplate = mir_strdup(odp->pszTemplate);
- else
- p->pszTemplate = odp->pszTemplate;
- return 0;
-}
+ void onOk(CCtrlButton*)
+ {
+ EndDialog(m_hwnd, 1);
+ }
+};
int getProfileManager(PROFILEMANAGERDATA *pd)
{
EnsureCheckerLoaded(true);
- DetailsPageInit opi = { 0 };
-
- OPTIONSDIALOGPAGE odp = { 0 };
- odp.pszTitle = LPGEN("My profiles");
- odp.pfnDlgProc = DlgProfileSelect;
- odp.pszTemplate = MAKEINTRESOURCEA(IDD_PROFILE_SELECTION);
- odp.hInstance = hInst;
- AddProfileManagerPage(&opi, &odp);
-
- odp.pszTitle = LPGEN("New profile");
- odp.pszTemplate = MAKEINTRESOURCEA(IDD_PROFILE_NEW);
- odp.pfnDlgProc = DlgProfileNew;
- AddProfileManagerPage(&opi, &odp);
-
- PROPSHEETHEADER psh = { 0 };
- psh.dwSize = sizeof(psh);
- psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
- psh.nPages = opi.pageCount;
- psh.ppsp = (PROPSHEETPAGE*)opi.odp;
-
- DlgProfData prof;
- prof.pd = pd;
- prof.psh = &psh;
- int rc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PROFILEMANAGER), NULL, DlgProfileManager, (LPARAM)&prof);
- if (rc != -1) {
- for (int i = 0; i < opi.pageCount; i++) {
- mir_free(opi.odp[i].pszTitle);
- mir_free(opi.odp[i].pszGroup);
- if ((DWORD_PTR)opi.odp[i].pszTemplate & 0xFFFF0000)
- mir_free((char*)opi.odp[i].pszTemplate);
- }
- }
- mir_free(opi.odp);
-
- return rc;
+ return CProfileManager(pd).DoModal();
}
diff --git a/src/resource.rc b/src/resource.rc
index 11bb217691..31ab3dab7b 100644
--- a/src/resource.rc
+++ b/src/resource.rc
@@ -91,7 +91,7 @@ CAPTION "Miranda NG profile manager"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CONTROL "Manage your Miranda NG profile",IDC_NAME,"MHeaderbarCtrl",0x0,0,0,220,25
- CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK | WS_TABSTOP,2,31,215,137
+ CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK,2,31,215,137
PUSHBUTTON "&Run",IDOK,169,195,48,14
PUSHBUTTON "&Exit",IDCANCEL,112,195,48,14
RTEXT "Start in service mode with",IDC_SM_LABEL,10,178,106,10
@@ -387,7 +387,7 @@ BEGIN
END
IDD_PROFILE_SELECTION DIALOGEX 0, 0, 208, 122
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | DS_CONTROL
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
@@ -395,8 +395,7 @@ BEGIN
END
IDD_PROFILE_NEW DIALOGEX 0, 0, 208, 122
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
-EXSTYLE WS_EX_CONTROLPARENT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | DS_CONTROL
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
LTEXT "Please complete the following form to create a new user profile",IDC_STATIC,4,3,205,16