riched20: Rewrite ME_FindPixelPos to use ME_GetRunInRow.
This commit is contained in:
parent
87163410e5
commit
a6369b8332
|
@ -865,22 +865,48 @@ static ME_DisplayItem* ME_FindPixelPosInTableRow(int x, int y,
|
|||
return para;
|
||||
}
|
||||
|
||||
static BOOL ME_ReturnFoundPos(ME_TextEditor *editor, ME_DisplayItem *found,
|
||||
ME_Cursor *result, int rx, BOOL isExact)
|
||||
static BOOL ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow,
|
||||
int x, ME_Cursor *cursor, int *pbCaretAtEnd)
|
||||
{
|
||||
assert(found);
|
||||
assert(found->type == diRun);
|
||||
if ((found->member.run.nFlags & MERF_ENDPARA) || rx < 0)
|
||||
rx = 0;
|
||||
result->pRun = found;
|
||||
result->nOffset = ME_CharFromPoint(editor, rx, &found->member.run, TRUE);
|
||||
if (result->nOffset == found->member.run.len && rx)
|
||||
ME_DisplayItem *pNext, *pLastRun;
|
||||
pNext = ME_FindItemFwd(pRow, diRunOrStartRow);
|
||||
assert(pNext->type == diRun);
|
||||
if (pbCaretAtEnd) *pbCaretAtEnd = FALSE;
|
||||
cursor->nOffset = 0;
|
||||
do {
|
||||
int run_x = pNext->member.run.pt.x;
|
||||
int width = pNext->member.run.nWidth;
|
||||
if (x < run_x)
|
||||
{
|
||||
result->pRun = ME_FindItemFwd(result->pRun, diRun);
|
||||
result->nOffset = 0;
|
||||
cursor->pRun = pNext;
|
||||
cursor->pPara = ME_GetParagraph( cursor->pRun );
|
||||
return FALSE;
|
||||
}
|
||||
result->pPara = ME_GetParagraph(result->pRun);
|
||||
return isExact;
|
||||
if (x >= run_x && x < run_x+width)
|
||||
{
|
||||
int ch = ME_CharFromPoint(editor, x-run_x, &pNext->member.run, TRUE);
|
||||
if (ch < pNext->member.run.len)
|
||||
{
|
||||
cursor->nOffset = ch;
|
||||
cursor->pRun = pNext;
|
||||
cursor->pPara = ME_GetParagraph( cursor->pRun );
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
pLastRun = pNext;
|
||||
pNext = ME_FindItemFwd(pNext, diRunOrStartRow);
|
||||
} while(pNext && pNext->type == diRun);
|
||||
|
||||
if ((pLastRun->member.run.nFlags & MERF_ENDPARA) == 0)
|
||||
{
|
||||
cursor->pRun = ME_FindItemFwd(pNext, diRun);
|
||||
if (pbCaretAtEnd) *pbCaretAtEnd = TRUE;
|
||||
}
|
||||
else
|
||||
cursor->pRun = pLastRun;
|
||||
|
||||
cursor->pPara = ME_GetParagraph( cursor->pRun );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Finds the run and offset from the pixel position.
|
||||
|
@ -895,8 +921,6 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
|
|||
ME_Cursor *result, BOOL *is_eol)
|
||||
{
|
||||
ME_DisplayItem *p = editor->pBuffer->pFirst->member.para.next_para;
|
||||
ME_DisplayItem *last = NULL;
|
||||
int rx = 0;
|
||||
BOOL isExact = TRUE;
|
||||
|
||||
x -= editor->rcFormat.left;
|
||||
|
@ -925,17 +949,9 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
|
|||
{
|
||||
ME_DisplayItem *pp;
|
||||
assert(p->type == diStartRow);
|
||||
if (y < p->member.row.pt.y + p->member.row.nHeight)
|
||||
{
|
||||
p = ME_FindItemFwd(p, diRun);
|
||||
break;
|
||||
}
|
||||
if (y < p->member.row.pt.y + p->member.row.nHeight) break;
|
||||
pp = ME_FindItemFwd(p, diStartRow);
|
||||
if (!pp)
|
||||
{
|
||||
p = ME_FindItemFwd(p, diRun);
|
||||
break;
|
||||
}
|
||||
if (!pp) break;
|
||||
p = pp;
|
||||
}
|
||||
if (p == editor->pBuffer->pLast)
|
||||
|
@ -945,40 +961,14 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
|
|||
* determine the offset closest to the pixel position. */
|
||||
isExact = FALSE;
|
||||
p = ME_FindItemBack(p, diStartRow);
|
||||
if (p != NULL){
|
||||
p = ME_FindItemFwd(p, diRun);
|
||||
}
|
||||
else
|
||||
{
|
||||
p = editor->pBuffer->pLast;
|
||||
}
|
||||
}
|
||||
for (; p != editor->pBuffer->pLast; p = p->next)
|
||||
{
|
||||
switch (p->type)
|
||||
{
|
||||
case diRun:
|
||||
rx = x - p->member.run.pt.x;
|
||||
if (rx < p->member.run.nWidth)
|
||||
return ME_ReturnFoundPos(editor, p, result, rx, isExact);
|
||||
break;
|
||||
case diStartRow:
|
||||
isExact = FALSE;
|
||||
p = ME_FindItemFwd(p, diRun);
|
||||
if (is_eol) *is_eol = 1;
|
||||
rx = 0; /* FIXME not sure */
|
||||
return ME_ReturnFoundPos(editor, p, result, rx, isExact);
|
||||
case diCell:
|
||||
case diParagraph:
|
||||
case diTextEnd:
|
||||
isExact = FALSE;
|
||||
rx = 0; /* FIXME not sure */
|
||||
p = last;
|
||||
return ME_ReturnFoundPos(editor, p, result, rx, isExact);
|
||||
default: assert(0);
|
||||
}
|
||||
last = p;
|
||||
if (!p) p = editor->pBuffer->pLast;
|
||||
}
|
||||
|
||||
assert( p->type == diStartRow || p == editor->pBuffer->pLast );
|
||||
|
||||
if( p->type == diStartRow )
|
||||
return ME_FindRunInRow( editor, p, x, result, is_eol ) && isExact;
|
||||
|
||||
result->pRun = ME_FindItemBack(p, diRun);
|
||||
result->pPara = ME_GetParagraph(result->pRun);
|
||||
result->nOffset = 0;
|
||||
|
@ -1177,50 +1167,6 @@ void ME_MouseMove(ME_TextEditor *editor, int x, int y)
|
|||
ME_SendSelChange(editor);
|
||||
}
|
||||
|
||||
static BOOL ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow,
|
||||
int x, ME_Cursor *cursor, int *pbCaretAtEnd)
|
||||
{
|
||||
ME_DisplayItem *pNext, *pLastRun;
|
||||
pNext = ME_FindItemFwd(pRow, diRunOrStartRow);
|
||||
assert(pNext->type == diRun);
|
||||
if (pbCaretAtEnd) *pbCaretAtEnd = FALSE;
|
||||
cursor->nOffset = 0;
|
||||
do {
|
||||
int run_x = pNext->member.run.pt.x;
|
||||
int width = pNext->member.run.nWidth;
|
||||
if (x < run_x)
|
||||
{
|
||||
cursor->pRun = pNext;
|
||||
cursor->pPara = ME_GetParagraph( cursor->pRun );
|
||||
return FALSE;
|
||||
}
|
||||
if (x >= run_x && x < run_x+width)
|
||||
{
|
||||
int ch = ME_CharFromPoint(editor, x-run_x, &pNext->member.run, TRUE);
|
||||
if (ch < pNext->member.run.len)
|
||||
{
|
||||
cursor->nOffset = ch;
|
||||
cursor->pRun = pNext;
|
||||
cursor->pPara = ME_GetParagraph( cursor->pRun );
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
pLastRun = pNext;
|
||||
pNext = ME_FindItemFwd(pNext, diRunOrStartRow);
|
||||
} while(pNext && pNext->type == diRun);
|
||||
|
||||
if ((pLastRun->member.run.nFlags & MERF_ENDPARA) == 0)
|
||||
{
|
||||
cursor->pRun = ME_FindItemFwd(pNext, diRun);
|
||||
if (pbCaretAtEnd) *pbCaretAtEnd = TRUE;
|
||||
}
|
||||
else
|
||||
cursor->pRun = pLastRun;
|
||||
|
||||
cursor->pPara = ME_GetParagraph( cursor->pRun );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int ME_GetXForArrow(ME_TextEditor *editor, ME_Cursor *pCursor)
|
||||
{
|
||||
ME_DisplayItem *pRun = pCursor->pRun;
|
||||
|
|
Loading…
Reference in New Issue