/* -*- 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 <drawinglayer/attribute/fontattribute.hxx>
#include <rtl/ustring.hxx>
#include <utility>

namespace drawinglayer::attribute
{
class ImpFontAttribute
{
public:
    /// core data
    OUString maFamilyName; // Font Family Name
    OUString maStyleName; // Font Style Name
    sal_uInt16 mnWeight; // Font weight

    bool mbSymbol : 1; // Symbol Font Flag
    bool mbVertical : 1; // Vertical Text Flag
    bool mbItalic : 1; // Italic Flag
    bool mbOutline : 1; // Outline Flag
    bool mbRTL : 1; // RTL Flag
    bool mbBiDiStrong : 1; // BiDi Flag
    bool mbMonospaced : 1;

    ImpFontAttribute(OUString aFamilyName, OUString aStyleName, sal_uInt16 nWeight, bool bSymbol,
                     bool bVertical, bool bItalic, bool bMonospaced, bool bOutline, bool bRTL,
                     bool bBiDiStrong)
        : maFamilyName(std::move(aFamilyName))
        , maStyleName(std::move(aStyleName))
        , mnWeight(nWeight)
        , mbSymbol(bSymbol)
        , mbVertical(bVertical)
        , mbItalic(bItalic)
        , mbOutline(bOutline)
        , mbRTL(bRTL)
        , mbBiDiStrong(bBiDiStrong)
        , mbMonospaced(bMonospaced)
    {
    }

    ImpFontAttribute()
        : mnWeight(0)
        , mbSymbol(false)
        , mbVertical(false)
        , mbItalic(false)
        , mbOutline(false)
        , mbRTL(false)
        , mbBiDiStrong(false)
        , mbMonospaced(false)
    {
    }

    // data read access
    const OUString& getFamilyName() const { return maFamilyName; }
    const OUString& getStyleName() const { return maStyleName; }
    sal_uInt16 getWeight() const { return mnWeight; }
    bool getSymbol() const { return mbSymbol; }
    bool getVertical() const { return mbVertical; }
    bool getItalic() const { return mbItalic; }
    bool getOutline() const { return mbOutline; }
    bool getRTL() const { return mbRTL; }
    bool getBiDiStrong() const { return mbBiDiStrong; }
    bool getMonospaced() const { return mbMonospaced; }

    bool operator==(const ImpFontAttribute& rCompare) const
    {
        return (getFamilyName() == rCompare.getFamilyName()
                && getStyleName() == rCompare.getStyleName() && getWeight() == rCompare.getWeight()
                && getSymbol() == rCompare.getSymbol() && getVertical() == rCompare.getVertical()
                && getItalic() == rCompare.getItalic() && getOutline() == rCompare.getOutline()
                && getRTL() == rCompare.getRTL() && getBiDiStrong() == rCompare.getBiDiStrong()
                && getMonospaced() == rCompare.getMonospaced());
    }
};

namespace
{
FontAttribute::ImplType& theGlobalDefault()
{
    static FontAttribute::ImplType SINGLETON;
    return SINGLETON;
}
}

FontAttribute::FontAttribute(const OUString& rFamilyName, const OUString& rStyleName,
                             sal_uInt16 nWeight, bool bSymbol, bool bVertical, bool bItalic,
                             bool bMonospaced, bool bOutline, bool bRTL, bool bBiDiStrong)
    : mpFontAttribute(ImpFontAttribute(rFamilyName, rStyleName, nWeight, bSymbol, bVertical,
                                       bItalic, bMonospaced, bOutline, bRTL, bBiDiStrong))
{
}

FontAttribute::FontAttribute()
    : mpFontAttribute(theGlobalDefault())
{
}

FontAttribute::FontAttribute(const FontAttribute&) = default;

FontAttribute::FontAttribute(FontAttribute&&) = default;

FontAttribute::~FontAttribute() = default;

FontAttribute& FontAttribute::operator=(const FontAttribute&) = default;

FontAttribute& FontAttribute::operator=(FontAttribute&&) = default;

bool FontAttribute::operator==(const FontAttribute& rCandidate) const
{
    return rCandidate.mpFontAttribute == mpFontAttribute;
}

const OUString& FontAttribute::getFamilyName() const { return mpFontAttribute->getFamilyName(); }

const OUString& FontAttribute::getStyleName() const { return mpFontAttribute->getStyleName(); }

sal_uInt16 FontAttribute::getWeight() const { return mpFontAttribute->getWeight(); }

bool FontAttribute::getSymbol() const { return mpFontAttribute->getSymbol(); }

bool FontAttribute::getVertical() const { return mpFontAttribute->getVertical(); }

bool FontAttribute::getItalic() const { return mpFontAttribute->getItalic(); }

bool FontAttribute::getOutline() const { return mpFontAttribute->getOutline(); }

bool FontAttribute::getRTL() const { return mpFontAttribute->getRTL(); }

bool FontAttribute::getBiDiStrong() const { return mpFontAttribute->getBiDiStrong(); }

bool FontAttribute::getMonospaced() const { return mpFontAttribute->getMonospaced(); }

} // end of namespace

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
