/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
//////////////////////////////////////////////////////////////////////////////
//                                                                          //
//  pfConsole Header                                                        //
//                                                                          //
//  9.21.2001 mcn - Added pfLogDisplays. These are classes that represent   //
//                  a scrolling buffer, much like the console, for on-      //
//                  screen display of error logs and the such. Currently    //
//                  managed by the console, but hopefully once we have      //
//                  a general manager for dialogs/menus (debug or           //
//                  otherwise), that manager will take the displays over.   //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////

#ifndef _pfConsole_h
#define _pfConsole_h

#include "hsTypes.h"
#include "pnKeyedObject/hsKeyedObject.h"


class plPipeline;

//// Class Definition ////////////////////////////////////////////////////////

class pfConsoleEngine;
class plKeyEventMsg;
class pfConsoleInputInterface;

class pfConsole : public hsKeyedObject 
{
    friend class pfConsoleInputInterface;

    protected:

        enum Konstants 
        {
            kNumHistoryItems = 16,
            kModeHidden = 0,
            kModeSingleLine = 1,
            kModeFull = 2,
            kEffectDivisions = 1000,
            kMaxCharsWide = 80,
            kHelpDelay = 32,
            kCursorBlinkRate = 16,
            kMsgHintTimeout = 64,
            kWorkingLineSize = 256
        };


        UInt32  fNumDisplayLines;

        Int32   fEffectCounter;
        float   fLastTime;
        UInt32  fHelpTimer;
        char    fLastHelpMsg[ kWorkingLineSize ];
        UInt8   fMode;      // 0 - invisible, 1 - single line, 2 - full
        hsBool  fInited, fHelpMode, fPythonMode, fPythonFirstTime, fFXEnabled;
        UInt32  fPythonMultiLines;
        short   fCursorTicks;
        UInt32  fMsgTimeoutTimer;

        char    fHistory[ kNumHistoryItems ][ kMaxCharsWide ];
        UInt32  fHistoryCursor, fHistoryRecallCursor;
        char    *fDisplayBuffer;
        char    fWorkingLine[ kWorkingLineSize ];
        UInt32  fWorkingCursor;

        pfConsoleInputInterface *fInputInterface;

        pfConsoleEngine     *fEngine;

        void    IHandleKey( plKeyEventMsg *msg );
        char    IKeyEventToChar( plKeyEventMsg *msg );

        static UInt32       fConsoleTextColor;
        static pfConsole    *fTheConsole;
        static void _cdecl IAddLineCallback( const char *string );

        static plPipeline   *fPipeline;

        void    IAddLine( const char *string, short leftMargin = 0 );
        void    IAddParagraph( const char *string, short margin = 0 );
        void    IClear( void );

        void    ISetMode( UInt8 mode );
        void    IEnableFX( hsBool e ) { fFXEnabled = e; }
        hsBool  IFXEnabled( void ) { return fFXEnabled; }

        void    IPrintSomeHelp( void );
        void    IUpdateTooltip( void );

    public:

        pfConsole();
        ~pfConsole();

        CLASSNAME_REGISTER( pfConsole );
        GETINTERFACE_ANY( pfConsole, plReceiver );
        
        static pfConsole * GetInstance ();

        virtual hsBool  MsgReceive( plMessage *msg );
    
        void    Init( pfConsoleEngine *engine );
        void    Draw( plPipeline *p );

        static void AddLine( const char *string ) { fTheConsole->IAddParagraph( string ); }
        static void AddLineF(const char * fmt, ...);
        static void Clear( void ) { fTheConsole->IClear(); }
        static void Hide( void ) { fTheConsole->ISetMode(kModeHidden); }

        static void EnableEffects( hsBool enable ) { fTheConsole->IEnableFX( enable ); }
        static hsBool AreEffectsEnabled( void ) { return fTheConsole->IFXEnabled(); }
        static void SetTextColor( UInt32 color ) { fConsoleTextColor = color; }
        static UInt32 GetTextColor() { return fConsoleTextColor; }

        static void         SetPipeline( plPipeline *pipe ) { fPipeline = pipe; }
        static plPipeline   *GetPipeline( void ) { return fPipeline; }
        
        static void RunCommandAsync (const char cmd[]);
};

#endif //_pfConsole_h