property sheet dialogs
authorMartin Fuchs <fuchs.martin@gmail.com>
Sun, 18 Jan 2004 00:33:53 +0000 (00:33 +0000)
committerMartin Fuchs <fuchs.martin@gmail.com>
Sun, 18 Jan 2004 00:33:53 +0000 (00:33 +0000)
svn path=/trunk/; revision=7730

reactos/subsys/system/explorer/explorer_intres.h
reactos/subsys/system/explorer/explorer_intres.rc
reactos/subsys/system/explorer/taskbar/desktopbar.cpp
reactos/subsys/system/explorer/taskbar/desktopbar.h
reactos/subsys/system/explorer/taskbar/startmenu.cpp
reactos/subsys/system/explorer/taskbar/startmenu.h
reactos/subsys/system/explorer/taskbar/traynotify.cpp
reactos/subsys/system/explorer/utility/utility.h
reactos/subsys/system/explorer/utility/window.cpp
reactos/subsys/system/explorer/utility/window.h

index c0afdbf..3550bd8 100644 (file)
@@ -38,6 +38,7 @@
 #define ID_ACTIVATE                     105
 #define IDD_SEARCH_PROGRAM              105
 #define IDB_DRIVEBAR                    106
+#define IDD_DESKBAR_DESKTOP             106
 #define IDB_IMAGES                      107
 #define IDD_EXECUTE                     108
 #define IDR_MAINFRAME                   109
@@ -68,6 +69,8 @@
 #define IDI_NETWORK                     148
 #define IDI_COMPUTER                    149
 #define IDM_DESKTOPBAR                  150
+#define IDD_DESKBAR_TASKBAR             153
+#define IDD_DESKBAR_STARTMENU           154
 #define ID_VIEW_NAME                    401
 #define ID_VIEW_ALL_ATTRIBUTES          402
 #define ID_VIEW_SELECTED_ATTRIBUTES     403
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        151
+#define _APS_NEXT_RESOURCE_VALUE        153
 #define _APS_NEXT_COMMAND_VALUE         40006
-#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_CONTROL_VALUE         1002
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
index 059b521..3eabf24 100644 (file)
@@ -72,8 +72,8 @@ BEGIN
     EDITTEXT        201,3,29,134,12,ES_AUTOHSCROLL
     CONTROL         "Ca &Simbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
                     45,71,12
-    DEFPUSHBUTTON   "OK",1,158,6,47,14
-    PUSHBUTTON      "Anulare",2,158,23,47,14
+    DEFPUSHBUTTON   "&OK",1,158,6,47,14
+    PUSHBUTTON      "A&nulare",2,158,23,47,14
     PUSHBUTTON      "&Ajutor",254,158,43,47,14
 END
 
@@ -334,8 +334,8 @@ BEGIN
     EDITTEXT        201,3,29,134,12,ES_AUTOHSCROLL
     CONTROL         "Als &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                     3,45,71,12
-    DEFPUSHBUTTON   "OK",1,158,6,47,14
-    PUSHBUTTON      "Abbrechen",2,158,23,47,14
+    DEFPUSHBUTTON   "&OK",1,158,6,47,14
+    PUSHBUTTON      "A&bbrechen",2,158,23,47,14
     PUSHBUTTON      "&Hilfe",254,158,43,47,14
 END
 
@@ -348,8 +348,8 @@ BEGIN
     LTEXT           "(c) 2003 Martin Fuchs",IDC_STATIC,90,50,70,8
     LTEXT           "http://www.sky.franken.de/explorer/",IDC_WWW,21,84,104,
                     8
-    CONTROL         "OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,151,
-                    90,38,12
+    CONTROL         "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+                    151,90,38,12
 END
 
 
@@ -651,8 +651,8 @@ BEGIN
     EDITTEXT        201,3,29,134,12,ES_AUTOHSCROLL
     CONTROL         "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
                     45,71,12
