1 ////////////////////////////////////////////////////
\r
5 #include "TabbedMDIApp.h"
\r
7 #include "resource.h"
\r
10 // Definitions for the CMainFrame class
\r
11 CMainFrame::CMainFrame() : m_pLastActiveDocker(0)
\r
13 // Constructor for CMainFrame. Its called after CFrame's constructor
\r
15 //Set m_DockTabbedMDI as the view window of the frame
\r
16 SetView(m_DockTabbedMDI);
\r
18 // Set the registry key name, and load the initial window position
\r
19 // Use a registry key name like "CompanyName\\Application"
\r
20 LoadRegistrySettings(_T("Win32++\\TabbedMDI Docking"));
\r
23 CMainFrame::~CMainFrame()
\r
25 // Destructor for CMainFrame.
\r
28 void CMainFrame::OnFileNew()
\r
30 // Creates the popup menu when the "New" toolbar button is pressed
\r
32 // Position the popup menu
\r
33 CToolBar& TB = GetToolBar();
\r
34 RECT rc = TB.GetItemRect(TB.CommandToIndex(IDM_FILE_NEW));
\r
35 GetToolBar().ClientToScreen(rc);
\r
38 tpm.cbSize = sizeof(TPMPARAMS);
\r
41 // Load the popup menu
\r
42 HMENU hTopMenu = ::LoadMenu(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDM_NEWMENU));
\r
43 HMENU hPopupMenu = ::GetSubMenu(hTopMenu, 0);
\r
45 // Start the popup menu
\r
46 ::TrackPopupMenuEx(hPopupMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, m_hWnd, &tpm);
\r
48 // Release the menu resource
\r
49 ::DestroyMenu(hTopMenu);
\r
52 void CMainFrame::OnContainerTabsAtTop()
\r
53 // Reposition the tabs in the containers
\r
56 std::vector<DockPtr>::iterator iter;
\r
58 // Set the Tab position for each container
\r
59 for (iter = m_DockTabbedMDI.GetAllDockers().begin(); iter < m_DockTabbedMDI.GetAllDockers().end(); ++iter)
\r
61 CDockContainer* pContainer = (*iter)->GetContainer();
\r
64 bTop = pContainer->GetTabsAtTop();
\r
65 pContainer->SetTabsAtTop(!bTop);
\r
69 // Set the menu checkmark
\r
70 UINT uCheck = (bTop)? MF_UNCHECKED : MF_CHECKED;
\r
71 ::CheckMenuItem(GetFrameMenu(), IDM_CONTAINER_TOP, uCheck);
\r
74 void CMainFrame::OnMDITabsAtTop()
\r
75 // Reposition TabbedMDI's tabs
\r
77 CTabbedMDI* pTabbedMDI = m_DockTabbedMDI.GetTabbedMDI();
\r
79 BOOL bTop = pTabbedMDI->GetTab().GetTabsAtTop();
\r
80 pTabbedMDI->GetTab().SetTabsAtTop(!bTop);
\r
82 // Set the menu checkmark
\r
83 UINT uCheck = (bTop)? MF_UNCHECKED : MF_CHECKED;
\r
84 ::CheckMenuItem(GetFrameMenu(), IDM_TABBEDMDI_TOP, uCheck);
\r
87 void CMainFrame::LoadDefaultDockers()
\r
89 // Note: The DockIDs are used for saving/restoring the dockers state in the registry
\r
91 DWORD dwStyle = DS_CLIENTEDGE; // The style added to each docker
\r
93 // Add the parent dockers
\r
94 CDocker* pDockRight = m_DockTabbedMDI.AddDockedChild(new CDockClasses, DS_DOCKED_RIGHT | dwStyle, 200, ID_DOCK_CLASSES1);
\r
95 CDocker* pDockBottom = m_DockTabbedMDI.AddDockedChild(new CDockText, DS_DOCKED_BOTTOM | dwStyle, 100, ID_DOCK_TEXT1);
\r
97 // Add the remaining dockers
\r
98 pDockRight->AddDockedChild(new CDockFiles, DS_DOCKED_CONTAINER | dwStyle, 200, ID_DOCK_FILES1);
\r
99 pDockRight->AddDockedChild(new CDockClasses, DS_DOCKED_CONTAINER | dwStyle, 200, ID_DOCK_CLASSES2);
\r
100 pDockRight->AddDockedChild(new CDockFiles, DS_DOCKED_CONTAINER | dwStyle, 200, ID_DOCK_FILES2);
\r
102 pDockBottom->AddDockedChild(new CDockOutput, DS_DOCKED_CONTAINER | dwStyle, 100, ID_DOCK_OUTPUT1);
\r
103 pDockBottom->AddDockedChild(new CDockText, DS_DOCKED_CONTAINER | dwStyle, 100, ID_DOCK_TEXT2);
\r
104 pDockBottom->AddDockedChild(new CDockOutput, DS_DOCKED_CONTAINER | dwStyle, 100, ID_DOCK_OUTPUT2);
\r
107 void CMainFrame::LoadDefaultMDIs()
\r
109 // Add some MDI tabs
\r
110 CTabbedMDI* pTabbedMDI = (CTabbedMDI*)m_DockTabbedMDI.GetView();
\r
111 pTabbedMDI->AddMDIChild(new CViewSimple, _T("Simple View"), ID_MDI_SIMPLE);
\r
112 pTabbedMDI->AddMDIChild(new CViewRect, _T("Rectangles"), ID_MDI_RECT);
\r
113 pTabbedMDI->AddMDIChild(new CViewText, _T("TextView"), ID_MDI_TEXT);
\r
114 pTabbedMDI->AddMDIChild(new CViewClasses, _T("Classes"), ID_MDI_CLASSES);
\r
115 pTabbedMDI->AddMDIChild(new CViewFiles, _T("Files"), ID_MDI_FILES);
\r
117 if (pTabbedMDI->IsWindow())
\r
118 pTabbedMDI->SetActiveMDITab(0);
\r
121 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
\r
123 CTabbedMDI* pTabbedMDI = (CTabbedMDI*)m_DockTabbedMDI.GetView();
\r
125 // OnCommand responds to menu and and toolbar input
\r
126 switch(LOWORD(wParam))
\r
131 case IDM_FILE_NEWSIMPLE:
\r
132 pTabbedMDI->AddMDIChild(new CViewSimple, _T("Simple"), ID_MDI_SIMPLE);
\r
134 case IDM_FILE_NEWRECT:
\r
135 pTabbedMDI->AddMDIChild(new CViewRect, _T("Rectangles"), ID_MDI_RECT);
\r
137 case IDM_FILE_NEWTEXT:
\r
138 pTabbedMDI->AddMDIChild(new CViewText, _T("TextView"), ID_MDI_TEXT);
\r
140 case IDM_FILE_NEWTREE:
\r
141 pTabbedMDI->AddMDIChild(new CViewClasses, _T("TreeView"), ID_MDI_CLASSES);
\r
143 case IDM_FILE_NEWLIST:
\r
144 pTabbedMDI->AddMDIChild(new CViewFiles, _T("ListView"), ID_MDI_FILES);
\r
146 case IDM_FILE_EXIT:
\r
147 // End the application
\r
148 ::PostQuitMessage(0);
\r
150 case IDM_CONTAINER_TOP:
\r
151 OnContainerTabsAtTop();
\r
153 case IDM_TABBEDMDI_TOP:
\r
156 case IDM_LAYOUT_DEFAULT:
\r
159 m_DockTabbedMDI.CloseAllDockers();
\r
160 m_DockTabbedMDI.GetTabbedMDI()->CloseAllMDIChildren();
\r
161 LoadDefaultDockers();
\r
165 RedrawWindow(0, 0, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ALLCHILDREN);
\r
168 case IDM_LAYOUT_CLOSE_DOCKERS:
\r
169 m_DockTabbedMDI.CloseAllDockers();
\r
171 case IDM_LAYOUT_CLOSE_MDIS:
\r
172 m_DockTabbedMDI.GetTabbedMDI()->CloseAllMDIChildren();
\r
174 case IDW_VIEW_STATUSBAR:
\r
177 case IDW_VIEW_TOOLBAR:
\r
180 case IDM_HELP_ABOUT:
\r
181 // Display the help dialog
\r
186 // Pass the command on to the view window of the last active docker
\r
188 if (m_pLastActiveDocker == &m_DockTabbedMDI)
\r
189 m_DockTabbedMDI.GetTabbedMDI()->GetActiveMDIChild()->SendMessage(WM_COMMAND, wParam, lParam);
\r
190 else if (m_pLastActiveDocker->IsDocked())
\r
191 m_pLastActiveDocker->GetContainer()->GetActiveView()->SendMessage(WM_COMMAND, wParam, lParam);
\r
198 void CMainFrame::OnCreate()
\r
200 // OnCreate controls the way the frame is created.
\r
201 // Overriding CFrame::Oncreate is optional.
\r
202 // The default for the following variables is TRUE
\r
204 // m_bShowIndicatorStatus = FALSE; // Don't show statusbar indicators
\r
205 // m_bShowMenuStatus = FALSE; // Don't show toolbar or menu status
\r
206 // m_bUseReBar = FALSE; // Don't use rebars
\r
207 // m_bUseThemes = FALSE; // Don't use themes
\r
208 // m_bUseToolBar = FALSE; // Don't use a toolbar
\r
210 // call the base class function
\r
211 CFrame::OnCreate();
\r
214 void CMainFrame::OnInitialUpdate()
\r
216 m_DockTabbedMDI.SetDockStyle(DS_CLIENTEDGE|DS_FIXED_RESIZE);
\r
218 // Load dock settings
\r
219 if (!m_DockTabbedMDI.LoadRegistrySettings(GetRegistryKeyName()))
\r
220 LoadDefaultDockers();
\r
222 // Load MDI child settings
\r
223 if (!m_DockTabbedMDI.GetTabbedMDI()->LoadRegistrySettings(GetRegistryKeyName()))
\r
226 // PreCreate initially set the window as invisible, so show it now.
\r
230 void CMainFrame::OnMenuUpdate(UINT nID)
\r
231 // Called when menu items are about to be displayed
\r
233 // Only for the Menu IDs we wish to modify
\r
234 if (nID >= IDM_EDIT_UNDO && nID <= IDM_EDIT_DELETE)
\r
238 Menu.Attach(GetFrameMenu());
\r
239 CMenu* pEditMenu = Menu.GetSubMenu(1);
\r
241 if (m_pLastActiveDocker)
\r
243 if (m_pLastActiveDocker == &m_DockTabbedMDI)
\r
244 pWnd = m_DockTabbedMDI.GetTabbedMDI()->GetActiveMDIChild();
\r
245 else if (m_pLastActiveDocker->IsDocked())
\r
246 pWnd = m_pLastActiveDocker->GetContainer()->GetActiveView();
\r
249 // Enable the Edit menu items for CViewText windows, disable them otherwise
\r
250 UINT Flags = (dynamic_cast<CViewText*>(pWnd))? MF_ENABLED : MF_GRAYED;
\r
251 pEditMenu->EnableMenuItem(nID, MF_BYCOMMAND | Flags);
\r
256 void CMainFrame::PreCreate(CREATESTRUCT &cs)
\r
258 // Call the base class function first
\r
259 CFrame::PreCreate(cs);
\r
261 // Hide the window initially by removing the WS_VISIBLE style
\r
262 cs.style &= ~WS_VISIBLE;
\r
265 BOOL CMainFrame::SaveRegistrySettings()
\r
267 CFrame::SaveRegistrySettings();
\r
269 // Save the docker settings
\r
270 m_DockTabbedMDI.SaveRegistrySettings(GetRegistryKeyName());
\r
272 // Save the tabbedMDI settings
\r
273 m_DockTabbedMDI.GetTabbedMDI()->SaveRegistrySettings(GetRegistryKeyName());
\r
278 void CMainFrame::SetupToolBar()
\r
280 // Set the Resource IDs for the toolbar buttons
\r
281 AddToolBarButton( IDM_FILE_NEW );
\r
282 AddToolBarButton( IDM_FILE_OPEN, FALSE );
\r
283 AddToolBarButton( IDM_FILE_SAVE, FALSE );
\r
285 AddToolBarButton( 0 ); // Separator
\r
286 AddToolBarButton( IDM_EDIT_CUT, FALSE );
\r
287 AddToolBarButton( IDM_EDIT_COPY, FALSE );
\r
288 AddToolBarButton( IDM_EDIT_PASTE, FALSE );
\r
290 AddToolBarButton( 0 ); // Separator
\r
291 AddToolBarButton( IDM_FILE_PRINT, FALSE );
\r
293 AddToolBarButton( 0 ); // Separator
\r
294 AddToolBarButton( IDM_HELP_ABOUT );
\r
296 // Remove the checkmark for container tabs at top
\r
297 ::CheckMenuItem(GetFrameMenu(), IDM_CONTAINER_TOP, MF_UNCHECKED);
\r
299 // Add some extra icons for menu items
\r
300 AddMenuIcon(IDM_FILE_NEWSIMPLE, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_SIMPLE), IMAGE_ICON, 0, 0, LR_SHARED));
\r
301 AddMenuIcon(IDM_FILE_NEWRECT, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_RECT), IMAGE_ICON, 0, 0, LR_SHARED));
\r
302 AddMenuIcon(IDM_FILE_NEWTEXT, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_TEXT), IMAGE_ICON, 0, 0, LR_SHARED));
\r
303 AddMenuIcon(IDM_FILE_NEWLIST, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_FILEVIEW), IMAGE_ICON, 0, 0, LR_SHARED));
\r
304 AddMenuIcon(IDM_FILE_NEWTREE, (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(IDI_CLASSVIEW), IMAGE_ICON, 0, 0, LR_SHARED));
\r
307 LRESULT CMainFrame::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
311 case WM_MOUSEACTIVATE:
\r
312 // Store the active docker before processing the menu events
\r
313 m_pLastActiveDocker = m_DockTabbedMDI.GetActiveDocker();
\r
317 // Always pass unhandled messages on to WndProcDefault
\r
318 return WndProcDefault(uMsg, wParam, lParam);
\r