/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include #include "textdat2.hxx" TextSelection::TextSelection() { } TextSelection::TextSelection( const TextPaM& rPaM ) : maStartPaM( rPaM ), maEndPaM( rPaM ) { } TextSelection::TextSelection( const TextPaM& rStart, const TextPaM& rEnd ) : maStartPaM( rStart ), maEndPaM( rEnd ) { } void TextSelection::Justify() { if ( maEndPaM < maStartPaM ) { TextPaM aTemp( maStartPaM ); maStartPaM = maEndPaM; maEndPaM = aTemp; } } TETextPortionList::TETextPortionList() { } TETextPortionList::~TETextPortionList() { Reset(); } TETextPortion& TETextPortionList::operator[]( std::size_t nPos ) { return maPortions[ nPos ]; } std::vector::iterator TETextPortionList::begin() { return maPortions.begin(); } std::vector::const_iterator TETextPortionList::begin() const { return maPortions.begin(); } std::vector::iterator TETextPortionList::end() { return maPortions.end(); } std::vector::const_iterator TETextPortionList::end() const { return maPortions.end(); } bool TETextPortionList::empty() const { return maPortions.empty(); } std::size_t TETextPortionList::size() const { return maPortions.size(); } std::vector::iterator TETextPortionList::erase( const std::vector::iterator& aIter ) { return maPortions.erase( aIter ); } std::vector::iterator TETextPortionList::insert( const std::vector::iterator& aIter, const TETextPortion& rTP ) { return maPortions.insert( aIter, rTP ); } void TETextPortionList::push_back( const TETextPortion& rTP ) { maPortions.push_back( rTP ); } void TETextPortionList::Reset() { maPortions.clear(); } void TETextPortionList::DeleteFromPortion( std::size_t nDelFrom ) { SAL_WARN_IF( ( nDelFrom >= maPortions.size() ) && ( (nDelFrom != 0) || (!maPortions.empty()) ), "vcl", "DeleteFromPortion: Out of range" ); maPortions.erase( maPortions.begin() + nDelFrom, maPortions.end() ); } std::size_t TETextPortionList::FindPortion( sal_Int32 nCharPos, sal_Int32& nPortionStart, bool bPreferStartingPortion ) { // find left portion at nCharPos at portion border sal_Int32 nTmpPos = 0; for ( std::size_t nPortion = 0; nPortion < maPortions.size(); nPortion++ ) { TETextPortion& rPortion = maPortions[ nPortion ]; nTmpPos += rPortion.GetLen(); if ( nTmpPos >= nCharPos ) { // take this one if we don't prefer the starting portion, or if it's the last one if ( ( nTmpPos != nCharPos ) || !bPreferStartingPortion || ( nPortion == maPortions.size() - 1 ) ) { nPortionStart = nTmpPos - rPortion.GetLen(); return nPortion; } } } OSL_FAIL( "FindPortion: Not found!" ); return ( maPortions.size() - 1 ); } TEParaPortion::TEParaPortion( TextNode* pN ) : mpNode {pN} , mnInvalidPosStart {0} , mnInvalidDiff {0} , mbInvalid {true} , mbSimple {false} { } TEParaPortion::~TEParaPortion() { } void TEParaPortion::MarkInvalid( sal_Int32 nStart, sal_Int32 nDiff ) { if ( !mbInvalid ) { mnInvalidPosStart = ( nDiff >= 0 ) ? nStart : ( nStart + nDiff ); mnInvalidDiff = nDiff; } else { // simple consecutive typing if ( ( nDiff > 0 ) && ( mnInvalidDiff > 0 ) && ( ( mnInvalidPosStart+mnInvalidDiff ) == nStart ) ) { mnInvalidDiff = mnInvalidDiff + nDiff; } // simple consecutive deleting else if ( ( nDiff < 0 ) && ( mnInvalidDiff < 0 ) && ( mnInvalidPosStart == nStart ) ) { mnInvalidPosStart = mnInvalidPosStart + nDiff; mnInvalidDiff = mnInvalidDiff + nDiff; } else { SAL_WARN_IF( ( nDiff < 0 ) && ( (nStart+nDiff) < 0 ), "vcl", "MarkInvalid: Diff out of Range" ); mnInvalidPosStart = std::min( mnInvalidPosStart, nDiff < 0 ? nStart+nDiff : nDiff ); mnInvalidDiff = 0; mbSimple = false; } } maWritingDirectionInfos.clear(); mbInvalid = true; } void TEParaPortion::MarkSelectionInvalid( sal_Int32 nStart ) { if ( !mbInvalid ) { mnInvalidPosStart = nStart; } else { mnInvalidPosStart = std::min( mnInvalidPosStart, nStart ); } maWritingDirectionInfos.clear(); mnInvalidDiff = 0; mbInvalid = true; mbSimple = false; } std::vector::size_type TEParaPortion::GetLineNumber( sal_Int32 nChar, bool bInclEnd ) { for ( std::vector::size_type nLine = 0; nLine < maLines.size(); nLine++ ) { TextLine& rLine = maLines[ nLine ]; if ( ( bInclEnd && ( rLine.GetEnd() >= nChar ) ) || ( rLine.GetEnd() > nChar ) ) { return nLine; } } // Then it should be at the end of the last line OSL_ENSURE(nChar == maLines.back().GetEnd(), "wrong Index"); OSL_ENSURE(!bInclEnd, "Line not found: FindLine"); return ( maLines.size() - 1 ); } void TEParaPortion::CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine ) { sal_uInt16 nLines = maLines.size(); SAL_WARN_IF( !nLines, "vcl", "CorrectPortionNumbersFromLine: Empty portion?" ); if ( nLastFormattedLine >= ( nLines - 1 ) ) return; const TextLine& rLastFormatted = maLines[ nLastFormattedLine ]; const TextLine& rUnformatted = maLines[ nLastFormattedLine+1 ]; std::ptrdiff_t nPortionDiff = rUnformatted.GetStartPortion() - rLastFormatted.GetEndPortion(); sal_Int32 nTextDiff = rUnformatted.GetStart() - rLastFormatted.GetEnd(); nTextDiff++; // LastFormatted.GetEnd() was inclusive => subtracted one too much! // The first unformatted one has to start exactly one portion past the last // formatted one. // If a portion got split in the changed row, nLastEnd could be > nNextStart! std::ptrdiff_t nPDiff = -( nPortionDiff-1 ); const sal_Int32 nTDiff = -( nTextDiff-1 ); if ( !(nPDiff || nTDiff) ) return; for ( sal_uInt16 nL = nLastFormattedLine+1; nL < nLines; nL++ ) { TextLine& rLine = maLines[ nL ]; rLine.SetStartPortion(rLine.GetStartPortion() + nPDiff); rLine.SetEndPortion(rLine.GetEndPortion() + nPDiff); rLine.SetStart(rLine.GetStart() + nTDiff); rLine.SetEnd(rLine.GetEnd() + nTDiff); rLine.SetValid(); } } TEParaPortions::~TEParaPortions() { } IdleFormatter::IdleFormatter() : Idle("vcl::TextEngine mpIdleFormatter") , mpView(nullptr) , mnRestarts(0) { SetPriority(TaskPriority::HIGH_IDLE); } IdleFormatter::~IdleFormatter() { mpView = nullptr; } void IdleFormatter::DoIdleFormat( TextView* pV, sal_uInt16 nMaxRestarts ) { mpView = pV; if ( IsActive() ) mnRestarts++; if ( mnRestarts > nMaxRestarts ) { mnRestarts = 0; Invoke(); } else { Start(); } } void IdleFormatter::ForceTimeout() { if ( IsActive() ) { Stop(); mnRestarts = 0; Invoke(); } } TextHint::TextHint( SfxHintId Id ) : SfxHint( Id ), mnValue(0) { } TextHint::TextHint( SfxHintId Id, sal_Int32 nValue ) : SfxHint( Id ), mnValue(nValue) { } TEIMEInfos::TEIMEInfos( const TextPaM& rPos, OUString _aOldTextAfterStartPos ) : aOldTextAfterStartPos(std::move(_aOldTextAfterStartPos)) , aPos(rPos) , nLen(0) , bWasCursorOverwrite(false) { } TEIMEInfos::~TEIMEInfos() { } void TEIMEInfos::CopyAttribs(const ExtTextInputAttr* pA, sal_Int32 nL) { nLen = nL; pAttribs.reset( new ExtTextInputAttr[ nL ] ); memcpy( pAttribs.get(), pA, nL*sizeof(ExtTextInputAttr) ); } void TEIMEInfos::DestroyAttribs() { pAttribs.reset(); nLen = 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ ion value='distro/vector/vector-5.4'>distro/vector/vector-5.4 LibreOffice 核心代码仓库文档基金会
summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2021-12-06Better workaround for ASan use-after-poisonStephan Bergmann
2021-12-04use --with-system-lockfile for coverity buildCaolán McNamara
2021-12-03ofz#41602 fix more build failureCaolán McNamara
2021-12-03ofz#41602 Build-FailureCaolán McNamara
2021-11-26Work around use-after-poisonStephan Bergmann
2021-11-26Adapt distro-configs/LibreOfficeFlatpak.confStephan Bergmann
2021-11-26--without-system-cuckoo missing in distro-configs/LibreOfficeFlatpak.confStephan Bergmann
2021-11-18make Jenkins dev builds use --enable-dbgutil, not just debugLuboš Luňák
2021-10-14--enable-lto for distro-configs/* that already use --enable-mergelibsLuboš Luňák
2021-09-25add dbffuzzerCaolán McNamara
2021-09-09a system cuckoo isn't availableCaolán McNamara
2021-09-06Flatpak: Upgrade to 21.08 runtime, disable SkiaStephan Bergmann
2021-09-02turn on symbols for jenkins windows buildsNoel Grandin
2021-08-26There is no --disable-neon configure option any moreTor Lillqvist
2021-08-22ofz: prep for allowing oss-fuzz msanCaolán McNamara
2021-08-16ofz: use system curl .a and system glm headersCaolán McNamara
2021-08-14ofz: build with system libexttextcatCaolán McNamara
2021-08-13ofz: use system .a curl, fontconfig, freetypeCaolán McNamara
2021-08-12use --with-idlc-cpp=cpp instead of --with-system-ucppCaolán McNamara
2021-08-12ofz: use system .a libs when they aren't c++ onesCaolán McNamara
2021-08-10oss-fuzz: can use system ucppCaolán McNamara
2021-08-07disable scripting for fuzzingCaolán McNamara
2021-08-07explicitly disable ldap for fuzzingCaolán McNamara
2021-08-06disable a few more things when fuzzingCaolán McNamara
2021-08-06oss-fuzz: disable some more features we don't needCaolán McNamara
2021-07-27Try without --disable-database-connectivity when building for iOSTor Lillqvist
2021-06-26use --disable-xmlhelp for fuzzingCaolán McNamara
2021-06-04Enable PdfIum for android buildmerttumer
2021-06-01configure: Refactor platform defaultsJan-Marek Glogowski
2021-05-29fix coverity build failure due to --with-privacy-policy-url=...Caolán McNamara
2021-05-26fix callgrind job by providing dummy privacy-urlChristian Lohmaier
2021-05-26fix also the Win64 tinderboxesChristian Lohmaier
2021-05-26fix jenkins tinderboxes config after 15ab55c092e0b474827abe104b73c5bfab6ef28cChristian Lohmaier
2021-05-26add privacy URL to crashreport dialog & updatecheck tab in optionsChristian Lohmaier
2021-05-19Adapt Flatpak build to switch from qrcodegen to zxingStephan Bergmann
2021-05-18make --disable-odk the defaultNoel Grandin
2021-05-05WASM: add distro config, amend readmeThorsten Behrens
2021-04-11Get rid of apache-commons-loggingStephan Bergmann
2021-04-07Updated README.md files to represent current code / use Markdown formatHossein
2021-03-30drop ---disable-scripting again for fuzzingCaolán McNamara
2021-03-30Update the iOS simulator conf file to match the device oneTor Lillqvist
2021-03-29disable scripting for oss-fuzz tooCaolán McNamara
2021-03-24Using .md extension/Markdown syntax for modules READMEHossein
2021-03-23qrcodegen was replaced by zxingCaolán McNamara
2021-03-16Do build Pdfium for iOS, tooTor Lillqvist