-    DEFPUSHBUTTON   "OK",1,158,6,47,14
-    PUSHBUTTON      "Cancel",2,158,23,47,14
+    DEFPUSHBUTTON   "&OK",1,158,6,47,14
+    PUSHBUTTON      "&Cancel",2,158,23,47,14
     PUSHBUTTON      "&Help",254,158,43,47,14
 END
 
@@ -670,6 +670,30 @@ BEGIN
                     WS_TABSTOP,7,25,130,33
 END
 
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE  0, 0, 210, 154
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Desktop Properties"
+FONT 8, "MS Sans Serif"
+BEGIN
+    CONTROL         130,IDC_STATIC,"Static",SS_BITMAP,74,20,21,98
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE  0, 0, 210, 154
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Taskbar Properties"
+FONT 8, "MS Sans Serif"
+BEGIN
+    CONTROL         129,IDC_STATIC,"Static",SS_BITMAP,129,19,21,98
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE  0, 0, 210, 154
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Startmenu Properties"
+FONT 8, "MS Sans Serif"
+BEGIN
+    CONTROL         130,IDC_STATIC,"Static",SS_BITMAP,74,20,21,98
+END
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -686,6 +710,30 @@ BEGIN
         TOPMARGIN, 7
         BOTTOMMARGIN, 58
     END
+
+    IDD_DESKBAR_DESKTOP, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 203
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 147
+    END
+
+    IDD_DESKBAR_TASKBAR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 203
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 147
+    END
+
+    IDD_DESKBAR_STARTMENU, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 203
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 147
+    END
 END
 #endif    // APSTUDIO_INVOKED
 
@@ -796,8 +844,8 @@ BEGIN
     EDITTEXT        201,3,29,134,12,ES_AUTOHSCROLL
     CONTROL         "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
                     45,71,12
-    DEFPUSHBUTTON   "OK",1,158,6,47,14
-    PUSHBUTTON      "Cancel",2,158,23,47,14
+    DEFPUSHBUTTON   "&OK",1,158,6,47,14
+    PUSHBUTTON      "&Cancel",2,158,23,47,14
     PUSHBUTTON      "&Help",254,158,43,47,14
 END
 
index 796e89d..5c66f20 100644 (file)
@@ -230,7 +230,7 @@ int DesktopBar::Command(int id, int code)
                break;
 
          case ID_DESKTOPBAR_SETTINGS:
-               MessageBox(_hwnd, TEXT("Not yet implemented"), ResString(IDS_TITLE), MB_OK);
+               DoPropertySheet();
                break;
 
          default:
@@ -272,3 +272,99 @@ LRESULT DesktopBar::ProcessCopyData(COPYDATASTRUCT* pcd)
 
        return 0;
 }
