/**
 * @file llchathistory.h
 * @brief LLTextEditor base class
 *
 * $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 LLCHATHISTORY_H_
#define LLCHATHISTORY_H_

#include "lltexteditor.h"
#include "lltextbox.h"
#include "llviewerchat.h"

//Chat log widget allowing addition of a message as a widget
class LLChatHistory : public LLUICtrl
{
    public:
        struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
        {
            //Message header filename
            Optional<std::string>   message_header;
            //Message separator filename
            Optional<std::string>   message_separator;
            //Text left padding from the scroll rect
            Optional<S32>           left_text_pad;
            //Text right padding from the scroll rect
            Optional<S32>           right_text_pad;
            //Widget left padding from the scroll rect
            Optional<S32>           left_widget_pad;
            //Widget right padding from the scroll rect
            Optional<S32>           right_widget_pad;
            //Separator top padding
            Optional<S32>           top_separator_pad;
            //Separator bottom padding
            Optional<S32>           bottom_separator_pad;
            //Header top padding
            Optional<S32>           top_header_pad;
            //Header bottom padding
            Optional<S32>           bottom_header_pad;

            Optional<LLTextBox::Params> more_chat_text;

            Optional<bool>          notify_unread_msg;

            Params()
            :   message_header("message_header"),
                message_separator("message_separator"),
                left_text_pad("left_text_pad"),
                right_text_pad("right_text_pad"),
                left_widget_pad("left_widget_pad"),
                right_widget_pad("right_widget_pad"),
                top_separator_pad("top_separator_pad"),
                bottom_separator_pad("bottom_separator_pad"),
                top_header_pad("top_header_pad"),
                bottom_header_pad("bottom_header_pad"),
                more_chat_text("more_chat_text"),
                notify_unread_msg("notify_unread_msg", true)
            {}

        };
    protected:
        LLChatHistory(const Params&);
        friend class LLUICtrlFactory;

        /*virtual*/ void draw();
        /**
         * Redefinition of LLTextEditor::updateTextRect() to considerate text
         * left/right padding params.
         */
        //virtual void  updateTextRect();
        /**
         * Builds a message separator.
         * @return pointer to LLView separator object.
         */
        LLView* getSeparator();

        void onClickMoreText();

    private:
        /**
         * Builds a message header.
         * @return pointer to LLView header object.
         */
        LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args);
    public:
        ~LLChatHistory();
        LLSD getValue() const;
        void initFromParams(const Params&);

        /**
         * Appends a widget message.
         * If last user appended message, concurs with current user,
         * separator is added before the message, otherwise header is added.
         * The args LLSD contains:
         * - use_plain_text_chat_history (bool) - whether to add message as plain text.
         * - owner_id (LLUUID) - the owner ID for object chat
         * @param chat - base chat message.
         * @param args - additional arguments
         * @param input_append_params - font style.
         */
        void appendMessage(const LLChat& chat, const LLSD &args = LLSD(), const LLStyle::Params& input_append_params = LLStyle::Params());
        /*virtual*/ void clear();

    private:
        std::string mLastFromName;
        LLUUID mLastFromID;
        LLDate mLastMessageTime;
        bool mIsLastMessageFromLog;
        bool mNotifyAboutUnreadMsg;
        //std::string mLastMessageTimeStr;

        std::string mMessageHeaderFilename;
        std::string mMessageSeparatorFilename;

        S32 mLeftTextPad;
        S32 mRightTextPad;

        S32 mLeftWidgetPad;
        S32 mRightWidgetPad;

        S32 mTopSeparatorPad;
        S32 mBottomSeparatorPad;
        S32 mTopHeaderPad;
        S32 mBottomHeaderPad;

        class LLLayoutPanel*    mMoreChatPanel;
        LLTextBox*      mMoreChatText;
        LLTextEditor*   mEditor;
        typedef std::set<std::string> unread_chat_source_t;
        unread_chat_source_t mUnreadChatSources;
};
#endif /* LLCHATHISTORY_H_ */