|
|
1.1 ! root 1: /************************************************************************* ! 2: ** ! 3: ** OLE 2 Server Sample Code ! 4: ** ! 5: ** frametls.c ! 6: ** ! 7: ** This file contains all FrameTools methods and related support ! 8: ** functions. The FrameTools object is an encapsulation of the apps ! 9: ** formula bar and button bar. ! 10: ** ! 11: ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved ! 12: ** ! 13: *************************************************************************/ ! 14: ! 15: #include "outline.h" ! 16: ! 17: OLEDBGDATA ! 18: ! 19: /* private function prototype */ ! 20: static void Bar_Move(LPBAR lpbar, LPRECT lprcClient, LPRECT lprcPopup); ! 21: static void FB_ResizeEdit(LPBAR lpbar); ! 22: ! 23: extern LPOUTLINEAPP g_lpApp; ! 24: extern RECT g_rectNull; ! 25: ! 26: /* ! 27: * FrameToolsRegisterClass ! 28: * ! 29: * Purpose: ! 30: * Register the popup toolbar window class ! 31: * ! 32: * Parameters: ! 33: * hInst Process instance ! 34: * ! 35: * Return Value: ! 36: * TRUE if successful ! 37: * FALSE if failed ! 38: * ! 39: */ ! 40: BOOL FrameToolsRegisterClass(HINSTANCE hInst) ! 41: { ! 42: WNDCLASS wc; ! 43: ! 44: // Register Tool Palette Class ! 45: wc.style = CS_BYTEALIGNWINDOW; ! 46: wc.lpfnWndProc = FrameToolsWndProc; ! 47: wc.cbClsExtra = 0; ! 48: wc.cbWndExtra = 4; ! 49: wc.hInstance = hInst; ! 50: wc.hIcon = NULL; ! 51: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 52: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); ! 53: wc.lpszMenuName = NULL; ! 54: wc.lpszClassName = CLASS_PALETTE; ! 55: ! 56: if (!RegisterClass(&wc)) ! 57: return FALSE; ! 58: else ! 59: return TRUE; ! 60: } ! 61: ! 62: ! 63: static BOOL FrameTools_CreatePopupPalette(LPFRAMETOOLS lpft, HWND hWndFrame) ! 64: { ! 65: if (lpft->m_hWndPopupPalette) ! 66: DestroyWindow(lpft->m_hWndPopupPalette); ! 67: ! 68: lpft->m_hWndPopupPalette = CreateWindow( ! 69: CLASS_PALETTE, ! 70: "Tool Palette", ! 71: WS_POPUP | WS_CAPTION | WS_CLIPCHILDREN, ! 72: CW_USEDEFAULT, 0, 0, 0, ! 73: hWndFrame, ! 74: (HMENU)NULL, ! 75: g_lpApp->m_hInst, ! 76: 0L ! 77: ); ! 78: ! 79: if (!lpft->m_hWndPopupPalette) ! 80: return FALSE; ! 81: ! 82: SetWindowLong(lpft->m_hWndPopupPalette, 0, (LONG)lpft); ! 83: return TRUE; ! 84: } ! 85: ! 86: ! 87: /* ! 88: * FrameTools_Init ! 89: * ! 90: * Purpose: ! 91: * Init and create the toolbar ! 92: * ! 93: * Parameters: ! 94: * lpft FrameTools object ! 95: * hWndParent The window which owns the toolbar ! 96: * hInst Process instance ! 97: * ! 98: * Return Value: ! 99: * TRUE if successful ! 100: * FALSE if failed ! 101: * ! 102: */ ! 103: BOOL FrameTools_Init(LPFRAMETOOLS lpft, HWND hWndParent, HINSTANCE hInst) ! 104: { ! 105: RECT rc; ! 106: UINT uPos; ! 107: UINT dx; ! 108: UINT dy; ! 109: ! 110: if (!lpft || !hWndParent || !hInst) ! 111: return FALSE; ! 112: ! 113: //Get BTTNCUR's display information ! 114: UIToolConfigureForDisplay(&lpft->m_tdd); ! 115: ! 116: dx=lpft->m_tdd.cxButton; ! 117: dy=lpft->m_tdd.cyButton; ! 118: ! 119: // 15 is calculated from the total number of buttons and separators ! 120: lpft->m_uPopupWidth = dx * 15; ! 121: ! 122: lpft->m_hWndApp = hWndParent; ! 123: lpft->m_ButtonBar.m_nState = BARSTATE_TOP; ! 124: lpft->m_FormulaBar.m_nState = BARSTATE_TOP; ! 125: lpft->m_fInFormulaBar = FALSE; ! 126: ! 127: lpft->m_fToolsDisabled = FALSE; ! 128: ! 129: lpft->m_ButtonBar.m_uHeight = lpft->m_tdd.cyBar; ! 130: lpft->m_FormulaBar.m_uHeight = lpft->m_tdd.cyBar; ! 131: ! 132: ! 133: //Get our image bitmaps for the display type we're on ! 134: if (72 == lpft->m_tdd.uDPI) ! 135: lpft->m_hBmp = LoadBitmap(hInst, (LPCSTR)"Image72"); ! 136: if (96 == lpft->m_tdd.uDPI) ! 137: lpft->m_hBmp = LoadBitmap(hInst, (LPCSTR)"Image96"); ! 138: if (120 == lpft->m_tdd.uDPI) ! 139: lpft->m_hBmp = LoadBitmap(hInst, (LPCSTR)"Image120"); ! 140: ! 141: if (!lpft->m_hBmp) ! 142: return FALSE; ! 143: ! 144: /* Create Popup Tool Palette window */ ! 145: lpft->m_hWndPopupPalette = NULL; ! 146: if (! FrameTools_CreatePopupPalette(lpft, hWndParent)) ! 147: return FALSE; ! 148: ! 149: uPos = 0; ! 150: //Create the GizmoBar and the client area window ! 151: GetClientRect(hWndParent, &rc); ! 152: lpft->m_ButtonBar.m_hWnd = CreateWindow( ! 153: CLASS_GIZMOBAR, ! 154: "ButtonBar", ! 155: WS_CHILD | WS_VISIBLE, ! 156: 0, 0, rc.right-rc.left, lpft->m_tdd.cyBar, ! 157: hWndParent, ! 158: (HMENU)IDC_GIZMOBAR, ! 159: hInst, ! 160: 0L ! 161: ); ! 162: ! 163: if (!lpft->m_ButtonBar.m_hWnd) ! 164: return FALSE; ! 165: ! 166: ! 167: SendMessage(lpft->m_ButtonBar.m_hWnd, WM_SETREDRAW, FALSE, 0L); ! 168: ! 169: //File new, open, save, print ! 170: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_NEW, dx, dy, NULL, NULL, TOOLIMAGE_FILENEW, GIZMO_NORMAL); ! 171: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_OPEN, dx, dy, NULL, NULL, TOOLIMAGE_FILEOPEN, GIZMO_NORMAL); ! 172: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_SAVE, dx, dy, NULL, NULL, TOOLIMAGE_FILESAVE, GIZMO_NORMAL); ! 173: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_PRINT, dx, dy, NULL, NULL, TOOLIMAGE_FILEPRINT, GIZMO_NORMAL); ! 174: ! 175: // separator ! 176: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL); ! 177: ! 178: // Edit cut, copy, paste ! 179: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_E_CUT, dx, dy, NULL, NULL, TOOLIMAGE_EDITCUT, GIZMO_NORMAL); ! 180: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_E_COPY, dx, dy, NULL, NULL, TOOLIMAGE_EDITCOPY, GIZMO_NORMAL); ! 181: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_E_PASTE, dx, dy, NULL, NULL, TOOLIMAGE_EDITPASTE, GIZMO_NORMAL); ! 182: ! 183: // separator ! 184: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL); ! 185: ! 186: // Line indent, unindent ! 187: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_UNINDENTLINE, dx, dy, NULL, lpft->m_hBmp, IDB_UNINDENTLINE, GIZMO_NORMAL); ! 188: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_INDENTLINE, dx, dy, NULL, lpft->m_hBmp, IDB_INDENTLINE, GIZMO_NORMAL); ! 189: ! 190: // separator ! 191: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL); ! 192: ! 193: // Help ! 194: GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_H_ABOUT, dx, dy, NULL, NULL, TOOLIMAGE_HELP, GIZMO_NORMAL); ! 195: ! 196: SendMessage(lpft->m_ButtonBar.m_hWnd, WM_SETREDRAW, TRUE, 0L); ! 197: ! 198: ! 199: uPos = 0; ! 200: lpft->m_FormulaBar.m_hWnd = CreateWindow( ! 201: CLASS_GIZMOBAR, ! 202: "FormulaBar", ! 203: WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, ! 204: 0, lpft->m_tdd.cyBar, rc.right-rc.left, lpft->m_tdd.cyBar, ! 205: hWndParent, ! 206: (HMENU)IDC_FORMULABAR, ! 207: hInst, ! 208: 0L ! 209: ); ! 210: ! 211: if (!lpft->m_FormulaBar.m_hWnd) ! 212: return FALSE; ! 213: ! 214: SendMessage(lpft->m_FormulaBar.m_hWnd, WM_SETREDRAW, FALSE, 0L); ! 215: ! 216: // Line add line ! 217: GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_ADDLINE, dx, dy, NULL, lpft->m_hBmp, IDB_ADDLINE, GIZMO_NORMAL); ! 218: ! 219: // separator ! 220: GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL); ! 221: ! 222: // Line edit line, Cancel ! 223: GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_EDITLINE, dx, dy, NULL, lpft->m_hBmp, IDB_EDITLINE, GIZMO_NORMAL); ! 224: GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_FB_CANCEL, dx, dy, NULL, lpft->m_hBmp, IDB_CANCEL, GIZMO_NORMAL); ! 225: ! 226: // separator ! 227: GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL); ! 228: ! 229: // Edit control for line input ! 230: GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_EDIT, uPos++, IDM_FB_EDIT, dx*10, lpft->m_tdd.cyBar-5, NULL, NULL, 0, GIZMO_NORMAL); ! 231: ! 232: ! 233: SendMessage(lpft->m_FormulaBar.m_hWnd, WM_SETREDRAW, TRUE, 0L); ! 234: ! 235: // Limit the text lenght of edit control ! 236: GBGizmoSendMessage(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, EM_LIMITTEXT, ! 237: (WPARAM)MAXSTRLEN, 0L); ! 238: ! 239: //Set the GizmoBar's associate to be this client window ! 240: GBHwndAssociateSet(lpft->m_ButtonBar.m_hWnd, hWndParent); ! 241: ! 242: //Set the FormulaBar's associate to be this client window ! 243: GBHwndAssociateSet(lpft->m_FormulaBar.m_hWnd, hWndParent); ! 244: ! 245: return TRUE; ! 246: } ! 247: ! 248: ! 249: void FrameTools_AttachToFrame(LPFRAMETOOLS lpft, HWND hWndFrame) ! 250: { ! 251: if (! lpft) ! 252: return; ! 253: ! 254: if (hWndFrame == NULL) ! 255: hWndFrame = OutlineApp_GetFrameWindow((LPOUTLINEAPP)g_lpApp); ! 256: ! 257: if (lpft->m_hWndApp == hWndFrame) ! 258: return; // already have this parent frame ! 259: ! 260: lpft->m_hWndApp = hWndFrame; ! 261: ! 262: /* parent the tool bars to the frame so we can safely ! 263: ** destroy/recreate the palette window. ! 264: */ ! 265: SetParent(lpft->m_ButtonBar.m_hWnd, hWndFrame); ! 266: SetParent(lpft->m_FormulaBar.m_hWnd, hWndFrame); ! 267: ! 268: // recreate popup palette so that it is owned by the hWndFrame ! 269: FrameTools_CreatePopupPalette(lpft, hWndFrame); ! 270: ! 271: // restore the correct parent for the tool bars ! 272: FrameTools_BB_SetState(lpft, lpft->m_ButtonBar.m_nState); ! 273: FrameTools_FB_SetState(lpft, lpft->m_FormulaBar.m_nState); ! 274: } ! 275: ! 276: ! 277: void FrameTools_AssociateDoc(LPFRAMETOOLS lpft, LPOUTLINEDOC lpOutlineDoc) ! 278: { ! 279: HWND hWnd = OutlineDoc_GetWindow(lpOutlineDoc); ! 280: ! 281: if (! lpft) ! 282: return; ! 283: ! 284: // if no Doc is given, then associate with the App's frame window. ! 285: if (lpOutlineDoc) ! 286: hWnd = OutlineDoc_GetWindow(lpOutlineDoc); ! 287: else ! 288: hWnd = OutlineApp_GetWindow((LPOUTLINEAPP)g_lpApp); ! 289: ! 290: //Set the GizmoBar's associate to be this client window ! 291: GBHwndAssociateSet(lpft->m_ButtonBar.m_hWnd, hWnd); ! 292: ! 293: //Set the FormulaBar's associate to be this client window ! 294: GBHwndAssociateSet(lpft->m_FormulaBar.m_hWnd, hWnd); ! 295: } ! 296: ! 297: ! 298: /* ! 299: * FrameTools_Destroy ! 300: * ! 301: * Purpose: ! 302: * Destroy the toolbar ! 303: * ! 304: * Parameters: ! 305: * lpft FrameTools object ! 306: * ! 307: * Return Value: ! 308: * nil ! 309: */ ! 310: void FrameTools_Destroy(LPFRAMETOOLS lpft) ! 311: { ! 312: if (!lpft) ! 313: return; ! 314: ! 315: if (IsWindow(lpft->m_ButtonBar.m_hWnd)) ! 316: DestroyWindow(lpft->m_ButtonBar.m_hWnd); ! 317: if (IsWindow(lpft->m_FormulaBar.m_hWnd)) ! 318: DestroyWindow(lpft->m_FormulaBar.m_hWnd); ! 319: if (IsWindow(lpft->m_hWndPopupPalette)) ! 320: DestroyWindow(lpft->m_hWndPopupPalette); ! 321: ! 322: if (lpft->m_hBmp) ! 323: DeleteObject(lpft->m_hBmp); ! 324: } ! 325: ! 326: ! 327: /* ! 328: * FrameTools_Move ! 329: * ! 330: * Purpose: ! 331: * Move and resize the toolbar ! 332: * ! 333: * Parameters: ! 334: * lpft FrameTools object ! 335: * lprc Pointer to client rectangle ! 336: * ! 337: * Return Value: ! 338: * nil ! 339: */ ! 340: void FrameTools_Move(LPFRAMETOOLS lpft, LPRECT lprcClient) ! 341: { ! 342: RECT rcPopup; ! 343: LPRECT lprcPopup = (LPRECT)&rcPopup; ! 344: int nCmdShow = SW_HIDE; ! 345: ! 346: if (!lpft || lpft->m_fToolsDisabled) ! 347: return; ! 348: ! 349: lprcPopup->left = 0; ! 350: lprcPopup->top = 0; ! 351: lprcPopup->right = lpft->m_uPopupWidth; ! 352: lprcPopup->bottom = lpft->m_ButtonBar.m_uHeight + ! 353: lpft->m_FormulaBar.m_uHeight; ! 354: ! 355: switch (lpft->m_ButtonBar.m_nState) { ! 356: case BARSTATE_HIDE: ! 357: case BARSTATE_POPUP: ! 358: case BARSTATE_TOP: ! 359: Bar_Move(&lpft->m_ButtonBar, lprcClient, lprcPopup); ! 360: Bar_Move(&lpft->m_FormulaBar, lprcClient, lprcPopup); ! 361: break; ! 362: ! 363: case BARSTATE_BOTTOM: ! 364: Bar_Move(&lpft->m_FormulaBar, lprcClient, lprcPopup); ! 365: Bar_Move(&lpft->m_ButtonBar, lprcClient, lprcPopup); ! 366: break; ! 367: } ! 368: ! 369: if (lprcPopup->top) { ! 370: SetWindowPos(lpft->m_hWndPopupPalette, NULL, 0, 0, lprcPopup->right, ! 371: lprcPopup->top + GetSystemMetrics(SM_CYCAPTION), ! 372: SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW); ! 373: } ! 374: else ! 375: ShowWindow(lpft->m_hWndPopupPalette, SW_HIDE); ! 376: ! 377: FB_ResizeEdit(&lpft->m_FormulaBar); ! 378: ! 379: InvalidateRect(lpft->m_ButtonBar.m_hWnd, NULL, TRUE); ! 380: InvalidateRect(lpft->m_FormulaBar.m_hWnd, NULL, TRUE); ! 381: } ! 382: ! 383: ! 384: /* ! 385: * FrameTools_PopupTools ! 386: * ! 387: * Purpose: ! 388: * Put both formula bar and button bar in Popup Window. ! 389: * ! 390: * Parameters: ! 391: * lpft FrameTools object ! 392: * ! 393: * Return Value: ! 394: * nil ! 395: */ ! 396: void FrameTools_PopupTools(LPFRAMETOOLS lpft) ! 397: { ! 398: if (! lpft) ! 399: return; ! 400: ! 401: FrameTools_BB_SetState(lpft, BARSTATE_POPUP); ! 402: FrameTools_FB_SetState(lpft, BARSTATE_POPUP); ! 403: FrameTools_Move(lpft, NULL); ! 404: } ! 405: ! 406: ! 407: /* ! 408: * FrameTools_Enable ! 409: * ! 410: * Purpose: ! 411: * Enable/Disable(hide) all the tools of the toolbar. ! 412: * this will hide both the buttonbar and the ! 413: * formulabar independent of whether they are floating or anchored. ! 414: * ! 415: * Parameters: ! 416: * lpft FrameTools object ! 417: * fEnable ! 418: * ! 419: * Return Value: ! 420: * nil ! 421: */ ! 422: void FrameTools_Enable(LPFRAMETOOLS lpft, BOOL fEnable) ! 423: { ! 424: lpft->m_fToolsDisabled = !fEnable; ! 425: if (lpft->m_fToolsDisabled) { ! 426: ShowWindow(lpft->m_hWndPopupPalette, SW_HIDE); ! 427: ShowWindow(lpft->m_ButtonBar.m_hWnd, SW_HIDE); ! 428: ShowWindow(lpft->m_FormulaBar.m_hWnd, SW_HIDE); ! 429: } ! 430: } ! 431: ! 432: ! 433: #if defined( INPLACE_CNTR ) || defined( INPLACE_SVR ) ! 434: ! 435: /* ! 436: * FrameTools_NegotiateForSpaceAndShow ! 437: * ! 438: * Purpose: ! 439: * Negotiate for space for the toolbar tools with the given frame window. ! 440: * and make them visible. ! 441: * Negotiation steps: ! 442: * 1. try to get enough space at top/bottom of window ! 443: * 2. float the tools as a palette if space not available ! 444: * ! 445: * Parameters: ! 446: * lpft FrameTools object ! 447: * ! 448: * Return Value: ! 449: * none ! 450: */ ! 451: void FrameTools_NegotiateForSpaceAndShow( ! 452: LPFRAMETOOLS lpft, ! 453: LPRECT lprcFrameRect, ! 454: LPOLEINPLACEFRAME lpTopIPFrame ! 455: ) ! 456: { ! 457: BORDERWIDTHS borderwidths; ! 458: RECT rectBorder; ! 459: HRESULT hrErr; ! 460: ! 461: if (lprcFrameRect) ! 462: rectBorder = *lprcFrameRect; ! 463: else { ! 464: /* OLE2NOTE: by calling GetBorder, the server can find out the ! 465: ** size of the frame window. it can use this information to ! 466: ** make decisions about how to orient/organize it tools (eg. ! 467: ** if window is taller than wide put tools vertically at ! 468: ** left edge). ! 469: */ ! 470: OLEDBG_BEGIN2("IOleInPlaceFrame::GetBorder called\r\n") ! 471: hrErr = lpTopIPFrame->lpVtbl->GetBorder( ! 472: lpTopIPFrame, ! 473: (LPRECT)&rectBorder ! 474: ); ! 475: OLEDBG_END2 ! 476: } ! 477: ! 478: /* Try SetBorderSpace() with the space that you need. If it fails then ! 479: ** you can negotiate for space and then do the SetBorderSpace(). ! 480: */ ! 481: FrameTools_GetRequiredBorderSpace(lpft,(LPBORDERWIDTHS)&borderwidths); ! 482: OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace called\r\n") ! 483: hrErr = lpTopIPFrame->lpVtbl->SetBorderSpace( ! 484: lpTopIPFrame, ! 485: (LPCBORDERWIDTHS)&borderwidths ! 486: ); ! 487: OLEDBG_END2 ! 488: ! 489: #if defined( LATER ) ! 490: if (hrErr != NOERROR) { ! 491: /* Frame did not give the toolsspace that we want. So negotiate */ ! 492: ! 493: // REVIEW: try a different placement of the tools here ! 494: ! 495: OLEDBG_BEGIN2("IOleInPlaceFrame::RequestBorderSpace called\r\n") ! 496: hrErr = lpTopIPFrame->lpVtbl->RequestBorderSpace( ! 497: lpTopIPFrame, ! 498: (LPCBORDERWIDTHS)&borderwidths ! 499: ); ! 500: OLEDBG_END2 ! 501: ! 502: if (hrErr == NOERROR) { ! 503: OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace called\r\n") ! 504: hrErr = lpTopIPFrame->lpVtbl->SetBorderSpace( ! 505: lpTopIPFrame, ! 506: (LPCBORDERWIDTHS)&borderwidths ! 507: ); ! 508: OLEDBG_END2 ! 509: } ! 510: } ! 511: #endif ! 512: ! 513: if (hrErr == NOERROR) { ! 514: FrameTools_Move(lpft, (LPRECT)&rectBorder); // we got what we wanted ! 515: } else { ! 516: /* We did not get tool space, so POP them up. ! 517: /* OLE2NOTE: since we are poping up our tools, we MUST inform ! 518: ** the top in-place frame window that we need NO tool space ! 519: ** BUT that it should NOT put its own tools up. if we were ! 520: ** to pass NULL instead of (0,0,0,0), then the container ! 521: ** would have the option to leave its own tools up. ! 522: */ ! 523: OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace(NULL) called\r\n") ! 524: hrErr = lpTopIPFrame->lpVtbl->SetBorderSpace( ! 525: lpTopIPFrame, ! 526: (LPCBORDERWIDTHS)&g_rectNull ! 527: ); ! 528: OLEDBG_END2 ! 529: FrameTools_PopupTools(lpft); ! 530: } ! 531: } ! 532: ! 533: #endif // INPLACE_CNTR || INPLACE_SVR ! 534: ! 535: ! 536: /* ! 537: * FrameTools_GetRequiredBorderSpace ! 538: * ! 539: * Purpose: ! 540: * Calculate the desired space for the toolbar tools. ! 541: * ! 542: * Parameters: ! 543: * lpft FrameTools object ! 544: * lpBorderWidths Widths required at top,bottom,left,right ! 545: * ! 546: * Return Value: ! 547: * nil ! 548: */ ! 549: void FrameTools_GetRequiredBorderSpace(LPFRAMETOOLS lpft, LPBORDERWIDTHS lpBorderWidths) ! 550: { ! 551: *lpBorderWidths = g_rectNull; ! 552: ! 553: switch (lpft->m_ButtonBar.m_nState) { ! 554: case BARSTATE_TOP: ! 555: lpBorderWidths->top += lpft->m_ButtonBar.m_uHeight; ! 556: break; ! 557: ! 558: case BARSTATE_BOTTOM: ! 559: lpBorderWidths->bottom += lpft->m_ButtonBar.m_uHeight; ! 560: break; ! 561: } ! 562: ! 563: switch (lpft->m_FormulaBar.m_nState) { ! 564: case BARSTATE_TOP: ! 565: lpBorderWidths->top += lpft->m_FormulaBar.m_uHeight; ! 566: break; ! 567: ! 568: case BARSTATE_BOTTOM: ! 569: lpBorderWidths->bottom += lpft->m_FormulaBar.m_uHeight; ! 570: break; ! 571: } ! 572: } ! 573: ! 574: ! 575: ! 576: /* ! 577: * FrameTools_UpdateButtons ! 578: * ! 579: * Purpose: ! 580: * Enable/disable individual buttons of the toolbar according to the ! 581: * state of the app ! 582: * ! 583: * Parameters: ! 584: * lpft FrameTools object ! 585: * ! 586: * Return Value: ! 587: * nil ! 588: */ ! 589: void FrameTools_UpdateButtons(LPFRAMETOOLS lpft, LPOUTLINEDOC lpOutlineDoc) ! 590: { ! 591: BOOL fEnable; ! 592: ! 593: #if defined( OLE_VERSION ) ! 594: LPDATAOBJECT lpClipboardDataObj; ! 595: HRESULT hrErr; ! 596: LPOLEAPP lpOleApp = (LPOLEAPP)g_lpApp; ! 597: BOOL bMsgFilterInstalled = (lpOleApp->m_lpMsgFilter != NULL); ! 598: #endif ! 599: ! 600: if (!lpft) ! 601: return; ! 602: ! 603: fEnable = (BOOL)OutlineDoc_GetLineCount(lpOutlineDoc); ! 604: ! 605: if (lpft->m_FormulaBar.m_nState != BARSTATE_HIDE) { ! 606: GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_EDITLINE, fEnable); ! 607: ! 608: if (! lpft->m_fInFormulaBar) { ! 609: GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_ADDLINE, FALSE); ! 610: GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_FB_CANCEL, FALSE); ! 611: GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_EDITLINE, FALSE); ! 612: } else { ! 613: GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_ADDLINE, TRUE); ! 614: GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_FB_CANCEL, TRUE); ! 615: } ! 616: } ! 617: ! 618: if (lpft->m_ButtonBar.m_nState != BARSTATE_HIDE) ! 619: { ! 620: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_CUT, fEnable); ! 621: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_COPY, fEnable); ! 622: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_L_INDENTLINE, fEnable); ! 623: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_L_UNINDENTLINE, fEnable); ! 624: ! 625: #if defined( OLE_SERVER ) ! 626: ! 627: { ! 628: LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc; ! 629: ! 630: #if defined( INPLACE_SVR ) ! 631: fEnable = ((lpServerDoc->m_fUIActive) ? FALSE : TRUE); ! 632: #else ! 633: fEnable = (lpOutlineDoc->m_docInitType != DOCTYPE_EMBEDDED); ! 634: #endif // INPLACE_SVR ! 635: ! 636: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_NEW, fEnable); ! 637: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_OPEN, fEnable); ! 638: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_SAVE, fEnable); ! 639: } ! 640: ! 641: #endif // OLE_SERVER ! 642: ! 643: #if defined( OLE_VERSION ) ! 644: ! 645: /* OLE2NOTE: we do not want to ever give the busy dialog when we ! 646: ** are trying to enable or disable our tool bar buttons eg. ! 647: ** even if the source of data on the clipboard is busy, we do ! 648: ** not want put up the busy dialog. thus we will disable the ! 649: ** dialog and at the end re-enable it. ! 650: */ ! 651: if (bMsgFilterInstalled) ! 652: OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, FALSE); ! 653: ! 654: /* OLE2NOTE: perform OLE specific menu initialization. ! 655: ** the OLE versions use the OleGetClipboard mechanism for ! 656: ** clipboard handling. thus, they determine if the Paste ! 657: ** command should be enabled in an OLE specific manner. ! 658: */ ! 659: fEnable = FALSE; ! 660: hrErr = OleGetClipboard((LPDATAOBJECT FAR*)&lpClipboardDataObj); ! 661: ! 662: if (hrErr == NOERROR) { ! 663: int nFmtEtc; ! 664: ! 665: nFmtEtc = OleStdGetPriorityClipboardFormat( ! 666: lpClipboardDataObj, ! 667: lpOleApp->m_arrPasteEntries, ! 668: lpOleApp->m_nPasteEntries ! 669: ); ! 670: ! 671: fEnable = (nFmtEtc >= 0); // there IS a format we like ! 672: ! 673: OleStdRelease((LPUNKNOWN)lpClipboardDataObj); ! 674: } ! 675: ! 676: // re-enable the busy dialog ! 677: if (bMsgFilterInstalled) ! 678: OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, TRUE); ! 679: ! 680: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, fEnable); ! 681: ! 682: #else ! 683: ! 684: // Base Outline version uses standard Windows clipboard handling ! 685: if(IsClipboardFormatAvailable(g_lpApp->m_cfOutline) || ! 686: IsClipboardFormatAvailable(CF_TEXT)) ! 687: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, TRUE); ! 688: else ! 689: GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, FALSE); ! 690: ! 691: #endif // OLE_VERSION ! 692: ! 693: } ! 694: } ! 695: ! 696: /* ! 697: * FrameTools_FB_SetEditText ! 698: * ! 699: * Purpose: ! 700: * Set text in the edit control in FormulaBar ! 701: * ! 702: * Parameters: ! 703: * lpft FrameTools object ! 704: * lpsz pointer to string to be set ! 705: * ! 706: * Return Value: ! 707: * nil ! 708: */ ! 709: void FrameTools_FB_SetEditText(LPFRAMETOOLS lpft, LPSTR lpsz) ! 710: { ! 711: GBGizmoTextSet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, lpsz); ! 712: } ! 713: ! 714: ! 715: /* ! 716: * FrameTools_FB_GetEditText ! 717: * ! 718: * Purpose: ! 719: * Get text from the edit control in FormulaBar ! 720: * ! 721: * Parameters: ! 722: * lpft FrameTools object ! 723: * lpsz pointer to buffer to receive the text ! 724: * cch buffer size ! 725: * ! 726: * Return Value: ! 727: * nil ! 728: */ ! 729: void FrameTools_FB_GetEditText(LPFRAMETOOLS lpft, LPSTR lpsz, UINT cch) ! 730: { ! 731: GBGizmoTextGet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, lpsz, cch); ! 732: } ! 733: ! 734: ! 735: /* ! 736: * FrameTools_FB_FocusEdit ! 737: * ! 738: * Purpose: ! 739: * Set the focus in the edit control of FormulaBar ! 740: * ! 741: * Parameters: ! 742: * lpft FrameTools object ! 743: * ! 744: * Return Value: ! 745: * nil ! 746: */ ! 747: void FrameTools_FB_FocusEdit(LPFRAMETOOLS lpft) ! 748: { ! 749: GBGizmoFocusSet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT); ! 750: ! 751: // select the whole text in the edit control ! 752: GBGizmoSendMessage(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, EM_SETSEL, ! 753: (WPARAM)TRUE, MAKELPARAM(0, -1)); ! 754: } ! 755: ! 756: ! 757: /* ! 758: * FrameTools_FB_SendMessage ! 759: * ! 760: * Purpose: ! 761: * Send a message to the FormulaBar window gizmo ! 762: * ! 763: * Parameters: ! 764: * lpft FrameTools object ! 765: * uID gizmo ID ! 766: * msg ! 767: * wParam ! 768: * lParam ! 769: * ! 770: * Return Value: ! 771: * nil ! 772: */ ! 773: void FrameTools_FB_SendMessage(LPFRAMETOOLS lpft, UINT uID, UINT msg, WPARAM wParam, LPARAM lParam) ! 774: { ! 775: GBGizmoSendMessage(lpft->m_FormulaBar.m_hWnd, uID, msg, wParam, lParam); ! 776: } ! 777: ! 778: ! 779: /* ! 780: * FrameTools_FB_ForceRedraw ! 781: * ! 782: * Purpose: ! 783: * Force the toolbar to draw itself ! 784: * ! 785: * Parameters: ! 786: * lpft FrameTools object ! 787: * ! 788: * Return Value: ! 789: * nil ! 790: */ ! 791: void FrameTools_ForceRedraw(LPFRAMETOOLS lpft) ! 792: { ! 793: InvalidateRect(lpft->m_ButtonBar.m_hWnd, NULL, TRUE); ! 794: InvalidateRect(lpft->m_FormulaBar.m_hWnd, NULL, TRUE); ! 795: InvalidateRect(lpft->m_hWndPopupPalette, NULL, TRUE); ! 796: } ! 797: ! 798: ! 799: /* ! 800: * FrameTools_BB_SetState ! 801: * ! 802: * Purpose: ! 803: * Set display state of ButtonBar ! 804: * ! 805: * Parameters: ! 806: * lpft FrameTools object ! 807: * nState new display state ! 808: * ! 809: * Return Value: ! 810: * nil ! 811: */ ! 812: void FrameTools_BB_SetState(LPFRAMETOOLS lpft, int nState) ! 813: { ! 814: if (!lpft) { ! 815: return; ! 816: } ! 817: ! 818: lpft->m_ButtonBar.m_nState = nState; ! 819: ! 820: if (nState == BARSTATE_POPUP) ! 821: SetParent(lpft->m_ButtonBar.m_hWnd, lpft->m_hWndPopupPalette); ! 822: else ! 823: SetParent(lpft->m_ButtonBar.m_hWnd, lpft->m_hWndApp); ! 824: } ! 825: ! 826: ! 827: /* ! 828: * FrameTools_BB_GetState ! 829: * ! 830: * Purpose: ! 831: * Get display state of ButtonBar ! 832: * ! 833: * Parameters: ! 834: * lpft FrameTools object ! 835: * ! 836: * Return Value: ! 837: * nState current display state ! 838: */ ! 839: int FrameTools_BB_GetState(LPFRAMETOOLS lpft) ! 840: { ! 841: return lpft->m_ButtonBar.m_nState; ! 842: } ! 843: ! 844: ! 845: /* ! 846: * FrameTools_FB_SetState ! 847: * ! 848: * Purpose: ! 849: * Set display state of FormulaBar ! 850: * ! 851: * Parameters: ! 852: * lpft FrameTools object ! 853: * nState new display state ! 854: * ! 855: * Return Value: ! 856: 4 * nil ! 857: */ ! 858: void FrameTools_FB_SetState(LPFRAMETOOLS lpft, int nState) ! 859: { ! 860: if (!lpft) { ! 861: return; ! 862: } ! 863: ! 864: lpft->m_FormulaBar.m_nState = nState; ! 865: ! 866: if (nState == BARSTATE_POPUP) ! 867: SetParent(lpft->m_FormulaBar.m_hWnd, lpft->m_hWndPopupPalette); ! 868: ! 869: #if defined( INPLACE_SVR ) ! 870: /* OLE2NOTE: it is dangerous for an in-place server to hide its ! 871: ** toolbar window and leave it parented to the hWndFrame of the ! 872: ** in-place container. if the in-place container call ! 873: ** ShowOwnedPopups, then it could inadvertantly be made visible. ! 874: ** to avoid this we will parent the toolbar window back to our ! 875: ** own application main window. if we are not in-place active ! 876: ** then this is the same as lpft->m_hWndApp. ! 877: */ ! 878: else if (nState == BARSTATE_HIDE) ! 879: SetParent(lpft->m_FormulaBar.m_hWnd, g_lpApp->m_hWndApp); ! 880: #endif ! 881: ! 882: else ! 883: SetParent(lpft->m_FormulaBar.m_hWnd, lpft->m_hWndApp); ! 884: } ! 885: ! 886: ! 887: /* ! 888: * FrameTools_FB_GetState ! 889: * ! 890: * Purpose: ! 891: * Get display state of FormulaBar ! 892: * ! 893: * Parameters: ! 894: * lpft FrameTools object ! 895: * ! 896: * Return Value: ! 897: * nState current display state ! 898: */ ! 899: int FrameTools_FB_GetState(LPFRAMETOOLS lpft) ! 900: { ! 901: return lpft->m_FormulaBar.m_nState; ! 902: } ! 903: ! 904: ! 905: /* ! 906: * FrameToolsWndProc ! 907: * ! 908: * Purpose: ! 909: * WndProc for toolbar window ! 910: * ! 911: * Parameters: ! 912: * hWnd ! 913: * Message ! 914: * wParam ! 915: * lParam ! 916: * ! 917: * Return Value: ! 918: * message dependent ! 919: */ ! 920: LRESULT FAR PASCAL FrameToolsWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) ! 921: { ! 922: LPFRAMETOOLS lpft = (LPFRAMETOOLS)GetWindowLong(hWnd, 0); ! 923: ! 924: switch (Message) { ! 925: ! 926: case WM_MOUSEACTIVATE: ! 927: return MA_NOACTIVATE; ! 928: ! 929: default: ! 930: return DefWindowProc(hWnd, Message, wParam, lParam); ! 931: } ! 932: ! 933: return 0L; ! 934: } ! 935: ! 936: ! 937: /* ! 938: * Bar_Move ! 939: * ! 940: * Purpose: ! 941: * Resize and reposition a bar ! 942: * ! 943: * Parameters: ! 944: * lpbar Bar object ! 945: * lprcClient pointer to Client rect ! 946: * lprcPopup pointer to Popup rect ! 947: * ! 948: * Return Value: ! 949: * nil ! 950: */ ! 951: static void Bar_Move(LPBAR lpbar, LPRECT lprcClient, LPRECT lprcPopup) ! 952: { ! 953: if (lpbar->m_nState == BARSTATE_HIDE) { ! 954: ShowWindow(lpbar->m_hWnd, SW_HIDE); ! 955: } ! 956: else { ! 957: ShowWindow(lpbar->m_hWnd, SW_SHOW); ! 958: switch (lpbar->m_nState) { ! 959: case BARSTATE_POPUP: ! 960: MoveWindow(lpbar->m_hWnd, lprcPopup->left, lprcPopup->top, ! 961: lprcPopup->right - lprcPopup->left, lpbar->m_uHeight, ! 962: TRUE); ! 963: lprcPopup->top += lpbar->m_uHeight; ! 964: break; ! 965: ! 966: case BARSTATE_TOP: ! 967: MoveWindow(lpbar->m_hWnd, lprcClient->left, lprcClient->top, ! 968: lprcClient->right - lprcClient->left, ! 969: lpbar->m_uHeight, TRUE); ! 970: lprcClient->top += lpbar->m_uHeight; ! 971: break; ! 972: ! 973: case BARSTATE_BOTTOM: ! 974: MoveWindow(lpbar->m_hWnd, lprcClient->left, ! 975: lprcClient->bottom - lpbar->m_uHeight, ! 976: lprcClient->right - lprcClient->left, ! 977: lpbar->m_uHeight, TRUE); ! 978: lprcClient->bottom -= lpbar->m_uHeight; ! 979: break; ! 980: } ! 981: } ! 982: } ! 983: ! 984: ! 985: /* ! 986: * FB_ResizeEdit ! 987: * ! 988: * Purpose: ! 989: * Resize the edit control in FormulaBar ! 990: * ! 991: * Parameters: ! 992: * lpft Bar object ! 993: * ! 994: * Return Value: ! 995: * nil ! 996: */ ! 997: static void FB_ResizeEdit(LPBAR lpbar) ! 998: { ! 999: RECT rcClient; ! 1000: RECT rcEdit; ! 1001: HWND hwndEdit; ! 1002: ! 1003: GetClientRect(lpbar->m_hWnd, (LPRECT)&rcClient); ! 1004: hwndEdit = GetDlgItem(lpbar->m_hWnd, IDM_FB_EDIT); ! 1005: GetWindowRect(hwndEdit, (LPRECT)&rcEdit); ! 1006: ScreenToClient(lpbar->m_hWnd, (LPPOINT)&rcEdit.left); ! 1007: ScreenToClient(lpbar->m_hWnd, (LPPOINT)&rcEdit.right); ! 1008: ! 1009: SetWindowPos(hwndEdit, NULL, 0, 0, rcClient.right - rcEdit.left - SPACE, ! 1010: rcEdit.bottom - rcEdit.top, SWP_NOMOVE | SWP_NOZORDER); ! 1011: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.