mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 22:47:19 +00:00
riched20: Move the marked paragraph list to a rbtree.
Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3a1aaf2655
commit
b466eefbdf
|
@ -3062,7 +3062,6 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
|
||||||
ed->bEmulateVersion10 = bEmulateVersion10;
|
ed->bEmulateVersion10 = bEmulateVersion10;
|
||||||
ed->styleFlags = 0;
|
ed->styleFlags = 0;
|
||||||
ed->exStyleFlags = 0;
|
ed->exStyleFlags = 0;
|
||||||
ed->first_marked_para = NULL;
|
|
||||||
ed->total_rows = 0;
|
ed->total_rows = 0;
|
||||||
ITextHost_TxGetPropertyBits(texthost,
|
ITextHost_TxGetPropertyBits(texthost,
|
||||||
(TXTBIT_RICHTEXT|TXTBIT_MULTILINE|
|
(TXTBIT_RICHTEXT|TXTBIT_MULTILINE|
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/heap.h"
|
#include "wine/heap.h"
|
||||||
#include "wine/list.h"
|
#include "wine/list.h"
|
||||||
|
#include "wine/rbtree.h"
|
||||||
|
|
||||||
#ifdef __ASM_USE_THISCALL_WRAPPER
|
#ifdef __ASM_USE_THISCALL_WRAPPER
|
||||||
extern const struct ITextHostVtbl itextHostStdcallVtbl DECLSPEC_HIDDEN;
|
extern const struct ITextHostVtbl itextHostStdcallVtbl DECLSPEC_HIDDEN;
|
||||||
|
@ -216,7 +217,7 @@ typedef struct tagME_Paragraph
|
||||||
struct para_num para_num;
|
struct para_num para_num;
|
||||||
ME_Run *eop_run; /* ptr to the end-of-para run */
|
ME_Run *eop_run; /* ptr to the end-of-para run */
|
||||||
struct tagME_DisplayItem *prev_para, *next_para;
|
struct tagME_DisplayItem *prev_para, *next_para;
|
||||||
struct tagME_DisplayItem *prev_marked, *next_marked;
|
struct wine_rb_entry marked_entry;
|
||||||
} ME_Paragraph;
|
} ME_Paragraph;
|
||||||
|
|
||||||
typedef struct tagME_Cell /* v4.1 */
|
typedef struct tagME_Cell /* v4.1 */
|
||||||
|
@ -431,7 +432,6 @@ typedef struct tagME_TextEditor
|
||||||
int imeStartIndex;
|
int imeStartIndex;
|
||||||
DWORD selofs; /* The size of the selection bar on the left side of control */
|
DWORD selofs; /* The size of the selection bar on the left side of control */
|
||||||
ME_SelectionType nSelectionType;
|
ME_SelectionType nSelectionType;
|
||||||
ME_DisplayItem *first_marked_para;
|
|
||||||
|
|
||||||
/* Track previous notified selection */
|
/* Track previous notified selection */
|
||||||
CHARRANGE notified_cr;
|
CHARRANGE notified_cr;
|
||||||
|
@ -445,6 +445,7 @@ typedef struct tagME_TextEditor
|
||||||
int wheel_remain;
|
int wheel_remain;
|
||||||
struct list style_list;
|
struct list style_list;
|
||||||
struct list reobj_list;
|
struct list reobj_list;
|
||||||
|
struct wine_rb_tree marked_paras;
|
||||||
} ME_TextEditor;
|
} ME_TextEditor;
|
||||||
|
|
||||||
typedef struct tagME_Context
|
typedef struct tagME_Context
|
||||||
|
|
|
@ -35,7 +35,6 @@ static ME_DisplayItem *make_para(ME_TextEditor *editor)
|
||||||
|
|
||||||
ME_SetDefaultParaFormat(editor, &item->member.para.fmt);
|
ME_SetDefaultParaFormat(editor, &item->member.para.fmt);
|
||||||
item->member.para.nFlags = MEPF_REWRAP;
|
item->member.para.nFlags = MEPF_REWRAP;
|
||||||
item->member.para.next_marked = item->member.para.prev_marked = NULL;
|
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
@ -74,74 +73,21 @@ int get_total_width(ME_TextEditor *editor)
|
||||||
return total_width;
|
return total_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int para_mark_compare( const void *key, const struct wine_rb_entry *entry )
|
||||||
|
{
|
||||||
|
ME_Paragraph *para = WINE_RB_ENTRY_VALUE( entry, ME_Paragraph, marked_entry );
|
||||||
|
|
||||||
|
return *(int *)key - para->nCharOfs;
|
||||||
|
}
|
||||||
|
|
||||||
void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para )
|
void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para )
|
||||||
{
|
{
|
||||||
ME_DisplayItem *di = para_get_di( para );
|
wine_rb_remove_key( &editor->marked_paras, ¶->nCharOfs );
|
||||||
ME_DisplayItem *head = editor->first_marked_para;
|
|
||||||
|
|
||||||
if (!di->member.para.next_marked && !di->member.para.prev_marked)
|
|
||||||
{
|
|
||||||
if (di == head)
|
|
||||||
editor->first_marked_para = NULL;
|
|
||||||
}
|
|
||||||
else if (di->member.para.next_marked && di->member.para.prev_marked)
|
|
||||||
{
|
|
||||||
di->member.para.prev_marked->member.para.next_marked = di->member.para.next_marked;
|
|
||||||
di->member.para.next_marked->member.para.prev_marked = di->member.para.prev_marked;
|
|
||||||
di->member.para.prev_marked = di->member.para.next_marked = NULL;
|
|
||||||
}
|
|
||||||
else if (di->member.para.next_marked)
|
|
||||||
{
|
|
||||||
assert(di == editor->first_marked_para);
|
|
||||||
editor->first_marked_para = di->member.para.next_marked;
|
|
||||||
di->member.para.next_marked->member.para.prev_marked = NULL;
|
|
||||||
di->member.para.next_marked = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
di->member.para.prev_marked->member.para.next_marked = NULL;
|
|
||||||
di->member.para.prev_marked = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para )
|
void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para )
|
||||||
{
|
{
|
||||||
ME_DisplayItem *di = para_get_di( para );
|
wine_rb_put( &editor->marked_paras, ¶->nCharOfs, ¶->marked_entry );
|
||||||
ME_DisplayItem *iter = editor->first_marked_para;
|
|
||||||
|
|
||||||
if (!iter)
|
|
||||||
{
|
|
||||||
editor->first_marked_para = di;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while (iter)
|
|
||||||
{
|
|
||||||
if (iter == di)
|
|
||||||
return;
|
|
||||||
else if (di->member.para.nCharOfs < iter->member.para.nCharOfs)
|
|
||||||
{
|
|
||||||
if (iter == editor->first_marked_para)
|
|
||||||
editor->first_marked_para = di;
|
|
||||||
di->member.para.next_marked = iter;
|
|
||||||
iter->member.para.prev_marked = di;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (di->member.para.nCharOfs >= iter->member.para.nCharOfs)
|
|
||||||
{
|
|
||||||
if (!iter->member.para.next_marked || di->member.para.nCharOfs < iter->member.para.next_marked->member.para.nCharOfs)
|
|
||||||
{
|
|
||||||
if (iter->member.para.next_marked)
|
|
||||||
{
|
|
||||||
di->member.para.next_marked = iter->member.para.next_marked;
|
|
||||||
iter->member.para.next_marked->member.para.prev_marked = di;
|
|
||||||
}
|
|
||||||
di->member.para.prev_marked = iter;
|
|
||||||
iter->member.para.next_marked = di;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iter = iter->member.para.next_marked;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ME_Run *para_first_run( ME_Paragraph *para )
|
ME_Run *para_first_run( ME_Paragraph *para )
|
||||||
|
@ -229,6 +175,7 @@ void ME_MakeFirstParagraph(ME_TextEditor *editor)
|
||||||
|
|
||||||
text->pLast->member.para.nCharOfs = editor->bEmulateVersion10 ? 2 : 1;
|
text->pLast->member.para.nCharOfs = editor->bEmulateVersion10 ? 2 : 1;
|
||||||
|
|
||||||
|
wine_rb_init( &editor->marked_paras, para_mark_compare );
|
||||||
para_mark_add( editor, ¶->member.para );
|
para_mark_add( editor, ¶->member.para );
|
||||||
ME_DestroyContext(&c);
|
ME_DestroyContext(&c);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1029,19 +1029,22 @@ static void adjust_para_y(ME_Paragraph *para, ME_Context *c, ME_DisplayItem *rep
|
||||||
BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
|
BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
|
||||||
{
|
{
|
||||||
ME_Paragraph *para, *next;
|
ME_Paragraph *para, *next;
|
||||||
|
struct wine_rb_entry *entry, *next_entry;
|
||||||
ME_Context c;
|
ME_Context c;
|
||||||
int totalWidth = editor->nTotalWidth, diff = 0, prev_width;
|
int totalWidth = editor->nTotalWidth, prev_width;
|
||||||
ME_DisplayItem *repaint_start = NULL, *repaint_end = NULL;
|
ME_DisplayItem *repaint_start = NULL, *repaint_end = NULL;
|
||||||
|
|
||||||
if (!editor->first_marked_para)
|
if (!editor->marked_paras.root) return FALSE;
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
|
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
|
||||||
|
|
||||||
para = &editor->first_marked_para->member.para;
|
entry = wine_rb_head( editor->marked_paras.root );
|
||||||
c.pt = para->pt;
|
while (entry)
|
||||||
while (para_get_di( para ) != editor->pBuffer->pLast)
|
|
||||||
{
|
{
|
||||||
|
para = WINE_RB_ENTRY_VALUE( entry, ME_Paragraph, marked_entry );
|
||||||
|
next_entry = wine_rb_next( entry );
|
||||||
|
|
||||||
|
c.pt = para->pt;
|
||||||
prev_width = para->nWidth;
|
prev_width = para->nWidth;
|
||||||
ME_WrapTextParagraph( editor, &c, para );
|
ME_WrapTextParagraph( editor, &c, para );
|
||||||
if (prev_width == totalWidth && para->nWidth < totalWidth)
|
if (prev_width == totalWidth && para->nWidth < totalWidth)
|
||||||
|
@ -1056,11 +1059,10 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
|
||||||
|
|
||||||
if (para->next_para)
|
if (para->next_para)
|
||||||
{
|
{
|
||||||
diff = c.pt.y - para->next_para->member.para.pt.y;
|
if (c.pt.y != para->next_para->member.para.pt.y)
|
||||||
if (diff)
|
|
||||||
{
|
{
|
||||||
next = para;
|
next = para;
|
||||||
while (next->next_para && next != ¶->next_marked->member.para &&
|
while (next->next_para && &next->marked_entry != next_entry &&
|
||||||
next != &editor->pBuffer->pLast->member.para)
|
next != &editor->pBuffer->pLast->member.para)
|
||||||
{
|
{
|
||||||
ME_MarkRepaintEnd(next->next_para, &repaint_start, &repaint_end);
|
ME_MarkRepaintEnd(next->next_para, &repaint_start, &repaint_end);
|
||||||
|
@ -1070,26 +1072,15 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (para->next_marked)
|
entry = next_entry;
|
||||||
{
|
|
||||||
ME_Paragraph *tmp = para;
|
|
||||||
para = ¶->next_marked->member.para;
|
|
||||||
para_mark_remove( editor, tmp );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
para_mark_remove( editor, para );
|
|
||||||
para = &editor->pBuffer->pLast->member.para;
|
|
||||||
}
|
|
||||||
c.pt.y = para->pt.y;
|
|
||||||
}
|
}
|
||||||
|
wine_rb_clear( &editor->marked_paras, NULL, NULL );
|
||||||
|
|
||||||
editor->sizeWindow.cx = c.rcView.right-c.rcView.left;
|
editor->sizeWindow.cx = c.rcView.right-c.rcView.left;
|
||||||
editor->sizeWindow.cy = c.rcView.bottom-c.rcView.top;
|
editor->sizeWindow.cy = c.rcView.bottom-c.rcView.top;
|
||||||
|
|
||||||
editor->nTotalLength = c.pt.y;
|
editor->nTotalLength = editor->pBuffer->pLast->member.para.pt.y;
|
||||||
editor->nTotalWidth = totalWidth;
|
editor->nTotalWidth = totalWidth;
|
||||||
editor->pBuffer->pLast->member.para.pt.x = 0;
|
|
||||||
editor->pBuffer->pLast->member.para.pt.y = c.pt.y;
|
|
||||||
|
|
||||||
ME_DestroyContext(&c);
|
ME_DestroyContext(&c);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue