// This may look like C code, but it is really -*- C++ -*-
// composant graphique de type console (terminal) 
//                    R. Ansari   12/97
// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA

#ifndef PICONSOLE_H
#define PICONSOLE_H

#include "pisysdep.h"
#include <string>

#include PISTDWDG_H 
#include PICONT_H
#include PIBWDG_H

enum PIVAType {    
  PIVA_Def = 0,
  PIVA_Bold = 1 << 0,
  PIVA_Ital = 1 << 1,
  PIVA_Reverse = 1 << 2,
//  Le 4eme bit (<<3) est reserve pour l'usage interne (PIVA_Select)
  PIVA_DefCol = 0,
  PIVA_Red = 1 << 4,
  PIVA_Blue = 2 << 4, 
  PIVA_Green = 3 << 4, 
  PIVA_Yellow = 4 << 4,
  PIVA_Magenta = 5 << 4
};

class PIConsole : public PIBaseWdg {
public:
  enum {ClassId = 6100};

                     PIConsole(PIContainer* par, const char* nom, PIMessage msg, int nl, int nc, 
                               int sx=300, int sy=200, int px=0, int py=0, bool scb=true);
                     ~PIConsole();

  virtual long       kind() {return ClassId; }

// Interface d utilisation : 
          void       AddChar(char c, unsigned char va= PIVA_Def, bool ref=true);
          void       AddStr(const char* strg, unsigned char va= PIVA_Def, bool ref=true);

          void       SelectFont(PIFontSize sz=PI_NormalSizeFont);
          void       AutoSize(int nl=-1, int nc=-1);
          void       PreferedSize(int& sx, int& sy);
          void       AcceptCmd(bool acc=true, int nrecmx=20);
          void       SetPrompt(const char* prompt); 
  inline  void       SetPrompt(string const& pr) { SetPrompt(pr.c_str()); } 
  inline  string     GetPrompt() const { return (string(mPrompt)); } 

  inline  int        WindNbLines() { return mWSzL; }
  inline  int        NbLines() { return mNL; }          
  inline  string     GetCmdString() { return(mCmd); }

// Gestion des evenements input/draw 
  virtual void       Draw(PIGraphic* g, int x0, int y0, int dx, int dy);
  virtual void       Resize();
  virtual void       Keyboard(int key, PIKeyModifier kmod);
  virtual void       But1Press(int x, int y);
  virtual void       Ptr1Move(int x, int y);
  virtual void       But1Release(int x, int y);
  virtual void       But2Press(int x, int y);
  virtual void       But3Press(int x, int y);

// Gestion de copier/coller
  virtual void       PasteSelection(unsigned int typ, void *pdata, unsigned int l);
  virtual void*      ProvideSelection(unsigned int& typ, unsigned int& len);
  virtual void       SelectionLost();
  virtual void       SelectionTransferEnd();

protected:
          void       AssocScrollBar(PIContainer* par, const char* nom, bool scb, int sx, int sy, int px, int py);
          void       ScrollUp();
          void       SetDispOffset(int ldeb=-1);
          void       ClearLine(int l);
          void       DisplayLines(PIGraphicGen* g, int l1, int l2);
          void       UpdCmdLine();
          void       ClrCmd();
          void       SendCmd();
          void       CmdAddChar(int key);
          void       SelFgBgCol(PIColors fc=PI_Black, PIColors bc=PI_White);
          void       SaveSelection();  // Pour copier la selection dans un buffer

  virtual void       Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL);


  int mNL, mNC;         // Nb de lignes, colonnes total de la console
  int mCurL, mCurC;     // Numero de ligne, colonne courante
  int mWSzL, mWSzC;     // Taille de fenetre en lignes, colonnes
  int mOffL;            // Offset d affichage (lignes) 
  int mNCmdL, mLCOff;   // Nb de lignes reserve a l entree des commandes
  int mDCOff;           // Offset (en caractere) pour l affichage de la ligne de commande
  char* mText;          // Contenu de la console
  unsigned char* mAtt;  // Attributs du contenu (bold, ...)
  int* mLPo;            // Adresse des lignes ds les tableaux mText, mAtt
  char* mStrBuf;        // Buffer 
  int mFHaut, mFLarg;   // Hauteur, Largeur des caracteres 
  PIFontSize mFTaille;  // Taille des caracteres 
  PIColors mFgC, mBgC;  // Couleur Avant - arriere plan
  char  mPrompt[32];    // Le prompt
  char* mCmdStr;        // La commande 
  int mCCP, mCLC;       // Position du curseur, longeur de la commande
  string mCmd;          // Le string de la derniere commande validee

// Pour le rappel des commandes
  int NMxRecall, mNComm;    // Profondeur de la pile de rappels, nb de commandes
  string * mRStr;           // Stockage des chaines 
  int mRCindx, mRindx;      // Index pour le rappel
  bool mChangeFg;           // Texte modifie
  
// Gestion du buffer de copie
  char* mCPBuffer;
  unsigned int mCPBufLen;
  int mCPbeginC, mCPbeginL;
  int mCPendC, mCPendL;
  
// S il y a un scroll-bar associe
  PIScrollBar* mScb;
  PIMessage msgScb;
};


#endif
