--- /dev/null
+////////////////////////////////////////////////////\r
+// Mainfrm.cpp\r
+\r
+#include "stdafx.h"\r
+#include "TabbedMDIApp.h"\r
+#include "mainfrm.h"\r
+#include "resource.h"\r
+\r
+\r
+// Definitions for the CMainFrame class\r
+CMainFrame::CMainFrame() : m_pLastActiveDocker(0)\r
+{\r
+ // Constructor for CMainFrame. Its called after CFrame's constructor\r
+\r
+ //Set m_DockTabbedMDI as the view window of the frame\r
+ SetView(m_DockTabbedMDI);\r
+\r
+ // Set the registry key name, and load the initial window position\r
+ // Use a registry key name like "CompanyName\\Application"\r
+ LoadRegistrySettings(_T("Win32++\\TabbedMDI Docking"));\r
+}\r
+\r
+CMainFrame::~CMainFrame()\r
+{\r
+ // Destructor for CMainFrame.\r
+}\r
+\r
+void CMainFrame::OnFileNew()\r
+{\r
+ // Creates the popup menu when the "New" toolbar button is pressed\r
+\r
+ // Position the popup menu\r
+ CToolBar& TB = GetToolBar();\r
+ RECT rc = TB.GetItemRect(TB.CommandToIndex(IDM_FILE_NEW));\r
+ GetToolBar().ClientToScreen(rc);\r
+\r
+ TPMPARAMS tpm;\r
+ tpm.cbSize = sizeof(TPMPARAMS);\r
+ tpm.rcExclude = rc;\r
+\r
+ // Load the popup menu\r
+ HMENU hTopMenu = ::LoadMenu(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDM_NEWMENU));\r
+ HMENU hPopupMenu = ::GetSubMenu(hTopMenu, 0);\r
+\r
+ // Start the popup menu\r
+ ::TrackPopupMenuEx(hPopupMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, m_hWnd, &tpm);\r
+\r
+ // Release the menu resource\r
+ ::DestroyMenu(hTopMenu);\r
+}\r
+\r
+void CMainFrame::OnContainerTabsAtTop()\r
+// Reposition the tabs in the containers\r
+{\r
+ BOOL bTop = FALSE;\r
+ std::vector<DockPtr>::iterator iter;\r
+\r
+ // Set the Tab position for each container\r
+ for (iter = m_DockTabbedMDI.GetAllDockers().begin(); iter < m_DockTabbedMDI.GetAllDockers().end(); ++iter)\r
+ {\r
+ CDockContainer* pContainer = (*iter)->GetContainer();\r
+ if (pContainer)\r
+ {\r
+ bTop = pContainer->GetTabsAtTop();\r
+ pContainer->SetTabsAtTop(!bTop);\r
+ }\r
+ }\r
+\r
+ // Set the menu checkmark\r
+ UINT uCheck = (bTop)? MF_UNCHECKED : MF_CHECKED;\r
+ ::CheckMenuItem(GetFrameMenu(), IDM_CONTAINER_TOP, uCheck);\r
+}\r
+\r
+void CMainFrame::OnMDITabsAtTop()\r
+// Reposition TabbedMDI's tabs\r
+{\r
+ CTabbedMDI* pTabbedMDI = m_DockTabbedMDI.GetTabbedMDI();\r
+\r
+ BOOL bTop = pTabbedMDI->GetTab().GetTabsAtTop();\r
+ pTabbedMDI->GetTab().SetTabsAtTop(!bTop);\r
+\r
+ // Set the menu checkmark\r
+ UINT uCheck = (bTop)? MF_UNCHECKED : MF_CHECKED;\r
+ ::CheckMenuItem(GetFrameMenu(), IDM_TABBEDMDI_TOP, uCheck);\r
+}\r
+\r
+void CMainFrame::LoadDefaultDockers()\r
+{\r
+ // Note: The DockIDs are used for saving/restoring the dockers state in the registry\r
+\r
+ DWORD dwStyle = DS_CLIENTEDGE; // The style added to each docker\r
+\r
+ // Add the parent dockers\r
+ CDocker* pDockRight = m_DockTabbedMDI.AddDockedChild(new CDockClasses, DS_DOCKED_RIGHT | dwStyle, 200, ID_DOCK_CLASSES1);\r
+ CDocker* pDockBottom = m_DockTabbedMDI.AddDockedChild(new CDockText, DS_DOCKED_BOTTOM | dwStyle, 100, ID_DOCK_TEXT1);\r
+\r
+ // Add the remaining dockers\r
+ pDockRight->AddDockedChild(new CDockFiles, DS_DOCKED_CONTAINER | dwStyle, 200, ID_DOCK_FILES1);\r
+ pDockRight->AddDockedChild(new CDockClasses, DS_DOCKED_CONTAINER | dwStyle, 200, ID_DOCK_CLASSES2);\r
+ pDockRight->AddDockedChild(new CDockFiles, DS_DOCKED_CONTAINER | dwStyle, 200, ID_DOCK_FILES2);\r
+\r
+ pDockBottom->AddDockedChild(new CDockOutput, DS_DOCKED_CONTAINER | dwStyle, 100, ID_DOCK_OUTPUT1);\r
+ pDockBottom->AddDockedChild(new CDockText, DS_DOCKED_CONTAINER | dwStyle, 100, ID_DOCK_TEXT2);\r
+ pDockBottom->AddDockedChild(new CDockOutput, DS_DOCKED_CONTAINER | dwStyle, 100, ID_DOCK_OUTPUT2);\r
+}\r
+\r
+void CMainFrame::LoadDefaultMDIs()\r
+{\r
+ // Add some MDI tabs\r
+ CTabbedMDI* pTabbedMDI = (CTabbedMDI*)m_DockTabbedMDI.GetView();\r
+ pTabbedMDI->AddMDIChild(new CViewSimple, _T("Simple View"), ID_MDI_SIMPLE);\r
+ pTabbedMDI->AddMDIChild(new CViewRect, _T("Rectangles"), ID_MDI_RECT);\r
+ pTabbedMDI->AddMDIChild(new CViewText, _T("TextView"), ID_MDI_TEXT);\r
+ pTabbedMDI->AddMDIChild(new CViewClasses, _T("Classes"), ID_MDI_CLASSES);\r
+ pTabbedMDI->AddMDIChild(new CViewFiles, _T("Files"), ID_MDI_FILES);\r
+\r
+ if (pTabbedMDI->IsWindow())\r
+ pTabbedMDI->SetActiveMDITab(0);\r
+}\r
+\r
+BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)\r
+{\r
+ CTabbedMDI* pTabbedMDI = (CTabbedMDI*)m_DockTabbedMDI.GetView();\r
+\r
+ // OnCommand responds to menu and and toolbar input\r
+ switch(LOWORD(wParam))\r
+ {\r
+ case IDM_FILE_NEW:\r
+ OnFileNew();\r
+ return TRUE;\r
+ case IDM_FILE_NEWSIMPLE:\r
+ pTabbedMDI->AddMDIChild(new CViewSimple, _T("Simple"), ID_MDI_SIMPLE);\r
+ return TRUE;\r
+ case IDM_FILE_NEWRECT:\r
+ pTabbedMDI->AddMDIChild(new CViewRect, _T("Rectangles"), ID_MDI_RECT);\r
+ return TRUE;\r
+ case IDM_FILE_NEWTEXT:\r
+ pTabbedMDI->AddMDIChild(new CViewText, _T("TextView"), ID_MDI_TEXT);\r
+ return TRUE;\r
+ case IDM_FILE_NEWTREE:\r
+ pTabbedMDI->AddMDIChild(new CViewClasses, _T("TreeView"), ID_MDI_CLASSES);\r
+ return TRUE;\r
+ case IDM_FILE_NEWLIST:\r
+ pTabbedMDI->AddMDIChild(new CViewFiles, _T("ListView"), ID_MDI_FILES);\r
+ return TRUE;\r
+ case IDM_FILE_EXIT:\r
+ // End the application\r
+ ::PostQuitMessage(0);\r
+ return TRUE;\r
+ case IDM_CONTAINER_TOP:\r
+ OnContainerTabsAtTop();\r
+ return TRUE;\r
+ case IDM_TABBEDMDI_TOP:\r
+ OnMDITabsAtTop();\r
+ return TRUE;\r
+ case IDM_LAYOUT_DEFAULT:\r
+ SetRedraw(FALSE);\r
+\r
+ m_DockTabbedMDI.CloseAllDockers();\r
+ m_DockTabbedMDI.GetTabbedMDI()->CloseAllMDIChildren();\r
+ LoadDefaultDockers();\r
+ LoadDefaultMDIs();\r
+\r
+ SetRedraw(TRUE);\r
+ RedrawWindow(0, 0, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ALLCHILDREN);\r
+\r
+ return TRUE;\r
+ case IDM_LAYOUT_CLOSE_DOCKERS:\r
+ m_DockTabbedMDI.CloseAllDockers();\r
+ return TRUE;\r
+ case IDM_LAYOUT_CLOSE_MDIS:\r
+ m_DockTabbedMDI.GetTabbedMDI()->CloseAllMDIChildren();\r
+ return TRUE;\r
+ case IDW_VIEW_STATUSBAR:\r
+ OnViewStatusBar();\r
+ return TRUE;\r
+ case IDW_VIEW_TOOLBAR:\r
+ OnViewToolBar();\r
+ return TRUE;\r
+ case IDM_HELP_ABOUT:\r
+ // Display the help dialog\r
+ OnHelp();\r
+ return TRUE;\r
+\r
+ default:\r
+ // Pass the command on to the view window of the last active docker\r
+ {\r
+ if (m_pLastActiveDocker == &m_DockTabbedMDI)\r
+ m_DockTabbedMDI.GetTabbedMDI()->GetActiveMDIChild()->SendMessage(WM_COMMAND, wParam, lParam);\r
+ else if (m_pLastActiveDocker->IsDocked())\r
+ m_pLastActiveDocker->GetContainer()->GetActiveView()->SendMessage(WM_COMMAND, wParam, lParam);\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+void CMainFrame::OnCreate()\r
+{\r
+ // OnCreate controls the way the frame is created.\r
+ // Overriding CFrame::Oncreate is optional.\r
+ // The default for the following variables is TRUE\r
+\r
+ // m_bShowIndicatorStatus = FALSE; // Don't show statusbar indicators\r
+ // m_bShowMenuStatus = FALSE; // Don't show toolbar or menu status\r
+ // m_bUseReBar = FALSE; // Don't use rebars\r
+ // m_bUseThemes = FALSE; // Don't use themes\r
+ // m_bUseToolBar = FALSE; // Don't use a toolbar\r
+\r
+ // call the base class function\r
+ CFrame::OnCreate();\r
+}\r
+\r
+void CMainFrame::OnInitialUpdate()\r
+{\r
+ m_DockTabbedMDI.SetDockStyle(DS_CLIENTEDGE|DS_FIXED_RESIZE);\r
+\r
+ // Load dock settings\r
+ if (!m_DockTabbedMDI.LoadRegistrySettings(GetRegistryKeyName()))\r
+ LoadDefaultDockers();\r
+\r
+ // Load MDI child settings\r
+ if (!m_DockTabbedMDI.GetTabbedMDI()->LoadRegistrySettings(GetRegistryKeyName()))\r
+ LoadDefaultMDIs();\r
+\r
+ // PreCreate initially set the window as invisible, so show it now.\r
+ ShowWindow();\r
+}\r
+\r
+void CMainFrame::OnMenuUpdate(UINT nID)\r
+// Called when menu items are about to be displayed\r
+{\r
+ // Only for the Menu IDs we wish to modify\r
+ if (nID >= IDM_EDIT_UNDO && nID <= IDM_EDIT_DELETE)\r
+ {\r
+ CWnd* pWnd = 0;\r
+ CMenu Menu;\r
+ Menu.Attach(GetFrameMenu());\r
+ CMenu* pEditMenu = Menu.GetSubMenu(1);\r
+\r
+ if (m_pLastActiveDocker)\r
+ {\r
+ if (m_pLastActiveDocker == &m_DockTabbedMDI)\r
+ pWnd = m_DockTabbedMDI.GetTabbedMDI()->GetActiveMDIChild();\r
+ else if (m_pLastActiveDocker->IsDocked())\r
+ pWnd = m_pLastActiveDocker->GetContainer()->GetActiveView();\r
+ }\r
+\r
+ // Enable the Edit menu items for CViewText windows, disable them otherwise\r
+ UINT Flags = (dynamic_cast<CViewText*>(pWnd))? MF_ENABLED : MF_GRAYED;\r
+ pEditMenu->EnableMenuItem(nID, MF_BYCOMMAND | Flags);\r
+ Menu.Detach();\r
+ }\r
+}\r
+\r
+void CMainFrame::PreCreate(CREATESTRUCT &cs)\r
+{\r
+ // Call the base class function first\r
+ CFrame::PreCreate(cs);\r
+\r
+ // Hide the window initially by removing the WS_VISIBLE style\r
+ cs.style &= ~WS_VISIBLE;\r
+}\r
+\r
+BOOL CMainFrame::SaveRegistrySettings()\r
+{\r
+ CFrame::SaveRegistrySettings();\r
+\r
+ // Save the docker settings\r
+ m_DockTabbedMDI.SaveRegistrySettings(GetRegistryKeyName());\r
+\r
+ // Save the tabbedMDI settings\r
+ m_DockTabbedMDI.GetTabbedMDI()->SaveRegistrySettings(GetRegistryKeyName());\r
+\r
+ return TRUE;\r
+}\r
+\r
+void CMainFrame::SetupToolBar()\r
+{\r
+ // Set the Resource IDs for the toolbar buttons\r
+ AddToolBarButton( IDM_FILE_NEW );\r
+ AddToolBarButton( IDM_FILE_OPEN, FALSE );\r
+ AddToolBarButton( IDM_FILE_SAVE, FALSE );\r
+\r
+ AddToolBarButton( 0 ); // Separator\r
+ AddToolBarButton( IDM_EDIT_CUT, FALSE );\r
+ AddToolBarButton( IDM_EDIT_COPY, FALSE );\r
+ AddToolBarButton( IDM_EDIT_PASTE, FALSE );\r
+\r
+ AddToolBarButton( 0 ); // Separator\r
+ AddToolBarButton( IDM_FILE_PRINT, FALSE );\r
+\r
+ AddToolBarButton( 0 ); // Separator\r
+ AddToolBarButton( IDM_HELP_ABOUT );\r
+\r
+ // Remove the checkmark for container tabs at top\r
+ ::CheckMenuItem(GetFrameMenu(), IDM_CONTAINER_TOP, MF_UNCHECKED);\r
+\r
+ // Add some extra icons for menu items\r
+ AddMenuIcon(IDM_FILE_NEWSIMPLE, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_SIMPLE), IMAGE_ICON, 0, 0, LR_SHARED));\r
+ AddMenuIcon(IDM_FILE_NEWRECT, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_RECT), IMAGE_ICON, 0, 0, LR_SHARED));\r
+ AddMenuIcon(IDM_FILE_NEWTEXT, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_TEXT), IMAGE_ICON, 0, 0, LR_SHARED));\r
+ AddMenuIcon(IDM_FILE_NEWLIST, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_FILEVIEW), IMAGE_ICON, 0, 0, LR_SHARED));\r
+ AddMenuIcon(IDM_FILE_NEWTREE, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_CLASSVIEW), IMAGE_ICON, 0, 0, LR_SHARED));\r
+}\r
+\r
+ LRESULT CMainFrame::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+ switch (uMsg)\r
+ {\r
+ case WM_MOUSEACTIVATE:\r
+ // Store the active docker before processing the menu events\r
+ m_pLastActiveDocker = m_DockTabbedMDI.GetActiveDocker();\r
+ break;\r
+ }\r
+\r
+ // Always pass unhandled messages on to WndProcDefault\r
+ return WndProcDefault(uMsg, wParam, lParam);\r
+}\r