/************************************************************/
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
/************************************************************/
/* clipdisp.c -- Clipboard display routines */
/* This module only gets called in when the clipboard view window is up */
#define NOVIRTUALKEYCODES
#define NOWINSTYLES
#define NOGDICAPMASKS
#define NOSYSMETRICS
#define NOMENUS
#define NOCTLMGR
#include "windows.h"
#include "mw.h"
#include "docdefs.h"
#include "cmddefs.h"
#include "str.h"
#include "propdefs.h"
#include "editdefs.h"
#include "winddefs.h"
#include "dispdefs.h"
#include "wwdefs.h"
#if defined(OLE)
#include "obj.h"
#endif
#define SCRIBBLE
#include "debug.h"
extern int docCur; /* Document in current ww */
extern int docScrap;
extern struct WWD rgwwd [];
int NEAR FGetClipboardDC( void );
int NEAR SetupClipboardDC( void );
int NEAR ReleaseClipboardDC( void );
MdocPaintClipboard( hWnd, hPS )
HWND hWnd;
HANDLE hPS;
{ /* Paint portion of clipboard window indicated by hPS */
LPPAINTSTRUCT lpps;
if (wwClipboard == wwNil)
return;
/* Must set the scroll bar range each time we get a PAINT message;
CLIPBRD.EXE resets it when it gets WM_DRAWCLIPBOARD */
SetScrollRange( wwdClipboard.wwptr, SB_VERT, 0, drMax-1, FALSE );
SetScrollRange( wwdClipboard.wwptr, SB_HORZ, 0, xpRightLim, FALSE );
if ( (lpps = (LPPAINTSTRUCT)GlobalLock( hPS )) != NULL )
{ /* Paint the clipboard */
wwdClipboard.hDC = lpps->hdc;
SetupClipboardDC();
NewCurWw( wwClipboard, TRUE );
InvalBand( &wwdClipboard, lpps->rcPaint.top, lpps->rcPaint.bottom - 1 );
UpdateWw( wwClipboard, FALSE );
NewCurWw( wwDocument, TRUE );
GlobalUnlock( hPS );
}
/* Since the DC is no longer good, we'll set it to NULL */
wwdClipboard.hDC = NULL;
#if 0
#if defined(OLE)
/* gotta delete objects loaded from scrap document */
ObjEnumInDoc(docScrap,ObjDeleteObjectInDoc);
#endif
#endif
}
MdocSizeClipboard( hWnd, hRC )
HWND hWnd;
HANDLE hRC;
{ /* Set clipboard window to be the rect in hRC */
/* If rectangle is 0 units high or wide, this means we're losing the
necessity for display until the next size message */
LPRECT lprc;
int dypRect;
if ( (lprc = (LPRECT)GlobalLock( hRC )) == NULL )
return;
if ( (dypRect = lprc->bottom - lprc->top) <= 0 )
{ /* NULL rect, means lose display until we get a nonnull size */
if (wwClipboard != wwNil)
FreeWw( wwClipboard );
}
else if ( (wwClipboard != wwNil) ||
((wwClipboard=WwAlloc( hWnd, docScrap )) != wwNil))
{ /* Have WWD entry for clipboard, set its size */
wwdClipboard.wwptr = hWnd; /* Just in case clipboard
was closed, then re-opened */
wwdClipboard.xpMin = lprc->left;
wwdClipboard.xpMac = lprc->right;
wwdClipboard.ypMin = lprc->top;
wwdClipboard.ypMac = lprc->bottom;
#ifdef WIN30
SetScrollPos(hWnd, SB_HORZ, 0, TRUE); /* suggested by sankar */
#endif
}
GlobalUnlock( hRC );
}
MdocVScrollClipboard( hWnd, sbMessage, wNewThumb )
HWND hWnd;
int sbMessage;
int wNewThumb;
{
if ( hWnd != wwdClipboard.wwptr || wwClipboard == wwNil)
{
Assert( FALSE );
return;
}
if (!FGetClipboardDC())
/* Unable to create clipboard device context */
return;
NewCurWw( wwClipboard, TRUE );
switch ( sbMessage )
{
case SB_THUMBPOSITION:
{
extern typeCP cpMacCur;
DirtyCache( wwdClipboard.cpFirst = (cpMacCur - wwdClipboard.cpMin) *
wNewThumb / (drMax - 1) + wwdClipboard.cpMin);
wwdClipboard.ichCpFirst = 0;
wwdClipboard.fCpBad = TRUE;
TrashWw( wwClipboard );
break;
}
case SB_LINEUP:
ScrollUpCtr( 1 );
break;
case SB_LINEDOWN:
ScrollDownCtr( 1 );
break;
case SB_PAGEUP:
ScrollUpDypWw();
break;
case SB_PAGEDOWN:
ScrollDownCtr( 100 ); /* 100 > tr's in a page */
break;
}
UpdateWw( wwClipboard, FALSE );
NewCurWw( wwDocument, TRUE ); /* Frees the memory DC */
ReleaseClipboardDC();
}
MdocHScrollClipboard( hWnd, sbMessage, wNewThumb )
HWND hWnd;
int sbMessage;
int wNewThumb;
{
if ( hWnd != wwdClipboard.wwptr || wwClipboard == wwNil)
{
Assert( FALSE );
return;
}
if (!FGetClipboardDC())
/* Unable to create clipboard device context */
return;
NewCurWw( wwClipboard, TRUE );
switch (sbMessage)
{
case SB_LINEUP: /* line left */
ScrollRight(xpMinScroll);
break;
case SB_LINEDOWN: /* line right */
ScrollLeft(xpMinScroll);
break;
case SB_PAGEUP: /* page left */
ScrollRight(wwdClipboard.xpMac - xpSelBar);
break;
case SB_PAGEDOWN: /* page right */
ScrollLeft(wwdClipboard.xpMac - xpSelBar);
break;
case SB_THUMBPOSITION:
/* position to posNew */
AdjWwHoriz( wNewThumb - wwdClipboard.xpMin );
break;
}
UpdateWw( wwClipboard, FALSE );
NewCurWw( wwDocument, TRUE ); /* Frees the memory DC */
ReleaseClipboardDC();
}
MdocAskCBFormatName( lpchName, cchNameMax )
LPCH lpchName;
int cchNameMax;
{ /* Copy the format name for the current contents of the clipboard
(of which we are the owner) to lpchName, copying no more than
cchNameMax characters */
extern int vfOwnClipboard;
extern int vfScrapIsPic;
extern CHAR szWRITEText[];
int cchCopy;
Assert( vfOwnClipboard );
/* Don't give a format name for pictures; the name is covered by the
standard types */
if (!vfScrapIsPic)
{
if ( (cchCopy=CchSz( szWRITEText )) > cchNameMax )
{
lpchName[ cchCopy = cchNameMax - 1 ] = '\0';
}
bltbx( (LPSTR)szWRITEText, (LPSTR)lpchName, cchCopy );
}
}
int NEAR FGetClipboardDC()
{ /* Get a DC for the clipboard window. Leave it in rgwwd [wwClipboard].
Call SetupClipboardDC to set up proper colors */
if ((wwdClipboard.hDC = GetDC( wwdClipboard.wwptr )) == NULL )
return FALSE;
SetupClipboardDC();
return TRUE;
}
int NEAR SetupClipboardDC()
{ /* Select in the background brush for appropriate color behavior. */
extern long rgbBkgrnd;
extern long rgbText;
extern HBRUSH hbrBkgrnd;
SelectObject( wwdClipboard.hDC, hbrBkgrnd );
SetBkColor( wwdClipboard.hDC, rgbBkgrnd );
SetTextColor( wwdClipboard.hDC, rgbText );
}
int NEAR ReleaseClipboardDC()
{
ReleaseDC( wwdClipboard.wwptr, wwdClipboard.hDC );
wwdClipboard.hDC = NULL; /* Mark clipboard DC as invalid */
}