mirror of https://github.com/lianthony/NT4.0
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
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;
|
|
}
|