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;
|
||
}
|
||
|
||
|