📄 pastespl.c
字号:
EnableWindow(GetDlgItem(hdlg, IDOK), 0);
}
static void update_src_text(HWND hdlg, ps_struct_t *ps_struct)
{
WCHAR *str;
if(ps_struct->flags & PSF_SELECTPASTE)
{
if(ps_struct->source_name)
str = ps_struct->source_name;
else
str = ps_struct->link_source_name;
}
else
{
if(ps_struct->link_source_name)
str = ps_struct->link_source_name;
else
str = ps_struct->source_name;
}
SetDlgItemTextW(hdlg, IDC_PS_SOURCETEXT, str);
}
static void update_as_icon(HWND hdlg, ps_struct_t *ps_struct)
{
HWND icon_display = GetDlgItem(hdlg, IDC_PS_ICONDISPLAY);
HWND display_as_icon = GetDlgItem(hdlg, IDC_PS_DISPLAYASICON);
HWND change_icon = GetDlgItem(hdlg, IDC_PS_CHANGEICON);
/* FIXME. No as icon handling */
ps_struct->flags &= ~PSF_CHECKDISPLAYASICON;
CheckDlgButton(hdlg, IDC_PS_DISPLAYASICON, ps_struct->flags & PSF_CHECKDISPLAYASICON);
EnableWindow(display_as_icon, 0);
ShowWindow(icon_display, SW_HIDE);
EnableWindow(icon_display, 0);
ShowWindow(change_icon, SW_HIDE);
EnableWindow(change_icon, 0);
}
static void update_result_text(HWND hdlg, ps_struct_t *ps_struct)
{
WCHAR resource_txt[200];
UINT res_id;
OLEUIPASTEENTRYW *pent;
LONG cur_sel;
static const WCHAR percent_s[] = {'%','s',0};
WCHAR *result_txt, *ptr;
cur_sel = SendMessageW(GetDlgItem(hdlg, IDC_PS_DISPLAYLIST), LB_GETCURSEL, 0, 0);
if(cur_sel == -1) return;
pent = (OLEUIPASTEENTRYW*)SendMessageW(GetDlgItem(hdlg, IDC_PS_DISPLAYLIST), LB_GETITEMDATA, cur_sel, 0);
if(ps_struct->flags & PSF_SELECTPASTE)
{
if(ps_struct->flags & PSF_CHECKDISPLAYASICON)
res_id = IDS_PS_PASTE_OBJECT_AS_ICON;
else
res_id = IDS_PS_PASTE_DATA;
}
else
{
if(ps_struct->flags & PSF_CHECKDISPLAYASICON)
res_id = IDS_PS_PASTE_LINK_OBJECT_AS_ICON;
else
res_id = IDS_PS_PASTE_LINK_DATA;
}
LoadStringW(OLEDLG_hInstance, res_id, resource_txt, sizeof(resource_txt)/sizeof(WCHAR));
if((ptr = strstrW(resource_txt, percent_s)))
{
/* FIXME handle %s in ResultText. Sub appname if IDS_PS_PASTE_OBJECT{_AS_ICON}. Else sub appropiate type name */
size_t result_txt_len = strlenW(pent->lpstrResultText);
ptrdiff_t offs = (char*)ptr - (char*)resource_txt;
result_txt = HeapAlloc(GetProcessHeap(), 0, (strlenW(resource_txt) + result_txt_len - 1) * sizeof(WCHAR));
memcpy(result_txt, resource_txt, offs);
memcpy((char*)result_txt + offs, pent->lpstrResultText, result_txt_len * sizeof(WCHAR));
memcpy((char*)result_txt + offs + result_txt_len * sizeof(WCHAR), ptr + 2, (strlenW(ptr + 2) + 1) * sizeof(WCHAR));
}
else
result_txt = resource_txt;
SetDlgItemTextW(hdlg, IDC_PS_RESULTTEXT, result_txt);
if(result_txt != resource_txt)
HeapFree(GetProcessHeap(), 0, result_txt);
}
static void selection_change(HWND hdlg, ps_struct_t *ps_struct)
{
update_as_icon(hdlg, ps_struct);
update_result_text(hdlg, ps_struct);
}
static void mode_change(HWND hdlg, ps_struct_t *ps_struct, UINT id)
{
if(id == IDC_PS_PASTE)
{
ps_struct->flags &= ~PSF_SELECTPASTELINK;
ps_struct->flags |= PSF_SELECTPASTE;
}
else
{
ps_struct->flags &= ~PSF_SELECTPASTE;
ps_struct->flags |= PSF_SELECTPASTELINK;
}
update_src_text(hdlg, ps_struct);
update_display_list(hdlg, id == IDC_PS_PASTE ? IDC_PS_PASTELIST : IDC_PS_PASTELINKLIST);
selection_change(hdlg, ps_struct);
}
static void post_help_msg(HWND hdlg, ps_struct_t *ps_struct)
{
PostMessageW(ps_struct->ps->hWndOwner, oleui_msg_help, (WPARAM)hdlg, IDD_PASTESPECIAL);
}
static void send_end_dialog_msg(HWND hdlg, ps_struct_t *ps_struct, UINT id)
{
SendMessageW(hdlg, oleui_msg_enddialog, id, 0);
}
static void update_structure(HWND hdlg, ps_struct_t *ps_struct)
{
LONG cur_sel = SendMessageW(GetDlgItem(hdlg, IDC_PS_DISPLAYLIST), LB_GETCURSEL, 0, 0);
if(cur_sel != -1)
{
OLEUIPASTEENTRYW *pent;
pent = (OLEUIPASTEENTRYW *)SendMessageW(GetDlgItem(hdlg, IDC_PS_DISPLAYLIST), LB_GETITEMDATA, cur_sel, 0);
ps_struct->ps->nSelectedIndex = pent->dwScratchSpace;
}
ps_struct->ps->dwFlags = ps_struct->flags;
ps_struct->ps->fLink = (ps_struct->flags & PSF_SELECTPASTELINK) ? TRUE : FALSE;
}
static void free_structure(ps_struct_t *ps_struct)
{
HeapFree(GetProcessHeap(), 0, ps_struct->type_name);
HeapFree(GetProcessHeap(), 0, ps_struct->source_name);
HeapFree(GetProcessHeap(), 0, ps_struct->link_type_name);
HeapFree(GetProcessHeap(), 0, ps_struct->link_source_name);
CoTaskMemFree(ps_struct->app_name);
HeapFree(GetProcessHeap(), 0, ps_struct);
}
static INT_PTR CALLBACK ps_dlg_proc(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp)
{
/* native uses prop name "Structure", but we're not compatible
with that so we'll prepend "Wine_". */
static const WCHAR prop_name[] = {'W','i','n','e','_','S','t','r','u','c','t','u','r','e',0};
ps_struct_t *ps_struct;
TRACE("(%p, %04x, %08lx, %08lx)\n", hdlg, msg, wp, lp);
ps_struct = GetPropW(hdlg, prop_name);
if(msg != WM_INITDIALOG)
{
if(!ps_struct)
return 0;
if(ps_struct->ps->lpfnHook)
{
INT_PTR ret = ps_struct->ps->lpfnHook(hdlg, msg, wp, lp);
if(ret) return ret;
}
}
switch(msg)
{
case WM_INITDIALOG:
{
ps_struct = HeapAlloc(GetProcessHeap(), 0, sizeof(*ps_struct));
ps_struct->ps = (OLEUIPASTESPECIALW*)lp;
ps_struct->type_name = NULL;
ps_struct->source_name = NULL;
ps_struct->link_type_name = NULL;
ps_struct->link_source_name = NULL;
ps_struct->app_name = NULL;
ps_struct->flags = ps_struct->ps->dwFlags;
SetPropW(hdlg, prop_name, ps_struct);
if(!(ps_struct->ps->dwFlags & PSF_SHOWHELP))
{
ShowWindow(GetDlgItem(hdlg, IDC_OLEUIHELP), SW_HIDE);
EnableWindow(GetDlgItem(hdlg, IDC_OLEUIHELP), 0);
}
if(ps_struct->ps->lpszCaption)
SetWindowTextW(hdlg, ps_struct->ps->lpszCaption);
get_descriptors(hdlg, ps_struct);
init_lists(hdlg, ps_struct);
update_src_text(hdlg, ps_struct);
selection_change(hdlg, ps_struct);
SetFocus(GetDlgItem(hdlg, IDC_PS_DISPLAYLIST));
if(ps_struct->ps->lpfnHook)
ps_struct->ps->lpfnHook(hdlg, msg, 0, 0);
return FALSE; /* use new focus */
}
case WM_COMMAND:
switch(LOWORD(wp))
{
case IDC_PS_DISPLAYLIST:
switch(HIWORD(wp))
{
case LBN_SELCHANGE:
selection_change(hdlg, ps_struct);
return FALSE;
default:
return FALSE;
}
case IDC_PS_PASTE:
case IDC_PS_PASTELINK:
switch(HIWORD(wp))
{
case BN_CLICKED:
mode_change(hdlg, ps_struct, LOWORD(wp));
return FALSE;
default:
return FALSE;
}
case IDC_OLEUIHELP:
switch(HIWORD(wp))
{
case BN_CLICKED:
post_help_msg(hdlg, ps_struct);
return FALSE;
default:
return FALSE;
}
case IDOK:
case IDCANCEL:
switch(HIWORD(wp))
{
case BN_CLICKED:
send_end_dialog_msg(hdlg, ps_struct, LOWORD(wp));
return FALSE;
default:
return FALSE;
}
}
return FALSE;
default:
if(msg == oleui_msg_enddialog)
{
if(wp == IDOK)
update_structure(hdlg, ps_struct);
EndDialog(hdlg, wp);
/* native does its cleanup in WM_DESTROY */
RemovePropW(hdlg, prop_name);
free_structure(ps_struct);
return TRUE;
}
return FALSE;
}
}
/***********************************************************************
* OleUIPasteSpecialA (OLEDLG.4)
*/
UINT WINAPI OleUIPasteSpecialA(LPOLEUIPASTESPECIALA psA)
{
OLEUIPASTESPECIALW ps;
UINT ret;
TRACE("(%p)\n", psA);
memcpy(&ps, psA, psA->cbStruct);
ps.lpszCaption = strdupAtoW(psA->lpszCaption);
if(!IS_INTRESOURCE(ps.lpszTemplate))
ps.lpszTemplate = strdupAtoW(psA->lpszTemplate);
if(psA->cPasteEntries > 0)
{
DWORD size = psA->cPasteEntries * sizeof(ps.arrPasteEntries[0]);
UINT i;
ps.arrPasteEntries = HeapAlloc(GetProcessHeap(), 0, size);
memcpy(ps.arrPasteEntries, psA->arrPasteEntries, size);
for(i = 0; i < psA->cPasteEntries; i++)
{
ps.arrPasteEntries[i].lpstrFormatName =
strdupAtoW(psA->arrPasteEntries[i].lpstrFormatName);
ps.arrPasteEntries[i].lpstrResultText =
strdupAtoW(psA->arrPasteEntries[i].lpstrResultText);
}
}
ret = OleUIPasteSpecialW(&ps);
if(psA->cPasteEntries > 0)
{
UINT i;
for(i = 0; i < psA->cPasteEntries; i++)
{
HeapFree(GetProcessHeap(), 0, (WCHAR*)ps.arrPasteEntries[i].lpstrFormatName);
HeapFree(GetProcessHeap(), 0, (WCHAR*)ps.arrPasteEntries[i].lpstrResultText);
}
HeapFree(GetProcessHeap(), 0, ps.arrPasteEntries);
}
if(!IS_INTRESOURCE(ps.lpszTemplate))
HeapFree(GetProcessHeap(), 0, (WCHAR*)ps.lpszTemplate);
HeapFree(GetProcessHeap(), 0, (WCHAR*)ps.lpszCaption);
/* Copy back the output fields */
psA->dwFlags = ps.dwFlags;
psA->lpSrcDataObj = ps.lpSrcDataObj;
psA->nSelectedIndex = ps.nSelectedIndex;
psA->fLink = ps.fLink;
psA->hMetaPict = ps.hMetaPict;
psA->sizel = ps.sizel;
return ret;
}
/***********************************************************************
* OleUIPasteSpecialW (OLEDLG.22)
*/
UINT WINAPI OleUIPasteSpecialW(LPOLEUIPASTESPECIALW ps)
{
LPCDLGTEMPLATEW dlg_templ = (LPCDLGTEMPLATEW)ps->hResource;
UINT ret;
TRACE("(%p)\n", ps);
if(TRACE_ON(ole)) dump_pastespecial(ps);
if(!ps->lpSrcDataObj)
OleGetClipboard(&ps->lpSrcDataObj);
if(ps->hInstance || !ps->hResource)
{
HINSTANCE hInst = ps->hInstance ? ps->hInstance : OLEDLG_hInstance;
const WCHAR *name = ps->hInstance ? ps->lpszTemplate : MAKEINTRESOURCEW(IDD_PASTESPECIAL4);
HRSRC hrsrc;
if(name == NULL) return OLEUI_ERR_LPSZTEMPLATEINVALID;
hrsrc = FindResourceW(hInst, name, MAKEINTRESOURCEW(RT_DIALOG));
if(!hrsrc) return OLEUI_ERR_FINDTEMPLATEFAILURE;
dlg_templ = LoadResource(hInst, hrsrc);
if(!dlg_templ) return OLEUI_ERR_LOADTEMPLATEFAILURE;
}
ret = DialogBoxIndirectParamW(OLEDLG_hInstance, dlg_templ, ps->hWndOwner, ps_dlg_proc, (LPARAM)ps);
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -