|
|
/*************************************************************************
** ** OLE 2 Server Sample Code ** ** frametls.c ** ** This file contains all FrameTools methods and related support ** functions. The FrameTools object is an encapsulation of the apps ** formula bar and button bar. ** ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved ** *************************************************************************/
#include "outline.h"
OLEDBGDATA
/* private function prototype */ static void Bar_Move(LPBAR lpbar, LPRECT lprcClient, LPRECT lprcPopup); static void FB_ResizeEdit(LPBAR lpbar);
extern LPOUTLINEAPP g_lpApp; extern RECT g_rectNull;
/*
* FrameToolsRegisterClass * * Purpose: * Register the popup toolbar window class * * Parameters: * hInst Process instance * * Return Value: * TRUE if successful * FALSE if failed * */ BOOL FrameToolsRegisterClass(HINSTANCE hInst) { WNDCLASS wc;
// Register Tool Palette Class
wc.style = CS_BYTEALIGNWINDOW; wc.lpfnWndProc = FrameToolsWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 4; wc.hInstance = hInst; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = CLASS_PALETTE;
if (!RegisterClass(&wc)) return FALSE; else return TRUE; }
static BOOL FrameTools_CreatePopupPalette(LPFRAMETOOLS lpft, HWND hWndFrame) { if (lpft->m_hWndPopupPalette) DestroyWindow(lpft->m_hWndPopupPalette);
lpft->m_hWndPopupPalette = CreateWindow( CLASS_PALETTE, "Tool Palette", WS_POPUP | WS_CAPTION | WS_CLIPCHILDREN, CW_USEDEFAULT, 0, 0, 0, hWndFrame, (HMENU)NULL, g_lpApp->m_hInst, 0L );
if (!lpft->m_hWndPopupPalette) return FALSE;
SetWindowLong(lpft->m_hWndPopupPalette, 0, (LONG)lpft); return TRUE; }
/*
* FrameTools_Init * * Purpose: * Init and create the toolbar * * Parameters: * lpft FrameTools object * hWndParent The window which owns the toolbar * hInst Process instance * * Return Value: * TRUE if successful * FALSE if failed * */ BOOL FrameTools_Init(LPFRAMETOOLS lpft, HWND hWndParent, HINSTANCE hInst) { RECT rc; UINT uPos; UINT dx; UINT dy;
if (!lpft || !hWndParent || !hInst) return FALSE;
//Get BTTNCUR's display information
UIToolConfigureForDisplay(&lpft->m_tdd);
dx=lpft->m_tdd.cxButton; dy=lpft->m_tdd.cyButton;
// 15 is calculated from the total number of buttons and separators
lpft->m_uPopupWidth = dx * 15;
lpft->m_hWndApp = hWndParent; lpft->m_ButtonBar.m_nState = BARSTATE_TOP; lpft->m_FormulaBar.m_nState = BARSTATE_TOP; lpft->m_fInFormulaBar = FALSE;
lpft->m_fToolsDisabled = FALSE;
lpft->m_ButtonBar.m_uHeight = lpft->m_tdd.cyBar; lpft->m_FormulaBar.m_uHeight = lpft->m_tdd.cyBar;
//Get our image bitmaps for the display type we're on
if (72 == lpft->m_tdd.uDPI) lpft->m_hBmp = LoadBitmap(hInst, (LPCSTR)"Image72"); if (96 == lpft->m_tdd.uDPI) lpft->m_hBmp = LoadBitmap(hInst, (LPCSTR)"Image96"); if (120 == lpft->m_tdd.uDPI) lpft->m_hBmp = LoadBitmap(hInst, (LPCSTR)"Image120");
if (!lpft->m_hBmp) return FALSE;
/* Create Popup Tool Palette window */ lpft->m_hWndPopupPalette = NULL; if (! FrameTools_CreatePopupPalette(lpft, hWndParent)) return FALSE;
uPos = 0; //Create the GizmoBar and the client area window
GetClientRect(hWndParent, &rc); lpft->m_ButtonBar.m_hWnd = CreateWindow( CLASS_GIZMOBAR, "ButtonBar", WS_CHILD | WS_VISIBLE, 0, 0, rc.right-rc.left, lpft->m_tdd.cyBar, hWndParent, (HMENU)IDC_GIZMOBAR, hInst, 0L );
if (!lpft->m_ButtonBar.m_hWnd) return FALSE;
SendMessage(lpft->m_ButtonBar.m_hWnd, WM_SETREDRAW, FALSE, 0L);
//File new, open, save, print
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_NEW, dx, dy, NULL, NULL, TOOLIMAGE_FILENEW, GIZMO_NORMAL); GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_OPEN, dx, dy, NULL, NULL, TOOLIMAGE_FILEOPEN, GIZMO_NORMAL); GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_SAVE, dx, dy, NULL, NULL, TOOLIMAGE_FILESAVE, GIZMO_NORMAL); GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_F_PRINT, dx, dy, NULL, NULL, TOOLIMAGE_FILEPRINT, GIZMO_NORMAL);
// separator
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL);
// Edit cut, copy, paste
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_E_CUT, dx, dy, NULL, NULL, TOOLIMAGE_EDITCUT, GIZMO_NORMAL); GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_E_COPY, dx, dy, NULL, NULL, TOOLIMAGE_EDITCOPY, GIZMO_NORMAL); GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_E_PASTE, dx, dy, NULL, NULL, TOOLIMAGE_EDITPASTE, GIZMO_NORMAL);
// separator
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL);
// Line indent, unindent
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_UNINDENTLINE, dx, dy, NULL, lpft->m_hBmp, IDB_UNINDENTLINE, GIZMO_NORMAL); GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_INDENTLINE, dx, dy, NULL, lpft->m_hBmp, IDB_INDENTLINE, GIZMO_NORMAL);
// separator
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL);
// Help
GBGizmoAdd(lpft->m_ButtonBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_H_ABOUT, dx, dy, NULL, NULL, TOOLIMAGE_HELP, GIZMO_NORMAL);
SendMessage(lpft->m_ButtonBar.m_hWnd, WM_SETREDRAW, TRUE, 0L);
uPos = 0; lpft->m_FormulaBar.m_hWnd = CreateWindow( CLASS_GIZMOBAR, "FormulaBar", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0, lpft->m_tdd.cyBar, rc.right-rc.left, lpft->m_tdd.cyBar, hWndParent, (HMENU)IDC_FORMULABAR, hInst, 0L );
if (!lpft->m_FormulaBar.m_hWnd) return FALSE;
SendMessage(lpft->m_FormulaBar.m_hWnd, WM_SETREDRAW, FALSE, 0L);
// Line add line
GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_ADDLINE, dx, dy, NULL, lpft->m_hBmp, IDB_ADDLINE, GIZMO_NORMAL);
// separator
GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL);
// Line edit line, Cancel
GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_L_EDITLINE, dx, dy, NULL, lpft->m_hBmp, IDB_EDITLINE, GIZMO_NORMAL); GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_BUTTONCOMMAND, uPos++, IDM_FB_CANCEL, dx, dy, NULL, lpft->m_hBmp, IDB_CANCEL, GIZMO_NORMAL);
// separator
GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_SEPARATOR, uPos++, 0, dx/2, dy, NULL, NULL, 0, GIZMO_NORMAL);
// Edit control for line input
GBGizmoAdd(lpft->m_FormulaBar.m_hWnd, GIZMOTYPE_EDIT, uPos++, IDM_FB_EDIT, dx*10, lpft->m_tdd.cyBar-5, NULL, NULL, 0, GIZMO_NORMAL);
SendMessage(lpft->m_FormulaBar.m_hWnd, WM_SETREDRAW, TRUE, 0L);
// Limit the text lenght of edit control
GBGizmoSendMessage(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, EM_LIMITTEXT, (WPARAM)MAXSTRLEN, 0L);
//Set the GizmoBar's associate to be this client window
GBHwndAssociateSet(lpft->m_ButtonBar.m_hWnd, hWndParent);
//Set the FormulaBar's associate to be this client window
GBHwndAssociateSet(lpft->m_FormulaBar.m_hWnd, hWndParent);
return TRUE; }
void FrameTools_AttachToFrame(LPFRAMETOOLS lpft, HWND hWndFrame) { if (! lpft) return;
if (hWndFrame == NULL) hWndFrame = OutlineApp_GetFrameWindow((LPOUTLINEAPP)g_lpApp);
if (lpft->m_hWndApp == hWndFrame) return; // already have this parent frame
lpft->m_hWndApp = hWndFrame;
/* parent the tool bars to the frame so we can safely
** destroy/recreate the palette window. */ SetParent(lpft->m_ButtonBar.m_hWnd, hWndFrame); SetParent(lpft->m_FormulaBar.m_hWnd, hWndFrame);
// recreate popup palette so that it is owned by the hWndFrame
FrameTools_CreatePopupPalette(lpft, hWndFrame);
// restore the correct parent for the tool bars
FrameTools_BB_SetState(lpft, lpft->m_ButtonBar.m_nState); FrameTools_FB_SetState(lpft, lpft->m_FormulaBar.m_nState); }
void FrameTools_AssociateDoc(LPFRAMETOOLS lpft, LPOUTLINEDOC lpOutlineDoc) { HWND hWnd = OutlineDoc_GetWindow(lpOutlineDoc);
if (! lpft) return;
// if no Doc is given, then associate with the App's frame window.
if (lpOutlineDoc) hWnd = OutlineDoc_GetWindow(lpOutlineDoc); else hWnd = OutlineApp_GetWindow((LPOUTLINEAPP)g_lpApp);
//Set the GizmoBar's associate to be this client window
GBHwndAssociateSet(lpft->m_ButtonBar.m_hWnd, hWnd);
//Set the FormulaBar's associate to be this client window
GBHwndAssociateSet(lpft->m_FormulaBar.m_hWnd, hWnd); }
/*
* FrameTools_Destroy * * Purpose: * Destroy the toolbar * * Parameters: * lpft FrameTools object * * Return Value: * nil */ void FrameTools_Destroy(LPFRAMETOOLS lpft) { if (!lpft) return;
if (IsWindow(lpft->m_ButtonBar.m_hWnd)) DestroyWindow(lpft->m_ButtonBar.m_hWnd); if (IsWindow(lpft->m_FormulaBar.m_hWnd)) DestroyWindow(lpft->m_FormulaBar.m_hWnd); if (IsWindow(lpft->m_hWndPopupPalette)) DestroyWindow(lpft->m_hWndPopupPalette);
if (lpft->m_hBmp) DeleteObject(lpft->m_hBmp); }
/*
* FrameTools_Move * * Purpose: * Move and resize the toolbar * * Parameters: * lpft FrameTools object * lprc Pointer to client rectangle * * Return Value: * nil */ void FrameTools_Move(LPFRAMETOOLS lpft, LPRECT lprcClient) { RECT rcPopup; LPRECT lprcPopup = (LPRECT)&rcPopup; int nCmdShow = SW_HIDE;
if (!lpft || lpft->m_fToolsDisabled) return;
lprcPopup->left = 0; lprcPopup->top = 0; lprcPopup->right = lpft->m_uPopupWidth; lprcPopup->bottom = lpft->m_ButtonBar.m_uHeight + lpft->m_FormulaBar.m_uHeight;
switch (lpft->m_ButtonBar.m_nState) { case BARSTATE_HIDE: case BARSTATE_POPUP: case BARSTATE_TOP: Bar_Move(&lpft->m_ButtonBar, lprcClient, lprcPopup); Bar_Move(&lpft->m_FormulaBar, lprcClient, lprcPopup); break;
case BARSTATE_BOTTOM: Bar_Move(&lpft->m_FormulaBar, lprcClient, lprcPopup); Bar_Move(&lpft->m_ButtonBar, lprcClient, lprcPopup); break; }
if (lprcPopup->top) { SetWindowPos(lpft->m_hWndPopupPalette, NULL, 0, 0, lprcPopup->right, lprcPopup->top + GetSystemMetrics(SM_CYCAPTION), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW); } else ShowWindow(lpft->m_hWndPopupPalette, SW_HIDE);
FB_ResizeEdit(&lpft->m_FormulaBar);
InvalidateRect(lpft->m_ButtonBar.m_hWnd, NULL, TRUE); InvalidateRect(lpft->m_FormulaBar.m_hWnd, NULL, TRUE); }
/*
* FrameTools_PopupTools * * Purpose: * Put both formula bar and button bar in Popup Window. * * Parameters: * lpft FrameTools object * * Return Value: * nil */ void FrameTools_PopupTools(LPFRAMETOOLS lpft) { if (! lpft) return;
FrameTools_BB_SetState(lpft, BARSTATE_POPUP); FrameTools_FB_SetState(lpft, BARSTATE_POPUP); FrameTools_Move(lpft, NULL); }
/*
* FrameTools_Enable * * Purpose: * Enable/Disable(hide) all the tools of the toolbar. * this will hide both the buttonbar and the * formulabar independent of whether they are floating or anchored. * * Parameters: * lpft FrameTools object * fEnable * * Return Value: * nil */ void FrameTools_Enable(LPFRAMETOOLS lpft, BOOL fEnable) { lpft->m_fToolsDisabled = !fEnable; if (lpft->m_fToolsDisabled) { ShowWindow(lpft->m_hWndPopupPalette, SW_HIDE); ShowWindow(lpft->m_ButtonBar.m_hWnd, SW_HIDE); ShowWindow(lpft->m_FormulaBar.m_hWnd, SW_HIDE); } }
/*
* FrameTools_EnableWindow * * Purpose: * EnableWindow for all the tools of the toolbar. * this enables/disables mouse and keyboard input to the tools. * while a modal dialog is up, it is inportant to disable the * floating tool windows. * this will NOT hide any windows; it will only call EnableWindow. * * Parameters: * lpft FrameTools object * fEnable * * Return Value: * nil */ void FrameTools_EnableWindow(LPFRAMETOOLS lpft, BOOL fEnable) { EnableWindow(lpft->m_hWndPopupPalette, fEnable); EnableWindow(lpft->m_ButtonBar.m_hWnd, fEnable); EnableWindow(lpft->m_FormulaBar.m_hWnd, fEnable); }
#if defined( INPLACE_CNTR ) || defined( INPLACE_SVR )
/*
* FrameTools_NegotiateForSpaceAndShow * * Purpose: * Negotiate for space for the toolbar tools with the given frame window. * and make them visible. * Negotiation steps: * 1. try to get enough space at top/bottom of window * 2. float the tools as a palette if space not available * * Parameters: * lpft FrameTools object * * Return Value: * none */ void FrameTools_NegotiateForSpaceAndShow( LPFRAMETOOLS lpft, LPRECT lprcFrameRect, LPOLEINPLACEFRAME lpTopIPFrame ) { BORDERWIDTHS borderwidths; RECT rectBorder; HRESULT hrErr;
if (lprcFrameRect) rectBorder = *lprcFrameRect; else { /* OLE2NOTE: by calling GetBorder, the server can find out the
** size of the frame window. it can use this information to ** make decisions about how to orient/organize it tools (eg. ** if window is taller than wide put tools vertically at ** left edge). */ OLEDBG_BEGIN2("IOleInPlaceFrame::GetBorder called\r\n") hrErr = lpTopIPFrame->lpVtbl->GetBorder( lpTopIPFrame, (LPRECT)&rectBorder ); OLEDBG_END2 }
/* Try SetBorderSpace() with the space that you need. If it fails then
** you can negotiate for space and then do the SetBorderSpace(). */ FrameTools_GetRequiredBorderSpace(lpft,(LPBORDERWIDTHS)&borderwidths); OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace called\r\n") hrErr = lpTopIPFrame->lpVtbl->SetBorderSpace( lpTopIPFrame, (LPCBORDERWIDTHS)&borderwidths ); OLEDBG_END2
#if defined( LATER )
if (hrErr != NOERROR) { /* Frame did not give the toolsspace that we want. So negotiate */
// REVIEW: try a different placement of the tools here
OLEDBG_BEGIN2("IOleInPlaceFrame::RequestBorderSpace called\r\n") hrErr = lpTopIPFrame->lpVtbl->RequestBorderSpace( lpTopIPFrame, (LPCBORDERWIDTHS)&borderwidths ); OLEDBG_END2
if (hrErr == NOERROR) { OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace called\r\n") hrErr = lpTopIPFrame->lpVtbl->SetBorderSpace( lpTopIPFrame, (LPCBORDERWIDTHS)&borderwidths ); OLEDBG_END2 } } #endif
if (hrErr == NOERROR) { FrameTools_Move(lpft, (LPRECT)&rectBorder); // we got what we wanted
} else { /* We did not get tool space, so POP them up.
/* OLE2NOTE: since we are poping up our tools, we MUST inform
** the top in-place frame window that we need NO tool space ** BUT that it should NOT put its own tools up. if we were ** to pass NULL instead of (0,0,0,0), then the container ** would have the option to leave its own tools up. */ OLEDBG_BEGIN2("IOleInPlaceFrame::SetBorderSpace(NULL) called\r\n") hrErr = lpTopIPFrame->lpVtbl->SetBorderSpace( lpTopIPFrame, (LPCBORDERWIDTHS)&g_rectNull ); OLEDBG_END2 FrameTools_PopupTools(lpft); } }
#endif // INPLACE_CNTR || INPLACE_SVR
/*
* FrameTools_GetRequiredBorderSpace * * Purpose: * Calculate the desired space for the toolbar tools. * * Parameters: * lpft FrameTools object * lpBorderWidths Widths required at top,bottom,left,right * * Return Value: * nil */ void FrameTools_GetRequiredBorderSpace(LPFRAMETOOLS lpft, LPBORDERWIDTHS lpBorderWidths) { *lpBorderWidths = g_rectNull;
switch (lpft->m_ButtonBar.m_nState) { case BARSTATE_TOP: lpBorderWidths->top += lpft->m_ButtonBar.m_uHeight; break;
case BARSTATE_BOTTOM: lpBorderWidths->bottom += lpft->m_ButtonBar.m_uHeight; break; }
switch (lpft->m_FormulaBar.m_nState) { case BARSTATE_TOP: lpBorderWidths->top += lpft->m_FormulaBar.m_uHeight; break;
case BARSTATE_BOTTOM: lpBorderWidths->bottom += lpft->m_FormulaBar.m_uHeight; break; } }
/*
* FrameTools_UpdateButtons * * Purpose: * Enable/disable individual buttons of the toolbar according to the * state of the app * * Parameters: * lpft FrameTools object * * Return Value: * nil */ void FrameTools_UpdateButtons(LPFRAMETOOLS lpft, LPOUTLINEDOC lpOutlineDoc) { BOOL fEnable;
#if defined( OLE_VERSION )
LPDATAOBJECT lpClipboardDataObj; HRESULT hrErr; LPOLEAPP lpOleApp = (LPOLEAPP)g_lpApp; BOOL fPrevEnable1; BOOL fPrevEnable2; #endif
if (!lpft) return;
#if defined( INPLACE_CNTR )
{ LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOutlineDoc; if (lpContainerDoc->m_lpLastUIActiveLine && lpContainerDoc->m_lpLastUIActiveLine->m_fUIActive) {
/* if there is a UIActive object, then we should disable
** all of our "active editor" commands. we should enable ** only those commands that are "workspace" commands. */ if (lpft->m_FormulaBar.m_nState != BARSTATE_HIDE) {
GBGizmoEnable(lpft->m_FormulaBar.m_hWnd,IDM_L_EDITLINE,FALSE); GBGizmoEnable(lpft->m_FormulaBar.m_hWnd,IDM_L_ADDLINE,FALSE); GBGizmoEnable(lpft->m_FormulaBar.m_hWnd,IDM_FB_CANCEL,FALSE); GBGizmoEnable(lpft->m_FormulaBar.m_hWnd,IDM_L_EDITLINE,FALSE); }
if (lpft->m_ButtonBar.m_nState != BARSTATE_HIDE) { GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_CUT, FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_COPY, FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd,IDM_L_INDENTLINE,FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_L_UNINDENTLINE, FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_H_ABOUT, FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_FB_EDIT, FALSE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_NEW, TRUE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_OPEN, TRUE); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_SAVE, TRUE); } return; } } #endif // INPLACE_CNTR
fEnable = (BOOL)OutlineDoc_GetLineCount(lpOutlineDoc);
if (lpft->m_FormulaBar.m_nState != BARSTATE_HIDE) {
GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_EDITLINE, fEnable);
if (! lpft->m_fInFormulaBar) { GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_ADDLINE, FALSE); GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_FB_CANCEL, FALSE); GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_EDITLINE, FALSE); if (!fEnable) { GBGizmoTextSet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, ""); } } else { GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_L_ADDLINE, TRUE); GBGizmoEnable(lpft->m_FormulaBar.m_hWnd, IDM_FB_CANCEL, TRUE); } }
if (lpft->m_ButtonBar.m_nState != BARSTATE_HIDE) { GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_CUT, fEnable); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_COPY, fEnable); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_L_INDENTLINE, fEnable); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_L_UNINDENTLINE, fEnable);
#if defined( OLE_SERVER )
{ LPSERVERDOC lpServerDoc = (LPSERVERDOC)lpOutlineDoc;
#if defined( INPLACE_SVR )
fEnable = ((lpServerDoc->m_fUIActive) ? FALSE : TRUE); #else
fEnable = (lpOutlineDoc->m_docInitType != DOCTYPE_EMBEDDED); #endif // INPLACE_SVR
GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_NEW, fEnable); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_OPEN, fEnable); GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_F_SAVE, fEnable); }
#endif // OLE_SERVER
#if defined( OLE_VERSION )
/* OLE2NOTE: we do not want to ever give the busy dialog when we
** are trying to enable or disable our tool bar buttons eg. ** even if the source of data on the clipboard is busy, we do ** not want put up the busy dialog. thus we will disable the ** dialog and at the end re-enable it. */ OleApp_DisableBusyDialogs(lpOleApp, &fPrevEnable1, &fPrevEnable2);
/* OLE2NOTE: perform OLE specific menu initialization.
** the OLE versions use the OleGetClipboard mechanism for ** clipboard handling. thus, they determine if the Paste ** command should be enabled in an OLE specific manner. */ fEnable = FALSE; hrErr = OleGetClipboard((LPDATAOBJECT FAR*)&lpClipboardDataObj);
if (hrErr == NOERROR) { int nFmtEtc;
nFmtEtc = OleStdGetPriorityClipboardFormat( lpClipboardDataObj, lpOleApp->m_arrPasteEntries, lpOleApp->m_nPasteEntries );
fEnable = (nFmtEtc >= 0); // there IS a format we like
OleStdRelease((LPUNKNOWN)lpClipboardDataObj); }
// re-enable the busy dialog
OleApp_EnableBusyDialogs(lpOleApp, fPrevEnable1, fPrevEnable2);
GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, fEnable);
#else
// Base Outline version uses standard Windows clipboard handling
if(IsClipboardFormatAvailable(g_lpApp->m_cfOutline) || IsClipboardFormatAvailable(CF_TEXT)) GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, TRUE); else GBGizmoEnable(lpft->m_ButtonBar.m_hWnd, IDM_E_PASTE, FALSE);
#endif // OLE_VERSION
} }
/*
* FrameTools_FB_SetEditText * * Purpose: * Set text in the edit control in FormulaBar * * Parameters: * lpft FrameTools object * lpsz pointer to string to be set * * Return Value: * nil */ void FrameTools_FB_SetEditText(LPFRAMETOOLS lpft, LPSTR lpsz) { GBGizmoTextSet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, lpsz); }
/*
* FrameTools_FB_GetEditText * * Purpose: * Get text from the edit control in FormulaBar * * Parameters: * lpft FrameTools object * lpsz pointer to buffer to receive the text * cch buffer size * * Return Value: * nil */ void FrameTools_FB_GetEditText(LPFRAMETOOLS lpft, LPSTR lpsz, UINT cch) { GBGizmoTextGet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, lpsz, cch); }
/*
* FrameTools_FB_FocusEdit * * Purpose: * Set the focus in the edit control of FormulaBar * * Parameters: * lpft FrameTools object * * Return Value: * nil */ void FrameTools_FB_FocusEdit(LPFRAMETOOLS lpft) { GBGizmoFocusSet(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT);
// select the whole text in the edit control
GBGizmoSendMessage(lpft->m_FormulaBar.m_hWnd, IDM_FB_EDIT, EM_SETSEL, (WPARAM)TRUE, MAKELPARAM(0, -1)); }
/*
* FrameTools_FB_SendMessage * * Purpose: * Send a message to the FormulaBar window gizmo * * Parameters: * lpft FrameTools object * uID gizmo ID * msg * wParam * lParam * * Return Value: * nil */ void FrameTools_FB_SendMessage(LPFRAMETOOLS lpft, UINT uID, UINT msg, WPARAM wParam, LPARAM lParam) { GBGizmoSendMessage(lpft->m_FormulaBar.m_hWnd, uID, msg, wParam, lParam); }
/*
* FrameTools_FB_ForceRedraw * * Purpose: * Force the toolbar to draw itself * * Parameters: * lpft FrameTools object * * Return Value: * nil */ void FrameTools_ForceRedraw(LPFRAMETOOLS lpft) { InvalidateRect(lpft->m_ButtonBar.m_hWnd, NULL, TRUE); InvalidateRect(lpft->m_FormulaBar.m_hWnd, NULL, TRUE); InvalidateRect(lpft->m_hWndPopupPalette, NULL, TRUE); }
/*
* FrameTools_BB_SetState * * Purpose: * Set display state of ButtonBar * * Parameters: * lpft FrameTools object * nState new display state * * Return Value: * nil */ void FrameTools_BB_SetState(LPFRAMETOOLS lpft, int nState) { if (!lpft) { return; }
lpft->m_ButtonBar.m_nState = nState;
if (nState == BARSTATE_POPUP) SetParent(lpft->m_ButtonBar.m_hWnd, lpft->m_hWndPopupPalette); else SetParent(lpft->m_ButtonBar.m_hWnd, lpft->m_hWndApp); }
/*
* FrameTools_BB_GetState * * Purpose: * Get display state of ButtonBar * * Parameters: * lpft FrameTools object * * Return Value: * nState current display state */ int FrameTools_BB_GetState(LPFRAMETOOLS lpft) { return lpft->m_ButtonBar.m_nState; }
/*
* FrameTools_FB_SetState * * Purpose: * Set display state of FormulaBar * * Parameters: * lpft FrameTools object * nState new display state * * Return Value: 4 * nil */ void FrameTools_FB_SetState(LPFRAMETOOLS lpft, int nState) { if (!lpft) { return; }
lpft->m_FormulaBar.m_nState = nState;
if (nState == BARSTATE_POPUP) SetParent(lpft->m_FormulaBar.m_hWnd, lpft->m_hWndPopupPalette);
#if defined( INPLACE_SVR )
/* OLE2NOTE: it is dangerous for an in-place server to hide its
** toolbar window and leave it parented to the hWndFrame of the ** in-place container. if the in-place container call ** ShowOwnedPopups, then it could inadvertantly be made visible. ** to avoid this we will parent the toolbar window back to our ** own application main window. if we are not in-place active ** then this is the same as lpft->m_hWndApp. */ else if (nState == BARSTATE_HIDE) SetParent(lpft->m_FormulaBar.m_hWnd, g_lpApp->m_hWndApp); #endif
else SetParent(lpft->m_FormulaBar.m_hWnd, lpft->m_hWndApp); }
/*
* FrameTools_FB_GetState * * Purpose: * Get display state of FormulaBar * * Parameters: * lpft FrameTools object * * Return Value: * nState current display state */ int FrameTools_FB_GetState(LPFRAMETOOLS lpft) { return lpft->m_FormulaBar.m_nState; }
/*
* FrameToolsWndProc * * Purpose: * WndProc for toolbar window * * Parameters: * hWnd * Message * wParam * lParam * * Return Value: * message dependent */ LRESULT FAR PASCAL FrameToolsWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { LPFRAMETOOLS lpft = (LPFRAMETOOLS)GetWindowLong(hWnd, 0);
switch (Message) {
case WM_MOUSEACTIVATE: return MA_NOACTIVATE;
default: return DefWindowProc(hWnd, Message, wParam, lParam); }
return 0L; }
/*
* Bar_Move * * Purpose: * Resize and reposition a bar * * Parameters: * lpbar Bar object * lprcClient pointer to Client rect * lprcPopup pointer to Popup rect * * Return Value: * nil */ static void Bar_Move(LPBAR lpbar, LPRECT lprcClient, LPRECT lprcPopup) { if (lpbar->m_nState == BARSTATE_HIDE) { ShowWindow(lpbar->m_hWnd, SW_HIDE); } else { ShowWindow(lpbar->m_hWnd, SW_SHOW); switch (lpbar->m_nState) { case BARSTATE_POPUP: MoveWindow(lpbar->m_hWnd, lprcPopup->left, lprcPopup->top, lprcPopup->right - lprcPopup->left, lpbar->m_uHeight, TRUE); lprcPopup->top += lpbar->m_uHeight; break;
case BARSTATE_TOP: MoveWindow(lpbar->m_hWnd, lprcClient->left, lprcClient->top, lprcClient->right - lprcClient->left, lpbar->m_uHeight, TRUE); lprcClient->top += lpbar->m_uHeight; break;
case BARSTATE_BOTTOM: MoveWindow(lpbar->m_hWnd, lprcClient->left, lprcClient->bottom - lpbar->m_uHeight, lprcClient->right - lprcClient->left, lpbar->m_uHeight, TRUE); lprcClient->bottom -= lpbar->m_uHeight; break; } } }
/*
* FB_ResizeEdit * * Purpose: * Resize the edit control in FormulaBar * * Parameters: * lpft Bar object * * Return Value: * nil */ static void FB_ResizeEdit(LPBAR lpbar) { RECT rcClient; RECT rcEdit; HWND hwndEdit;
GetClientRect(lpbar->m_hWnd, (LPRECT)&rcClient); hwndEdit = GetDlgItem(lpbar->m_hWnd, IDM_FB_EDIT); GetWindowRect(hwndEdit, (LPRECT)&rcEdit); ScreenToClient(lpbar->m_hWnd, (LPPOINT)&rcEdit.left); ScreenToClient(lpbar->m_hWnd, (LPPOINT)&rcEdit.right);
SetWindowPos(hwndEdit, NULL, 0, 0, rcClient.right - rcEdit.left - SPACE, rcEdit.bottom - rcEdit.top, SWP_NOMOVE | SWP_NOZORDER); }
|