static BOOL ME_ReturnFoundPos(ME_TextEditor *editor, ME_DisplayItem *found, ME_Cursor *result, int rx, BOOL isExact) { assert(found); assert(found->type == diRun); if ((found->member.run.nFlags & MERF_ENDPARA) || rx < 0) rx = 0; result->pRun = found; result->nOffset = ME_CharFromPointCursor(editor, rx, &found->member.run); if (editor->pCursors[0].nOffset == found->member.run.strText->nLen && rx) { result->pRun = ME_FindItemFwd(editor->pCursors[0].pRun, diRun); result->nOffset = 0; } return isExact; }
static ME_DisplayItem *ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow, int x, int *pOffset, int *pbCaretAtEnd) { ME_DisplayItem *pNext, *pLastRun; pNext = ME_FindItemFwd(pRow, diRunOrStartRow); assert(pNext->type == diRun); pLastRun = pNext; *pbCaretAtEnd = FALSE; do { int run_x = pNext->member.run.pt.x; int width = pNext->member.run.nWidth; if (x < run_x) { if (pOffset) *pOffset = 0; return pNext; } if (x >= run_x && x < run_x+width) { int ch = ME_CharFromPointCursor(editor, x-run_x, &pNext->member.run); ME_String *s = pNext->member.run.strText; if (ch < s->nLen) { if (pOffset) *pOffset = ch; return pNext; } } pLastRun = pNext; pNext = ME_FindItemFwd(pNext, diRunOrStartRow); } while(pNext && pNext->type == diRun); if ((pLastRun->member.run.nFlags & MERF_ENDPARA) == 0) { pNext = ME_FindItemFwd(pNext, diRun); if (pbCaretAtEnd) *pbCaretAtEnd = 1; if (pOffset) *pOffset = 0; return pNext; } else { if (pbCaretAtEnd) *pbCaretAtEnd = 0; if (pOffset) *pOffset = 0; return pLastRun; } }
static void 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; if (is_eol) *is_eol = 0; /* find paragraph */ for (; p != editor->pBuffer->pLast; p = p->member.para.next_para) { assert(p->type == diParagraph); if (y < p->member.para.nYPos + p->member.para.nHeight) { y -= p->member.para.nYPos; p = ME_FindItemFwd(p, diStartRow); break; } } /* find row */ for (; p != editor->pBuffer->pLast; ) { ME_DisplayItem *pp; assert(p->type == diStartRow); if (y < p->member.row.nYPos + p->member.row.nHeight) { p = ME_FindItemFwd(p, diRun); break; } pp = ME_FindItemFwd(p, diStartRowOrParagraphOrEnd); if (pp->type != diStartRow) { p = ME_FindItemFwd(p, diRun); break; } p = pp; } 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) { found_here: assert(p->type == diRun); if ((p->member.run.nFlags & MERF_ENDPARA) || rx < 0) rx = 0; result->pRun = p; result->nOffset = ME_CharFromPointCursor(editor, rx, &p->member.run); if (editor->pCursors[0].nOffset == p->member.run.strText->nLen && rx) { result->pRun = ME_FindItemFwd(editor->pCursors[0].pRun, diRun); result->nOffset = 0; } return; } break; case diStartRow: p = ME_FindItemFwd(p, diRun); if (is_eol) *is_eol = 1; rx = 0; /* FIXME not sure */ goto found_here; case diParagraph: case diTextEnd: rx = 0; /* FIXME not sure */ p = last; goto found_here; default: assert(0); } last = p; } result->pRun = ME_FindItemBack(p, diRun); result->nOffset = 0; assert(result->pRun->member.run.nFlags & MERF_ENDPARA); }
int 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; int rx = 0; if (is_eol) *is_eol = 0; while(p != editor->pBuffer->pLast) { if (p->type == diParagraph) { int ry = y - p->member.para.nYPos; if (ry < 0) { result->pRun = ME_FindItemFwd(p, diRun); result->nOffset = 0; return 0; } if (ry >= p->member.para.nHeight) { p = p->member.para.next_para; continue; } p = ME_FindItemFwd(p, diStartRow); y = ry; continue; } if (p->type == diStartRow) { int ry = y - p->member.row.nYPos; if (ry < 0) return 0; if (ry >= p->member.row.nHeight) { p = ME_FindItemFwd(p, diStartRowOrParagraphOrEnd); if (p->type != diStartRow) return 0; continue; } p = ME_FindItemFwd(p, diRun); continue; } if (p->type == diRun) { ME_DisplayItem *pp; rx = x - p->member.run.pt.x; if (rx < 0) rx = 0; if (rx >= p->member.run.nWidth) /* not this run yet... find next item */ { pp = p; do { p = p->next; if (p->type == diRun) { rx = x - p->member.run.pt.x; goto continue_search; } if (p->type == diStartRow) { p = ME_FindItemFwd(p, diRun); if (is_eol) *is_eol = 1; rx = 0; /* FIXME not sure */ goto found_here; } if (p->type == diParagraph || p->type == diTextEnd) { rx = 0; /* FIXME not sure */ p = pp; goto found_here; } } while(1); continue; } found_here: if (p->member.run.nFlags & MERF_ENDPARA) rx = 0; result->pRun = p; result->nOffset = ME_CharFromPointCursor(editor, rx, &p->member.run); if (editor->pCursors[0].nOffset == p->member.run.strText->nLen && rx) { result->pRun = ME_FindItemFwd(editor->pCursors[0].pRun, diRun); result->nOffset = 0; } return 1; } assert(0); continue_search: ; } result->pRun = ME_FindItemBack(p, diRun); result->nOffset = 0; assert(result->pRun->member.run.nFlags & MERF_ENDPARA); return 0; }