/************************************************************/ /* 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 */ }