+
+
+void DesktopBar::DoPropertySheet()
+{
+       PropertySheetDialog ps(_hwnd);
+
+       ps.dwFlags |= PSH_USEICONID | PSH_PROPTITLE;
+       ps.pszIcon = MAKEINTRESOURCE(IDI_REACTOS);
+       ps.pszCaption = TEXT("Explorer");
+
+       PropSheetPage psp1(IDD_DESKBAR_DESKTOP, WINDOW_CREATOR(DesktopSettingsDlg));
+       psp1.dwFlags |= PSP_USETITLE;
+       psp1.pszTitle = TEXT("Desktop");//MAKEINTRESOURCE(IDS_DESKTOP);
+       ps.add(psp1);
+
+       PropSheetPage psp2(IDD_DESKBAR_TASKBAR, WINDOW_CREATOR(TaskbarSettingsDlg));
+       psp2.dwFlags |= PSP_USETITLE;
+       psp2.pszTitle = TEXT("Taskbar");//MAKEINTRESOURCE(IDS_DESKTOP);
+       ps.add(psp2);
+
+       PropSheetPage psp3(IDD_DESKBAR_STARTMENU, WINDOW_CREATOR(StartmenuSettingsDlg));
+       psp3.dwFlags |= PSP_USETITLE;
+       psp3.pszTitle = TEXT("Start Menu");//MAKEINTRESOURCE(IDS_DESKTOP);
+       ps.add(psp3);
+
+       ps.DoModal();
+}
+
+
+DesktopSettingsDlg::DesktopSettingsDlg(HWND hwnd)
+ :     super(hwnd)
+{
+}
+
+LRESULT DesktopSettingsDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+       switch(nmsg) {
+         case WM_PAINT:
+               Paint();
+               break;
+
+         default:
+               return super::WndProc(nmsg, wparam, lparam);
+       }
+
+       return 0;
+}
+
+void DesktopSettingsDlg::Paint()
+{
+       PaintCanvas canvas(_hwnd);
+
+       FillRect(canvas, &canvas.rcPaint, GetStockBrush(WHITE_BRUSH));
+}
+
+
+TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd)
+ :     super(hwnd)
+{
+}
+
+LRESULT TaskbarSettingsDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+       switch(nmsg) {
+         case WM_PAINT: {
+               PaintCanvas canvas(_hwnd);
+               FillRect(canvas, &canvas.rcPaint, GetStockBrush(GRAY_BRUSH));
+               break;}
+
+         default:
+               return super::WndProc(nmsg, wparam, lparam);
+       }
+
+       return 0;
+}
+
+
+StartmenuSettingsDlg::StartmenuSettingsDlg(HWND hwnd)
+ :     super(hwnd)
+{
+}
+
+LRESULT StartmenuSettingsDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+       switch(nmsg) {
+         case WM_PAINT: {
+               PaintCanvas canvas(_hwnd);
+               FillRect(canvas, &canvas.rcPaint, GetStockBrush(DKGRAY_BRUSH));
+               break;}
+
+         default:
+               return super::WndProc(nmsg, wparam, lparam);
+       }
+
+       return 0;
+}
index e1bf667..9c98245 100644 (file)
@@ -87,11 +87,48 @@ protected:
        void    RegisterHotkeys();
        void    ProcessHotKey(int id_hotkey);
        void    ShowStartMenu();
-       LRESULT ProcessCopyData(COPYDATASTRUCT* pcd);
+       LRESULT ProcessCopyData(COPYDATASTRUCT* pcd);
 
        WindowHandle _hwndTaskBar;
        WindowHandle _hwndNotify;
        WindowHandle _hwndQuickLaunch;
 
        struct StartMenuRoot* _startMenuRoot;
+
+       void    DoPropertySheet();
+};
+
+
+ /// "Desktopbar Settings" Property Sheet Dialog
+struct DesktopSettingsDlg : public PropSheetPageDlg
+{
+       typedef PropSheetPageDlg super;
+
+       DesktopSettingsDlg(HWND hwnd);
+
+       LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+       void    Paint();
+};
+
+
+ /// "Desktopbar Settings" Property Sheet Dialog
+struct TaskbarSettingsDlg : public PropSheetPageDlg
+{
+       typedef PropSheetPageDlg super;
+
+       TaskbarSettingsDlg(HWND hwnd);
+
+       LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+};
+
+
+ /// "Startmenu Settings" Property Sheet Dialog
+struct StartmenuSettingsDlg : public PropSheetPageDlg
+{
+       typedef PropSheetPageDlg super;
+
+       StartmenuSettingsDlg(HWND hwnd);
+
+       LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
 };
index a89f7e9..479ebdc 100644 (file)
@@ -91,9 +91,9 @@ BtnWindowClass& StartMenu::GetWndClasss()
 }
 
 
-Window::CREATORFUNC StartMenu::s_def_creator = STARTMENU_CREATOR(StartMenu);
+Window::CREATORFUNC_INFO StartMenu::s_def_creator = STARTMENU_CREATOR(StartMenu);
 
-HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndParent, LPCTSTR title, CREATORFUNC creator)
+HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndParent, LPCTSTR title, CREATORFUNC_INFO creator)
 {
        UINT style, ex_style;
        int top_height;
@@ -948,12 +948,12 @@ bool StartMenu::CloseOtherSubmenus(int id)
 }
 
 
-void StartMenu::CreateSubmenu(int id, LPCTSTR title, CREATORFUNC creator)
+void StartMenu::CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator)
 {
        CreateSubmenu(id, StartMenuFolders(), title, creator);
 }
 
