369 lines
10 KiB
C
369 lines
10 KiB
C
|
/************************************************************/
|
|||
|
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
|||
|
/************************************************************/
|
|||
|
|
|||
|
#include "windows.h"
|
|||
|
#include "mw.h"
|
|||
|
#include "winddefs.h"
|
|||
|
#include "obj.h"
|
|||
|
#include "objreg.h"
|
|||
|
#include "str.h"
|
|||
|
|
|||
|
static BOOL GetClipObjectInfo(LPSTR szClass, LPSTR szItem);
|
|||
|
BOOL QueryPasteFromClip(OLEOPT_RENDER lpRender, OLECLIPFORMAT lpFormat);
|
|||
|
BOOL QueryLinkFromClip(OLEOPT_RENDER lpRender, OLECLIPFORMAT lpFormat);
|
|||
|
static int FillListFormat(HWND hwndList, BOOL bObjAvail);
|
|||
|
static WORD GetFormatClip(int i);
|
|||
|
static BOOL IsFormatAvailable(WORD cfFormat);
|
|||
|
|
|||
|
WORD cfObjPasteSpecial;
|
|||
|
BOOL vObjPasteLinkSpecial;
|
|||
|
WORD rgchFormats[5];
|
|||
|
int irgchFormats = 0;
|
|||
|
|
|||
|
void fnObjPasteSpecial(void)
|
|||
|
{
|
|||
|
if (OurDialogBox(hINSTANCE, "PasteSpecial", hMAINWINDOW, lpfnPasteSpecial))
|
|||
|
fnPasteEdit();
|
|||
|
cfObjPasteSpecial = 0; // clear it for next time
|
|||
|
vbObjLinkOnly = vObjPasteLinkSpecial = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
int FAR PASCAL fnPasteSpecial(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
|
|||
|
{
|
|||
|
extern HWND vhWndMsgBoxParent;
|
|||
|
static BOOL bLinkAvail,bObjAvail;
|
|||
|
extern BOOL ferror;
|
|||
|
|
|||
|
switch (message)
|
|||
|
{
|
|||
|
case WM_INITDIALOG:
|
|||
|
{
|
|||
|
char szClassName[KEYNAMESIZE];
|
|||
|
char szItemName[CBPATHMAX];
|
|||
|
int nWhichToSelect;
|
|||
|
|
|||
|
HWND hwndList = GetDlgItem(hDlg,IDD_LISTBOX);
|
|||
|
|
|||
|
szClassName[0] = szItemName[0] = '\0';
|
|||
|
irgchFormats = 0; //always start with 0
|
|||
|
vObjPasteLinkSpecial = vbObjLinkOnly = FALSE;
|
|||
|
|
|||
|
bObjAvail = OleQueryCreateFromClip(PROTOCOL, olerender_draw, 0) == OLE_OK;
|
|||
|
bLinkAvail = OleQueryLinkFromClip(PROTOCOL, olerender_draw, 0) == OLE_OK;
|
|||
|
|
|||
|
if (bObjAvail || bLinkAvail)
|
|||
|
{
|
|||
|
GetClipObjectInfo(szClassName, szItemName);
|
|||
|
SetWindowText(GetDlgItem(hDlg,IDD_CLIPOWNER), szClassName);
|
|||
|
SetWindowText(GetDlgItem(hDlg,IDD_ITEM), szItemName);
|
|||
|
}
|
|||
|
else
|
|||
|
ShowWindow(GetDlgItem(hDlg,IDD_SOURCE), SW_HIDE);
|
|||
|
|
|||
|
if (bObjAvail || bLinkAvail)
|
|||
|
/* then there's an object on clipboard */
|
|||
|
{
|
|||
|
char szListItem[CBMESSAGEMAX]; // hope this is big enough!
|
|||
|
char szTmp[CBMESSAGEMAX];
|
|||
|
|
|||
|
LoadString(hINSTANCE, IDSTRObject, szTmp, sizeof(szTmp));
|
|||
|
wsprintf(szListItem,"%s %s",(LPSTR)szClassName,(LPSTR)szTmp);
|
|||
|
SendMessage(hwndList, LB_INSERTSTRING, irgchFormats, (DWORD)(LPSTR)szListItem);
|
|||
|
if (bObjAvail)
|
|||
|
rgchFormats[irgchFormats++] = vcfOwnerLink;
|
|||
|
else
|
|||
|
rgchFormats[irgchFormats++] = vcfLink;
|
|||
|
}
|
|||
|
|
|||
|
nWhichToSelect = FillListFormat(hwndList,bObjAvail || bLinkAvail);
|
|||
|
|
|||
|
/* select what Write would normally take */
|
|||
|
SendMessage(hwndList, LB_SETCURSEL, nWhichToSelect, 0L);
|
|||
|
|
|||
|
EnableWindow(GetDlgItem(hDlg, IDD_PASTELINK), bLinkAvail &&
|
|||
|
rgchFormats[nWhichToSelect] != CF_TEXT);
|
|||
|
|
|||
|
if (!bObjAvail && bLinkAvail)
|
|||
|
/* then we've got the object format in the list box, but don't want to
|
|||
|
enable paste if its selected */
|
|||
|
EnableWindow(GetDlgItem(hDlg, IDD_PASTE), nWhichToSelect != 0);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
case WM_ACTIVATE:
|
|||
|
if (wParam)
|
|||
|
vhWndMsgBoxParent = hDlg;
|
|||
|
break;
|
|||
|
|
|||
|
case WM_SYSCOMMAND:
|
|||
|
switch(wParam & 0xFFF0)
|
|||
|
{
|
|||
|
case SC_CLOSE:
|
|||
|
OurEndDialog(hDlg, FALSE);
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
switch (wParam)
|
|||
|
{
|
|||
|
case IDD_LISTBOX:
|
|||
|
switch (HIWORD(lParam))
|
|||
|
{
|
|||
|
case LBN_DBLCLK:
|
|||
|
SendMessage(hDlg,WM_COMMAND,IDD_PASTE,0L);
|
|||
|
return TRUE;
|
|||
|
case LBN_SELCHANGE:
|
|||
|
if (!bObjAvail && bLinkAvail)
|
|||
|
/* then we've got the object format in the list box, but don't want to
|
|||
|
enable paste if its selected */
|
|||
|
EnableWindow(GetDlgItem(hDlg, IDD_PASTE),
|
|||
|
SendMessage(LOWORD(lParam), LB_GETCURSEL, 0, 0L) != 0);
|
|||
|
|
|||
|
EnableWindow(GetDlgItem(hDlg, IDD_PASTELINK),
|
|||
|
bLinkAvail &&
|
|||
|
(GetFormatClip(SendMessage(LOWORD(lParam), LB_GETCURSEL, 0, 0L)) != CF_TEXT));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
case IDD_PASTE:
|
|||
|
case IDD_PASTELINK:
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
if (LB_ERR == (i = (WORD)SendMessage(GetDlgItem(hDlg, IDD_LISTBOX), LB_GETCURSEL, 0, 0L)))
|
|||
|
break;
|
|||
|
|
|||
|
cfObjPasteSpecial = GetFormatClip(i);
|
|||
|
|
|||
|
if (!IsFormatAvailable(cfObjPasteSpecial))
|
|||
|
/* somebody changed clip contents while in dialog */
|
|||
|
{
|
|||
|
Error(IDPMTFormat);
|
|||
|
ferror=FALSE; // reenable error messages
|
|||
|
SendMessage(GetDlgItem(hDlg,IDD_LISTBOX), LB_RESETCONTENT, 0, 0L);
|
|||
|
SendMessage(hDlg, WM_INITDIALOG, 0, 0L);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (wParam == IDD_PASTELINK)
|
|||
|
if (i > 0)
|
|||
|
vObjPasteLinkSpecial = TRUE;
|
|||
|
else
|
|||
|
vbObjLinkOnly = TRUE;
|
|||
|
|
|||
|
OurEndDialog(hDlg, TRUE);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
OurEndDialog(hDlg, FALSE);
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
static int FillListFormat(HWND hwndList, BOOL bObjAvail)
|
|||
|
/* fill hwndList with all the formats available on clipboard */
|
|||
|
/* return index of which format Write would normally take */
|
|||
|
{
|
|||
|
WORD cfFormat = NULL;
|
|||
|
int nDefFormat= -1;
|
|||
|
char szFormat[cchMaxSz];
|
|||
|
BOOL bFoundDefault = FALSE;
|
|||
|
|
|||
|
OpenClipboard(hDOCWINDOW);
|
|||
|
|
|||
|
/** priority order:
|
|||
|
if (bObjAvail)
|
|||
|
If text comes before native, then text is default.
|
|||
|
else object is default
|
|||
|
else no object available
|
|||
|
if text is there it is the default,
|
|||
|
else default is first come first server of bitmap, metafile or DIB
|
|||
|
**/
|
|||
|
|
|||
|
while (cfFormat = EnumClipboardFormats(cfFormat))
|
|||
|
switch(cfFormat)
|
|||
|
{
|
|||
|
case CF_BITMAP:
|
|||
|
LoadString(hINSTANCE, IDSTRBitmap, szFormat, sizeof(szFormat));
|
|||
|
SendMessage(hwndList, LB_INSERTSTRING, irgchFormats, (DWORD)(LPSTR)szFormat);
|
|||
|
|
|||
|
if (!bObjAvail)
|
|||
|
if (!bFoundDefault)
|
|||
|
{
|
|||
|
nDefFormat = irgchFormats;
|
|||
|
bFoundDefault = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
rgchFormats[irgchFormats++] = cfFormat;
|
|||
|
break;
|
|||
|
|
|||
|
case CF_METAFILEPICT:
|
|||
|
LoadString(hINSTANCE, IDSTRPicture, szFormat, sizeof(szFormat));
|
|||
|
SendMessage(hwndList, LB_INSERTSTRING, irgchFormats, (DWORD)(LPSTR)szFormat);
|
|||
|
|
|||
|
if (!bObjAvail)
|
|||
|
if (!bFoundDefault)
|
|||
|
{
|
|||
|
nDefFormat = irgchFormats;
|
|||
|
bFoundDefault = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
rgchFormats[irgchFormats++] = cfFormat;
|
|||
|
break;
|
|||
|
|
|||
|
case CF_DIB:
|
|||
|
LoadString(hINSTANCE, IDSTRDIB, szFormat, sizeof(szFormat));
|
|||
|
SendMessage(hwndList, LB_INSERTSTRING, irgchFormats, (DWORD)(LPSTR)szFormat);
|
|||
|
|
|||
|
if (!bObjAvail)
|
|||
|
if (!bFoundDefault)
|
|||
|
{
|
|||
|
nDefFormat = irgchFormats;
|
|||
|
bFoundDefault = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
rgchFormats[irgchFormats++] = cfFormat;
|
|||
|
break;
|
|||
|
|
|||
|
case CF_TEXT:
|
|||
|
LoadString(hINSTANCE, IDSTRText, szFormat, sizeof(szFormat));
|
|||
|
SendMessage(hwndList, LB_INSERTSTRING, irgchFormats, (DWORD)(LPSTR)szFormat);
|
|||
|
if (bObjAvail)
|
|||
|
{
|
|||
|
if (!bFoundDefault)
|
|||
|
/* then found text before native */
|
|||
|
nDefFormat = irgchFormats;
|
|||
|
}
|
|||
|
else
|
|||
|
nDefFormat = irgchFormats;
|
|||
|
|
|||
|
rgchFormats[irgchFormats++] = cfFormat;
|
|||
|
bFoundDefault = TRUE;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
if (!bFoundDefault && (cfFormat == vcfNative))
|
|||
|
{
|
|||
|
bFoundDefault = TRUE;
|
|||
|
nDefFormat = 0;
|
|||
|
}
|
|||
|
break;
|
|||
|
} //end switch
|
|||
|
|
|||
|
CloseClipboard();
|
|||
|
if (nDefFormat == -1)
|
|||
|
nDefFormat = 0;
|
|||
|
return nDefFormat;
|
|||
|
}
|
|||
|
|
|||
|
static WORD GetFormatClip(int i)
|
|||
|
{
|
|||
|
return rgchFormats[i];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static BOOL GetClipObjectInfo(LPSTR szClass, LPSTR szItem)
|
|||
|
/* get the classname, item name for the owner of the clipboard */
|
|||
|
/* return TRUE if error */
|
|||
|
/* only gets ownerlink class, assumes its available */
|
|||
|
{
|
|||
|
HANDLE hData=NULL;
|
|||
|
LPSTR lpData=NULL;
|
|||
|
BOOL bRetval = TRUE;
|
|||
|
char szFullItem[CBPATHMAX],*pch;
|
|||
|
|
|||
|
OpenClipboard( hDOCWINDOW );
|
|||
|
|
|||
|
if ((hData = GetClipboardData(vcfOwnerLink)) == NULL)
|
|||
|
if ((hData = GetClipboardData(vcfLink)) == NULL)
|
|||
|
{
|
|||
|
bRetval = TRUE;
|
|||
|
goto end;
|
|||
|
}
|
|||
|
|
|||
|
if ((lpData = GlobalLock(hData)) == NULL)
|
|||
|
goto end;
|
|||
|
|
|||
|
/**** get szClass ****/
|
|||
|
RegGetClassId(szClass,lpData);
|
|||
|
|
|||
|
/**** get szName ****/
|
|||
|
while(*lpData++); // skip class key
|
|||
|
|
|||
|
pch = szFullItem;
|
|||
|
|
|||
|
/* first doc name */
|
|||
|
do
|
|||
|
*pch++ = *lpData;
|
|||
|
while(*lpData++);
|
|||
|
|
|||
|
/* second item name (if there) */
|
|||
|
if (*lpData)
|
|||
|
{
|
|||
|
*(pch-1) = ' ';
|
|||
|
do
|
|||
|
*pch++ = *lpData;
|
|||
|
while(*lpData++);
|
|||
|
}
|
|||
|
|
|||
|
/* get rid of path. pch now points to \0 */
|
|||
|
#ifdef DBCS //T-HIROYN 1992.07.13
|
|||
|
pch = AnsiPrev(szFullItem,pch); //02/26/93 T-HIROYN
|
|||
|
while (pch != szFullItem) {
|
|||
|
if ((*(pch) == '\\') || (*(pch) == ':')) {
|
|||
|
pch++;
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
pch = AnsiPrev(szFullItem,pch);
|
|||
|
}
|
|||
|
if ((*(pch) == '\\') || (*(pch) == ':')) //02/26/93 T-HIROYN
|
|||
|
pch++;
|
|||
|
#else
|
|||
|
--pch;
|
|||
|
while (pch != szFullItem)
|
|||
|
if ((*(pch-1) == '\\') || (*(pch-1) == ':'))
|
|||
|
break;
|
|||
|
else
|
|||
|
--pch;
|
|||
|
#endif
|
|||
|
|
|||
|
lstrcpy(szItem,(LPSTR)pch);
|
|||
|
|
|||
|
bRetval = FALSE;
|
|||
|
|
|||
|
end:
|
|||
|
if (lpData)
|
|||
|
GlobalUnlock(hData);
|
|||
|
|
|||
|
CloseClipboard();
|
|||
|
|
|||
|
return bRetval;
|
|||
|
}
|
|||
|
|
|||
|
static BOOL IsFormatAvailable(WORD cfFormat)
|
|||
|
{
|
|||
|
BOOL bRetval;
|
|||
|
|
|||
|
OpenClipboard(hDOCWINDOW);
|
|||
|
|
|||
|
bRetval = IsClipboardFormatAvailable(cfFormat);
|
|||
|
|
|||
|
CloseClipboard();
|
|||
|
|
|||
|
return bRetval;
|
|||
|
}
|
|||
|
|
|||
|
|