private bool GetRunContainingCp(int index, out OrderedTextRun run) { foreach (var ordered in ReorderRuns()) { if (index >= ordered.CpFirst && index < ordered.CpFirst + ordered.Range.Length && !(ordered.TextRun is TextEndOfLine)) { run = ordered; return(true); } } run = default(OrderedTextRun); return(false); }
private List <OrderedTextRun> ReorderRuns() { var result = new List <OrderedTextRun> (); var store = _fullText.TextStore; var settings = store.Settings; int cpFirst = store.CpFirst; int pos = cpFirst; int remaining_length = Length; // FIXME: Fetch bidi levels, reset to 0 for trailing whitespace while (remaining_length > 0) { TextRun run; int runLength; CharacterBufferRange chars = settings.FetchTextRun(pos, cpFirst, out run, out runLength); if (runLength > remaining_length) { runLength = remaining_length; chars = new CharacterBufferRange(chars, 0, runLength); } // FIXME: determine bidi level and shorten runLength to keep bidi level constant var ordered = new OrderedTextRun(); ordered.BidiLevel = 0; ordered.TextRun = run; ordered.Range = chars; ordered.CpFirst = pos; result.Add(ordered); remaining_length -= runLength; pos += runLength; } // FIXME: reverse bidi levels return(result); }