/* -*- 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 <sal/config.h>
 
#include <osl/diagnose.h>
#include <vcl/outdev.hxx>
#include <editeng/editrids.hrc>
#include <unotools/intlwrapper.hxx>
#include <unotools/localedatawrapper.hxx>
#include <editeng/itemtype.hxx>
#include <editeng/eerdll.hxx>
#include <rtl/ustrbuf.hxx>
 
 
OUString GetMetricText( tools::Long nVal, MapUnit eSrcUnit, MapUnit eDestUnit, const IntlWrapper* pIntl )
{
    bool bNeg = false;
    bool bShowAtLeastOneDecimalDigit = true;
    sal_Int32 nRet = 0;
 
    if ( nVal < 0 )
    {
        bNeg = true;
        nVal *= -1;
    }
 
    switch ( eDestUnit )
    {
        case MapUnit::Map100thMM:
        case MapUnit::Map10thMM:
        case MapUnit::MapMM:
        case MapUnit::MapCM:
        {
            nRet = OutputDevice::LogicToLogic( nVal, eSrcUnit, MapUnit::Map100thMM );
 
            switch ( eDestUnit )
            {
                case MapUnit::Map100thMM:  nRet *= 1000; break;
                case MapUnit::Map10thMM:   nRet *= 100; break;
                case MapUnit::MapMM:        nRet *= 10; break;
                default: ;//prevent warning
            }
            break;
        }
 
        case MapUnit::Map1000thInch:
        case MapUnit::Map100thInch:
        case MapUnit::Map10thInch:
        case MapUnit::MapInch:
        {
            nRet = OutputDevice::LogicToLogic( nVal, eSrcUnit, MapUnit::Map1000thInch );
 
            switch ( eDestUnit )
            {
                case MapUnit::Map1000thInch:   nRet *= 1000; break;
                case MapUnit::Map100thInch:    nRet *= 100; break;
                case MapUnit::Map10thInch:     nRet *= 10; break;
                default: ;//prevent warning
            }
            break;
        }
 
        case MapUnit::MapPoint:
            // fractions of a point are used, e.g., for font size
            nRet = OutputDevice::LogicToLogic(nVal, eSrcUnit, MapUnit::MapTwip) * 50;
            bShowAtLeastOneDecimalDigit = false;
            break;
 
        case MapUnit::MapTwip:
        case MapUnit::MapPixel:
            return OUString::number( OutputDevice::LogicToLogic(
                        nVal, eSrcUnit, eDestUnit ));
 
        default:
            OSL_FAIL( "not supported mapunit" );
            return OUString();
    }
 
    if ( MapUnit::MapCM == eDestUnit || MapUnit::MapInch == eDestUnit )
    {
        sal_Int32 nMod = nRet % 10;
 
        if ( nMod > 4 )
            nRet += 10 - nMod;
        else if ( nMod > 0 )
            nRet -= nMod;
    }
 
    OUStringBuffer sRet;
 
    if ( bNeg )
        sRet.append('-');
 
    tools::Long nDiff = 1000;
    for( int nDigits = 4; nDigits; --nDigits, nDiff /= 10 )
    {
        if ( nRet < nDiff )
            sRet.append('0');
        else
            sRet.append(nRet / nDiff);
        nRet %= nDiff;
        if( 4 == nDigits && (bShowAtLeastOneDecimalDigit || nRet) )
        {
            if(pIntl)
                sRet.append(pIntl->getLocaleData()->getNumDecimalSep());
            else
                sRet.append(',');
            if( !nRet )
            {
                sRet.append('0');
                break;
            }
        }
        else if( !nRet )
            break;
    }
    return sRet.makeStringAndClear();
}
 
OUString GetColorString( const Color& rCol )
{
    if (rCol == COL_AUTO)
        return EditResId(RID_SVXSTR_AUTOMATIC);
 
    static const Color aColAry[] = {
        COL_BLACK, COL_BLUE, COL_GREEN, COL_CYAN,
        COL_RED, COL_MAGENTA, COL_BROWN, COL_GRAY,
        COL_LIGHTGRAY, COL_LIGHTBLUE, COL_LIGHTGREEN, COL_LIGHTCYAN,
        COL_LIGHTRED, COL_LIGHTMAGENTA, COL_YELLOW, COL_WHITE };
 
    sal_uInt16 nColor = 0;
    while ( nColor < std::size(aColAry) &&
            aColAry[nColor] != rCol.GetRGBColor() )
    {
        nColor += 1;
    }
 
    static TranslateId RID_SVXITEMS_COLORS[] =
    {
        RID_SVXITEMS_COLOR_BLACK,
        RID_SVXITEMS_COLOR_BLUE,
        RID_SVXITEMS_COLOR_GREEN,
        RID_SVXITEMS_COLOR_CYAN,
        RID_SVXITEMS_COLOR_RED,
        RID_SVXITEMS_COLOR_MAGENTA,
        RID_SVXITEMS_COLOR_BROWN,
        RID_SVXITEMS_COLOR_GRAY,
        RID_SVXITEMS_COLOR_LIGHTGRAY,
        RID_SVXITEMS_COLOR_LIGHTBLUE,
        RID_SVXITEMS_COLOR_LIGHTGREEN,
        RID_SVXITEMS_COLOR_LIGHTCYAN,
        RID_SVXITEMS_COLOR_LIGHTRED,
        RID_SVXITEMS_COLOR_LIGHTMAGENTA,
        RID_SVXITEMS_COLOR_YELLOW,
        RID_SVXITEMS_COLOR_WHITE
    };
 
    static_assert(std::size(aColAry) == std::size(RID_SVXITEMS_COLORS), "must match");
 
    OUString sStr;
    if ( nColor < std::size(aColAry) )
        sStr = EditResId(RID_SVXITEMS_COLORS[nColor]);
 
    if ( sStr.isEmpty() )
    {
        sStr += "RGB(" +
                OUString::number( rCol.GetRed() )   + cpDelim +
                OUString::number( rCol.GetGreen() ) + cpDelim +
                OUString::number( rCol.GetBlue() )  + ")";
    }
    return sStr;
}
 
TranslateId GetMetricId( MapUnit eUnit )
{
    TranslateId pId = RID_SVXITEMS_METRIC_MM;
 
    switch ( eUnit )
    {
        case MapUnit::Map100thMM:
        case MapUnit::Map10thMM:
        case MapUnit::MapMM:
            pId = RID_SVXITEMS_METRIC_MM;
            break;
 
        case MapUnit::MapCM:
            pId = RID_SVXITEMS_METRIC_CM;
            break;
 
        case MapUnit::Map1000thInch:
        case MapUnit::Map100thInch:
        case MapUnit::Map10thInch:
        case MapUnit::MapInch:
            pId = RID_SVXITEMS_METRIC_INCH;
            break;
 
        case MapUnit::MapPoint:
            pId = RID_SVXITEMS_METRIC_POINT;
            break;
 
        case MapUnit::MapTwip:
            pId = RID_SVXITEMS_METRIC_TWIP;
            break;
 
        case MapUnit::MapPixel:
            pId = RID_SVXITEMS_METRIC_PIXEL;
            break;
 
        default:
            OSL_FAIL( "not supported mapunit" );
    }
    return pId;
}
 
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

V530 The return value of function 'append' is required to be utilized.

V530 The return value of function 'append' is required to be utilized.

V530 The return value of function 'append' is required to be utilized.

V530 The return value of function 'append' is required to be utilized.

V530 The return value of function 'append' is required to be utilized.