void ME_LButtonDown(ME_TextEditor *editor, int x, int y) { ME_Cursor tmp_cursor; int is_selection = 0; editor->nUDArrowX = -1; y += ME_GetYScrollPos(editor); tmp_cursor = editor->pCursors[0]; is_selection = ME_IsSelection(editor); ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd); if (GetKeyState(VK_SHIFT)>=0) { editor->pCursors[1] = editor->pCursors[0]; } else { if (!is_selection) { editor->pCursors[1] = tmp_cursor; is_selection = 1; } } ME_InvalidateSelection(editor); HideCaret(editor->hWnd); ME_MoveCaret(editor); ShowCaret(editor->hWnd); ME_ClearTempStyle(editor); ME_SendSelChange(editor); }
/** * Commits preceding changes into a transaction that can be undone together. * * This should be called after all the changes occur associated with an event * so that the group of changes can be undone atomically as a transaction. * * This will have no effect the undo mode is set to ignore changes, or if no * changes preceded calling this function before the last time it was called. * * This can also be used to conclude a coalescing transaction (used for grouping * typed characters). */ void ME_CommitUndo(ME_TextEditor *editor) { if (editor->nUndoMode == umIgnore) return; assert(editor->nUndoMode == umAddToUndo); /* no transactions, no need to commit */ if (!editor->pUndoStack) return; /* no need to commit empty transactions */ if (editor->pUndoStack->type == diUndoEndTransaction) return; if (editor->pUndoStack->type == diUndoPotentialEndTransaction) { /* Previous transaction was as a result of characters typed, * so the end of this transaction is confirmed. */ editor->pUndoStack->type = diUndoEndTransaction; return; } ME_AddUndoItem(editor, diUndoEndTransaction, NULL); ME_SendSelChange(editor); }
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_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow) { /* FIXME: Shift tab should move to the previous cell. */ ME_Cursor fromCursor, toCursor; ME_InvalidateSelection(editor); { int from, to; from = ME_GetCursorOfs(editor, 0); to = ME_GetCursorOfs(editor, 1); if (from <= to) { fromCursor = editor->pCursors[0]; toCursor = editor->pCursors[1]; } else { fromCursor = editor->pCursors[1]; toCursor = editor->pCursors[0]; } } if (!editor->bEmulateVersion10) /* v4.1 */ { if (!ME_IsInTable(toCursor.pRun)) { editor->pCursors[0] = toCursor; editor->pCursors[1] = toCursor; } else { ME_SelectOrInsertNextCell(editor, toCursor.pRun); } } else { /* v1.0 - 3.0 */ if (!ME_IsInTable(fromCursor.pRun)) { editor->pCursors[0] = fromCursor; editor->pCursors[1] = fromCursor; /* FIXME: For some reason the caret is shown at the start of the * previous paragraph in v1.0 to v3.0, and bCaretAtEnd only works * within the paragraph for wrapped lines. */ if (ME_FindItemBack(fromCursor.pRun, diRun)) editor->bCaretAtEnd = TRUE; } else if ((bSelectedRow || !ME_IsInTable(toCursor.pRun))) { ME_SelectOrInsertNextCell(editor, fromCursor.pRun); } else { if (ME_IsSelection(editor) && !toCursor.nOffset) { ME_DisplayItem *run; run = ME_FindItemBack(toCursor.pRun, diRunOrParagraphOrEnd); if (run->type == diRun && run->member.run.nFlags & MERF_TAB) ME_SelectOrInsertNextCell(editor, run); else ME_SelectOrInsertNextCell(editor, toCursor.pRun); } else { ME_SelectOrInsertNextCell(editor, toCursor.pRun); } } } ME_InvalidateSelection(editor); ME_Repaint(editor); HideCaret(editor->hWnd); ME_ShowCaret(editor); ME_SendSelChange(editor); }
void ME_SelectWord(ME_TextEditor *editor) { if (!(editor->pCursors[0].pRun->member.run.nFlags & MERF_ENDPARA)) ME_MoveCursorWords(editor, &editor->pCursors[0], -1); ME_MoveCursorWords(editor, &editor->pCursors[1], +1); ME_InvalidateSelection(editor); ME_SendSelChange(editor); }
void ME_UpdateRepaint(ME_TextEditor *editor) { /* InvalidateRect(editor->hWnd, NULL, TRUE); */ ME_SendOldNotify(editor, EN_CHANGE); ME_Repaint(editor); ME_SendOldNotify(editor, EN_UPDATE); ME_SendSelChange(editor); }
/* FIXME this is temporary, just to have something to test how bad graphics handler is */ void ME_InsertGraphicsFromCursor(ME_TextEditor *editor, int nCursor) { ME_Style *pStyle = ME_GetInsertStyle(editor, nCursor); WCHAR space = ' '; /* FIXME no no no */ if (ME_IsSelection(editor)) ME_DeleteSelection(editor); ME_InternalInsertTextFromCursor(editor, nCursor, &space, 1, pStyle, MERF_GRAPHICS); ME_SendSelChange(editor); }
void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor) { ME_Style *pStyle = ME_GetInsertStyle(editor, nCursor); ME_DisplayItem *di; WCHAR space = ' '; /* FIXME no no no */ if (ME_IsSelection(editor)) ME_DeleteSelection(editor); di = ME_InternalInsertTextFromCursor(editor, nCursor, &space, 1, pStyle, MERF_ENDROW); ME_SendSelChange(editor); }
void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor) { ME_Style *pStyle = ME_GetInsertStyle(editor, nCursor); ME_DisplayItem *di; WCHAR space = ' '; /* FIXME no no no */ if (ME_IsSelection(editor)) ME_DeleteSelection(editor); di = ME_InternalInsertTextFromCursor(editor, nCursor, &space, 1, pStyle, MERF_GRAPHICS); di->member.run.ole_obj = ALLOC_OBJ(*reo); ME_CopyReObject(di->member.run.ole_obj, reo); ME_SendSelChange(editor); }
void ME_CommitUndo(ME_TextEditor *editor) { if (editor->nUndoMode == umIgnore) return; assert(editor->nUndoMode == umAddToUndo); /* no transactions, no need to commit */ if (!editor->pUndoStack) return; /* no need to commit empty transactions */ if (editor->pUndoStack->type == diUndoEndTransaction) return; ME_AddUndoItem(editor, diUndoEndTransaction, NULL); ME_SendSelChange(editor); }
void ME_MouseMove(ME_TextEditor *editor, int x, int y) { ME_Cursor tmp_cursor; y += ME_GetYScrollPos(editor); tmp_cursor = editor->pCursors[0]; /* FIXME: do something with the return value of ME_FindPixelPos */ if (!editor->linesel) ME_FindPixelPos(editor, x, y, &tmp_cursor, &editor->bCaretAtEnd); else ME_FindPixelPos(editor, (y > editor->sely) * editor->rcFormat.right, y, &tmp_cursor, &editor->bCaretAtEnd); if (!memcmp(&tmp_cursor, editor->pCursors, sizeof(tmp_cursor))) return; ME_InvalidateSelection(editor); if (!editor->linesel) editor->pCursors[0] = tmp_cursor; else if (!memcmp(&tmp_cursor, editor->pCursors+2, sizeof(tmp_cursor)) || !memcmp(&tmp_cursor, editor->pCursors+3, sizeof(tmp_cursor))) { editor->pCursors[0] = editor->pCursors[2]; editor->pCursors[1] = editor->pCursors[3]; } else if (y < editor->sely) { editor->pCursors[0] = tmp_cursor; editor->pCursors[1] = editor->pCursors[2]; } else { editor->pCursors[0] = tmp_cursor; editor->pCursors[1] = editor->pCursors[3]; } HideCaret(editor->hWnd); ME_MoveCaret(editor); ME_InvalidateSelection(editor); ShowCaret(editor->hWnd); ME_SendSelChange(editor); }
void ME_MouseMove(ME_TextEditor *editor, int x, int y) { ME_Cursor tmp_cursor; y += ME_GetYScrollPos(editor); tmp_cursor = editor->pCursors[0]; /* FIXME: do something with the return value of ME_FindPixelPos */ ME_FindPixelPos(editor, x, y, &tmp_cursor, &editor->bCaretAtEnd); if (tmp_cursor.pRun == editor->pCursors[0].pRun && tmp_cursor.nOffset == editor->pCursors[0].nOffset) return; ME_InvalidateSelection(editor); editor->pCursors[0] = tmp_cursor; HideCaret(editor->hWnd); ME_MoveCaret(editor); ME_InvalidateSelection(editor); ShowCaret(editor->hWnd); ME_SendSelChange(editor); }
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; }
void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum) { ME_Cursor tmp_cursor; int is_selection = 0; BOOL is_shift; editor->nUDArrowX = -1; x += editor->horz_si.nPos; y += editor->vert_si.nPos; tmp_cursor = editor->pCursors[0]; is_selection = ME_IsSelection(editor); is_shift = GetKeyState(VK_SHIFT) < 0; ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd); if (x >= editor->rcFormat.left || is_shift) { if (clickNum > 1) { editor->pCursors[1] = editor->pCursors[0]; if (is_shift) { if (x >= editor->rcFormat.left) ME_SelectByType(editor, stWord); else ME_SelectByType(editor, stParagraph); } else if (clickNum % 2 == 0) { ME_SelectByType(editor, stWord); } else { ME_SelectByType(editor, stParagraph); } } else if (!is_shift) { editor->nSelectionType = stPosition; editor->pCursors[1] = editor->pCursors[0]; } else if (!is_selection) { editor->nSelectionType = stPosition; editor->pCursors[1] = tmp_cursor; } else if (editor->nSelectionType != stPosition) { ME_ExtendAnchorSelection(editor); } } else { if (clickNum < 2) { ME_SelectByType(editor, stLine); } else if (clickNum % 2 == 0 || is_shift) { ME_SelectByType(editor, stParagraph); } else { ME_SelectByType(editor, stDocument); } } ME_InvalidateSelection(editor); HideCaret(editor->hWnd); ME_ShowCaret(editor); ME_ClearTempStyle(editor); ME_SendSelChange(editor); }
void ME_LButtonDown(ME_TextEditor *editor, int x, int y) { ME_Cursor tmp_cursor; int is_selection = 0; editor->nUDArrowX = -1; y += ME_GetYScrollPos(editor); tmp_cursor = editor->pCursors[0]; is_selection = ME_IsSelection(editor); if (x >= editor->selofs) { ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd); if (GetKeyState(VK_SHIFT)>=0) { editor->pCursors[1] = editor->pCursors[0]; } else if (!is_selection) { editor->pCursors[1] = tmp_cursor; is_selection = 1; } ME_InvalidateSelection(editor); HideCaret(editor->hWnd); ME_MoveCaret(editor); ShowCaret(editor->hWnd); ME_ClearTempStyle(editor); ME_SendSelChange(editor); } else { ME_DisplayItem *pRow; editor->linesel = 1; editor->sely = y; /* Set pCursors[0] to beginning of line */ ME_FindPixelPos(editor, x, y, &editor->pCursors[1], &editor->bCaretAtEnd); /* Set pCursors[1] to end of line */ pRow = ME_FindItemFwd(editor->pCursors[1].pRun, diStartRowOrParagraphOrEnd); assert(pRow); /* pCursor[0] is the position where the cursor will be drawn, * pCursor[1] is the other end of the selection range * pCursor[2] and [3] are backups of [0] and [1] so I * don't have to look them up again */ if (pRow->type == diStartRow) { /* FIXME WTF was I thinking about here ? */ ME_DisplayItem *pRun = ME_FindItemFwd(pRow, diRun); assert(pRun); editor->pCursors[0].pRun = pRun; editor->pCursors[0].nOffset = 0; editor->bCaretAtEnd = 1; } else { editor->pCursors[0].pRun = ME_FindItemBack(pRow, diRun); assert(editor->pCursors[0].pRun && editor->pCursors[0].pRun->member.run.nFlags & MERF_ENDPARA); editor->pCursors[0].nOffset = 0; editor->bCaretAtEnd = 0; } editor->pCursors[2] = editor->pCursors[0]; editor->pCursors[3] = editor->pCursors[1]; ME_InvalidateSelection(editor); HideCaret(editor->hWnd); ME_MoveCaret(editor); ShowCaret(editor->hWnd); ME_ClearTempStyle(editor); ME_SendSelChange(editor); } }