Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

258 lines
7.4 KiB

#include "precomp.h"
/************************************************************************/
/* */
/* Windows Cardfile - Written by Mark Cliggett */
/* (c) Copyright Microsoft Corp. 1985, 1994 - All Rights Reserved */
/* */
/* OLE - Paste special support */
/************************************************************************/
NOEXPORT BOOL GetClipObjectInfo(LPTSTR szClass, LPTSTR szItem);
NOEXPORT BOOL SetupFormatsList(HWND hwndList);
#define MAX_CLIPFORMATS 20
int Formats[MAX_CLIPFORMATS];
int nFormats, iFormats;
BOOL fPaste;
int ClipFormat;
void DoPasteSpecial(void)
{
int Result;
if (EditMode == I_TEXT)
return;
Result= DialogBox( hIndexInstance,
(LPTSTR) MAKEINTRESOURCE(DLGPASTESPECIAL),
hIndexWnd,
(DLGPROC) PasteSpecialDlgProc);
if (Result == -1)
return; /* probably error msg , out of mem */
else if (Result == 0)
return; /* dlg cancelled */
PicPaste( &CurCard, fPaste, (WORD) ((ClipFormat == vcfOwnerLink) ?
0 : ClipFormat) );
}
int FAR PASCAL PasteSpecialDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int i;
static BOOL fLinkAvail, fEmbAvail, fObjAvail;
switch (message)
{
case WM_INITDIALOG:
{
TCHAR szClassName[KEYNAMESIZE];
TCHAR szItemName[PATHMAX];
HWND hwndList;
hwndList = GetDlgItem(hDlg,IDD_LISTBOX);
szClassName[0] = szItemName[0] = TEXT('\0');
iFormats = 0; /* always start with 0 */
ClipFormat = 0; /* no formats have been selected */ // lhb tracks
fEmbAvail = OleQueryCreateFromClip(szPStdFile, olerender_draw, 0) == OLE_OK;
fLinkAvail = OleQueryLinkFromClip(szPStdFile, olerender_draw, 0) == OLE_OK;
fObjAvail = fEmbAvail || fLinkAvail;
// Show ole object first if available
if (fObjAvail)
{
TCHAR szTmp[OBJSTRINGSMAX];
TCHAR szListItem[OBJSTRINGSMAX+KEYNAMESIZE]; // hope this is big enough!
GetClipObjectInfo(szClassName, szItemName);
SetWindowText(GetDlgItem(hDlg,IDD_CLIPOWNER), szClassName);
SetWindowText(GetDlgItem(hDlg,IDD_ITEM), szItemName);
LoadString(hIndexInstance, IDS_OBJECTFMT, szTmp, CharSizeOf(szTmp));
wsprintf(szListItem,TEXT("%s %s"), szClassName, szTmp);
SendMessage(hwndList, LB_INSERTSTRING, iFormats, (LPARAM) szClassName);
Formats[iFormats++] = vcfOwnerLink;
}
else
ShowWindow(GetDlgItem(hDlg,IDD_SOURCE), SW_HIDE);
SetupFormatsList(hwndList);
if( !iFormats ) // if nothing to do, exit (how did we get here?)
{
EndDialog(hDlg, FALSE );
return FALSE;
}
/* Choose the first one by default */
SendMessage(hwndList, LB_SETCURSEL, 0, 0L);
EnableWindow(GetDlgItem(hDlg, IDD_PASTELINK), fLinkAvail);
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDD_LISTBOX:
switch (HIWORD(lParam))
{
case LBN_DBLCLK:
SendMessage (hDlg, WM_COMMAND, IDD_PASTE, 0L);
return TRUE;
default:
break;
}
break;
case IDD_PASTE:
case IDD_PASTELINK:
i = (WORD)SendDlgItemMessage(hDlg, IDD_LISTBOX, LB_GETCURSEL, 0, 0L);
if (i == LB_ERR)
break;
fPaste = (LOWORD(wParam) == IDD_PASTE);
ClipFormat = Formats[i];
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
break;
}
return FALSE;
}
/* fill hwndList with all the formats available on clipboard */
NOEXPORT BOOL SetupFormatsList(HWND hwndList)
{
TCHAR szPicture[OBJSTRINGSMAX];
TCHAR szBitmap[OBJSTRINGSMAX];
WORD cfFormat = 0; // lhb tracks
if (!OpenClipboard(hIndexWnd))
return FALSE;
LoadString(hIndexInstance, IDS_PICTUREFMT, szPicture, CharSizeOf(szPicture));
LoadString(hIndexInstance, IDS_BITMAPFMT, szBitmap, CharSizeOf(szBitmap));
while (cfFormat = EnumClipboardFormats(cfFormat))
{
switch(cfFormat)
{
case CF_BITMAP:
SendMessage(hwndList, LB_INSERTSTRING, iFormats, (LPARAM) szBitmap);
Formats[iFormats++] = cfFormat;
break;
case CF_METAFILEPICT:
SendMessage(hwndList, LB_INSERTSTRING, iFormats, (LPARAM) szPicture);
Formats[iFormats++] = cfFormat;
break;
default:
break; //do nothing
} //end switch
}
CloseClipboard();
return iFormats;
}
/* get the classname, item name for the owner of the clipboard */
/* return TRUE if successful */
/* only gets ownerlink class, assumes its available */
NOEXPORT BOOL GetClipObjectInfo(LPTSTR szClass, LPTSTR szItem)
{
HANDLE hData = INVALID_HANDLE_VALUE;
LPTSTR lpData = NULL;
TCHAR szFullItem[PATHMAX],*pch;
DWORD dwSize = KEYNAMESIZE;
TCHAR szShortClass[PATHMAX];
INT iDataSize;
if (!OpenClipboard(hIndexWnd))
return FALSE;
if (!(hData = GetClipboardData(vcfOwnerLink)) &&
!(hData = GetClipboardData(vcfLink)))
{
CloseClipboard();
return FALSE;
}
if (!(lpData = GlobalLock(hData)))
{
CloseClipboard();
return FALSE;
}
// convert to unicode if need be
iDataSize= GlobalSize( hData );
if( IsTextUnicode( lpData,GlobalSize(hData),NULL ) )
{
CopyMemory( szShortClass, lpData, iDataSize );
}
else
{
MultiByteToWideChar( CP_ACP,
MB_PRECOMPOSED,
(LPCSTR) lpData,
iDataSize,
szShortClass,
CharSizeOf(szShortClass) );
}
/**** get szClass ****/
if (RegQueryValue(HKEY_CLASSES_ROOT, szShortClass, szClass, &dwSize))
lstrcpy(szClass, szShortClass);
lpData= (LPTSTR) &szShortClass;
/**** 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) = TEXT(' ');
do
{
*pch++ = *lpData;
} while(*lpData++);
}
/* get rid of path. pch now points to \0 */
--pch;
while (pch != szFullItem)
{
if ((*(pch-1) == TEXT('\\')) || (*(pch-1) == TEXT(':')))
break;
else
--pch;
}
lstrcpy(szItem, pch);
GlobalUnlock(hData);
CloseClipboard();
return TRUE;
}