/**
 * @file llbadge.h
 * @brief Header for badges
 *
 * $LicenseInfo:firstyear=2001&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_LLBADGE_H
#define LL_LLBADGE_H

#include <string>

#include "lluicolor.h"
#include "lluictrl.h"
#include "llstring.h"
#include "lluiimage.h"
#include "llview.h"
#include "llfontvertexbuffer.h"

//
// Declarations
//

class LLFontGL;
class LLFontVertexBuffer;
class LLScrollContainer;
class LLUICtrlFactory;

//
// Relative Position Alignment
//

namespace LLRelPos
{
    enum Location
    {
        CENTER  = 0,

        LEFT    = (1 << 0),
        RIGHT   = (1 << 1),

        TOP     = (1 << 2),
        BOTTOM  = (1 << 3),

        BOTTOM_LEFT     = (BOTTOM | LEFT),
        BOTTOM_RIGHT    = (BOTTOM | RIGHT),

        TOP_LEFT        = (TOP | LEFT),
        TOP_RIGHT       = (TOP | RIGHT),
    };

    inline bool IsBottom(Location relPos)   { return (relPos & BOTTOM) == BOTTOM; }
    inline bool IsCenter(Location relPos)   { return (relPos == CENTER); }
    inline bool IsLeft(Location relPos)     { return (relPos & LEFT) == LEFT; }
    inline bool IsRight(Location relPos)    { return (relPos & RIGHT) == RIGHT; }
    inline bool IsTop(Location relPos)      { return (relPos & TOP) == TOP; }
}

// NOTE: This needs to occur before Optional<LLRelPos::Location> declaration for proper compilation.
namespace LLInitParam
{
    template<>
    struct TypeValues<LLRelPos::Location> : public TypeValuesHelper<LLRelPos::Location>
    {
        static void declareValues();
    };
}

//
// Classes
//

class LLBadge
: public LLUICtrl
{
public:
    struct Params
    : public LLInitParam::Block<Params, LLUICtrl::Params>
    {
        Optional< LLHandle<LLView> >    owner;  // Mandatory in code but not in xml

        Optional< LLUIImage* >          border_image;
        Optional< LLUIColor >           border_color;

        Optional< LLUIImage* >          image;
        Optional< LLUIColor >           image_color;

        Optional< std::string >         label;
        Optional< LLUIColor >           label_color;

        Optional< S32 >                 label_offset_horiz;
        Optional< S32 >                 label_offset_vert;

        Optional< LLRelPos::Location >  location;
        Optional< S32 >                 location_offset_hcenter;
        Optional< S32 >                 location_offset_vcenter;
        Optional< U32 >                 location_percent_hcenter;
        Optional< U32 >                 location_percent_vcenter;

        Optional< F32 >                 padding_horiz;
        Optional< F32 >                 padding_vert;

        Params();

        bool equals(const Params&) const;
    };

protected:
    friend class LLUICtrlFactory;
    LLBadge(const Params& p);

public:

    ~LLBadge();

    bool                addToView(LLView * view);

    virtual void        draw();

    const std::string   getLabel() const { return wstring_to_utf8str(mLabel); }
    void                setLabel( const LLStringExplicit& label);

    void                setDrawAtParentTop(bool draw_at_top) { mDrawAtParentTop = draw_at_top;}

private:
    LLPointer< LLUIImage >  mBorderImage;
    LLUIColor               mBorderColor;

    const LLFontGL*         mGLFont;
    LLFontVertexBuffer      mFontBuffer;

    LLPointer< LLUIImage >  mImage;
    LLUIColor               mImageColor;

    LLUIString              mLabel;
    LLUIColor               mLabelColor;

    S32                     mLabelOffsetHoriz;
    S32                     mLabelOffsetVert;

    LLRelPos::Location      mLocation;
    S32                     mLocationOffsetHCenter;
    S32                     mLocationOffsetVCenter;
    F32                     mLocationPercentHCenter;
    F32                     mLocationPercentVCenter;

    LLHandle< LLView >      mOwner;

    F32                     mPaddingHoriz;
    F32                     mPaddingVert;

    LLScrollContainer*      mParentScroller;
    bool                    mDrawAtParentTop;
};

// Build time optimization, generate once in .cpp file
#ifndef LLBADGE_CPP
extern template class LLBadge* LLView::getChild<class LLBadge>(std::string_view name, bool recurse) const;
#endif

#endif  // LL_LLBADGE_H