-void StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC creator)
+void StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_INFO creator)
 {
        try {
                SpecialFolderPath folder(folder_id, _hwnd);
@@ -967,7 +967,7 @@ void StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC
        }
 }
 
-void StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC creator)
+void StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC_INFO creator)
 {
        StartMenuFolders new_folders;
 
@@ -985,7 +985,7 @@ void StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR ti
                CreateSubmenu(id, new_folders, title, creator);
 }
 
-void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC creator)
+void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator)
 {
         // Only open one submenu at a time.
        if (!CloseOtherSubmenus(id))
index c2c19be..150d7f6 100644 (file)
@@ -146,7 +146,7 @@ struct StartMenuCreateInfo
        StartMenuFolders _folders;
        int             _border_top;
        String  _title;
-       Window::CREATORFUNC _creator;
+       Window::CREATORFUNC_INFO _creator;
 };
 
 #define STARTMENU_CREATOR(WND_CLASS) WINDOW_CREATOR_INFO(WND_CLASS, StartMenuCreateInfo)
@@ -216,8 +216,8 @@ struct StartMenu :
        StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info);
        ~StartMenu();
 
-       static HWND Create(int x, int y, const StartMenuFolders&, HWND hwndParent, LPCTSTR title, CREATORFUNC creator=s_def_creator);
-       static CREATORFUNC s_def_creator;
+       static HWND Create(int x, int y, const StartMenuFolders&, HWND hwndParent, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator);
+       static CREATORFUNC_INFO s_def_creator;
 
 protected:
         // overridden member functions
@@ -277,10 +277,10 @@ protected:
 
        bool    CloseSubmenus() {return CloseOtherSubmenus();}
        bool    CloseOtherSubmenus(int id=0);
-       void    CreateSubmenu(int id, LPCTSTR title, CREATORFUNC creator=s_def_creator);
-       void    CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC creator=s_def_creator);
-       void    CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC creator=s_def_creator);
-       void    CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC creator=s_def_creator);
+       void    CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator);
+       void    CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator);
+       void    CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator);
+       void    CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator);
        void    ActivateEntry(int id, const ShellEntrySet& entries);
        virtual void CloseStartMenu(int id=0);
 
index 09a6ab4..f95c8b3 100644 (file)
@@ -149,6 +149,9 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
          case PM_GET_WIDTH:
                return _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width;
 
