/****************************************************************************
** ui.h extension file, included from the uic-generated form implementation.
**
** If you want to add, delete, or rename functions or slots, use
** Qt Designer to update this file, preserving your code.
**
** You should not define a constructor or destructor in this file.
** Instead, write your code in functions called init() and destroy().
** These will automatically be called by the form's constructor and
** destructor.
*****************************************************************************/
#include "../../MedinTuxTools/CMedicaBase.h"

//--------------------------------- init -----------------------
// Les défines de column sont dans CPrtListViewItem.h
/*! \class Rub_Centrale
 *  Widget centrale de CMDI_GroupedView.
 */

/*! \brief Constructeur.
 * Place les icones de thème, initialise les variables.
 */
void Rub_Centrale::init()
{m_pMyEditText  =  0;
 m_LastRub      = -1;
// m_IsModified = 0;
 // préparation des pixmaps
 m_Pixmap_ToSave = new QPixmap( Theme::getIconListSave().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
 m_Pixmap_ToDelete = new QPixmap( Theme::getIconListDelete().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
 m_Pixmap_HighPriority = new QPixmap( Theme::getIconListPriority().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
 m_Pixmap_Document = new QPixmap( Theme::getIconListTypeDocument().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
 m_Pixmap_Observation = new QPixmap( Theme::getIconListTypeObservation().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
 m_Pixmap_Prescription = new QPixmap( Theme::getIconListTypePrescription().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
// m_Pixmap_Renouv = new QPixmap(G_pCApp->m_PathAppli + "Ressources/icones/listview_renouv.png");

 // Trie automatiquement par défaut les rubriques par leur date
 m_QListView_Liste->setSorting (1, FALSE);

 // Centrer la date dans la colonne, et un peu de géométrie de colonnes
 m_QListView_Liste->setColumnAlignment (1, Qt::AlignHCenter ) ;
 m_QListView_Liste->setColumnWidthMode ( LISTVIEW_TYPE_COLUMN, QListView::Manual);
 m_QListView_Liste->setColumnWidth ( LISTVIEW_TYPE_COLUMN, 35 );
 m_QListView_Liste->setColumnWidthMode ( LISTVIEW_ETAT_COLUMN, QListView::Manual);
 m_QListView_Liste->setColumnWidth ( LISTVIEW_ETAT_COLUMN, 35 );
 m_QListView_Liste->setColumnWidthMode ( LISTVIEW_PRIORITY_COLUMN, QListView::Manual);
 m_QListView_Liste->setColumnWidth ( LISTVIEW_PRIORITY_COLUMN, 35 );
}


//--------------------------------- destroy -----------------------
/*! \brief destructeur de la classe.
 */
void Rub_Centrale::destroy()
{m_pMyEditText  =  0;
 m_LastRub      = -1;
}

//--------------------------------- setParams -----------------------
/*! \brief Indique les paramètres utilisables par la classe. Attention cette fonction DOIT être appelée après la création de la classe sinon ne fonctionne pas.
 */
void Rub_Centrale::setParams(CMoteurBase* pMoteurBase,
			     RUBREC_LIST* pRubList,
			     const char* num_GUID,
			     const char* id_doss,
			     const char* dossNom,
			     const char* dossPrenom,
			     const char* user,
			     QSplitter*  splitter)
{ m_pCMoteurBase = pMoteurBase;
  m_pRubList    = pRubList;
  if (num_GUID)   m_NumGUID    = num_GUID;
  else            m_NumGUID    = "";
  if (id_doss)    m_ID_Doss    = id_doss;
  else            m_ID_Doss    = "";
  if (dossNom)    m_DossNom    = dossNom;
  else            m_DossNom    = "";
  if (dossPrenom) m_DossPrenom = dossPrenom;
  else            m_DossPrenom = "";
  if (user)       m_User       = user;
  else            m_User       = "";
 m_pMyEditText = new MyEditText(m_pCMoteurBase->m_DataBase, splitter);
 splitter->setResizeMode ( m_pMyEditText, QSplitter::Auto);
 m_pMyEditText->setPaletteForegroundColor( QColor( 0, 0, 0 ) );
 m_pMyEditText->setWrapPolicy ( QTextEdit::AtWordBoundary );
 m_pMyEditText->setWordWrap (QTextEdit::WidgetWidth);
 setData();
 initText(m_pMyEditText);
}

//------------------- Current_RubList_ID -----------------------------
/*! \brief Retourne l'Id de la RubList correspondant à l'item sélectionné dans le QListView.
*/
int Rub_Centrale::Current_RubList_ID()
{CPrtQListViewItem* pCPrtQListViewItem  = (CPrtQListViewItem*) m_QListView_Liste->selectedItem();
 if (pCPrtQListViewItem) return pCPrtQListViewItem->get_ID_Rublist().toInt();
 return -1;
}

//------------------- initText -------------
/*! \brief Rattache à la variable membre: MyEditText *m_pMyEditText  l'editeur de texte passé en entrée et initialise cet editeur sur les valeurs adéquates
 * Il est imperatif d'appeler cette fonction apres le constructeur.
 */
void Rub_Centrale::initText(MyEditText *pMyEditText)
{if (pMyEditText==0)     return;
 m_pMyEditText = pMyEditText;
 m_pMyEditText->setGeometry (QRect  (0,100,100,400));
 m_pMyEditText->setTextFormat(RichText);
 m_pMyEditText->SetTypeRubrique((*m_pRubList->at(Current_RubList_ID())).m_Type.toInt() );
}


//--------------------------------- initListView -----------------------
/*! \brief initialise le ListView de la classe avec toutes les documents des rubriques.
 *  \return nombre de documents ajoutées.
 */
long  Rub_Centrale::initListView()
{ RUBREC_LIST::iterator it;
  long  i = 0;
  int pos = 0;
  m_QListView_Liste->clear();
  for(it = m_pRubList->begin(); it !=  m_pRubList->end(); ++it )   // it != m_RecSpeclist.end();
  { CPrtQListViewItem* CPrt  = new CPrtQListViewItem
			          (m_QListView_Liste ,		// QListView dans laquelle on insère un item
                                   (*it).m_Libelle,		// libelle
                                   QString::number(pos) ,	//  position du document dans la liste RUBREC_LIST
                                   (*it).m_Date ,		//  date document
                                   (*it).m_PrimKey,		//  pk du document
                                   (*it).m_SubType,		//  sous type du document
                                   (*it).m_Type,		//  type du document
                                   (*it).m_SignUser,		//  Signataire
                                   (*it).m_User);		//  Utilisateur courant de l'appli
    ++i;
    ++pos;
    // Ajoute l'icone selon le type
    if ((*it).m_Type.left(4) == "2008") // Document
     CPrt->setPixmap(LISTVIEW_TYPE_COLUMN, *m_Pixmap_Document);
 //   else if ((*it).m-Type.left(4) == "2006") // Terrain
    else if ((*it).m_Type.left(4) == "2003") // Observation
     CPrt->setPixmap(LISTVIEW_TYPE_COLUMN, *m_Pixmap_Observation);
    else if ((*it).m_Type.left(4) == "2002") // Prescription
     {	CPrt->setPixmap(LISTVIEW_TYPE_COLUMN, *m_Pixmap_Prescription);
	CPrt->setPixmap(LISTVIEW_PRIORITY_COLUMN, *m_Pixmap_HighPriority);
     }

  } //end for
 return i;
}


//--------------------------------- documentIsModified -----------------------
/*! \brief SLOT appelé lors d'une modification du text de la rubrique. Met en gras l'item correspondant dans la liste t ajoute une icone 'sauvegarde'.
*/
void Rub_Centrale::documentIsModified()
{ CPrtQListViewItem* pCPrtQListViewItem  = (CPrtQListViewItem*) m_QListView_Liste->selectedItem();
  if (!pCPrtQListViewItem) return;
  pCPrtQListViewItem->setModified(TRUE);
  pCPrtQListViewItem->setPixmap(LISTVIEW_ETAT_COLUMN, *m_Pixmap_ToSave );
  m_QListView_Liste->triggerUpdate() ;
}


//--------------------------------- SetData-------------------------------
/*! \brief Met à jour le ListView avec les éléments de la rublist sauvegardée dans la classe et positionne sur le premier élément. */
int Rub_Centrale::setData()
{QString qstr;
 if (m_pCMoteurBase==0) return 0;
 if (!m_pMyEditText) return 0;


 //................. mettre à jour le texte ............................
 int nb = initListView();
 if (nb > 0)
 { // Sélectionne le premier item de la liste
   m_QListView_Liste->setSelected( m_QListView_Liste->itemAt( QPoint(0,0) ), TRUE );
   m_QListView_Liste_selectionChanged();
   // Met à jour le texte
   m_pMyEditText->m_State = 1;
   m_pMyEditText->show();
   show();
 }
 else
 { m_pMyEditText->m_State = 0;
   m_pMyEditText->hide();
   textLabel_UserName->setText("");
   m_pMyEditText->setText("");
   hide();
 }
 return nb;
}

//--------------------------------- m_QListView_Liste_selectionChanged-------------------------------
/*! \brief Slot appelé par la QListView des documents lorsqu'un document est choisi par l'utilisateur.
 *  Sauvegarde si nécessaire le contenu du document actuel dans la RubList, affiche le document sélectionné.
 */
void Rub_Centrale::m_QListView_Liste_selectionChanged()
{CPrtQListViewItem* pCPrtQListViewItem  = (CPrtQListViewItem*) m_QListView_Liste->selectedItem () ;
 if (pCPrtQListViewItem == 0) return;
 int     id  =  pCPrtQListViewItem->get_ID_Rublist().toInt();
 if (m_pMyEditText==0) return ;

 // Déconnecter MyEditText du slot textChanged
 m_pMyEditText->disconnect(  SIGNAL( textChanged() )  );

 QByteArray          data;
 char                *ptr = 0;
 QString stringDST        = "";
 RUBREC_LIST::iterator it = m_pRubList->at(id);
 int typ 		  = (*it).m_Type.toInt();
 //........................... si rubrique qui etait avant celle a afficher, a ete modifiée ................................................
 //                            replacer son contenu dans la liste des rubriques avant d'afficher la nouvelle
//   if (m_pMyEditText && m_pMyEditText->isModified() && m_LastRub != -1)
//      {SaveTextInRubList();
//      }
 //........................... retirer le texte de la nouvelle rubrique a afficher ..............................
 //
 int ret   = m_pCMoteurBase->GetDataFromRubList(data, it);
 m_LastRub = id;                   // c'est maintenant la dernière affichée

 if ( (*it).m_Type .left(4) == "2008") // C'est un Document multimédia
 { dataToInterface(data); }
 else
 {int     f = 0;
  if (ret == RUB_READ_ON_DISK)      // en fait cela veut dire que ça été lu sur le disque
    {ptr        = data.data();
     long len   = data.size()-4;
     if (ptr && len>6)
        {// gestion des prescriptions vidal
         if (strncmp(ptr, "<?xml", 5)==0)
            {if (CGestIni::IsUtf8( ptr ))
                { CMedicaBase::Medica_DiskDataSplitIn_HtmlData_StructData(QString::fromUtf8 ( ptr ), &stringDST,0);
                }
             else CMedicaBase::Medica_DiskDataSplitIn_HtmlData_StructData(data.data(), &stringDST,0);
             m_pMyEditText->setText(stringDST);
             m_pMyEditText->setModified (FALSE);
            }
         else if (strncmp(ptr, "<html>", 6))
            {CHtmlTools::RtfToQtextEdit_HTML(ptr+4, len, stringDST,1);
	     m_pMyEditText->setText(stringDST);
             m_pMyEditText->setModified (FALSE);
            }
         else
            {m_pMyEditText->setText( ptr );
             m_pMyEditText->setModified (FALSE);
            }
         f = 1;
        }
    }
 else if (ret == RUB_READ_IN_LIST)   // en fait cela veut dire que ça été lu dans les données de liste
    {ptr      = data.data();
     if (ptr)
        {// Gestion des ordonnances
	 if (typ==TYP_ORDO_CALC)
            {if (CGestIni::IsUtf8( ptr ))
                { CMedicaBase::Medica_DiskDataSplitIn_HtmlData_StructData(QString::fromUtf8 ( ptr ), &stringDST,0);
                }
             else CMedicaBase::Medica_DiskDataSplitIn_HtmlData_StructData(data.data(), &stringDST,0);
             m_pMyEditText->setText(stringDST);
            }
         else
            {m_pMyEditText->setText(ptr);
            }
         m_pMyEditText->setModified (FALSE);
        }
     f = 1;
    }

  // Définit le type pour MyEditText
  if ((*it).m_Type.left(4) == "2002") // TYP_Prescription
   m_pMyEditText->SetTypeRubrique( TYP_PRESCRIPTION );
  else
   m_pMyEditText->SetTypeRubrique( (*it).m_Type.toInt() );
 } // Fin if document multimédia
 //........................ régler droits utilisateurs ......................................................................
 QString user              = (*it).m_User;
 QString doc_sign_user     = (*it).m_SignUser;

//  if (G_pCApp->m_User != doc_sign_user)  // si l'utilisateur actuel n'est pas le même que le signataire du document vérifier les droits
//     {QString friend_droits     = G_pCApp->m_pCMoteurBase->PermsUserIsThisUserFriendFromName(  doc_sign_user , G_pCApp->m_User);
//      if (G_pCApp->IsThisDroitExist(friend_droits, "obv")) {                                                                 pushButtonDelete->setEnabled(TRUE); pushButtonRubDateChange->setIconSet(Theme::getIconChangeDate);}
//      else                                                      { m_pMyEditText->setText(G_pCApp->m_MessVisuDocNotPossible); pushButtonDelete->setEnabled(FALSE);pushButtonRubDateChange->setIconSet(Theme::getIconCadenas);}
//      if (G_pCApp->IsThisDroitExist(friend_droits, "obc")) { m_pMyEditText->setReadOnly (FALSE );pushButtonDelete->setEnabled(TRUE);pushButtonRubDateChange->setIconSet(Theme::getIconChangeDate);}
//      else                                                      { m_pMyEditText->setReadOnly (TRUE ); pushButtonDelete->setEnabled(FALSE);pushButtonRubDateChange->setIconSet(Theme::getIconCadenas);}
//      if (G_pCApp->IsThisDroitExist(friend_droits, "obp")) { pushButtonPrint->setEnabled(TRUE);}
//      else                                                      { pushButtonPrint->setEnabled(FALSE);}
//     }
//  else
//     {m_pMyEditText->setReadOnly (FALSE );pushButtonDelete->setEnabled(TRUE); pushButtonPrint->setEnabled(TRUE);pushButtonRubDateChange->setIconSet(Theme::getIconChangeDate);
//     }
 textLabel_UserName->setText(user + "::" + doc_sign_user);
// 
//  if ((*it).m_State == RUB_IS_TO_DELETE) {pushButtonDelete->setIconSet (Theme::getIconIsDeleted); pushButtonDelete->setDown(TRUE);}
//  else                                   {pushButtonDelete->setIconSet (Theme::getIconDelete);    pushButtonDelete->setDown(FALSE);}
//  if (m_pMyEditText!=0 && f==0) m_pMyEditText->setText("");

 // Connecte le textEdit textChanged
 connect ( m_pMyEditText, SIGNAL( textChanged() ), this, SLOT(documentIsModified() ) );
// qWarning("Selected ID = " + QString::number(m_LastRub));
}

//----------------------------- dataToInterface -----------------------------------
/*! \brief Fonction qui place les données structurées dans l'interface
 *  \todo EN TEST
*/
void Rub_Centrale::dataToInterface(const QString &data)
{//clearDocument();
/* m_pMyEditText->setText("");
 G_pCApp->m_C_ImageList.resetRef();
 QString imgName, imageFile;
 QPixmap   pixmap;
 int pos_deb = data.find("<HTML_Data>",0);
 if (pos_deb==-1)         return;
 pos_deb += 11;
 int pos_end = data.find("</HTML_Data>", pos_deb);
 if (pos_deb==-1)         return;
 int pos_deb_img = data.find("<ImageListe>", pos_deb+12);
 if (pos_deb_img==-1)     return;
 int pos_end_img;
 while ( (pos_deb_img  = data.find("<name>",  pos_deb_img)) != -1 )
       {  imageFile = "";
          pos_deb_img += 6;
          if ( (pos_end_img  = data.find("</name>", pos_deb_img)) != -1)
             {imgName     = data.mid(pos_deb_img, pos_end_img-pos_deb_img).stripWhiteSpace();
              int pos;
              if ( (pos = data.find("<fileName>", pos_deb_img)) != -1)
                 {pos += 10;
                  if ( (pos_end_img  = data.find("</fileName>", pos)) != -1)
                     {imageFile = data.mid(pos, pos_end_img-pos).stripWhiteSpace();
                     }
                 }
              if ( (pos_deb_img = data.find("<base64>", pos_deb_img)) != -1)
                 {pos_deb_img += 8;
                  if ( (pos_end_img  = data.find("</base64>", pos_deb_img)) != -1)
                     { if (G_pCApp->m_C_ImageList.getNbRefForThisName(imgName) ==-1)           // est elle déjà dans la factory ??
                          {pixmap =  decodeStringTo_QPixmap( data.mid(pos_deb_img, pos_end_img-pos_deb_img ));
                           G_pCApp->m_C_ImageList.appendToList( pixmap, imgName, imageFile );
                           pos_deb_img = pos_end_img + 9;
                           //QImage   qi = pixmap.convertToImage().scale ( 60, 60 );
                           //new QIconViewItem( m_iconViewDocuments, imgName, QPixmap (qi )  );
                          }
                     }
                  else return;
                 }
               else return;
             }
          else return;
       }
 m_pMyEditText->setText(data.mid(pos_deb, pos_end-pos_deb));
*/
}


//----------------------------- decodeStringTo_pQPixmap -----------------------------------
/*! \brief Fonction qui décode un texte base64 en image... 
 *  \param in : QCString ou QByteArray ou QString qui contient l'image encodée en base64
 *  \return Renvoie un pointeur vers le QPixmap décodé.
*/
QPixmap *Rub_Centrale::decodeStringTo_pQPixmap( const QString& in )
{ QByteArray ba_dec;
  QCString base64encoded = QCString( in );
  QCodecs::base64Decode( base64encoded , ba_dec);
  return new QPixmap ( ba_dec );
}

//----------------------------- decodeStringTo_QPixmap -----------------------------------
/*! \brief Fonction qui décode un texte base64 en image... 
 *  \param in : QCString ou QByteArray ou QString qui contient l'image encodée en base64
 *  \return Renvoie un pointeur vers le QPixmap décodé.
*/
QPixmap Rub_Centrale::decodeStringTo_QPixmap( const QString& in )
{ QByteArray ba_dec;
  QCString base64encoded = QCString( in );
  QCodecs::base64Decode( base64encoded , ba_dec);
  return QPixmap ( ba_dec );
}

//--------------- SetCurentDocByPrimkey --------------------------------------------------
/*! \brief Fonction qui positionne l'interface sur la vue correspondant au document indique par son primKey... 
 *  \param primKey : QCString qui est le primary key du document a affichrt
 *  \return l'indice de ce document dans la liste eds rubriques.
*/
int Rub_Centrale::SetCurentDocByPrimkey(const QString &primKey)
{
int iPk = primKey.toInt();
QListViewItemIterator it( m_QListView_Liste );
while ( it.current() ) 
    {CPrtQListViewItem *pCPrtQListViewItem = (CPrtQListViewItem*) it.current();
     if (iPk == pCPrtQListViewItem->getPkDoc().toInt())
        {m_QListView_Liste->clearSelection();
         pCPrtQListViewItem->setSelected(TRUE);
         m_QListView_Liste->ensureItemVisible (pCPrtQListViewItem);
         m_QListView_Liste->setCurrentItem ( pCPrtQListViewItem );
         m_QListView_Liste_selectionChanged();
         m_LastRub = pCPrtQListViewItem->get_ID_Rublist().toInt();
         return m_LastRub;
        }
     ++it;
    }
 return -1; // pas trouvé
}

//--------------- Current_RubList_Iterator -----------------------------------------------
/*! \brief retourne un iterateur de la liste des rubriques sur le document en cours
*/

RUBREC_LIST::iterator Rub_Centrale::Current_RubList_Iterator()
{int id = Current_RubList_ID();
 if (id==-1) return  m_pRubList->end();
             return  m_pRubList->at(id);
}


//--------------------------- IfModified_SaveInRubList -----------------------------------------
/*! \brief Si rubrique qui etait avant celle a afficher, a ete modifiée replacer son contenu dans la liste des rubriques avant d'afficher la nouvelle
*/
int Rub_Centrale::IfModified_SaveInRubList()
{//if (m_IsModifiable && m_pMyEditText && m_pMyEditText->isModified() ) //&& m_LastRub != -1)
 if (m_pMyEditText && m_pMyEditText->isModified() ) //&& m_LastRub != -1)
    {SaveTextInRubList();
     return TRUE;
    }
 return FALSE;
}


//--------------------------------- SaveTextInRubList ------------------------------------------------
/*! \brief Sauvegarde le contenu de MyEditText dans la liste des rubriques
 *  \sa CMoteurBase::ReplaceDataInRubList
 */
void Rub_Centrale::SaveTextInRubList()
{ //if (m_IsModifiable==0) return;
  QString       txt ;
  if (m_pMyEditText && m_LastRub != -1)
  { if ((*m_pRubList->at(m_LastRub)).m_Type == TYP_ORDO_CALC)
    { //txt = m_pMyEditText->getText( &(*m_pRubList->at(m_LastRub)) ); 
    }
    else txt = m_pMyEditText->text();//txt = m_pMyEditText->getText();
    m_pCMoteurBase->ReplaceDataInRubList(txt, m_pRubList, m_LastRub );
    }

}

//--------------------------------- changeViewToRub ------------------------------------------------
/*! \brief Slot appelé par Dock_Menu Sign_Activm_QListView_Liste->clearSelection();
    pCPrtQListViewItem->setSelected(TRUE);
    m_QListView_Liste->ensureItemVisible (pCPrtQListViewItem);
    m_QListView_Liste->setCurrentItem ( pCPrtQListViewItem );
    m_QListView_Liste_selectionChanged();
    m_LastRub = idRubList;erDocument( pCPrtItem->getPk() ,  rubName );. Trouve le document à afficher dans la listView et l'affiche. 
 */
void Rub_Centrale::changeViewToRub(int idRubList )
{SetCurentDocByPrimkey(QString::number(idRubList));
}
