+ EM_REPLACESEL (proper style?) ANSI&Unicode
+ EM_SCROLL
+ EM_SCROLLCARET
- - EM_SELECTIONTYPE
+ + EM_SELECTIONTYPE
- EM_SETBIDIOPTIONS 3.0
+ EM_SETBKGNDCOLOR
+ EM_SETCHARFORMAT (partly done, no ANSI)
editor->rcFormat.right -= 1;
}
+static LONG ME_GetSelectionType(ME_TextEditor *editor)
+{
+ LONG sel_type = SEL_EMPTY;
+ LONG start, end;
+
+ ME_GetSelectionOfs(editor, &start, &end);
+ if (start == end)
+ sel_type = SEL_EMPTY;
+ else
+ {
+ LONG object_count = 0, character_count = 0;
+ int i;
+
+ for (i = 0; i < end - start; i++)
+ {
+ ME_Cursor cursor;
+
+ ME_CursorFromCharOfs(editor, start + i, &cursor);
+ if (cursor.pRun->member.run.reobj)
+ object_count++;
+ else
+ character_count++;
+ if (character_count >= 2 && object_count >= 2)
+ return (SEL_TEXT | SEL_MULTICHAR | SEL_OBJECT | SEL_MULTIOBJECT);
+ }
+ if (character_count)
+ {
+ sel_type |= SEL_TEXT;
+ if (character_count >= 2)
+ sel_type |= SEL_MULTICHAR;
+ }
+ if (object_count)
+ {
+ sel_type |= SEL_OBJECT;
+ if (object_count >= 2)
+ sel_type |= SEL_MULTIOBJECT;
+ }
+ }
+ return sel_type;
+}
+
static BOOL ME_ShowContextMenu(ME_TextEditor *editor, int x, int y)
{
CHARRANGE selrange;
HMENU menu;
- int seltype = 0;
+ int seltype;
+
if(!editor->lpOleCallback || !editor->hWnd)
return FALSE;
ME_GetSelectionOfs(editor, &selrange.cpMin, &selrange.cpMax);
- if(selrange.cpMin == selrange.cpMax)
- seltype |= SEL_EMPTY;
- else
- {
- /* FIXME: Handle objects */
- seltype |= SEL_TEXT;
- if(selrange.cpMax-selrange.cpMin > 1)
- seltype |= SEL_MULTICHAR;
- }
+ seltype = ME_GetSelectionType(editor);
if(SUCCEEDED(IRichEditOleCallback_GetContextMenu(editor->lpOleCallback, seltype, NULL, &selrange, &menu)))
{
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, editor->hwndParent, NULL);
ed->wheel_remain = 0;
list_init( &ed->style_list );
+ list_init( &ed->reobj_list );
OleInitialize(NULL);
return ed;
UNSUPPORTED_MSG(EM_GETTYPOGRAPHYOPTIONS)
UNSUPPORTED_MSG(EM_GETUNDONAME)
UNSUPPORTED_MSG(EM_GETWORDBREAKPROCEX)
- UNSUPPORTED_MSG(EM_SELECTIONTYPE)
UNSUPPORTED_MSG(EM_SETBIDIOPTIONS)
UNSUPPORTED_MSG(EM_SETEDITSTYLE)
UNSUPPORTED_MSG(EM_SETLANGOPTIONS)
ME_UpdateRepaint(editor, FALSE);
return len;
}
+ case EM_SELECTIONTYPE:
+ return ME_GetSelectionType(editor);
case EM_SETBKGNDCOLOR:
{
LRESULT lColor;
REOBJECT *lpreobject, DWORD dwFlags)
{
IRichEditOleImpl *This = impl_from_IRichEditOle(me);
- FIXME("stub %p\n",This);
- return E_NOTIMPL;
+ struct re_object *reobj = NULL;
+ LONG count = 0;
+
+ TRACE("(%p)->(%x, %p, %x)\n", This, iob, lpreobject, dwFlags);
+
+ if (!lpreobject || !lpreobject->cbStruct)
+ return E_INVALIDARG;
+
+ if (iob == REO_IOB_USE_CP)
+ {
+ ME_Cursor cursor;
+
+ TRACE("character offset: %d\n", lpreobject->cp);
+ ME_CursorFromCharOfs(This->editor, lpreobject->cp, &cursor);
+ if (!cursor.pRun->member.run.reobj)
+ return E_INVALIDARG;
+ else
+ reobj = cursor.pRun->member.run.reobj;
+ }
+ else
+ {
+ if (iob > IRichEditOle_GetObjectCount(me))
+ return E_INVALIDARG;
+ LIST_FOR_EACH_ENTRY(reobj, &This->editor->reobj_list, struct re_object, entry)
+ {
+ if (count == iob)
+ break;
+ count++;
+ }
+ }
+ ME_CopyReObject(lpreobject, &reobj->obj, dwFlags);
+ return S_OK;
}
static LONG WINAPI
IRichEditOle_fnGetObjectCount(IRichEditOle *me)
{
IRichEditOleImpl *This = impl_from_IRichEditOle(me);
- FIXME("stub %p\n",This);
- return 0;
+ TRACE("(%p)\n",This);
+ return list_count(&This->editor->reobj_list);
}
static HRESULT WINAPI
return E_NOTIMPL;
}
+static HRESULT textrange_moveend(ITextRange *range, LONG unit, LONG count, LONG *delta)
+{
+ LONG old_start, old_end, new_start, new_end;
+ HRESULT hr = S_OK;
+
+ if (!count)
+ {
+ if (delta)
+ *delta = 0;
+ return S_FALSE;
+ }
+
+ ITextRange_GetStart(range, &old_start);
+ ITextRange_GetEnd(range, &old_end);
+ switch (unit)
+ {
+ case tomStory:
+ if (count < 0)
+ new_start = new_end = 0;
+ else
+ {
+ new_start = old_start;
+ ITextRange_GetStoryLength(range, &new_end);
+ }
+ if (delta)
+ {
+ if (new_end < old_end)
+ *delta = -1;
+ else if (new_end == old_end)
+ *delta = 0;
+ else
+ *delta = 1;
+ }
+ break;
+ default:
+ FIXME("unit %d is not supported\n", unit);
+ return E_NOTIMPL;
+ }
+ if (new_end == old_end)
+ hr = S_FALSE;
+ ITextRange_SetStart(range, new_start);
+ ITextRange_SetEnd(range, new_end);
+
+ return hr;
+}
+
static HRESULT WINAPI ITextRange_fnMoveEnd(ITextRange *me, LONG unit, LONG count,
LONG *delta)
{
ITextRangeImpl *This = impl_from_ITextRange(me);
- FIXME("(%p)->(%d %d %p): stub\n", This, unit, count, delta);
+ TRACE("(%p)->(%d %d %p)\n", This, unit, count, delta);
if (!This->child.reole)
return CO_E_RELEASED;
- return E_NOTIMPL;
+ return textrange_moveend(me, unit, count, delta);
}
static HRESULT WINAPI ITextRange_fnMoveWhile(ITextRange *me, VARIANT *charset, LONG count,
static HRESULT WINAPI ITextSelection_fnGetFont(ITextSelection *me, ITextFont **font)
{
ITextSelectionImpl *This = impl_from_ITextSelection(me);
+ ITextRange *range = NULL;
+ HRESULT hr;
TRACE("(%p)->(%p)\n", This, font);
if (!font)
return E_INVALIDARG;
- return create_textfont((ITextRange*)me, NULL, font);
+ ITextSelection_QueryInterface(me, &IID_ITextRange, (void**)&range);
+ hr = create_textfont(range, NULL, font);
+ ITextRange_Release(range);
+ return hr;
}
static HRESULT WINAPI ITextSelection_fnSetFont(ITextSelection *me, ITextFont *font)
{
ITextSelectionImpl *This = impl_from_ITextSelection(me);
+ ITextRange *range = NULL;
TRACE("(%p)->(%p)\n", This, font);
if (!This->reOle)
return CO_E_RELEASED;
- textrange_set_font((ITextRange*)me, font);
+ ITextSelection_QueryInterface(me, &IID_ITextRange, (void**)&range);
+ textrange_set_font(range, font);
+ ITextRange_Release(range);
return S_OK;
}
static HRESULT WINAPI ITextSelection_fnGetPara(ITextSelection *me, ITextPara **para)
{
ITextSelectionImpl *This = impl_from_ITextSelection(me);
+ ITextRange *range = NULL;
+ HRESULT hr;
TRACE("(%p)->(%p)\n", This, para);
if (!para)
return E_INVALIDARG;
- return create_textpara((ITextRange*)me, para);
+ ITextSelection_QueryInterface(me, &IID_ITextRange, (void**)&range);
+ hr = create_textpara(range, para);
+ ITextRange_Release(range);
+ return hr;
}
static HRESULT WINAPI ITextSelection_fnSetPara(ITextSelection *me, ITextPara *para)
static HRESULT WINAPI ITextSelection_fnExpand(ITextSelection *me, LONG unit, LONG *delta)
{
ITextSelectionImpl *This = impl_from_ITextSelection(me);
+ ITextRange *range = NULL;
+ HRESULT hr;
TRACE("(%p)->(%d %p)\n", This, unit, delta);
if (!This->reOle)
return CO_E_RELEASED;
- return textrange_expand((ITextRange*)me, unit, delta);
+ ITextSelection_QueryInterface(me, &IID_ITextRange, (void**)&range);
+ hr = textrange_expand(range, unit, delta);
+ ITextRange_Release(range);
+ return hr;
}
static HRESULT WINAPI ITextSelection_fnGetIndex(ITextSelection *me, LONG unit, LONG *index)
LONG *delta)
{
ITextSelectionImpl *This = impl_from_ITextSelection(me);
+ ITextRange *range = NULL;
+ HRESULT hr;
- FIXME("(%p)->(%d %d %p): stub\n", This, unit, count, delta);
+ TRACE("(%p)->(%d %d %p)\n", This, unit, count, delta);
if (!This->reOle)
return CO_E_RELEASED;
- return E_NOTIMPL;
+ ITextSelection_QueryInterface(me, &IID_ITextRange, (void**)&range);
+ hr = textrange_moveend(range, unit, count, delta);
+ ITextRange_Release(range);
+ return hr;
}
static HRESULT WINAPI ITextSelection_fnMoveWhile(ITextSelection *me, VARIANT *charset, LONG count,
ENHMETAHEADER emh;
assert(run->nFlags & MERF_GRAPHICS);
- assert(run->ole_obj);
+ assert(run->reobj);
- if (run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0)
+ if (run->reobj->obj.sizel.cx != 0 || run->reobj->obj.sizel.cy != 0)
{
- convert_sizel(c, &run->ole_obj->sizel, pSize);
+ convert_sizel(c, &run->reobj->obj.sizel, pSize);
if (c->editor->nZoomNumerator != 0)
{
pSize->cx = MulDiv(pSize->cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
return;
}
- if (!run->ole_obj->poleobj)
+ if (!run->reobj->obj.poleobj)
{
pSize->cx = pSize->cy = 0;
return;
}
- if (IOleObject_QueryInterface(run->ole_obj->poleobj, &IID_IDataObject, (void**)&ido) != S_OK)
+ if (IOleObject_QueryInterface(run->reobj->obj.poleobj, &IID_IDataObject, (void**)&ido) != S_OK)
{
FIXME("Query Interface IID_IDataObject failed!\n");
pSize->cx = pSize->cy = 0;
RECT rc;
assert(run->nFlags & MERF_GRAPHICS);
- assert(run->ole_obj);
- if (IOleObject_QueryInterface(run->ole_obj->poleobj, &IID_IDataObject, (void**)&ido) != S_OK)
+ assert(run->reobj);
+ if (IOleObject_QueryInterface(run->reobj->obj.poleobj, &IID_IDataObject, (void**)&ido) != S_OK)
{
FIXME("Couldn't get interface\n");
return;
}
- has_size = run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0;
+ has_size = run->reobj->obj.sizel.cx != 0 || run->reobj->obj.sizel.cy != 0;
fmt.cfFormat = CF_BITMAP;
fmt.ptd = NULL;
fmt.dwAspect = DVASPECT_CONTENT;
old_bm = SelectObject(hMemDC, stgm.u.hBitmap);
if (has_size)
{
- convert_sizel(c, &run->ole_obj->sizel, &sz);
+ convert_sizel(c, &run->reobj->obj.sizel, &sz);
} else {
sz.cx = dibsect.dsBm.bmWidth;
sz.cy = dibsect.dsBm.bmHeight;
GetEnhMetaFileHeader(stgm.u.hEnhMetaFile, sizeof(emh), &emh);
if (has_size)
{
- convert_sizel(c, &run->ole_obj->sizel, &sz);
+ convert_sizel(c, &run->reobj->obj.sizel, &sz);
} else {
sz.cx = emh.rclBounds.right - emh.rclBounds.left;
sz.cy = emh.rclBounds.bottom - emh.rclBounds.top;
PatBlt(c->hDC, x, y - sz.cy, sz.cx, sz.cy, DSTINVERT);
}
-void ME_DeleteReObject(REOBJECT* reo)
+void ME_DeleteReObject(struct re_object *reobj)
{
- if (reo->poleobj) IOleObject_Release(reo->poleobj);
- if (reo->pstg) IStorage_Release(reo->pstg);
- if (reo->polesite) IOleClientSite_Release(reo->polesite);
- heap_free(reo);
+ if (reobj->obj.poleobj) IOleObject_Release(reobj->obj.poleobj);
+ if (reobj->obj.pstg) IStorage_Release(reobj->obj.pstg);
+ if (reobj->obj.polesite) IOleClientSite_Release(reobj->obj.polesite);
+ heap_free(reobj);
}
-void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src)
+void ME_CopyReObject(REOBJECT *dst, const REOBJECT *src, DWORD flags)
{
*dst = *src;
+ dst->poleobj = NULL;
+ dst->pstg = NULL;
+ dst->polesite = NULL;
- if (dst->poleobj) IOleObject_AddRef(dst->poleobj);
- if (dst->pstg) IStorage_AddRef(dst->pstg);
- if (dst->polesite) IOleClientSite_AddRef(dst->polesite);
+ if ((flags & REO_GETOBJ_POLEOBJ) && src->poleobj)
+ {
+ dst->poleobj = src->poleobj;
+ IOleObject_AddRef(dst->poleobj);
+ }
+ if ((flags & REO_GETOBJ_PSTG) && src->pstg)
+ {
+ dst->pstg = src->pstg;
+ IStorage_AddRef(dst->pstg);
+ }
+ if ((flags & REO_GETOBJ_POLESITE) && src->polesite)
+ {
+ dst->polesite = src->polesite;
+ IOleClientSite_AddRef(dst->polesite);
+ }
}
void ME_GetITextDocumentInterface(IRichEditOle *iface, LPVOID *ppvObj)