+         case WM_CONTEXTMENU:
+               break;  // don't let WM_CONTEXTMENU go through to the desktop bar
+
          default:
                if (nmsg>=WM_MOUSEFIRST && nmsg<=WM_MOUSELAST) {
                         // close startup menu and other popup menus
index b634c69..2f60f3a 100644 (file)
@@ -62,6 +62,8 @@ extern "C" {
 
 #define        for if (0) {} else for
 
+#define        COUNTOF(x)      (sizeof(x)/sizeof(x[0]))
+
 
 #define        BUFFER_LEN                              1024
 
@@ -169,6 +171,8 @@ using namespace std;
 #include <map>
 #include <set>
 #include <list>
+#include <vector>
+
 
 #if _MSC_VER>=1300     // VS.Net
 #define _NO_COMUTIL    //@@
index 10b8441..16fbe6b 100644 (file)
@@ -104,14 +104,14 @@ HWND Window::Create(CREATORFUNC creator, DWORD dwExStyle,
                                                        hwndParent, hMenu, g_Globals._hInstance, 0/*lpParam*/);
 }
 
-HWND Window::Create(CREATORFUNC creator, const void* info, DWORD dwExStyle,
+HWND Window::Create(CREATORFUNC_INFO creator, const void* info, DWORD dwExStyle,
                                        LPCTSTR lpClassName, LPCTSTR lpWindowName,
                                        DWORD dwStyle, int x, int y, int w, int h,
                                        HWND hwndParent, HMENU hMenu/*, LPVOID lpParam*/)
 {
        Lock lock(GetStaticWindowData()._create_crit_sect);     // protect access to s_window_creator and s_new_info
 
-       s_window_creator = creator;
+       s_window_creator = (CREATORFUNC) creator;
        s_new_info = info;
 
        return CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle,
@@ -120,33 +120,29 @@ HWND Window::Create(CREATORFUNC creator, const void* info, DWORD dwExStyle,
 }
 
 
-static Window* s_new_child_wnd = NULL;
-
-Window* Window::create_mdi_child(HWND hmdiclient, const MDICREATESTRUCT& mcs, CREATORFUNC creator, const void* info)
+Window* Window::create_mdi_child(HWND hmdiclient, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator, const void* info)
 {
        Lock lock(GetStaticWindowData()._create_crit_sect);     // protect access to s_window_creator and s_new_info
 
-       s_window_creator = creator;
+       s_window_creator = (CREATORFUNC) creator;
        s_new_info = info;
-       s_new_child_wnd = NULL;
 
-       s_hcbtHook = SetWindowsHookEx(WH_CBT, CBTHookProc, 0, GetCurrentThreadId());
+       s_hcbtHook = SetWindowsHookEx(WH_CBT, MDICBTHookProc, 0, GetCurrentThreadId());
 
        HWND hwnd = (HWND) SendMessage(hmdiclient, WM_MDICREATE, 0, (LPARAM)&mcs);
 
        UnhookWindowsHookEx(s_hcbtHook);
 
-       Window* child = s_new_child_wnd;
+       Window* child = get_window(hwnd);
        s_new_info = NULL;
-       s_new_child_wnd = NULL;
 
-       if (!hwnd || !child || !child->_hwnd)
+       if (child && (!hwnd || !child->_hwnd))
                child = NULL;
 
        return child;
 }
 
-LRESULT CALLBACK Window::CBTHookProc(int code, WPARAM wparam, LPARAM lparam)
+LRESULT CALLBACK Window::MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam)
 {
        if (code == HCBT_CREATEWND) {
                HWND hwnd = (HWND)wparam;
@@ -156,9 +152,46 @@ LRESULT CALLBACK Window::CBTHookProc(int code, WPARAM wparam, LPARAM lparam)
 
                if (!child)
                        child = create_controller(hwnd);
+       }
+
+       return CallNextHookEx(s_hcbtHook, code, wparam, lparam);
+}
+
+
+/*
+Window* Window::create_property_sheet(PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info)
+{
+       Lock lock(GetStaticWindowData()._create_crit_sect);     // protect access to s_window_creator and s_new_info
+
+       s_window_creator = creator;
+       s_new_info = info;
+
+       s_hcbtHook = SetWindowsHookEx(WH_CBT, PropSheetCBTHookProc, 0, GetCurrentThreadId());
+
+       HWND hwnd = (HWND) PropertySheet(ppsd);
+
+       UnhookWindowsHookEx(s_hcbtHook);
+
+       Window* child = get_window(hwnd);
+       s_new_info = NULL;
+
+       if (child && (!hwnd || !child->_hwnd))
+               child = NULL;
+
+       return child;
+}
+*/
+
+LRESULT CALLBACK Window::PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam)
+{
+       if (code == HCBT_CREATEWND) {
+               HWND hwnd = (HWND)wparam;
+
+                // create Window controller and associate it with the window handle
+               Window* child = get_window(hwnd);
 
-               if (child)
-                       s_new_child_wnd = child;
+               if (!child)
+                       child = create_controller(hwnd);
        }
 
        return CallNextHookEx(s_hcbtHook, code, wparam, lparam);
@@ -186,7 +219,7 @@ Window* Window::get_window(HWND hwnd)
 
 Window* Window::create_controller(HWND hwnd)
 {
-       if (s_window_creator) { // protect for recursion
+       if (s_window_creator) { // protect for recursion and create the window object only for the first window
                Lock lock(GetStaticWindowData()._create_crit_sect);     // protect access to s_window_creator and s_new_info
 
                const void* info = s_new_info;
@@ -196,9 +229,9 @@ Window* Window::create_controller(HWND hwnd)
                s_window_creator = NULL;
 
                if (info)
-                       return window_creator(hwnd, info);
+                       return CREATORFUNC_INFO(window_creator)(hwnd, info);
                else
-                       return CREATORFUNC_NO_INFO(window_creator)(hwnd);
+                       return CREATORFUNC(window_creator)(hwnd);
        }
 
        return NULL;
@@ -344,7 +377,7 @@ ChildWindow::ChildWindow(HWND hwnd)
 }
 
 
-ChildWindow* ChildWindow::create(HWND hmdiclient, const RECT& rect, CREATORFUNC creator, LPCTSTR classname, LPCTSTR title, const void* info)
+ChildWindow* ChildWindow::create(HWND hmdiclient, const RECT& rect, CREATORFUNC_INFO creator, LPCTSTR classname, LPCTSTR title, const void* info)
 {
        MDICREATESTRUCT mcs;
 
@@ -612,11 +645,11 @@ int Dialog::DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent)
        return DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(nid), hwndParent, DialogProc, 0/*lpParam*/);
 }
 
-int Dialog::DoModal(UINT nid, CREATORFUNC creator, const void* info, HWND hwndParent)
+int Dialog::DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent)
 {
        Lock lock(GetStaticWindowData()._create_crit_sect);     // protect access to s_window_creator and s_new_info
 
-       s_window_creator = creator;
+       s_window_creator = (CREATORFUNC) creator;
        s_new_info = NULL;
 
        return DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(nid), hwndParent, DialogProc, 0/*lpParam*/);
