}
}
-static BOOL ME_RTFInsertOleObject(RTF_Info *info, HENHMETAFILE hemf, HBITMAP hbmp,
- const SIZEL* sz)
+static HRESULT insert_static_object(ME_TextEditor *editor, HENHMETAFILE hemf, HBITMAP hbmp,
+ const SIZEL* sz)
{
LPOLEOBJECT lpObject = NULL;
LPSTORAGE lpStorage = NULL;
STGMEDIUM stgm;
FORMATETC fm;
CLSID clsid;
- BOOL ret = FALSE;
+ HRESULT hr = E_FAIL;
DWORD conn;
if (hemf)
fm.lindex = -1;
fm.tymed = stgm.tymed;
- if (!info->lpRichEditOle)
+ if (!editor->reOle)
{
- CreateIRichEditOle(NULL, info->editor, (VOID**)&info->lpRichEditOle);
+ if (!CreateIRichEditOle(NULL, editor, (LPVOID *)&editor->reOle))
+ return hr;
}
if (OleCreateDefaultHandler(&CLSID_NULL, NULL, &IID_IOleObject, (void**)&lpObject) == S_OK &&
- IRichEditOle_GetClientSite(info->lpRichEditOle, &lpClientSite) == S_OK &&
+ IRichEditOle_GetClientSite(editor->reOle, &lpClientSite) == S_OK &&
IOleObject_SetClientSite(lpObject, lpClientSite) == S_OK &&
IOleObject_GetUserClassID(lpObject, &clsid) == S_OK &&
IOleObject_QueryInterface(lpObject, &IID_IOleCache, (void**)&lpOleCache) == S_OK &&
reobject.dwFlags = 0; /* FIXME */
reobject.dwUser = 0;
- ME_InsertOLEFromCursor(info->editor, &reobject, 0);
- ret = TRUE;
+ ME_InsertOLEFromCursor(editor, &reobject, 0);
+ hr = S_OK;
}
if (lpObject) IOleObject_Release(lpObject);
if (lpDataObject) IDataObject_Release(lpDataObject);
if (lpOleCache) IOleCache_Release(lpOleCache);
- return ret;
+ return hr;
}
static void ME_RTFReadShpPictGroup( RTF_Info *info )
{
case gfx_enhmetafile:
if ((hemf = SetEnhMetaFileBits( size, buffer )))
- ME_RTFInsertOleObject( info, hemf, NULL, &sz );
+ insert_static_object( info->editor, hemf, NULL, &sz );
break;
case gfx_metafile:
if ((hemf = SetWinMetaFileBits( size, buffer, NULL, &mfp )))
- ME_RTFInsertOleObject( info, hemf, NULL, &sz );
+ insert_static_object( info->editor, hemf, NULL, &sz );
break;
case gfx_dib:
{
if ((hbmp = CreateDIBitmap( hdc, &bi->bmiHeader,
CBM_INIT, (char*)(bi + 1) + nc * sizeof(RGBQUAD),
bi, DIB_RGB_COLORS)) )
- ME_RTFInsertOleObject( info, NULL, hbmp, &sz );
+ insert_static_object( info->editor, NULL, hbmp, &sz );
ReleaseDC( 0, hdc );
break;
}
}
ME_CheckTablesForCorruption(editor);
RTFDestroy(&parser);
- if (parser.lpRichEditOle)
- IRichEditOle_Release(parser.lpRichEditOle);
if (parser.stackTop > 0)
{
return 0;
}
-static BOOL ME_Paste(ME_TextEditor *editor)
+static const WCHAR rtfW[] = {'R','i','c','h',' ','T','e','x','t',' ','F','o','r','m','a','t',0};
+
+static HRESULT paste_rtf(ME_TextEditor *editor, FORMATETC *fmt, STGMEDIUM *med)
{
- DWORD dwFormat = 0;
- EDITSTREAM es;
- ME_GlobalDestStruct gds;
- UINT nRTFFormat = RegisterClipboardFormatA("Rich Text Format");
- UINT cf = 0;
-
- if (IsClipboardFormatAvailable(nRTFFormat))
- cf = nRTFFormat, dwFormat = SF_RTF;
- else if (IsClipboardFormatAvailable(CF_UNICODETEXT))
- cf = CF_UNICODETEXT, dwFormat = SF_TEXT|SF_UNICODE;
- else
- return FALSE;
+ EDITSTREAM es;
+ ME_GlobalDestStruct gds;
+ HRESULT hr;
+
+ gds.hData = med->u.hGlobal;
+ gds.nLength = 0;
+ es.dwCookie = (DWORD_PTR)&gds;
+ es.pfnCallback = ME_ReadFromHGLOBALRTF;
+ hr = ME_StreamIn( editor, SF_RTF | SFF_SELECTION, &es, FALSE ) == 0 ? E_FAIL : S_OK;
+ ReleaseStgMedium( med );
+ return hr;
+}
- if (!OpenClipboard(editor->hWnd))
- return FALSE;
- gds.hData = GetClipboardData(cf);
- gds.nLength = 0;
- es.dwCookie = (DWORD_PTR)&gds;
- es.pfnCallback = dwFormat == SF_RTF ? ME_ReadFromHGLOBALRTF : ME_ReadFromHGLOBALUnicode;
- ME_StreamIn(editor, dwFormat|SFF_SELECTION, &es, FALSE);
+static HRESULT paste_text(ME_TextEditor *editor, FORMATETC *fmt, STGMEDIUM *med)
+{
+ EDITSTREAM es;
+ ME_GlobalDestStruct gds;
+ HRESULT hr;
+
+ gds.hData = med->u.hGlobal;
+ gds.nLength = 0;
+ es.dwCookie = (DWORD_PTR)&gds;
+ es.pfnCallback = ME_ReadFromHGLOBALUnicode;
+ hr = ME_StreamIn( editor, SF_TEXT | SF_UNICODE | SFF_SELECTION, &es, FALSE ) == 0 ? E_FAIL : S_OK;
+ ReleaseStgMedium( med );
+ return hr;
+}
- CloseClipboard();
- return TRUE;
+static HRESULT paste_emf(ME_TextEditor *editor, FORMATETC *fmt, STGMEDIUM *med)
+{
+ HRESULT hr;
+ SIZEL sz = {0, 0};
+
+ hr = insert_static_object( editor, med->u.hEnhMetaFile, NULL, &sz );
+ if (SUCCEEDED(hr))
+ {
+ ME_CommitUndo( editor );
+ ME_UpdateRepaint( editor, FALSE );
+ }
+ else
+ ReleaseStgMedium( med );
+
+ return hr;
+}
+
+static struct paste_format
+{
+ FORMATETC fmt;
+ HRESULT (*paste)(ME_TextEditor *, FORMATETC *, STGMEDIUM *);
+ const WCHAR *name;
+} paste_formats[] =
+{
+ {{ -1, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, paste_rtf, rtfW },
+ {{ CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, paste_text },
+ {{ CF_ENHMETAFILE, NULL, DVASPECT_CONTENT, -1, TYMED_ENHMF }, paste_emf },
+ {{ 0 }}
+};
+
+static void init_paste_formats(void)
+{
+ struct paste_format *format;
+ static int done;
+
+ if (!done)
+ {
+ for (format = paste_formats; format->fmt.cfFormat; format++)
+ {
+ if (format->name)
+ format->fmt.cfFormat = RegisterClipboardFormatW( format->name );
+ }
+ done = 1;
+ }
+}
+
+static BOOL paste_special(ME_TextEditor *editor, UINT cf, REPASTESPECIAL *ps, BOOL check_only)
+{
+ HRESULT hr;
+ STGMEDIUM med;
+ struct paste_format *format;
+ IDataObject *data;
+
+ init_paste_formats();
+
+ if (ps && ps->dwAspect != DVASPECT_CONTENT)
+ FIXME("Ignoring aspect %x\n", ps->dwAspect);
+
+ hr = OleGetClipboard( &data );
+ if (hr != S_OK) return FALSE;
+
+ if (cf == CF_TEXT) cf = CF_UNICODETEXT;
+
+ hr = S_FALSE;
+ for (format = paste_formats; format->fmt.cfFormat; format++)
+ {
+ if (cf && cf != format->fmt.cfFormat) continue;
+ hr = IDataObject_QueryGetData( data, &format->fmt );
+ if (hr == S_OK)
+ {
+ if (!check_only)
+ {
+ hr = IDataObject_GetData( data, &format->fmt, &med );
+ if (hr != S_OK) goto done;
+ hr = format->paste( editor, &format->fmt, &med );
+ }
+ break;
+ }
+ }
+
+done:
+ IDataObject_Release( data );
+
+ return hr == S_OK;
}
static BOOL ME_Copy(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
break;
case 'V':
if (ctrl_is_down)
- return ME_Paste(editor);
+ return paste_special( editor, 0, NULL, FALSE );
break;
case 'C':
case 'X':
return TRUE;
}
-ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10, DWORD csStyle)
+ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
{
ME_TextEditor *ed = ALLOC_OBJ(ME_TextEditor);
int i;
ed->reOle = NULL;
ed->bEmulateVersion10 = bEmulateVersion10;
ed->styleFlags = 0;
- ed->alignStyle = PFA_LEFT;
- if (csStyle & ES_RIGHT)
- ed->alignStyle = PFA_RIGHT;
- if (csStyle & ES_CENTER)
- ed->alignStyle = PFA_CENTER;
+ ed->exStyleFlags = 0;
ITextHost_TxGetPropertyBits(texthost,
(TXTBIT_RICHTEXT|TXTBIT_MULTILINE|
TXTBIT_READONLY|TXTBIT_USEPASSWORD|
}
ME_CheckCharOffsets(ed);
+ SetRectEmpty(&ed->rcFormat);
ed->bDefaultFormatRect = TRUE;
ITextHost_TxGetSelectionBarWidth(ed->texthost, &selbarwidth);
if (selbarwidth) {
UNSUPPORTED_MSG(EM_GETTYPOGRAPHYOPTIONS)
UNSUPPORTED_MSG(EM_GETUNDONAME)
UNSUPPORTED_MSG(EM_GETWORDBREAKPROCEX)
- UNSUPPORTED_MSG(EM_PASTESPECIAL)
UNSUPPORTED_MSG(EM_SELECTIONTYPE)
UNSUPPORTED_MSG(EM_SETBIDIOPTIONS)
UNSUPPORTED_MSG(EM_SETEDITSTYLE)
return 1;
}
case EM_CANPASTE:
- {
- UINT nRTFFormat = RegisterClipboardFormatA("Rich Text Format");
- if (IsClipboardFormatAvailable(nRTFFormat))
- return TRUE;
- if (IsClipboardFormatAvailable(CF_UNICODETEXT))
- return TRUE;
- return FALSE;
- }
+ return paste_special( editor, 0, NULL, TRUE );
case WM_PASTE:
case WM_MBUTTONDOWN:
- ME_Paste(editor);
+ wParam = 0;
+ lParam = 0;
+ /* fall through */
+ case EM_PASTESPECIAL:
+ paste_special( editor, wParam, (REPASTESPECIAL *)lParam, FALSE );
return 0;
case WM_CUT:
case WM_COPY:
return 0L;
}
+static BOOL create_windowed_editor(HWND hwnd, CREATESTRUCTW *create, BOOL emulate_10)
+{
+ ITextHost *host = ME_CreateTextHost( hwnd, create, emulate_10 );
+ ME_TextEditor *editor;
+
+ if (!host) return FALSE;
+
+ editor = ME_MakeEditor( host, emulate_10 );
+ if (!editor)
+ {
+ ITextHost_Release( host );
+ return FALSE;
+ }
+
+ editor->exStyleFlags = GetWindowLongW( hwnd, GWL_EXSTYLE );
+ editor->styleFlags |= GetWindowLongW( hwnd, GWL_STYLE ) & ES_WANTRETURN;
+ editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */
+ editor->hwndParent = create->hwndParent;
+
+ SetWindowLongPtrW( hwnd, 0, (LONG_PTR)editor );
+
+ return TRUE;
+}
+
static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam, BOOL unicode)
{
if (msg == WM_NCCREATE)
{
CREATESTRUCTW *pcs = (CREATESTRUCTW *)lParam;
- ITextHost *texthost;
TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style);
- texthost = ME_CreateTextHost(hWnd, pcs, FALSE);
- return texthost != NULL;
+ return create_windowed_editor( hWnd, pcs, FALSE );
}
else
{
{
if (msg == WM_NCCREATE && !GetWindowLongPtrW(hWnd, 0))
{
- ITextHost *texthost;
CREATESTRUCTW *pcs = (CREATESTRUCTW *)lParam;
TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style);
- texthost = ME_CreateTextHost(hWnd, pcs, TRUE);
- return texthost != NULL;
+ return create_windowed_editor( hWnd, pcs, TRUE );
}
return RichEditANSIWndProc(hWnd, msg, wParam, lParam);
}
struct IOleClientSiteImpl {
struct reole_child child;
IOleClientSite IOleClientSite_iface;
- IOleWindow IOleWindow_iface;
IOleInPlaceSite IOleInPlaceSite_iface;
LONG ref;
};
return CONTAINING_RECORD(iface, IRichEditOleImpl, IUnknown_inner);
}
-static inline IOleClientSiteImpl *impl_from_IOleWindow(IOleWindow *iface)
-{
- return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleWindow_iface);
-}
-
static inline IOleClientSiteImpl *impl_from_IOleInPlaceSite(IOleInPlaceSite *iface)
{
return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceSite_iface);
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IOleClientSite))
*ppvObj = me;
- else if (IsEqualGUID(riid, &IID_IOleWindow))
- *ppvObj = &This->IOleWindow_iface;
- else if (IsEqualGUID(riid, &IID_IOleInPlaceSite))
+ else if (IsEqualGUID(riid, &IID_IOleWindow) ||
+ IsEqualGUID(riid, &IID_IOleInPlaceSite))
*ppvObj = &This->IOleInPlaceSite_iface;
if (*ppvObj)
{
IOleClientSite_fnRequestNewObjectLayout
};
-/* IOleWindow interface */
-static HRESULT WINAPI IOleWindow_fnQueryInterface(IOleWindow *iface, REFIID riid, void **ppvObj)
+/* IOleInPlaceSite interface */
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnQueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppvObj)
{
- IOleClientSiteImpl *This = impl_from_IOleWindow(iface);
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
}
-static ULONG WINAPI IOleWindow_fnAddRef(IOleWindow *iface)
+static ULONG STDMETHODCALLTYPE IOleInPlaceSite_fnAddRef(IOleInPlaceSite *iface)
{
- IOleClientSiteImpl *This = impl_from_IOleWindow(iface);
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
return IOleClientSite_AddRef(&This->IOleClientSite_iface);
}
-static ULONG WINAPI IOleWindow_fnRelease(IOleWindow *iface)
+static ULONG STDMETHODCALLTYPE IOleInPlaceSite_fnRelease(IOleInPlaceSite *iface)
{
- IOleClientSiteImpl *This = impl_from_IOleWindow(iface);
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
return IOleClientSite_Release(&This->IOleClientSite_iface);
}
-static HRESULT WINAPI IOleWindow_fnContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode)
-{
- IOleClientSiteImpl *This = impl_from_IOleWindow(iface);
- FIXME("not implemented: (%p)->(%d)\n", This, fEnterMode);
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI IOleWindow_fnGetWindow(IOleWindow *iface, HWND *phwnd)
+static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnGetWindow(IOleInPlaceSite *iface, HWND *phwnd)
{
- IOleClientSiteImpl *This = impl_from_IOleWindow(iface);
+ IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
TRACE("(%p)->(%p)\n", This, phwnd);
return S_OK;
}
-static const IOleWindowVtbl olewinvt = {
- IOleWindow_fnQueryInterface,
- IOleWindow_fnAddRef,
- IOleWindow_fnRelease,
- IOleWindow_fnGetWindow,
- IOleWindow_fnContextSensitiveHelp
-};
-
-/* IOleInPlaceSite interface */
-static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnQueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppvObj)
-{
- IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
- return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
-}
-
-static ULONG STDMETHODCALLTYPE IOleInPlaceSite_fnAddRef(IOleInPlaceSite *iface)
-{
- IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
- return IOleClientSite_AddRef(&This->IOleClientSite_iface);
-}
-
-static ULONG STDMETHODCALLTYPE IOleInPlaceSite_fnRelease(IOleInPlaceSite *iface)
-{
- IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
- return IOleClientSite_Release(&This->IOleClientSite_iface);
-}
-
-static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnGetWindow(IOleInPlaceSite *iface, HWND *phwnd)
-{
- IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
- return IOleWindow_GetWindow(&This->IOleWindow_iface, phwnd);
-}
-
static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
- return IOleWindow_ContextSensitiveHelp(&This->IOleWindow_iface, fEnterMode);
+ FIXME("not implemented: (%p)->(%d)\n", This, fEnterMode);
+ return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE IOleInPlaceSite_fnCanInPlaceActivate(IOleInPlaceSite *iface)
return E_OUTOFMEMORY;
clientSite->IOleClientSite_iface.lpVtbl = &ocst;
- clientSite->IOleWindow_iface.lpVtbl = &olewinvt;
clientSite->IOleInPlaceSite_iface.lpVtbl = &olestvt;
clientSite->ref = 1;
clientSite->child.reole = reOle;