/* -*- 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 .
*/
// Shrink the style if it is too thick for the control. while( GetWidth() > nMaxWidth )
{ // First decrease space between lines. if (mfDist)
{
--mfDist; continue;
}
// Still too thick? Decrease the line widths. if (mfPrim != 0.0 && rtl::math::approxEqual(mfPrim, mfSecn))
{ // Both lines equal - decrease both to keep symmetry.
--mfPrim;
--mfSecn; continue;
}
// Decrease each line for itself if (mfPrim)
--mfPrim;
namespace
{ /** * Gets the weight of rStyle, according to [MS-OI29500] v20171130, 2.1.168 Part 1 Section 17.4.66, * tcBorders (Table Cell Borders).
*/ double GetWordTableCellBorderWeight(const Style& rStyle)
{ double fWidth = rStyle.GetWidth(); int nBorderNumber = 0;
// See lcl_convertBorderStyleFromToken() in writerfilter/ and ConvertBorderStyleFromWord() in // editeng/, this is the opposite of the combination of those functions. switch (rStyle.Type())
{ case SvxBorderLineStyle::NONE: return 0.0; case SvxBorderLineStyle::DOTTED: case SvxBorderLineStyle::DASHED: return 1.0; case SvxBorderLineStyle::SOLID: // single = 1 // thick = 2 // wave = 20
nBorderNumber = 1; break; case SvxBorderLineStyle::DOUBLE: case SvxBorderLineStyle::DOUBLE_THIN: // double = 3 // triple = 10 // doubleWave = 21 // dashDotStroked = 23
nBorderNumber = 3; break; case SvxBorderLineStyle::DASH_DOT: // dotDash = 8
nBorderNumber = 8; break; case SvxBorderLineStyle::DASH_DOT_DOT: // dotDotDash = 9
nBorderNumber = 9; break; case SvxBorderLineStyle::THINTHICK_SMALLGAP: // thinThickSmallGap = 11
nBorderNumber = 11; break; case SvxBorderLineStyle::THICKTHIN_SMALLGAP: // thickThinSmallGap = 12 // thinThickThinSmallGap = 13
nBorderNumber = 12; break; case SvxBorderLineStyle::THINTHICK_MEDIUMGAP: // thinThickMediumGap = 14
nBorderNumber = 14; break; case SvxBorderLineStyle::THICKTHIN_MEDIUMGAP: // thickThinMediumGap = 15 // thinThickThinMediumGap = 16
nBorderNumber = 15; break; case SvxBorderLineStyle::THINTHICK_LARGEGAP: // thinThickLargeGap = 17
nBorderNumber = 17; break; case SvxBorderLineStyle::THICKTHIN_LARGEGAP: // thickThinLargeGap = 18 // thinThickThinLargeGap = 19
nBorderNumber = 18; break; case SvxBorderLineStyle::FINE_DASHED: // dashSmallGap = 22
nBorderNumber = 22; break; case SvxBorderLineStyle::EMBOSSED: // threeDEmboss = 24
nBorderNumber = 24; break; case SvxBorderLineStyle::ENGRAVED: // threeDEngrave = 25
nBorderNumber = 25; break; case SvxBorderLineStyle::OUTSET: // outset = 26
nBorderNumber = 25; break; case SvxBorderLineStyle::INSET: // inset = 27
nBorderNumber = 27; break;
}
return nBorderNumber * fWidth;
}
}
bool Style::operator<( const Style& rOther) const
{ if (mbWordTableCell)
{ // The below code would first compare based on the border width, Word compares based on its // calculated weight, do that in the compat case. double fLW = GetWordTableCellBorderWeight(*this); double fRW = GetWordTableCellBorderWeight(rOther); if (!rtl::math::approxEqual(fLW, fRW))
{ return fLW < fRW;
}
}
// different total widths -> this<rOther, if this is thinner double nLW = GetWidth(); double nRW = rOther.GetWidth(); if( !rtl::math::approxEqual(nLW, nRW) ) return nLW < nRW;
// one line double, the other single -> this<rOther, if this is single if( (Secn() == 0) != (rOther.Secn() == 0) ) return Secn() == 0;
// both lines double with different distances -> this<rOther, if distance of this greater if( (Secn() && rOther.Secn()) && !rtl::math::approxEqual(Dist(), rOther.Dist()) ) return Dist() > rOther.Dist();
// both lines single and 1 unit thick, only one is dotted -> this<rOther, if this is dotted if ((nLW == 1) && !Secn() && !rOther.Secn() && (Type() != rOther.Type())) return Type() > rOther.Type();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.