@@ -1172,3 +1205,141 @@ void ListSort::sort()
                ListView_EnsureVisible(_hwnd, idx, FALSE);
        }
 }
+
+
+PropSheetPage::PropSheetPage(UINT nid, Window::CREATORFUNC dlg_creator)
+ :     _dlg_creator(dlg_creator)
+{
+       PROPSHEETPAGE::dwSize           = sizeof(PROPSHEETPAGE);
+       PROPSHEETPAGE::dwFlags          = 0;
+       PROPSHEETPAGE::hInstance        = g_Globals._hInstance;
+       PROPSHEETPAGE::pszTemplate      = MAKEINTRESOURCE(nid);
+       PROPSHEETPAGE::pfnDlgProc       = PropSheetPageDlg::DialogProc;
+       PROPSHEETPAGE::lParam           = (LPARAM) this;
+}
+
+
+#ifndef PSM_GETRESULT  // currently (as of 18.01.2004) missing in MinGW headers
+#define PSM_GETRESULT                          (WM_USER + 135)
+#define PropSheet_GetResult(hDlg)      SNDMSG(hDlg, PSM_GETRESULT, 0, 0)
+#endif
+
+
+PropertySheetDialog::PropertySheetDialog(HWND owner)
+ :     _hwnd(0)
+{
+       PROPSHEETHEADER::dwSize = sizeof(PROPSHEETHEADER);
+       PROPSHEETHEADER::dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS;
+       PROPSHEETHEADER::hwndParent = owner;
+       PROPSHEETHEADER::hInstance = g_Globals._hInstance;
+}
+
+void PropertySheetDialog::add(PropSheetPage& psp)
+{
+       _pages.push_back(psp);
+}
+
+int    PropertySheetDialog::DoModal(int start_page)
+{
+       PROPSHEETHEADER::ppsp = (LPCPROPSHEETPAGE) &_pages[0];
+       PROPSHEETHEADER::nPages = _pages.size();
+       PROPSHEETHEADER::nStartPage = start_page;
+/*
+       Window* pwnd = Window::create_property_sheet(this, WINDOW_CREATOR(PropertySheetDlg), NULL);
+       if (!pwnd)
+               return -1;
+
+       HWND hwndPropSheet = *pwnd;
+*/
+       HWND hwndPropSheet = (HWND) PropertySheet(this);
+       HWND hwndparent = GetParent(hwndPropSheet);
+
+       if (hwndparent)
+               EnableWindow(hwndparent, FALSE);
+
+       int ret = 0;
+       MSG msg;
+
+       while(GetMessage(&msg, 0, 0, 0)) {
+               try {
+                       if (Window::pretranslate_msg(&msg))
+                               continue;
+
+                       if (PropSheet_IsDialogMessage(hwndPropSheet, &msg))
+                               continue;
+
+                       if (Window::dispatch_dialog_msg(&msg))
+                               continue;
+
+                       TranslateMessage(&msg);
+
+                       try {
+                               DispatchMessage(&msg);
+                       } catch(COMException& e) {
+                               HandleException(e, 0);
+                       }
+
+                       if (!PropSheet_GetCurrentPageHwnd(hwndPropSheet)) {
+                               ret = PropSheet_GetResult(hwndPropSheet);
+                               break;
+                       }
+               } catch(COMException& e) {
+                       HandleException(e, 0);
+               }
+       }
+
+       if (hwndparent)
+               EnableWindow(hwndparent, TRUE);
+
+       DestroyWindow(hwndPropSheet);
+
+       return ret;
+}
+
+HWND PropertySheetDialog::GetCurrentPage()
+{
+       HWND hdlg = PropSheet_GetCurrentPageHwnd(_hwnd);
+       return hdlg;
+}
+
+
+PropSheetPageDlg::PropSheetPageDlg(HWND hwnd)
+ :     super(hwnd)
+{
+}
+
+INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+       PropSheetPageDlg* pThis = GET_WINDOW(PropSheetPageDlg, hwnd);
+
+       if (pThis) {
+               switch(nmsg) {
+                 case WM_COMMAND:
+                       pThis->Command(LOWORD(wparam), HIWORD(wparam));
+                       return TRUE;    // message has been processed
+
+                 case WM_NOTIFY:
+                       pThis->Notify(wparam, (NMHDR*)lparam);
+                       return TRUE;    // message has been processed
+
+                 case WM_NCDESTROY:
+                       delete pThis;
+                       return TRUE;    // message has been processed
+
+                 default:
+                       return pThis->WndProc(nmsg, wparam, lparam);
+               }
+       } else if (nmsg == WM_INITDIALOG) {
+               PROPSHEETPAGE* psp = (PROPSHEETPAGE*) lparam;
+               PropSheetPage* ppsp = (PropSheetPage*) psp->lParam;
+
+               if (ppsp->_dlg_creator) {
+                       pThis = static_cast<PropSheetPageDlg*>(ppsp->_dlg_creator(hwnd));
+
+                       if (pThis)
+                               return pThis->Init(NULL);
+               }
+       }
+
+       return FALSE;   // message has not been processed
+}
index ca59911..110870c 100644 (file)
@@ -53,20 +53,21 @@ struct Window : public WindowHandle
 
        typedef map<HWND,Window*> WindowMap;
 
