SharedCaretState TextFormulaNode::GetNextPosition(SharedCaretState& relativeState) { if (relativeState && relativeState->CheckInNode(this)) { int pos = relativeState->GetPos(); if (pos < GetText().length()) return SharedCaretState(new CaretState(this, pos + 1)); return parent->GetNextPosition(relativeState); } return GetFirstPosition(); }
SharedCaretState CompoundFormulaNode::GetNextPosition(SharedCaretState& relativeState) { SharedCaretState res; if (!relativeState) res = SharedCaretState(new CaretState(parent, parent->GetChildPos(this))); else { if (relativeState->CheckOnNode(this)) res = GetFirstPosition(); else if (relativeState->CheckInNode(this)) { int i; FormulaNode* n; FormulaNode* node = relativeState->GetNode(); if (node == this) { i = relativeState->GetPos(); n = (*this)[i == childNodes->Count() ? i - 1 : i]; res = n->GetNextPosition(relativeState); if (res) return res; } else i = GetFirstLevelChildPos(node); if (i + 1 < childNodes->Count()) { n = (*this)[i + 1]; res = n->GetNextPosition(); while (!res && !n->CanSetCaret()) { ++i; n = (*this)[i + 1]; res = n->GetNextPosition(); } if (!res && n->CanSetCaret()) res = SharedCaretState(new CaretState(this, i + 1)); } if (!res && parent) res = parent->GetNextPosition(relativeState); } else if (relativeState->CheckAtLast(this)) res = parent->GetNextPosition(relativeState); else res = SharedCaretState(new CaretState(parent, parent->GetChildPos(this))); } return res; }
bool CHttpRanges::GetTotalRange(CHttpRange& range) const { if (m_ranges.empty()) return false; uint64_t firstPosition, lastPosition; if (!GetFirstPosition(firstPosition) || !GetLastPosition(lastPosition)) return false; range.SetFirstPosition(firstPosition); range.SetLastPosition(lastPosition); return range.IsValid(); }
SharedCaretState RootFormulaNode::GetNextPosition(SharedCaretState& relativeState) { SharedCaretState res; if (!relativeState) res = GetFirstPosition(); else { int i = -1; FormulaNode* node = relativeState->GetNode(); if (!relativeState->CheckAtLast(this)) { if (node == this) { i = relativeState->GetPos(); FormulaNode* n = (*this)[i == childNodes->Count() ? i - 1 : i]; res = n->GetNextPosition(relativeState); if (res) return res; if (i == childNodes->Count() - 1 && !dynamic_cast<EmptyFormulaNode*>(n)) return SharedCaretState(new CaretState(this, i + 1)); } else i = GetFirstLevelChildPos(node); } else if (node == this && parent) res = parent->GetNextPosition(relativeState); else i = GetFirstLevelChildPos(node); if (i != -1) { if (i + 1 < childNodes->Count()) { FormulaNode* n = (*this)[i + 1]; res = n->GetNextPosition(relativeState); if (!res && n->CanSetCaret()) res = SharedCaretState(new CaretState(this, i + 1)); } else if (!IsEmptySymbol() && i == childNodes->Count() - 1 && *relativeState != *GetLastPosition()) return SharedCaretState(new CaretState(this, i + 1)); } if (!res && parent) return parent->GetNextPosition(relativeState); } return res; }