Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / reactos / dll / win32 / devmgr / devmgmt / MainWindow.cpp
diff --git a/reactos/dll/win32/devmgr/devmgmt/MainWindow.cpp b/reactos/dll/win32/devmgr/devmgmt/MainWindow.cpp
deleted file mode 100644 (file)
index 50dc3a9..0000000
+++ /dev/null
@@ -1,866 +0,0 @@
-/*
- * PROJECT:     ReactOS Device Manager
- * LICENSE:     GPL - See COPYING in the top level directory
- * FILE:        dll/win32/devmgr/devmgmt/MainWindow.cpp
- * PURPOSE:     Implements the main container window for the device view
- * COPYRIGHT:   Copyright 2014 - 2015 Ged Murphy <gedmurphy@reactos.org>
- */
-
-
-#include "precomp.h"
-#include "devmgmt.h"
-#include "MainWindow.h"
-
-
-/* DATA *****************************************************/
-
-#define BTN_PROPERTIES      0
-#define BTN_SCAN_HARDWARE   1
-#define BTN_ENABLE_DRV      2
-#define BTN_DISABLE_DRV     3
-#define BTN_UPDATE_DRV      4
-#define BTN_UNINSTALL_DRV   5
-
-#define REFRESH_TIMER       1
-
-HINSTANCE g_hThisInstance = NULL;
-HINSTANCE g_hParentInstance = NULL;
-
-// menu hints
-static const MENU_HINT MainMenuHintTable[] =
-{
-    // File Menu
-    { IDC_EXIT, IDS_HINT_EXIT },
-
-    // Action Menu
-    { IDC_PROPERTIES, IDS_HINT_PROPERTIES },
-    { IDC_SCAN_HARDWARE, IDS_HINT_SCAN },
-    { IDC_ENABLE_DRV, IDS_HINT_ENABLE },
-    { IDC_DISABLE_DRV, IDS_HINT_DISABLE },
-    { IDC_UPDATE_DRV, IDS_HINT_UPDATE },  
-    { IDC_UNINSTALL_DRV, IDS_HINT_UNINSTALL },
-    { IDC_ADD_HARDWARE, IDS_HINT_ADD },
-    
-
-    // View Menu
-    { IDC_DEVBYTYPE, IDS_HINT_DEV_BY_TYPE},
-    { IDC_DEVBYCONN, IDS_HINT_DEV_BY_CONN},
-    { IDC_RESBYTYPE, IDS_HINT_RES_BY_TYPE},
-    { IDC_RESBYCONN, IDS_HINT_RES_BY_TYPE},
-    { IDC_SHOWHIDDEN, IDS_HINT_SHOW_HIDDEN },
-
-    { IDC_ABOUT, IDS_HINT_ABOUT }
-
-};
-
-
-// system menu hints
-static const MENU_HINT SystemMenuHintTable[] =
-{
-    {SC_RESTORE,    IDS_HINT_SYS_RESTORE},
-    {SC_MOVE,       IDS_HINT_SYS_MOVE},
-    {SC_SIZE,       IDS_HINT_SYS_SIZE},
-    {SC_MINIMIZE,   IDS_HINT_SYS_MINIMIZE},
-    {SC_MAXIMIZE,   IDS_HINT_SYS_MAXIMIZE},
-    {SC_CLOSE,      IDS_HINT_SYS_CLOSE}
-};
-
-static TBBUTTON TbButtons[] =
-{
-    { BTN_PROPERTIES, IDC_PROPERTIES, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },
-    { BTN_SCAN_HARDWARE, IDC_SCAN_HARDWARE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },
-    { 2, IDC_STATIC, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0 },
-    { BTN_ENABLE_DRV, IDC_ENABLE_DRV, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },
-    { BTN_DISABLE_DRV, IDC_DISABLE_DRV, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },
-    { BTN_UPDATE_DRV, IDC_UPDATE_DRV, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 },
-    { BTN_UNINSTALL_DRV, IDC_UNINSTALL_DRV, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }
-};
-
-
-/* PUBLIC METHODS **********************************************/
-
-CDeviceManager::CDeviceManager(void) :
-    m_hMainWnd(NULL),
-    m_hStatusBar(NULL),
-    m_hToolBar(NULL),
-    m_CmdShow(0),
-    m_RefreshPending(false)
-{
-    m_szMainWndClass = L"DevMgmtWndClass";
-}
-
-CDeviceManager::~CDeviceManager(void)
-{
-}
-
-bool
-CDeviceManager::Create(_In_ HWND /*hWndParent*/,
-                       _In_ HINSTANCE hInst,
-                       _In_opt_z_ LPCWSTR /*lpMachineName*/,
-                       _In_ int nCmdShow)
-{
-    CDeviceManager MainWindow;
-    INITCOMMONCONTROLSEX icex;
-    CAtlStringW szAppName;
-    int Ret = 1;
-
-    // Store the instances
-    g_hParentInstance = hInst;
-    g_hThisInstance = GetModuleHandleW(L"devmgr.dll");
-
-    // Initialize common controls
-    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
-    icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES;
-    InitCommonControlsEx(&icex);
-
-    // Load the application name
-    if (szAppName.LoadStringW(g_hThisInstance, IDS_APPNAME))
-    {
-        // Initialize the main window
-        if (MainWindow.Initialize(szAppName, nCmdShow))
-        {
-            // Run the application
-            Ret = MainWindow.Run();
-
-            // Uninitialize the main window
-            MainWindow.Uninitialize();
-        }
-    }
-
-    return (Ret == 0);
-}
-
-
-/* PRIVATE METHODS **********************************************/
-
-bool
-CDeviceManager::Initialize(_In_z_ LPCTSTR lpCaption,
-                           _In_ int nCmdShow)
-{
-    CAtlStringW szCaption;
-    WNDCLASSEXW wc = {0};
-
-    // Store the show window value
-    m_CmdShow = nCmdShow;
-
-    // Setup the window class struct
-    wc.cbSize = sizeof(WNDCLASSEXW);
-    wc.lpfnWndProc = MainWndProc;
-    wc.hInstance = g_hThisInstance;
-    wc.hIcon = LoadIcon(g_hThisInstance, MAKEINTRESOURCEW(IDI_MAIN_ICON));
-    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
-    wc.lpszMenuName = MAKEINTRESOURCEW(IDR_MAINMENU);
-    wc.lpszClassName = m_szMainWndClass;
-    wc.hIconSm = (HICON)LoadImage(g_hThisInstance,
-                                  MAKEINTRESOURCE(IDI_MAIN_ICON),
-                                  IMAGE_ICON,
-                                  16,
-                                  16,
-                                  LR_SHARED);
-
-    // Register the window
-    if (RegisterClassExW(&wc))
-    {
-        // Create the main window and store the object pointer
-        m_hMainWnd = CreateWindowExW(WS_EX_WINDOWEDGE,
-                                     m_szMainWndClass,
-                                     lpCaption,
-                                     WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
-                                     CW_USEDEFAULT,
-                                     CW_USEDEFAULT,
-                                     550,
-                                     500,
-                                     NULL,
-                                     NULL,
-                                     g_hThisInstance,
-                                     this);
-    }
-
-    // Return creation result 
-    return !!(m_hMainWnd);
-}
-
-void
-CDeviceManager::Uninitialize(void)
-{
-    // Unregister the window class 
-    UnregisterClassW(m_szMainWndClass, g_hThisInstance);
-}
-
-int
-CDeviceManager::Run(void)
-{
-    MSG Msg;
-
-    // Pump the message queue 
-    while (GetMessageW(&Msg, NULL, 0, 0 ) != 0)
-    {
-        TranslateMessage(&Msg);
-        DispatchMessageW(&Msg);
-    }
-
-    return 0;
-}
-
-bool
-CDeviceManager::MainWndMenuHint(_In_ WORD CmdId,
-                                _In_ const MENU_HINT *HintArray,
-                                _In_ DWORD HintsCount,
-                                _In_ UINT DefHintId)
-{
-    bool Found = false;
-    const MENU_HINT *LastHint;
-    UINT HintId = DefHintId;
-
-    LastHint = HintArray + HintsCount;
-    while (HintArray != LastHint)
-    {
-        if (HintArray->CmdId == CmdId)
-        {
-            HintId = HintArray->HintId;
-            Found = true;
-            break;
-        }
-        HintArray++;
-    }
-
-    StatusBarLoadString(m_hStatusBar,
-                        SB_SIMPLEID,
-                        g_hThisInstance,
-                        HintId);
-
-    return Found;
-}
-
-void
-CDeviceManager::UpdateStatusBar(_In_ bool InMenuLoop)
-{
-    SendMessageW(m_hStatusBar,
-                 SB_SIMPLE,
-                 (WPARAM)InMenuLoop,
-                 0);
-}
-
-bool
-CDeviceManager::RefreshView(_In_ ViewType Type,
-                            _In_ bool ScanForChanges)
-{
-    UINT CheckId = 0;
-
-    // Refreshed the cached view
-    m_DeviceView->Refresh(Type, ScanForChanges, true);
-
-    // Get the menu item id
-    switch (Type)
-    {
-        case DevicesByType:
-            CheckId = IDC_DEVBYTYPE;
-            break;
-
-        case DevicesByConnection:
-            CheckId = IDC_DEVBYCONN;
-            break;
-
-        case ResourcesByType:
-            CheckId = IDC_RESBYTYPE;
-            break;
-
-        case ResourcesByConnection:
-            CheckId = IDC_RESBYCONN;
-            break;
-
-        default:
-            ATLASSERT(FALSE);
-            break;
-    }
-
-    // Set the new check item
-    CheckMenuRadioItem(m_hMenu,
-                       IDC_DEVBYTYPE,
-                       IDC_RESBYCONN,
-                       CheckId,
-                       MF_BYCOMMAND);
-
-    return true;
-}
-
-bool
-CDeviceManager::CreateToolBar(void)
-{
-    TBADDBITMAP TbAddBitmap;
-
-    DWORD dwStyles = WS_CHILDWINDOW | TBSTYLE_FLAT | TBSTYLE_WRAPABLE | TBSTYLE_TOOLTIPS | CCS_NODIVIDER;
-    DWORD dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
-
-    // Create the toolbar window
-    m_hToolBar = CreateWindowExW(dwExStyles,
-                                 TOOLBARCLASSNAME,
-                                 NULL,
-                                 dwStyles,
-                                 0, 0, 0, 0,
-                                 m_hMainWnd,
-                                 (HMENU)IDC_TOOLBAR,
-                                 g_hThisInstance,
-                                 NULL);
-    if (m_hToolBar == NULL)
-        return FALSE;
-
-    // Don't show clipped buttons
-    SendMessageW(m_hToolBar,
-                 TB_SETEXTENDEDSTYLE,
-                 0,
-                 TBSTYLE_EX_HIDECLIPPEDBUTTONS);
-
-    SendMessageW(m_hToolBar, TB_SETBITMAPSIZE, 0, MAKELONG(16, 16));
-
-    // Set the struct size, the toobar needs this...
-    SendMessageW(m_hToolBar,
-                 TB_BUTTONSTRUCTSIZE,
-                 sizeof(TBBUTTON),
-                 0);
-
-    TbAddBitmap.hInst = g_hThisInstance;
-    TbAddBitmap.nID = IDB_TOOLBAR;
-    SendMessageW(m_hToolBar, TB_ADDBITMAP, _countof(TbButtons), (LPARAM)&TbAddBitmap);
-
-    SendMessageW(m_hToolBar, TB_ADDBUTTONSW, _countof(TbButtons), (LPARAM)TbButtons);
-    SendMessageW(m_hToolBar, TB_AUTOSIZE, 0, 0);
-
-    if (TRUE)
-    {
-        ShowWindow(m_hToolBar, SW_SHOW);
-    }
-
-    return TRUE;
-}
-
-bool
-CDeviceManager::CreateStatusBar(void)
-{
-    int StatWidths[] = {110, -1}; // widths of status bar
-    bool bRet = FALSE;
-
-    // Create the status bar
-    m_hStatusBar = CreateWindowExW(0,
-                                   STATUSCLASSNAME,
-                                   NULL,
-                                   WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,
-                                   0, 0, 0, 0,
-                                   m_hMainWnd,
-                                   (HMENU)IDC_STATUSBAR,
-                                   g_hThisInstance,
-                                   NULL);
-    if (m_hStatusBar)
-    {
-        // Set the width
-        bRet = (SendMessageW(m_hStatusBar,
-                             SB_SETPARTS,
-                             sizeof(StatWidths) / sizeof(int),
-                             (LPARAM)StatWidths) != 0);
-    }
-
-    return bRet;
-}
-
-void CDeviceManager::UpdateToolbar()
-{
-    WORD State;
-
-    CNode *Node = m_DeviceView->GetSelectedNode();
-
-    // properties button
-    if (Node->HasProperties())
-    {
-        State = TBSTATE_ENABLED;
-    }
-    else
-    {
-        State = TBSTATE_HIDDEN;
-    }
-    SendMessageW(m_hToolBar, TB_SETSTATE, IDC_PROPERTIES, MAKELPARAM(State, 0));
-    SendMessageW(m_hToolBar, TB_SETSTATE, IDC_UPDATE_DRV, MAKELPARAM(State, 0)); //hack
-    SendMessageW(m_hToolBar, TB_SETSTATE, IDC_UNINSTALL_DRV, MAKELPARAM(State, 0)); // hack
-
-    // enable driver button
-    if (Node->GetNodeType() == DeviceNode &&
-        dynamic_cast<CDeviceNode *>(Node)->IsDisabled())
-    {
-        State = TBSTATE_ENABLED;
-    }
-    else
-    {
-        State = TBSTATE_HIDDEN;
-    }
-    SendMessageW(m_hToolBar, TB_SETSTATE, IDC_ENABLE_DRV, MAKELPARAM(State, 0));
-
-    // disable driver button
-    if (Node->GetNodeType() == DeviceNode &&
-        dynamic_cast<CDeviceNode *>(Node)->CanDisable() &&
-        !dynamic_cast<CDeviceNode *>(Node)->IsDisabled())
-    {
-        State = TBSTATE_ENABLED;
-    }
-    else
-    {
-        State = TBSTATE_HIDDEN;
-    }
-    SendMessageW(m_hToolBar, TB_SETSTATE, IDC_DISABLE_DRV, MAKELPARAM(State, 0));
-}
-
-bool
-CDeviceManager::StatusBarLoadString(_In_ HWND hStatusBar,
-                                    _In_ INT PartId,
-                                    _In_ HINSTANCE hInstance,
-                                    _In_ UINT uID)
-{
-    CAtlStringW szMessage;
-    bool bRet = false;
-
-    // Load the string
-    if (szMessage.LoadStringW(hInstance, uID))
-    {
-        // Show the string on the status bar
-        bRet = (SendMessageW(hStatusBar,
-                             SB_SETTEXT,
-                             (WPARAM)PartId,
-                             (LPARAM)szMessage.GetBuffer()) != 0);
-    }
-
-    return bRet;
-}
-
-LRESULT
-CDeviceManager::OnCreate(_In_ HWND hwnd)
-{
-    LRESULT RetCode;
-
-    RetCode = -1;
-    m_hMainWnd = hwnd;
-
-    // Store a handle to the main menu
-    m_hMenu = GetMenu(m_hMainWnd);
-
-    // Create the toolbar and statusbar
-    if (CreateToolBar() && CreateStatusBar())
-    {
-        // Create the device view object
-        m_DeviceView = new CDeviceView(m_hMainWnd);
-        if (m_DeviceView->Initialize())
-        {
-            // Do the initial scan
-            RefreshView(m_DeviceView->GetCurrentView(), true);
-
-            // Display the window according to the user request
-            ShowWindow(hwnd, m_CmdShow);
-            RetCode = 0;
-        }
-    }
-
-    return RetCode;
-}
-
-LRESULT
-CDeviceManager::OnSize(void)
-{
-    RECT rcClient, rcTool, rcStatus;
-    INT lvHeight, iToolHeight, iStatusHeight;
-
-    // Autosize the toolbar
-    SendMessage(m_hToolBar, TB_AUTOSIZE, 0, 0);
-
-    // Get the toolbar rect and save the height
-    GetWindowRect(m_hToolBar, &rcTool);
-    iToolHeight = rcTool.bottom - rcTool.top;
-
-    // Resize the status bar
-    SendMessage(m_hStatusBar, WM_SIZE, 0, 0);
-
-    // Get the statusbar rect and save the height
-    GetWindowRect(m_hStatusBar, &rcStatus);
-    iStatusHeight = rcStatus.bottom - rcStatus.top;
-
-    // Get the full client rect
-    GetClientRect(m_hMainWnd, &rcClient);
-
-    // Calculate the remaining height for the treeview
-    lvHeight = rcClient.bottom - iToolHeight - iStatusHeight;
-
-    // Resize the device view
-    m_DeviceView->OnSize(0,
-                         iToolHeight,
-                         rcClient.right,
-                         lvHeight);
-
-    return 0;
-}
-
-LRESULT
-CDeviceManager::OnNotify(_In_ LPARAM lParam)
-{
-    LPNMHDR NmHdr = (LPNMHDR)lParam;
-    LRESULT Ret = 0;
-
-    switch (NmHdr->code)
-    {
-        case TVN_SELCHANGED:
-        {
-            UpdateToolbar();
-            break;
-        }
-
-        case NM_DBLCLK:
-        {
-            m_DeviceView->DisplayPropertySheet();
-            break;
-        }
-
-        case NM_RCLICK:
-        {
-            Ret = m_DeviceView->OnRightClick(NmHdr);
-            break;
-        }
-
-        case NM_RETURN:
-        {
-            m_DeviceView->DisplayPropertySheet();
-            break;
-        }
-
-        case TTN_GETDISPINFO:
-        {
-             LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)lParam;
-             lpttt->hinst = g_hThisInstance;
-
-            UINT_PTR idButton = lpttt->hdr.idFrom;
-            switch (idButton)
-            {
-                case IDC_PROPERTIES:
-                    lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_PROPERTIES);
-                    break;
-                case IDC_SCAN_HARDWARE:
-                    lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_SCAN);
-                    break;
-                case IDC_ENABLE_DRV:
-                    lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_ENABLE);
-                    break;
-                case IDC_DISABLE_DRV:
-                    lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_DISABLE);
-                    break;
-                case IDC_UPDATE_DRV:
-                    lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_UPDATE);
-                    break;
-                case IDC_UNINSTALL_DRV:
-                    lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_UNINSTALL);
-                    break;
-            }
-            break;
-        }
-    }
-
-    return Ret;
-}
-
-LRESULT
-CDeviceManager::OnContext(_In_ LPARAM lParam)
-{
-    return m_DeviceView->OnContextMenu(lParam);
-}
-
-LRESULT
-CDeviceManager::OnCommand(_In_ WPARAM wParam,
-                          _In_ LPARAM /*lParam*/)
-{
-    LRESULT RetCode = 0;
-    WORD Msg;
-
-    // Get the message
-    Msg = LOWORD(wParam);
-
-    switch (Msg)
-    {
-        case IDC_PROPERTIES:
-        case IDC_SCAN_HARDWARE:
-        case IDC_ENABLE_DRV:
-        case IDC_DISABLE_DRV:
-        case IDC_UPDATE_DRV:
-        case IDC_UNINSTALL_DRV:
-        case IDC_ADD_HARDWARE:
-        {
-            m_DeviceView->OnAction(Msg);
-            break;
-        }
-
-        case IDC_ACTIONMENU:
-        {
-            // Create a popup menu with all the actions for the selected node
-            HMENU hMenu = CreatePopupMenu();
-            m_DeviceView->CreateActionMenu(hMenu, true);
-
-            // Calculate where to put the menu
-            RECT rc;
-            GetMenuItemRect(m_hMainWnd, m_hMenu, 1, &rc);
-            LONG Height = rc.bottom - rc.top;
-
-            // Display the menu
-            TrackPopupMenuEx(hMenu,
-                             TPM_RIGHTBUTTON,
-                             rc.left,
-                             rc.top + Height,
-                             m_hMainWnd,
-                             NULL);
-
-            DestroyMenu(hMenu);
-            break;
-        }
-
-        case IDC_DEVBYTYPE:
-        {
-            RefreshView(DevicesByType, false);
-            break;
-        }
-
-        case IDC_DEVBYCONN:
-        {
-            RefreshView(DevicesByConnection, false);
-            break;
-        }
-
-        case IDC_SHOWHIDDEN:
-        {
-            // Get the current state
-            UINT CurCheckState = GetMenuState(m_hMenu, IDC_SHOWHIDDEN, MF_BYCOMMAND);
-            if (CurCheckState == MF_CHECKED)
-            {
-                m_DeviceView->SetHiddenDevices(false);
-                CheckMenuItem(m_hMenu, IDC_SHOWHIDDEN, MF_BYCOMMAND | MF_UNCHECKED);
-            }
-            else if (CurCheckState == MF_UNCHECKED)
-            {
-                m_DeviceView->SetHiddenDevices(true);
-                CheckMenuItem(m_hMenu, IDC_SHOWHIDDEN, MF_BYCOMMAND | MF_CHECKED);
-            }
-            // Refresh the device view
-            RefreshView(m_DeviceView->GetCurrentView(), false);
-            break;
-        }
-
-        case IDC_ABOUT:
-        {
-            // Apportion blame
-            MessageBoxW(m_hMainWnd,
-                        L"ReactOS Device Manager\r\nCopyright Ged Murphy 2015",
-                        L"About",
-                        MB_OK | MB_APPLMODAL);
-
-            // Set focus back to the treeview
-            m_DeviceView->SetFocus();
-            break;
-        }
-
-        case IDC_EXIT:
-        {
-            // Post a close message to the window
-            PostMessageW(m_hMainWnd,
-                         WM_CLOSE,
-                         0,
-                         0);
-            break;
-        }
-
-        default:
-            // We didn't handle it
-            RetCode = -1;
-            break;
-    }
-
-    return RetCode;
-}
-
-void
-CDeviceManager::OnActivate(void)
-{
-    m_DeviceView->SetFocus();
-}
-
-LRESULT
-CDeviceManager::OnDestroy(void)
-{
-    // Uninitialize the device view
-    m_DeviceView->Uninitialize();
-
-    // Kill the object
-    delete m_DeviceView;
-    m_DeviceView = NULL;
-
-    // Clear the user data pointer
-    SetWindowLongPtr(m_hMainWnd, GWLP_USERDATA, 0);
-
-    // Break the message loop
-    PostQuitMessage(0);
-
-    return 0;
-}
-
-LRESULT CALLBACK
-CDeviceManager::MainWndProc(_In_ HWND hwnd,
-                            _In_ UINT msg,
-                            _In_ WPARAM wParam,
-                            _In_ LPARAM lParam)
-{
-    CDeviceManager *This;
-    LRESULT RetCode = 0;
-
-    // Get the object pointer from window context
-    This = (CDeviceManager *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
-    if (This == NULL)
-    {
-        // Check that this isn't a create message
-        if (msg != WM_CREATE)
-        {
-            // Don't handle null info pointer
-            goto HandleDefaultMessage;
-        }
-    }
-
-    switch(msg)
-    {
-        case WM_CREATE:
-        {
-            // Get the object pointer from the create param
-            This = (CDeviceManager *)((LPCREATESTRUCT)lParam)->lpCreateParams;
-
-            // Store the pointer in the window's global user data
-            SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)This);
-
-            // Call the create handler
-            RetCode = This->OnCreate(hwnd);
-            break;
-        }
-
-        case WM_SIZE:
-        {
-            RetCode = This->OnSize();
-            break;
-        }
-
-        case WM_NOTIFY:
-        {
-            RetCode = This->OnNotify(lParam);
-            break;
-        }
-
-        case WM_CONTEXTMENU:
-        {
-            RetCode = This->OnContext(lParam);
-            break;
-        }
-
-        case WM_MENUSELECT:
-        {
-            if (This->m_hStatusBar != NULL)
-            {
-                if (!This->MainWndMenuHint(LOWORD(wParam),
-                                           MainMenuHintTable,
-                                           sizeof(MainMenuHintTable) / sizeof(MainMenuHintTable[0]),
-                                           IDS_HINT_BLANK))
-                {
-                    This->MainWndMenuHint(LOWORD(wParam),
-                                          SystemMenuHintTable,
-                                          sizeof(SystemMenuHintTable) / sizeof(SystemMenuHintTable[0]),
-                                          IDS_HINT_BLANK);
-                }
-            }
-
-            break;
-        }
-
-        case WM_COMMAND:
-        {
-            // Handle the command message
-            RetCode = This->OnCommand(wParam, lParam);
-            if (RetCode == -1)
-            {
-                // Hand it off to the default message handler
-                goto HandleDefaultMessage;
-            }
-            break;
-        }
-
-        case WM_DEVICECHANGE:
-        {
-            if (wParam == DBT_DEVNODES_CHANGED)
-            {
-                //
-                // The OS can send multiple change messages in quick succession. To avoid
-                // refreshing multiple times (and to avoid waiting in the message thread)
-                // we set a timer to run in 500ms, which should leave enough time for all
-                // the messages to come through. Wrap so we don't set multiple timers
-                //
-                if (InterlockedCompareExchange((LONG *)&This->m_RefreshPending, TRUE, FALSE) == FALSE)
-                {
-                    SetTimer(hwnd, REFRESH_TIMER, 500, NULL);
-                }
-            }
-            break;
-        }
-
-        case WM_TIMER:
-        {
-            if (wParam == REFRESH_TIMER)
-            {
-                // Schedule a refresh (this just creates a thread and returns)
-                This->RefreshView(This->m_DeviceView->GetCurrentView(), true);
-
-                // Cleanup the timer
-                KillTimer(hwnd, REFRESH_TIMER);
-
-                // Allow more change notifications
-                InterlockedExchange((LONG *)&This->m_RefreshPending, FALSE);
-            }
-            break;
-        }
-
-        case WM_ENTERMENULOOP:
-        {
-            This->UpdateStatusBar(true);
-            break;
-        }
-
-        case WM_EXITMENULOOP:
-        {
-            This->UpdateStatusBar(false);
-            break;
-        }
-
-        case WM_CLOSE:
-        {
-            // Destroy the main window
-            DestroyWindow(hwnd);
-            break;
-        }
-
-        case WM_ACTIVATE:
-        {
-            if (LOWORD(hwnd))
-                This->OnActivate();
-            break;
-        }
-
-        case WM_DESTROY:
-        {
-            // Call the destroy handler
-            RetCode = This->OnDestroy();
-            break;
-        }
-
-        default:
-        {
-HandleDefaultMessage:
-            RetCode = DefWindowProc(hwnd, msg, wParam, lParam);
-            break;
-        }
-    }
-
-    return RetCode;
-}