windows-nt/Source/XPSP1/NT/windows/richedit/re30/win2mac.cpp
2020-09-26 16:20:57 +08:00

514 lines
14 KiB
C++

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: win2mac.cpp
//
// Contents: All functions that are not implemented for the Macintosh
// Stubs are coded so that we can link cleanly.
//
//----------------------------------------------------------------------------
#ifndef PEGASUS
#include "_common.h"
#include <mbstring.h>
#include "stdio.h"
#if defined(MACPORT) && defined(UNICODE)
#include <macname1.h>
#include <quickdraw.h>
#include <macname2.h>
AssertData
//----------------------------------------------------------------------------
//
// Mac wrapper functions
//
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//
// Function: MacCLSIDFromProgID
//
//----------------------------------------------------------------------------
#undef CLSIDFromProgID
STDAPI MacCLSIDFromProgID (LPCWSTR lpszProgID, LPCLSID lpclsid)
{
CStrIn str(lpszProgID);
return CLSIDFromProgID((LPOLESTR)str, lpclsid);
}
//----------------------------------------------------------------------------
//
// Function: MacCoTaskMemAlloc
//
//----------------------------------------------------------------------------
STDAPI_(LPVOID) MacCoTaskMemAlloc(ULONG cb)
{
IMalloc *pIMalloc = NULL;
HRESULT hr;
HGLOBAL pMem = NULL;
hr = CoGetMalloc ( MEMCTX_TASK, &pIMalloc);
if (hr)
{
goto Cleanup;
}
pMem = pIMalloc->Alloc(cb);
Cleanup:
if( pIMalloc )
pIMalloc->Release();
return (LPVOID)pMem;
}
//----------------------------------------------------------------------------
//
// Function: MacCoTaskMemFree
//
//----------------------------------------------------------------------------
STDAPI_(void) MacCoTaskMemFree(LPVOID pv)
{
IMalloc *pIMalloc = NULL;
HRESULT hr;
HGLOBAL pMem = NULL;
hr = CoGetMalloc ( MEMCTX_TASK, &pIMalloc);
if (hr)
{
goto Cleanup;
}
pIMalloc->Free(pv);
Cleanup:
if( pIMalloc )
pIMalloc->Release();
}
//----------------------------------------------------------------------------
//
// Function: MacCoTaskMemRealloc
//
//----------------------------------------------------------------------------
STDAPI_(LPVOID) MacCoTaskMemRealloc(LPVOID pv, ULONG cb)
{
IMalloc *pIMalloc = NULL;
HRESULT hr;
HGLOBAL pMem = NULL;
hr = CoGetMalloc ( MEMCTX_TASK, &pIMalloc);
if (hr)
{
goto Cleanup;
}
pMem = pIMalloc->Realloc(pv,cb);
Cleanup:
if( pIMalloc )
pIMalloc->Release();
return (LPVOID)pMem;
}
//----------------------------------------------------------------------------
//
// Function: MacGetCurrentObject
//
//----------------------------------------------------------------------------
HGDIOBJ WINAPI MacGetCurrentObject(HDC hdc, // handle of device context
UINT uObjectType) // object-type identifier
{
// GetCurrentObject is not supported under wlm, so we always simulate failure
// by returning NULL
return NULL;
}
//----------------------------------------------------------------------------
// NOTE WELL: GetDoubleClickTime() maps to GetDblTime() in the VC++ 4.0 header
// file MSDEV\MAC\INCLUDE\MACOS\EVENTS.H. The only problem is that
// GetDblTime() returns the count in "Ticks" (1/60th second) and
// we want milliseconds (0.001 sec). This should be fixed when the
// bug in the VC4 header file is fixed. - DAS 1/16/96
//----------------------------------------------------------------------------
UINT MacGetDoubleClickTime()
{
return MulDiv(100,GetDblTime(),6);
}
//----------------------------------------------------------------------------
//
// Function: MacGetMetaFileBitsEx
//
//----------------------------------------------------------------------------
UINT WINAPI MacGetMetaFileBitsEx(HMETAFILE hmf, UINT nSize, LPVOID lpvData )
{
Assert (0 && "GetMetaFileBitsEx is not implemented for Macintosh");
return NULL;
}
//----------------------------------------------------------------------------
//
// Function: MacIsValidCodePage
//
//----------------------------------------------------------------------------
WINBASEAPI BOOL WINAPI MacIsValidCodePage(UINT CodePage)
{
return TRUE;
}
//----------------------------------------------------------------------------
//
// Function: MacOleDraw
//
//----------------------------------------------------------------------------
#undef OleDraw
STDAPI MacOleDraw(
IUnknown * pUnk, //Points to the view object to be drawn
DWORD dwAspect, //Specifies how the object is to be represented
HDC hdcDraw, //Identifies the device context on which to draw
LPCRECT lprcBounds //Specifies the rectangle in which the object is drawn
)
{
Rect rect;
HRESULT ret;
GrafPtr grafptr = CheckoutPort(hdcDraw, CA_NONE);
Assert(grafptr);
rect.top = lprcBounds->top;
rect.bottom = lprcBounds->bottom;
rect.left = lprcBounds->left;
rect.right = lprcBounds->right;
ret = OleDraw(pUnk, dwAspect, grafptr, &rect);
CheckinPort(hdcDraw, CA_ALL);
return ret;
}
//----------------------------------------------------------------------------
//
// Function: MacProgIDFromCLSID
//
//----------------------------------------------------------------------------
#undef ProgIDFromCLSID
STDAPI MacProgIDFromCLSID (REFCLSID clsid, LPWSTR FAR* lplpszProgID)
{
CStrIn str(*lplpszProgID);
return ProgIDFromCLSID(clsid, (LPSTR FAR*)&str);
}
//-------------------------------------------------------------------------
//
// Function: MacRichEditWndProc
//
// Synopsis: This is the Mac WndProc callback function.
//
// Arguments: HWND hwnd,
// UINT msg,
// WPARAM wparam,
// LPARAM lparam
//
// Returns: LRESULT
//
// Notes: The function processes the messages, then often calls
// the normal PC callback function (RichEditANSIWndProc);
//
//
//-------------------------------------------------------------------------
LRESULT CALLBACK MacRichEditWndProc(
HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
TRACEBEGINPARAM(TRCSUBSYSHOST, TRCSCOPEINTERN, "MacRichEditWndProc", msg);
switch( msg )
{
case WM_MACINTOSH:
{
if (LOWORD(wparam) == WLM_SETMENUBAR)
return TRUE; // dont change the menu bar
}
break;
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_LBUTTONDBLCLK:
{
MacSimulateMouseButtons(msg,wparam);
}
break;
case WM_KEYDOWN:
case WM_KEYUP:
{
MacSimulateKey(msg,wparam);
}
break;
case WM_SIZE:
//case WM_SETFOCUS:
//case WM_SYSCOLORCHANGE:
//case WM_MOVE:
//case WM_MACINTOSH:
{
return DefWindowProc(hwnd, msg, wparam, lparam);
}
break;
case WM_CHAR:
{
return RichEditWndProc(hwnd, msg, wparam, lparam);
}
break;
default:
return RichEditANSIWndProc(hwnd, msg, wparam, lparam);
}
return RichEditANSIWndProc(hwnd, msg, wparam, lparam);
}
//----------------------------------------------------------------------------
//
// Function: MacSelectPalette
//
//----------------------------------------------------------------------------
HPALETTE WINAPI MacSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground)
{
if (hpal)
return ::SelectPalette(hdc,hpal,bForceBackground);
else
return NULL;
}
//----------------------------------------------------------------------------
//
// Function: MacportSetCursor
//
//----------------------------------------------------------------------------
HCURSOR MacportSetCursor(HCURSOR hCursor)
{
if (hCursor)
return SetCursor(hCursor);
else
{
ObscureCursor();
return NULL;
}
}
//----------------------------------------------------------------------------
//
// Function: MacSetMetaFileBitsEx
//
//----------------------------------------------------------------------------
HMETAFILE WINAPI MacSetMetaFileBitsEx(UINT nSize,CONST BYTE * lpData )
{
Assert (0 && "SetMetaFileBitsEx is not implemented for Macintosh");
return NULL;
}
//-------------------------------------------------------------------------
//
// Function: MacSimulateKey
//
// Synopsis: Simulates menu enabler keys for the mac
//
// Arguments: [msg]
// [wParam]
//
// Returns: UINT
//
// Notes: The key is changed to accommodate the mac.
//
//
//-------------------------------------------------------------------------
UINT MacSimulateKey (UINT& msg, WPARAM& wParam)
{
BYTE rgbKeyState[256];
GetKeyboardState(rgbKeyState);
if (rgbKeyState[VK_CONTROL])
{
rgbKeyState[VK_CONTROL] = 0;
}
SetKeyboardState(rgbKeyState);
return msg;
}
//-------------------------------------------------------------------------
//
// Function: MacSimulateMouseButtons
//
// Synopsis: Simulates the right and middle mouse Windows buttons.
//
// Arguments: [msg]
// [wParam]
//
// Returns: UINT
//
// Notes: The right mouse is simulated by CTRL (or COMMAND) click. The
// middle mouse is simulated by SHIFT click. Because CTRL is already
// in use the CTRL click is simulated using the OPTION key.
//
// The command key is used the same as the control key because
// WLM likes to pick up the CTRL mouse as a user break. This makes
// debugging the right mouse simulation very difficult.
//
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
typedef struct tagUISim
{
UINT msg;
UINT wParam;
BYTE control; // Value for VK_CONTROL key state
BYTE menu; // Value for VK_MENU key state
} UISim;
//-------------------------------------------------------------------------
UINT MacSimulateMouseButtons (UINT& msg, WPARAM& wParam)
{
BYTE rgbKeyState[256];
WORD stateIndex = 0;
UISim UISim[] = // 8 4 2 1
{ // cmd shift ctrl option
WM_LBUTTONDOWN, MK_LBUTTON, 0x00, 0x00, // - - - -
WM_LBUTTONDOWN, MK_LBUTTON|MK_CONTROL, 0x80, 0x00, // - - - x
WM_RBUTTONDOWN, MK_RBUTTON, 0x00, 0x00, // - - x -
WM_RBUTTONDOWN, MK_RBUTTON|MK_CONTROL, 0x80, 0x00, // - - x x
WM_MBUTTONDOWN, MK_MBUTTON, 0x00, 0x00, // - x - -
WM_MBUTTONDOWN, MK_MBUTTON|MK_CONTROL, 0x80, 0x00, // - x - x
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON, 0x00, 0x00, // - x x -
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON|MK_CONTROL, 0x80, 0x00, // - x x x
WM_LBUTTONDOWN, MK_LBUTTON, 0x00, 0x10, // x - - -
WM_LBUTTONDOWN, MK_LBUTTON|MK_CONTROL, 0x80, 0x10, // x - - x
WM_RBUTTONDOWN, MK_RBUTTON, 0x00, 0x10, // x - x -
WM_RBUTTONDOWN, MK_RBUTTON|MK_CONTROL, 0x80, 0x10, // x - x x
WM_MBUTTONDOWN, MK_MBUTTON, 0x00, 0x10, // x x - -
WM_MBUTTONDOWN, MK_MBUTTON|MK_CONTROL, 0x80, 0x10, // x x - x
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON, 0x00, 0x10, // x x x -
WM_RBUTTONDOWN, MK_RBUTTON|MK_MBUTTON|MK_CONTROL, 0x80, 0x10 // x x x x
};
// Determine which keys were pressed, and clean out the state variables
GetKeyboardState(rgbKeyState);
if (rgbKeyState[VK_OPTION])
{
rgbKeyState[VK_OPTION] = 0; // Clear key state
stateIndex |= 0x01; // Set option key bit in index
}
if (rgbKeyState[VK_CONTROL])
{
rgbKeyState[VK_CONTROL] = 0; // Clear key state
stateIndex |= 0x02; // Set control key bit in index
}
if (rgbKeyState[VK_COMMAND]) // Use command key like control key due to WLM debug issues
{
rgbKeyState[VK_COMMAND] = 0; // Clear key state
stateIndex |= 0x08; // Set command key bit in index
}
if (rgbKeyState[VK_SHIFT])
{
rgbKeyState[VK_SHIFT] = 0; // Clear key state
stateIndex |= 0x04; // Set shift key bit in index
}
// Now set the return values
if (stateIndex) // Only do this is the mouse is being simulated
{
msg = (msg - WM_LBUTTONDOWN) + UISim[stateIndex].msg;
wParam = UISim[stateIndex].wParam;
rgbKeyState[VK_CONTROL] = UISim[stateIndex].control;
rgbKeyState[VK_MENU] = UISim[stateIndex].menu;
SetKeyboardState(rgbKeyState);
}
return msg;
}
//----------------------------------------------------------------------------
//
// Function: MacSysAllocStringLen
//
//----------------------------------------------------------------------------
STDAPI_(BSTR) MacSysAllocStringLen(LPCWSTR lpStringW, UINT lenChars)
{
TRACEBEGIN(TRCSUBSYSWRAP, TRCSCOPEINTERN, "SysAllocStringLenMac");
int lenStrBytes;
LPSTR lpStringMB;
if ((lpStringW) && (*lpStringW != NULL))
{
lenStrBytes = MsoWideCharToMultiByte(CP_ACP,0,lpStringW,lenChars,NULL,NULL,NULL,NULL);
lpStringMB = (LPSTR)CoTaskMemAlloc( lenStrBytes + sizeof(INT) );
memcpy(lpStringMB, &lenStrBytes, sizeof(INT)); //copy BSTR lenghth in integer before BSTR
lpStringMB += sizeof(INT);
MsoWideCharToMultiByte(CP_ACP,0,lpStringW,lenChars,lpStringMB,lenStrBytes,NULL,NULL);
}
else
{
// note that in every case so far used on RichEdit the first parm is NULL
// so no way to determine how big to make the buffer
// therefore making it the lenghth of a unicode buffer - max size it could be for mbcs
lenStrBytes = lenChars*sizeof(WCHAR);
lpStringMB = (LPSTR)CoTaskMemAlloc( lenStrBytes + sizeof(INT) );
// not sure if this should be lenChars or lenStrBytes
// note that lenStrBytes is wchar lenghth - the max length it could be for mbcs
// memcpy(lpStringMB, &lenStrBytes, sizeof(INT)); //copy BSTR lenghth in integer before BSTR
memcpy(lpStringMB, &lenChars, sizeof(INT)); //copy BSTR lenghth in integer before BSTR
lpStringMB += sizeof(INT);
}
return (BSTR)lpStringMB;
}
//----------------------------------------------------------------------------
//
// Function: MacWordSwapLong
//
//----------------------------------------------------------------------------
ULONG MacWordSwapLong ( ULONG ul)
{
WORD w1,w2;
w1 = (WORD)ul;
w2 = (WORD)(ul>>16);
return (((ULONG)w1)<<16) | w2;
}
#endif //MACPORT
#endif