void ME_InvalidateSelection(ME_TextEditor *editor) { ME_DisplayItem *para1, *para2; int nStart, nEnd; int len = ME_GetTextLength(editor); ME_GetSelection(editor, &nStart, &nEnd); /* if both old and new selection are 0-char (= caret only), then there's no (inverted) area to be repainted, neither old nor new */ if (nStart == nEnd && editor->nLastSelStart == editor->nLastSelEnd) return; ME_WrapMarkedParagraphs(editor); ME_GetSelectionParas(editor, ¶1, ¶2); assert(para1->type == diParagraph); assert(para2->type == diParagraph); /* last selection markers aren't always updated, which means they can point past the end of the document */ if (editor->nLastSelStart > len) editor->nLastSelEnd = len; if (editor->nLastSelEnd > len) editor->nLastSelEnd = len; /* if the start part of selection is being expanded or contracted... */ if (nStart < editor->nLastSelStart) { ME_MarkForPainting(editor, para1, ME_FindItemFwd(editor->pLastSelStartPara, diParagraphOrEnd)); } else if (nStart > editor->nLastSelStart) { ME_MarkForPainting(editor, editor->pLastSelStartPara, ME_FindItemFwd(para1, diParagraphOrEnd)); } /* if the end part of selection is being contracted or expanded... */ if (nEnd < editor->nLastSelEnd) { ME_MarkForPainting(editor, para2, ME_FindItemFwd(editor->pLastSelEndPara, diParagraphOrEnd)); } else if (nEnd > editor->nLastSelEnd) { ME_MarkForPainting(editor, editor->pLastSelEndPara, ME_FindItemFwd(para2, diParagraphOrEnd)); } ME_InvalidateMarkedParagraphs(editor); /* remember the last invalidated position */ ME_GetSelection(editor, &editor->nLastSelStart, &editor->nLastSelEnd); ME_GetSelectionParas(editor, &editor->pLastSelStartPara, &editor->pLastSelEndPara); assert(editor->pLastSelStartPara->type == diParagraph); assert(editor->pLastSelEndPara->type == diParagraph); }
void ME_GetSelectionParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt) { ME_DisplayItem *para, *para_end; PARAFORMAT2 *curFmt; if (pFmt->cbSize < sizeof(PARAFORMAT)) { pFmt->dwMask = 0; return; } ME_GetSelectionParas(editor, ¶, ¶_end); ME_GetParaFormat(editor, para, pFmt); /* Invalidate values that change across the selected paragraphs. */ while (para != para_end) { para = para->member.para.next_para; curFmt = para->member.para.pFmt; #define CHECK_FIELD(m, f) \ if (pFmt->f != curFmt->f) pFmt->dwMask &= ~(m); CHECK_FIELD(PFM_NUMBERING, wNumbering); CHECK_FIELD(PFM_STARTINDENT, dxStartIndent); CHECK_FIELD(PFM_RIGHTINDENT, dxRightIndent); CHECK_FIELD(PFM_OFFSET, dxOffset); CHECK_FIELD(PFM_ALIGNMENT, wAlignment); if (pFmt->dwMask & PFM_TABSTOPS) { if (pFmt->cTabCount != para->member.para.pFmt->cTabCount || memcmp(pFmt->rgxTabs, curFmt->rgxTabs, curFmt->cTabCount*sizeof(int))) pFmt->dwMask &= ~PFM_TABSTOPS; } if (pFmt->dwMask >= sizeof(PARAFORMAT2)) { pFmt->dwMask &= ~((pFmt->wEffects ^ curFmt->wEffects) << 16); CHECK_FIELD(PFM_SPACEBEFORE, dySpaceBefore); CHECK_FIELD(PFM_SPACEAFTER, dySpaceAfter); CHECK_FIELD(PFM_LINESPACING, dyLineSpacing); CHECK_FIELD(PFM_STYLE, sStyle); CHECK_FIELD(PFM_SPACEAFTER, bLineSpacingRule); CHECK_FIELD(PFM_SHADING, wShadingWeight); CHECK_FIELD(PFM_SHADING, wShadingStyle); CHECK_FIELD(PFM_NUMBERINGSTART, wNumberingStart); CHECK_FIELD(PFM_NUMBERINGSTYLE, wNumberingStyle); CHECK_FIELD(PFM_NUMBERINGTAB, wNumberingTab); CHECK_FIELD(PFM_BORDER, wBorderSpace); CHECK_FIELD(PFM_BORDER, wBorderWidth); CHECK_FIELD(PFM_BORDER, wBorders); } #undef CHECK_FIELD } }
BOOL ME_SetSelectionParaFormat(ME_TextEditor *editor, const PARAFORMAT2 *pFmt) { ME_DisplayItem *para, *para_end; ME_GetSelectionParas(editor, ¶, ¶_end); do { ME_SetParaFormat(editor, para, pFmt); if (para == para_end) break; para = para->member.para.next_para; } while(1); return TRUE; }