summaryrefslogtreecommitdiff
path: root/plugins/DbChecker/src/wizard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/DbChecker/src/wizard.cpp')
-rw-r--r--plugins/DbChecker/src/wizard.cpp239
1 files changed, 153 insertions, 86 deletions
diff --git a/plugins/DbChecker/src/wizard.cpp b/plugins/DbChecker/src/wizard.cpp
index a1b2b65645..370b3935a1 100644
--- a/plugins/DbChecker/src/wizard.cpp
+++ b/plugins/DbChecker/src/wizard.cpp
@@ -21,8 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
-static HFONT hBoldFont = nullptr;
-static HENHMETAFILE hEmfHeaderLogo = nullptr;
+#define WZM_GETOPTS (WM_USER+1)
+#define WZM_GOTOPAGE (WM_USER+2)
+
+HFONT hBoldFont = nullptr;
static BOOL CALLBACK MyControlsEnumChildren(HWND hwnd, LPARAM)
{
@@ -33,8 +35,12 @@ static BOOL CALLBACK MyControlsEnumChildren(HWND hwnd, LPARAM)
GetClassNameA(hwnd, szClass, sizeof(szClass));
if (!mir_strcmp(szClass, "Static")) {
- if (((style & SS_TYPEMASK) == SS_LEFT || (style & SS_TYPEMASK) == SS_CENTER || (style & SS_TYPEMASK) == SS_RIGHT) && exstyle & WS_EX_CLIENTEDGE)
- makeBold = 1;
+ if (exstyle & WS_EX_CLIENTEDGE) {
+ switch (style & SS_TYPEMASK) {
+ case SS_LEFT: case SS_CENTER: case SS_RIGHT:
+ makeBold = 1;
+ }
+ }
}
else if (!mir_strcmp(szClass, "Button")) {
if (exstyle & WS_EX_CLIENTEDGE)
@@ -55,98 +61,159 @@ static BOOL CALLBACK MyControlsEnumChildren(HWND hwnd, LPARAM)
return TRUE;
}
-int DoMyControlProcessing(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam, INT_PTR *bReturn)
+/////////////////////////////////////////////////////////////////////////////////////////
+// Basic wizard dialog class
+
+CWizardPageDlg::CWizardPageDlg(int iDlgId) :
+ CSuper(g_plugin, iDlgId),
+ btnOk(this, IDOK),
+ btnCancel(this, IDCANCEL)
{
- switch (message) {
- case WM_INITDIALOG:
- EnumChildWindows(hdlg, MyControlsEnumChildren, 0);
- if (hEmfHeaderLogo == nullptr) {
- HRSRC hRsrc = FindResourceA(g_plugin.getInst(), MAKEINTRESOURCEA(IDE_HDRLOGO), "EMF");
- HGLOBAL hGlob = LoadResource(g_plugin.getInst(), hRsrc);
- hEmfHeaderLogo = SetEnhMetaFileBits(SizeofResource(g_plugin.getInst(), hRsrc), (PBYTE)LockResource(hGlob));
- }
- SendDlgItemMessage(hdlg, IDC_HDRLOGO, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)hEmfHeaderLogo);
- break;
-
- case WM_CTLCOLORSTATIC:
- if ((GetWindowLongPtr((HWND)lParam, GWL_STYLE) & 0xFFFF) == 0) {
- char szText[256];
- GetWindowTextA((HWND)lParam, szText, _countof(szText));
- if (!mir_strcmp(szText, "whiterect")) {
- SetTextColor((HDC)wParam, RGB(255, 255, 255));
- SetBkColor((HDC)wParam, RGB(255, 255, 255));
- SetBkMode((HDC)wParam, OPAQUE);
- *bReturn = (INT_PTR)GetStockObject(WHITE_BRUSH);
- return TRUE;
- }
+ m_autoClose = 0; // disable built-in IDOK & IDCANCEL handlers;
+ m_forceResizable = true;
- SetBkMode((HDC)wParam, TRANSPARENT);
- *bReturn = (INT_PTR)GetStockObject(NULL_BRUSH);
- return TRUE;
- }
- break;
- }
- return FALSE;
+ btnOk.OnClick = Callback(this, &CWizardPageDlg::onClick_Ok);
+ btnCancel.OnClick = Callback(this, &CWizardPageDlg::onClick_Cancel);
+}
+
+void CWizardPageDlg::OnCancel()
+{
+ PostMessage(m_hwndParent, WM_CLOSE, 0, 0);
}
-INT_PTR CALLBACK WizardDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
+bool CWizardPageDlg::OnInitDialog()
{
- static HWND hdlgPage;
- auto *opts = (DbToolOptions *)GetWindowLongPtr(hdlg, GWLP_USERDATA);
+ EnumChildWindows(m_hwnd, MyControlsEnumChildren, 0);
+ return true;
+}
- switch (message) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hdlg);
- SetWindowLongPtr(hdlg, GWLP_USERDATA, lParam);
- SendMessage(hdlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_DBTOOL)));
- hdlgPage = nullptr;
+void CWizardPageDlg::changePage(CWizardPageDlg *pNewPage)
+{
+ PostMessage(m_hwndParent, WZM_GOTOPAGE, 0, (LPARAM)pNewPage);
+}
- OpenDatabase(hdlg);
- return TRUE;
+DbToolOptions* CWizardPageDlg::getOpts() const
+{
+ return (DbToolOptions *)SendMessage(m_hwndParent, WZM_GETOPTS, 0, 0);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Wizard dialog class
+
+CWizardDlg::CWizardDlg(DbToolOptions *opts) :
+ CDlgBase(g_plugin, IDD_WIZARD),
+ m_opts(opts),
+ btnCancel(this, IDCANCEL),
+ timerStart(this, 1)
+{
+ m_autoClose = CLOSE_ON_OK;
+ SetMinSize(450, 300);
+
+ btnCancel.OnClick = Callback(this, &CWizardDlg::onClick_Cancel);
+
+ timerStart.OnEvent = Callback(this, &CWizardDlg::onTimer);
+}
+
+bool CWizardDlg::OnInitDialog()
+{
+ Utils_RestoreWindowPosition(m_hwnd, 0, MODULENAME, "Wizard_");
+ Window_SetIcon_IcoLib(m_hwnd, g_plugin.getIconHandle(IDI_DBTOOL));
+ timerStart.Start(100);
+ return true;
+}
+
+bool CWizardDlg::OnApply()
+{
+ SendMessage(hwndPage, WZN_PAGECHANGING, 0, 0);
+ SendMessage(hwndPage, WM_COMMAND, IDOK, 0);
+ return false;
+}
+
+void CWizardDlg::OnDestroy()
+{
+ Utils_SaveWindowPosition(m_hwnd, 0, MODULENAME, "Wizard_");
+
+ if (m_opts->dbChecker) {
+ m_opts->dbChecker->Destroy();
+ m_opts->dbChecker = nullptr;
+ }
+ delete m_opts;
+
+ if (hwndPage)
+ DestroyWindow(hwndPage);
+
+ if (hBoldFont != nullptr) {
+ DeleteObject(hBoldFont);
+ hBoldFont = nullptr;
+ }
+}
+
+INT_PTR CWizardDlg::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg) {
+ case WZM_GETOPTS:
+ SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, (LPARAM)m_opts);
+ return true;
case WZM_GOTOPAGE:
- if (hdlgPage != nullptr) DestroyWindow(hdlgPage);
- EnableWindow(GetDlgItem(hdlg, IDOK), TRUE);
- EnableWindow(GetDlgItem(hdlg, IDCANCEL), TRUE);
- SetDlgItemText(hdlg, IDCANCEL, TranslateT("Cancel"));
- hdlgPage = CreateDialogParamW(g_plugin.getInst(), MAKEINTRESOURCE(wParam), hdlg, (DLGPROC)lParam, LPARAM(opts));
- TranslateDialogDefault(hdlgPage);
- SetWindowPos(hdlgPage, nullptr, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
- ShowWindow(hdlgPage, SW_SHOW);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- SendMessage(hdlgPage, WZN_PAGECHANGING, wParam, 0);
- SendMessage(hdlgPage, message, wParam, lParam);
- break;
-
- case IDCANCEL:
- wizardResult = 0;
- SendMessage(hdlgPage, WZN_CANCELCLICKED, 0, 0);
- EndDialog(hdlg, wizardResult);
- break;
- }
- break;
+ ChangePage((CWizardPageDlg *)lParam);
+ return FALSE;
+ }
- case WM_DESTROY:
- if (opts->dbChecker) {
- opts->dbChecker->Destroy();
- opts->dbChecker = nullptr;
- }
- delete opts;
+ INT_PTR res = CDlgBase::DlgProc(msg, wParam, lParam);
+ if (msg == WM_SIZE && hwndPage) {
+ SetWindowPos(hwndPage, 0, 0, 0, m_splitterX, m_splitterY, SWP_NOZORDER | SWP_NOACTIVATE);
+ SendMessage(hwndPage, WM_SIZE, wParam, lParam);
+ InvalidateRect(hwndPage, 0, 0);
+ }
- DestroyWindow(hdlgPage);
- if (hBoldFont != nullptr) {
- DeleteObject(hBoldFont);
- hBoldFont = nullptr;
- }
- if (hEmfHeaderLogo != nullptr) {
- DeleteEnhMetaFile(hEmfHeaderLogo);
- hEmfHeaderLogo = nullptr;
- }
- break;
+ return res;
+}
+
+int CWizardDlg::Resizer(UTILRESIZECONTROL *urc)
+{
+ switch (urc->wId) {
+ case IDC_SPLITTER:
+ m_splitterX = urc->dlgNewSize.cx;
+ m_splitterY = urc->dlgNewSize.cy - (urc->dlgOriginalSize.cy - urc->rcItem.top);
+ return RD_ANCHORX_WIDTH | RD_ANCHORY_BOTTOM;
+
+ case IDOK:
+ case IDCANCEL:
+ return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM;
}
- return FALSE;
+
+ return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM;
+}
+
+void CWizardDlg::onClick_Cancel(CCtrlButton *)
+{
+ SendMessage(hwndPage, WZN_CANCELCLICKED, 0, 0);
+ EndModal(0);
+}
+
+void CWizardDlg::onTimer(CTimer *pTimer)
+{
+ pTimer->Stop();
+
+ ChangePage(new COptionsPageDlg());
+}
+
+LRESULT CWizardDlg::ChangePage(CWizardPageDlg *pPage)
+{
+ if (hwndPage != nullptr)
+ DestroyWindow(hwndPage);
+
+ EnableWindow(GetDlgItem(m_hwnd, IDOK), TRUE);
+ EnableWindow(GetDlgItem(m_hwnd, IDCANCEL), TRUE);
+ SetDlgItemText(m_hwnd, IDCANCEL, TranslateT("Cancel"));
+ {
+ pPage->SetParent(m_hwnd);
+ pPage->Show();
+ hwndPage = pPage->GetHwnd();
+ }
+ SetWindowPos(hwndPage, nullptr, 0, 0, m_splitterX, m_splitterY, SWP_NOZORDER);
+
+ ShowWindow(hwndPage, SW_SHOW);
+ return 0;
}