-       typedef Window* (*CREATORFUNC)(HWND, const void*);
-       typedef Window* (*CREATORFUNC_NO_INFO)(HWND);
+       typedef Window* (*CREATORFUNC)(HWND);
+       typedef Window* (*CREATORFUNC_INFO)(HWND, const void*);
 
        static HWND Create(CREATORFUNC creator, DWORD dwExStyle,
                                LPCTSTR lpClassName, LPCTSTR lpWindowName,
                                DWORD dwStyle, int x, int y, int w, int h,
                                HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/);
 
-       static HWND Create(CREATORFUNC creator, const void* info,
+       static HWND Create(CREATORFUNC_INFO creator, const void* info,
                                DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
                                DWORD dwStyle, int x, int y, int w, int h,
                                HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/);
 
-       static Window* create_mdi_child(HWND hmdiclient, const MDICREATESTRUCT& mcs, CREATORFUNC creator, const void* info=NULL);
+       static Window* create_mdi_child(HWND hmdiclient, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator, const void* info=NULL);
+//     static Window* create_property_sheet(struct PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info);
 
        static LRESULT CALLBACK WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
        static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
@@ -120,7 +121,8 @@ protected:
 
         // MDI child creation
        static HHOOK s_hcbtHook;
-       static LRESULT CALLBACK CBTHookProc(int code, WPARAM wparam, LPARAM lparam);
+       static LRESULT CALLBACK MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam);
+       static LRESULT CALLBACK PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam);
 
        static WindowSet s_pretranslate_windows;
        static WindowSet s_dialogs;
