void ME_MouseMove(ME_TextEditor *editor, int x, int y) { ME_Cursor tmp_cursor; if (editor->nSelectionType == stDocument) return; x += editor->horz_si.nPos; y += editor->vert_si.nPos; tmp_cursor = editor->pCursors[0]; /* FIXME: do something with the return value of ME_FindPixelPos */ ME_FindPixelPos(editor, x, y, &tmp_cursor, &editor->bCaretAtEnd); ME_InvalidateSelection(editor); editor->pCursors[0] = tmp_cursor; ME_ExtendAnchorSelection(editor); if (editor->nSelectionType != stPosition && memcmp(&editor->pCursors[1], &editor->pCursors[3], sizeof(ME_Cursor))) { /* The scroll the cursor towards the other end, since it was the one * extended by ME_ExtendAnchorSelection */ ME_EnsureVisible(editor, &editor->pCursors[1]); } else { ME_EnsureVisible(editor, &editor->pCursors[0]); } ME_InvalidateSelection(editor); HideCaret(editor->hWnd); ME_ShowCaret(editor); ME_SendSelChange(editor); }
void ME_Repaint(ME_TextEditor *editor) { ME_Cursor *pCursor = &editor->pCursors[0]; if (ME_WrapMarkedParagraphs(editor)) { ME_UpdateScrollBar(editor); } if (editor->bRedraw) { ME_EnsureVisible(editor, pCursor->pRun); UpdateWindow(editor->hWnd); } }
static void ME_ArrowPageUp(ME_TextEditor *editor, ME_Cursor *pCursor) { ME_DisplayItem *pRun = pCursor->pRun; ME_DisplayItem *pLast, *p; int x, y, ys, yd, yp, yprev; ME_Cursor tmp_curs = *pCursor; x = ME_GetXForArrow(editor, pCursor); if (!pCursor->nOffset && editor->bCaretAtEnd) pRun = ME_FindItemBack(pRun, diRun); p = ME_FindItemBack(pRun, diStartRowOrParagraph); assert(p->type == diStartRow); yp = ME_FindItemBack(p, diParagraph)->member.para.nYPos; yprev = ys = y = yp + p->member.row.nYPos; yd = y - editor->sizeWindow.cy; pLast = p; do { p = ME_FindItemBack(p, diStartRowOrParagraph); if (!p) break; if (p->type == diParagraph) { /* crossing paragraphs */ if (p->member.para.prev_para == NULL) break; yp = p->member.para.prev_para->member.para.nYPos; continue; } y = yp + p->member.row.nYPos; if (y < yd) break; pLast = p; yprev = y; } while(1); pCursor->pRun = ME_FindRunInRow(editor, pLast, x, &pCursor->nOffset, &editor->bCaretAtEnd); ME_UpdateSelection(editor, &tmp_curs); if (yprev < editor->sizeWindow.cy) { ME_EnsureVisible(editor, ME_FindItemFwd(editor->pBuffer->pFirst, diRun)); ME_Repaint(editor); } else { ME_ScrollUp(editor, ys-yprev); } assert(pCursor->pRun); assert(pCursor->pRun->type == diRun); }
BOOL ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl) { int nCursor = 0; ME_Cursor *p = &editor->pCursors[nCursor]; ME_Cursor tmp_curs = *p; BOOL success = FALSE; ME_CheckCharOffsets(editor); switch(nVKey) { case VK_LEFT: editor->bCaretAtEnd = 0; if (ctrl) success = ME_MoveCursorWords(editor, &tmp_curs, -1); else success = ME_MoveCursorChars(editor, &tmp_curs, -1); break; case VK_RIGHT: editor->bCaretAtEnd = 0; if (ctrl) success = ME_MoveCursorWords(editor, &tmp_curs, +1); else success = ME_MoveCursorChars(editor, &tmp_curs, +1); break; case VK_UP: ME_MoveCursorLines(editor, &tmp_curs, -1); break; case VK_DOWN: ME_MoveCursorLines(editor, &tmp_curs, +1); break; case VK_PRIOR: ME_ArrowPageUp(editor, &tmp_curs); break; case VK_NEXT: ME_ArrowPageDown(editor, &tmp_curs); break; case VK_HOME: { if (ctrl) ME_ArrowCtrlHome(editor, &tmp_curs); else ME_ArrowHome(editor, &tmp_curs); editor->bCaretAtEnd = 0; break; } case VK_END: if (ctrl) ME_ArrowCtrlEnd(editor, &tmp_curs); else ME_ArrowEnd(editor, &tmp_curs); break; } if (!extend) editor->pCursors[1] = tmp_curs; *p = tmp_curs; ME_InvalidateSelection(editor); ME_Repaint(editor); HideCaret(editor->hWnd); ME_EnsureVisible(editor, &tmp_curs); ME_ShowCaret(editor); ME_SendSelChange(editor); return success; }