1 // ************************************************************************************** 2 // File: MainFrm.cpp 3 // By: Arthur David Leather 4 // Created: 12/02/98 5 // Copyright @1998 Massachusetts Institute of Technology - All rights reserved. 6 // Description: CPP file for MainFrm.h. Contains variables and functions 7 // for Leash 8 // 9 // History: 10 // 11 // MM/DD/YY Inits Description of Change 12 // 12/02/98 ADL Original 13 // ************************************************************************************** 14 15 16 #include "stdafx.h" 17 #include "LeashUIApplication.h" 18 #include "Leash.h" 19 #include "MainFrm.h" 20 #include "lglobals.h" 21 //#include "KrbRealmHostMaintenance.h" 22 23 #ifdef _DEBUG 24 #define new DEBUG_NEW 25 #undef THIS_FILE 26 static char THIS_FILE[] = __FILE__; 27 #endif 28 29 ///////////////////////////////////////////////////////////////////////////// 30 // CMainFrame 31 32 #define MIN_LEFT 179 33 #define MIN_TOP 61 34 #define MIN_RIGHT 530 35 #define MIN_BOTTOM 280 36 37 #ifndef NO_STATUS_BAR 38 CMFCStatusBar CMainFrame::m_wndStatusBar; 39 #endif 40 CMFCToolBar CMainFrame::m_wndToolBar; 41 CImageList CMainFrame::m_imageList; 42 CImageList CMainFrame::m_disabledImageList; 43 BOOL CMainFrame::m_isMinimum; 44 BOOL CMainFrame::m_isBeingResized; 45 int CMainFrame::m_whatSide; 46 47 IMPLEMENT_DYNCREATE(CMainFrame, CLeashFrame) 48 49 BEGIN_MESSAGE_MAP(CMainFrame, CLeashFrame) 50 //{{AFX_MSG_MAP(CMainFrame) 51 ON_WM_CREATE() 52 ON_WM_SIZING() 53 ON_WM_CLOSE() 54 ON_WM_GETMINMAXINFO() 55 ON_COMMAND(ID_APP_EXIT, OnClose) 56 //}}AFX_MSG_MAP 57 // Global help commands 58 ON_COMMAND(ID_HELP_LEASH_, CMainFrame::OnHelpFinder) 59 ON_COMMAND(ID_HELP, CMainFrame::OnHelp) 60 ON_COMMAND(ID_CONTEXT_HELP, CMainFrame::OnContextHelp) 61 ON_MESSAGE_VOID(WM_RIBBON_RESIZE, OnRibbonResize) 62 END_MESSAGE_MAP() 63 64 static UINT indicators[] = 65 { 66 ID_SEPARATOR, // status line indicator 67 ID_SEPARATOR, 68 ID_SEPARATOR, 69 ID_SEPARATOR 70 }; 71 72 73 ///////////////////////////////////////////////////////////////////////////// 74 // CMainFrame construction/destruction 75 76 CMainFrame::CMainFrame() 77 { 78 m_winRectLeft = 0; 79 m_winRectTop = 0; 80 m_winRectRight = 0; 81 m_winRectBottom = 0; 82 m_whatSide = RESET_MINSIZE; 83 m_isMinimum = FALSE; 84 m_isBeingResized = FALSE; 85 m_bOwnerCreated = FALSE; 86 pApplication = NULL; 87 } 88 89 CMainFrame::~CMainFrame() 90 { 91 } 92 93 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 94 { 95 if (CLeashApp::m_useRibbon) { 96 HWND hwnd; 97 HRESULT hr; 98 // Fixup tooltips (cribbed from http://social.msdn.microsoft.com/Forums/en/vcmfcatl/thread/5c5b4879-d278-4d79-8894-99e7f9b322df) 99 100 CMFCToolTipInfo ttParams; 101 ttParams.m_bVislManagerTheme = TRUE; 102 ttParams.m_bVislManagerTheme = FALSE; 103 ttParams.m_bDrawSeparator = FALSE; 104 ttParams.m_clrFillGradient = afxGlobalData.clrBarFace; 105 ttParams.m_clrFill = RGB(255, 255, 255); 106 ttParams.m_clrBorder = afxGlobalData.clrBarShadow; 107 ttParams.m_clrText = afxGlobalData.clrBarText; 108 109 theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL, 110 RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams); 111 112 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7)); 113 CDockingManager::SetDockingMode(DT_SMART); 114 m_wndRibbonBar.SetWindows7Look(TRUE); 115 116 // Initialize the ribbon, keeping a handle to the IUIApplication 117 // so that we can query the ribbon height and save space for it 118 // when calculating our layout. 119 hwnd = this->GetSafeHwnd(); 120 if (hwnd == NULL) 121 printf("Failed to get HWND\n"); 122 hr = LeashUIApplication::CreateInstance(&pApplication, hwnd); 123 if (FAILED(hr)) { 124 MessageBox("LeashUIApplication::CreateInstance!", "Error", MB_OK); 125 return -1; 126 } 127 } 128 129 if (CLeashFrame::OnCreate(lpCreateStruct) == -1) 130 return -1; 131 132 ShowWindow(SW_HIDE); 133 134 /* NT4 and NT5 aren't shipped with a version of MFC that supports 135 // 'CreateEx()' as of 2/1/99 136 #if _MFC_VER > 0x0421 137 138 if (!m_wndToolBar.CreateEx(this) || 139 !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 140 { 141 TRACE0("Failed to create toolbar\n"); 142 return -1; // fail to create 143 } 144 145 #else 146 147 if (!m_wndToolBar.Create(this) || 148 !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 149 { 150 TRACE0("Failed to create toolbar\n"); 151 return -1; // fail to create 152 } 153 154 #endif 155 */ 156 if ((!CLeashApp::m_useRibbon) && 157 (!m_wndToolBar.Create(this) || 158 !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))) 159 { 160 MessageBox("There is problem creating the Leash Toolbar!", 161 "Error", MB_OK); 162 TRACE0("Failed to create toolbar\n"); 163 return -1; // fail to create 164 } 165 166 #ifndef NO_STATUS_BAR 167 if (!m_wndStatusBar.Create(this) || 168 !m_wndStatusBar.SetIndicators(indicators, 3)) 169 { 170 MessageBox("There is problem creating the Leash Status Bar!", 171 "Error", MB_OK); 172 TRACE0("Failed to create status bar\n"); 173 return -1; // fail to create 174 } 175 #endif 176 177 178 // TODO: Remove this if you don't want tool tips or a resizable toolbar 179 //m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | 180 // CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 181 182 if (!CLeashApp::m_useRibbon) { 183 // TODO: Delete these three lines if you don't want the toolbar to 184 // be dockable 185 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 186 EnableDocking(CBRS_ALIGN_ANY); 187 DockPane(&m_wndToolBar); 188 } 189 190 return 0; 191 } 192 193 BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 194 { 195 return CLeashFrame::PreTranslateMessage(pMsg); 196 } 197 198 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 199 { 200 // Use the specific class name we established earlier 201 // Remove the Minimize and Maximize buttons 202 cs.style &= ~WS_MINIMIZEBOX; 203 cs.style &= ~WS_MAXIMIZEBOX; 204 // Initialize the extended window style to display a TaskBar entry with WS_EX_APPWINDOW 205 cs.dwExStyle |= WS_EX_APPWINDOW; 206 // cs.dwExStyle |= WS_EX_OVERLAPPEDWINDOW ; 207 cs.lpszClass = _T("LEASH.0WNDCLASS"); 208 cs.lpszName = _T("MIT Kerberos"); 209 210 CString strText = AfxGetApp()->GetProfileString(CLeashFrame::s_profileHeading, 211 CLeashFrame::s_profileRect); 212 if (!strText.IsEmpty()) 213 { 214 CRect rect; 215 216 rect.left = atoi((const char*) strText); 217 rect.top = atoi((const char*) strText + 5); 218 rect.right = atoi((const char*) strText + 10); 219 rect.bottom = atoi((const char*) strText + 15); 220 221 cs.x = rect.left; 222 cs.y = rect.top; 223 cs.cx = rect.right - rect.left; 224 cs.cy = rect.bottom - rect.top; 225 226 if ( cs.x < 0 ) 227 cs.x = CW_USEDEFAULT; 228 if ( cs.y < 0 ) 229 cs.y = CW_USEDEFAULT; 230 if ( cs.cx <= 0 ) 231 cs.cx = CLeashFrame::s_rectDefault.right; 232 if ( cs.cy <= 0 ) 233 cs.cy = CLeashFrame::s_rectDefault.bottom; 234 } 235 else 236 { 237 cs.cx = CLeashFrame::s_rectDefault.right; 238 cs.cy = CLeashFrame::s_rectDefault.bottom; 239 cs.y = CW_USEDEFAULT; 240 cs.x = CW_USEDEFAULT; 241 } 242 243 // Change the following line to call 244 // CLeashFrame::PreCreateWindow(cs) if this is an SDI application. 245 if (!CLeashFrame::PreCreateWindow(cs)) 246 return FALSE; 247 248 // We create a parent window for our application to ensure that 249 // it has an owner. This way we can disable the TaskBar entry 250 // by removing the WS_EX_APPWINDOW style later on. 251 if ( !m_bOwnerCreated ) 252 { 253 m_bOwnerCreated = m_MainFrameOwner.Create(IDD_FRAMEOWNER); 254 if ( m_bOwnerCreated ) 255 m_MainFrameOwner.ShowWindow(SW_HIDE); 256 } 257 if ( m_bOwnerCreated ) 258 cs.hwndParent = m_MainFrameOwner.GetSafeHwnd(); 259 260 return TRUE; 261 } 262 263 264 BOOL CMainFrame::ShowTaskBarButton(BOOL bVisible) 265 { 266 if (!m_bOwnerCreated) 267 return FALSE; 268 269 if (bVisible) { 270 ShowWindow(SW_HIDE); 271 ModifyStyleEx(0, WS_EX_APPWINDOW); 272 ShowWindow(SW_SHOW); 273 } else { 274 ShowWindow(SW_HIDE); 275 ModifyStyleEx(WS_EX_APPWINDOW, 0); 276 ShowWindow(SW_SHOW); 277 } 278 return TRUE; 279 } 280 281 ///////////////////////////////////////////////////////////////////////////// 282 // CMainFrame diagnostics 283 284 #ifdef _DEBUG 285 void CMainFrame::AssertValid() const 286 { 287 CLeashFrame::AssertValid(); 288 } 289 290 void CMainFrame::Dump(CDumpContext& dc) const 291 { 292 CLeashFrame::Dump(dc); 293 } 294 295 #endif //_DEBUG 296 297 ///////////////////////////////////////////////////////////////////////////// 298 // CMainFrame message handlers 299 300 void CMainFrame::OnResetWindowSize() 301 { 302 WINDOWPLACEMENT wndpl; 303 wndpl.length = sizeof(WINDOWPLACEMENT); 304 305 if (!GetWindowPlacement(&wndpl)) 306 { 307 MessageBox("There is a problem getting Leash Window size!", 308 "Error", MB_OK); 309 return; 310 } 311 312 wndpl.rcNormalPosition = CLeashFrame::s_rectDefault; 313 314 m_whatSide = SKIP_MINSIZE; 315 316 if (!SetWindowPlacement(&wndpl)) 317 { 318 MessageBox("There is a problem setting Leash Window size!", 319 "Error", MB_OK); 320 } 321 322 m_whatSide = RESET_MINSIZE; 323 } 324 325 void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) 326 { // Keeps track of Leash window size for function CMainFrame::RecalcLayout 327 m_winRectLeft = pRect->left; 328 m_winRectTop = pRect->top; 329 m_winRectRight = pRect->right; 330 m_winRectBottom = pRect->bottom; 331 332 if (m_whatSide) 333 m_whatSide = fwSide; 334 335 CLeashFrame::OnSizing(fwSide, pRect); 336 } 337 338 void CMainFrame::RecalcLayout(BOOL bNotify) 339 { // MINSIZE - Insurance that we have a minimum Leash window size 340 int width = MIN_RIGHT - MIN_LEFT; 341 int height = MIN_BOTTOM - MIN_TOP; 342 LeashUIApplication *leashUI; 343 RECT border; 344 border.left = border.right = border.bottom = 0; 345 // Leave room for the ribbon. 346 leashUI = static_cast<LeashUIApplication*>(pApplication); 347 border.top = (leashUI != NULL) ? leashUI->GetRibbonHeight() : 0; 348 NegotiateBorderSpace(CFrameWnd::borderSet, &border); 349 350 BOOL change = FALSE; 351 WINDOWPLACEMENT wndpl; 352 wndpl.length = sizeof(WINDOWPLACEMENT); 353 354 if (!GetWindowPlacement(&wndpl)) 355 { 356 MessageBox("There is a problem getting Leash Window size!", 357 "Error", MB_OK); 358 return; 359 } 360 361 if (m_whatSide) 362 { 363 if ((m_winRectRight - m_winRectLeft) < width) 364 { 365 if (m_whatSide == LEFT_SIDE) { 366 wndpl.rcNormalPosition.left = wndpl.rcNormalPosition.right - width; 367 change = TRUE; 368 } else if (m_whatSide == RIGHT_SIDE) { 369 wndpl.rcNormalPosition.right = wndpl.rcNormalPosition.left + width; 370 change = TRUE; 371 } 372 } 373 else if ((m_winRectBottom - m_winRectTop) < height) 374 { 375 if (m_whatSide == TOP_SIDE) { 376 wndpl.rcNormalPosition.top = wndpl.rcNormalPosition.bottom - height; 377 change = TRUE; 378 } else if (m_whatSide == BOTTOM_SIDE) { 379 wndpl.rcNormalPosition.bottom = wndpl.rcNormalPosition.top + height; 380 change = TRUE; 381 } 382 } 383 } 384 385 if ( change ) { 386 if (!SetWindowPlacement(&wndpl)) 387 { 388 MessageBox("There is a problem setting Leash Window size!", 389 "Error", MB_OK); 390 } 391 } 392 m_isBeingResized = TRUE; 393 394 CLeashFrame::RecalcLayout(bNotify); 395 } 396 397 398 void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 399 { 400 lpMMI->ptMinTrackSize.x = 650; 401 lpMMI->ptMinTrackSize.y = 240; 402 CLeashFrame::OnGetMinMaxInfo(lpMMI); 403 } 404 405 void CMainFrame::OnClose(void) 406 { 407 CLeashFrame::OnClose(); 408 } 409 410 LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 411 { 412 BOOL oldMin = m_isMinimum; 413 //printf("CMainFrame::WindowProc() Msg: %x, WPARAM: %x, LPARAM: %x\n", message, wParam, lParam); 414 switch(message) 415 { 416 case WM_CLOSE: 417 printf("received WM_CLOSE!"); 418 break; 419 case WM_SIZE: 420 switch ( wParam ) { 421 case SIZE_MINIMIZED: 422 m_isMinimum = TRUE; 423 break; 424 case SIZE_MAXIMIZED: 425 case SIZE_RESTORED: 426 m_isMinimum = FALSE; 427 break; 428 } 429 break; 430 case ID_OBTAIN_TGT_WITH_LPARAM: 431 GetActiveView()->SendMessage(ID_OBTAIN_TGT_WITH_LPARAM, wParam, 432 lParam); 433 break; 434 } 435 436 if ( oldMin != m_isMinimum ) { 437 if ( m_isMinimum ) { 438 ShowTaskBarButton(FALSE); 439 ShowWindow(SW_HIDE); 440 } 441 } 442 return CLeashFrame::WindowProc(message, wParam, lParam); 443 } 444 445 // Signalled by LeashUIApplication::OnViewChanged when the ribbon height 446 // changes. 447 void CMainFrame::OnRibbonResize() 448 { 449 RecalcLayout(TRUE); 450 } 451 452 /* 453 void CMainFrame::OnHelp() 454 { 455 456 } 457 */ 458 459 /* 460 void CMainFrame::OnContextHelp() 461 { 462 463 } 464 */ 465