@@ -172,7 +174,7 @@ protected:
 };
 
 
- /// template class used in macro WINDOW_CREATOR to the define creater functions for Window objects
+ /// template class used in macro WINDOW_CREATOR to define the creater functions for Window objects
 template<typename WND_CLASS> struct WindowCreator
 {
        static WND_CLASS* window_creator(HWND hwnd)
@@ -182,7 +184,7 @@ template<typename WND_CLASS> struct WindowCreator
 };
 
 #define WINDOW_CREATOR(WND_CLASS) \
-       (Window::CREATORFUNC) WindowCreator<WND_CLASS>::window_creator
+       ((Window::CREATORFUNC) WindowCreator<WND_CLASS>::window_creator)
 
 
  /// template class used in macro WINDOW_CREATOR_INFO to the define creater functions for Window objects with additional creation information
@@ -195,7 +197,7 @@ template<typename WND_CLASS, typename INFO_CLASS> struct WindowCreatorInfo
 };
 
 #define WINDOW_CREATOR_INFO(WND_CLASS, INFO_CLASS) \
-       (Window::CREATORFUNC) WindowCreatorInfo<WND_CLASS, INFO_CLASS>::window_creator
+       ((Window::CREATORFUNC_INFO) WindowCreatorInfo<WND_CLASS, INFO_CLASS>::window_creator)
 
 
  /**
@@ -276,7 +278,7 @@ struct ChildWindow : public Window
        ChildWindow(HWND hwnd);
 
        static ChildWindow* create(HWND hmdiclient, const RECT& rect,
-                               CREATORFUNC creator, LPCTSTR classname, LPCTSTR title=NULL, const void* info=NULL);
+                               CREATORFUNC_INFO creator, LPCTSTR classname, LPCTSTR title=NULL, const void* info=NULL);
 
 protected:
        LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
@@ -345,7 +347,7 @@ struct Dialog : public Window
        ~Dialog();
 
        static int DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent=0);
-       static int DoModal(UINT nid, CREATORFUNC creator, const void* info, HWND hwndParent=0);
+       static int DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent=0);
 
 protected:
        LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
@@ -357,6 +359,63 @@ protected:
 #define        Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, PM_FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt))
 
 
+
+struct PropSheetPage : public PROPSHEETPAGE
+{
+       PropSheetPage(UINT nid, Window::CREATORFUNC dlg_creator);
+
+       void    init(struct PropertySheetDialog*);
+
+protected:
+       friend struct PropSheetPageDlg;
+
+       Window::CREATORFUNC     _dlg_creator;
+};
+
+
+ /// Property Sheet dialog
+struct PropertySheetDialog : public PROPSHEETHEADER
+{
+       PropertySheetDialog(HWND owner);
+
+       void    add(PropSheetPage& psp);
+       int             DoModal(int start_page=0);
+
+       HWND    GetCurrentPage();
+
+protected:
+       typedef vector<PROPSHEETPAGE> Vector;
+       Vector  _pages;
+       HWND    _hwnd;
+};
+
+
+ /// Property Sheet Page (inner dialog)
+struct PropSheetPageDlg : public Dialog
+{
+       typedef Dialog super;
+
+       PropSheetPageDlg(HWND);
+
+protected:
+       friend struct PropertySheetDialog;
+       friend struct PropSheetPage;
+
+       static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
+};
+
+
+/*
+ /// Property Sheet Dialog (outer dialog)
+struct PropertySheetDlg : public SubclassedWindow
+{
+       typedef SubclassedWindow super;
+
+       PropertySheetDlg(HWND hwnd) : super(hwnd) {}
+};
+*/
+
+
  // Layouting of resizable windows
 
  /// Flags to specify how to move and resize controls when resizing their parent window