//
// C++ Implementation:
/********************************* C_RubDocuments.cpp *****************************************

    Project: MedinTux
    Copyright (C) 2005 by Roland Sevin  and Data Medical Design
    E-Mail: medintux@medintux.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the CeCILL Version 1 du 21/06/2004
    License (GPL compatible)
                               http://www.cecill.info/
    as published by :

    Commissariat � l'Energie Atomique
    - CEA,
                             31-33 rue de la F�d�ration, 75752 PARIS cedex 15.
                             FRANCE
    Centre National de la Recherche Scientifique
    - CNRS,
                             3 rue Michel-Ange, 75794 Paris cedex 16.
                             FRANCE
    Institut National de Recherche en Informatique et en Automatique
    - INRIA,
                             Domaine de Voluceau, Rocquencourt, BP 105, 78153
                             FRANCE

          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.
          CeCILL  License (GPL compatible) for more details.

*/

#include "C_RubDocuments.h"


#include <qpushbutton.h>
#include <qfiledialog.h>
#include <qclipboard.h>

#include <qvariant.h>
#include <qpushbutton.h>
#include <qcombobox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include <qtoolbar.h>

#include "../../MedinTuxTools/Codecs/qmdcodec.h"
#include "../../MedinTuxTools/CHtmlTools.h"
#include "CPreview.h"
#include "CMDI_Documents.h"
#include "DlgDateNom.h"
#include "C_Dlg_ImageProperty.h"
#include "../../MedinTuxTools/C_ImageList.h"
#include "drtux.h"
//======================================================== C_RubDocuments =======================================================
/*! \class C_RubDocuments
 *  \brief Classe C_RubDocuments.
*/



//----------------------------------------- C_RubDocuments --------------------------------
/*! \brief Constructeur de la classe. */
C_RubDocuments::C_RubDocuments(CMoteurBase *pCMoteurBase, RUBREC_LIST  *pRubList,
                                const char* num_GUID, const char* id_doss, const char* dossNom, const char* dossPrenom, const char* user,
                                QWidget* parent /* = 0 */, const char* name /* = 0 */, WFlags fl /* = 0 */ )
    : QWidget( parent, name, fl ), m_pCMoteurBase(pCMoteurBase), m_pRubList(pRubList)
{
 if ( !name )  setName( "FormRubDocuments" );
 setMinimumSize( QSize( 0, 32 ) );
 setMaximumSize( QSize( 32767, 32767 ) );

 m_IsModifiable  =  0;
 m_pMyEditText   =  0;
 m_LastRub       = -1;
 m_MaxImageWidth = 600;
 QString   val1  = "";

 if (READ_LOCAL_PARAM(LOCAL_PARAM, CMDI_Documents::S_GetRubName(), "MaxImageWidth", &val1 )==0) m_MaxImageWidth =  val1.toInt(); // splash utilisé provisoirement


 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 (dossPrenom)  m_User       = user;
 else             m_User       = "";
 //..................... vient de designer ...............................................
    m_pQToolBar_Combo  = new QToolBar( (QMainWindow*)parent );
    m_pQToolBar_Button = new QToolBar( (QMainWindow*)parent );

    FormRubDocumentsLayout = new QGridLayout( this, 1, 1, 0, 0, "FormRubDocumentsLayout");

    textLabel_NbRub = new QPushButton( m_pQToolBar_Combo, "textLabel_NbRub" );
    textLabel_NbRub->setProperty( "minimumSize", QSize( 22, 22 ) );
    textLabel_NbRub->setProperty( "maximumSize", QSize( 22, 22 ) );

    comboBox_RubName = new QComboBox( FALSE, m_pQToolBar_Combo, "comboBox_RubName" );
    comboBox_RubName->setProperty( "minimumSize", QSize( 200, 22 ) );
    comboBox_RubName->setProperty( "maximumSize", QSize( 32767, 22 ) );
    QFont comboBox_RubName_font(  comboBox_RubName->font() );
    comboBox_RubName->setFont( comboBox_RubName_font );
    comboBox_RubName->setProperty( "sizeLimit", 20 );

    pushButtonRubDateChange = new QPushButton( m_pQToolBar_Combo, "pushButtonRubDateChange" );
    pushButtonRubDateChange->setProperty( "minimumSize", QSize( 22, 22 ) );
    pushButtonRubDateChange->setProperty( "maximumSize", QSize( 22, 22 ) );

    textLabel1 = new QLabel( m_pQToolBar_Combo, "textLabel1" );
    textLabel1->setProperty( "minimumSize", QSize( 55, 22 ) );
    textLabel1->setProperty( "maximumSize", QSize( 55, 22 ) );
    QFont textLabel1_font(  textLabel1->font() );
    textLabel1->setFont( textLabel1_font );

    textLabel_UserName = new QLabel( m_pQToolBar_Combo, "textLabel_UserName" );
    textLabel_UserName->setProperty( "minimumSize", QSize( 100, 22 ) );
    textLabel_UserName->setProperty( "maximumSize", QSize( 115, 22 ) );
    QFont textLabel_UserName_font(  textLabel_UserName->font() );
    textLabel_UserName->setFont( textLabel_UserName_font );
    textLabel_UserName->setProperty( "frameShape", "StyledPanel" );
    textLabel_UserName->setProperty( "frameShadow", "Sunken" );
    textLabel_UserName->setProperty( "scaledContents", QVariant( FALSE, 0 ) );
    textLabel_UserName->setProperty( "alignment", int( QLabel::AlignCenter ) );

    pushButtonSave = new QPushButton( m_pQToolBar_Button, "pushButtonSave" );
    pushButtonSave->setProperty( "maximumSize", QSize( 35, 30 ) );

    pushButtonPrint = new QPushButton( m_pQToolBar_Button, "pushButtonPrint" );
    pushButtonPrint->setProperty( "maximumSize", QSize( 35, 30 ) );

    pushButtonDelete = new QPushButton( m_pQToolBar_Button, "pushButtonDelete" );
    pushButtonDelete->setProperty( "maximumSize", QSize( 35, 30 ) );

    pushButtonAdd = new QPushButton( m_pQToolBar_Button, "pushButtonAdd" );
    pushButtonAdd->setProperty( "maximumSize", QSize( 35, 30 ) );

    pushButtonExporter = new QPushButton( m_pQToolBar_Button, "pushButtonExporter" );
    pushButtonExporter->setProperty( "maximumSize", QSize( 35, 30 ) );

    languageChange();
    resize( QSize(839, 148).expandedTo(minimumSizeHint()) );
    clearWState( WState_Polished );

    // tab order
    setTabOrder( comboBox_RubName, pushButtonRubDateChange );
    setTabOrder( pushButtonRubDateChange, pushButtonSave );
    setTabOrder( pushButtonSave, pushButtonPrint );
    setTabOrder( pushButtonPrint, pushButtonDelete );
    setTabOrder( pushButtonDelete, pushButtonExporter );
//.................................................................


 pushButtonSave->setIconSet           (Theme::getIconSave());
 pushButtonPrint->setIconSet          (Theme::getIconPrint());
 pushButtonDelete->setIconSet         (Theme::getIconDelete());
 pushButtonRubDateChange->setIconSet  (Theme::getIconChangeDate());
 pushButtonAdd->setIconSet            (Theme::getIcon("22x22/fileopen.png") );
 pushButtonExporter->setIconSet       (Theme::getIcon("filesaveExport.png") );

 //.................. on crée le splitter vertical qui contiendra ........................................
 //                   l'icon  view à gauche et le viewer de documments à droite
 m_splitterVertical  = new QSplitter( this, "splitter1" );
 m_splitterVertical->setOrientation( QSplitter::Horizontal );

 m_iconViewDocuments = new QIconView( m_splitterVertical, "iconViewDocuments" );

 m_pMyEditText = new MyEditText( pCMoteurBase->m_DataBase, m_splitterVertical, "textEditDocuments" );
 m_pMyEditText->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, m_pMyEditText->sizePolicy().hasHeightForWidth() ) );
 m_pMyEditText->setPaletteForegroundColor( QColor( 0, 0, 0 ) );
 m_pMyEditText->SetTypeRubrique(TYP_DOCUMENTS);
 m_pMyEditText->setPaletteBackgroundColor( QColor( 255, 255, 255 ) );
 connect( m_pMyEditText,     SIGNAL( Signal_Key_Delete_Pressed(int)),      this,    SLOT  ( CheckIfImageIsToRemoveFromIconView(int))  );
 connect( m_pMyEditText,     SIGNAL( Signal_Key_Backspace_Pressed(int)),   this,    SLOT  ( CheckIfImageIsToRemoveFromIconView(int))  );
 connect( m_pMyEditText,     SIGNAL( Signal_Del_Before()),                 this,    SLOT  ( On_Signal_Del_Before())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Del_After()),                  this,    SLOT  ( On_Signal_Del_After())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Replace_Before()),             this,    SLOT  ( On_Signal_Del_Before())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Replace_After()),              this,    SLOT  ( On_Signal_Del_After())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Cut_Before()),                 this,    SLOT  ( On_Signal_Del_Before())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Cut_After()),                  this,    SLOT  ( On_Signal_Del_After())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Paste_Before()),               this,    SLOT  ( On_Signal_Del_Before())    );
 connect( m_pMyEditText,     SIGNAL( Signal_Paste_After()),                this,    SLOT  ( On_Signal_Paste_After())  );

 //........................ ajouter cela au dialogue principal .........................................
 //void addMultiCellWidget ( QWidget * w, int fromRow, int toRow, int fromCol, int toCol, int alignment = 0 )
 FormRubDocumentsLayout->addMultiCellWidget( m_splitterVertical, 0, 0, 0, 9 );
 setDefaultWordWrapFromIniFile();

 connect( pushButtonSave,               SIGNAL( clicked()),         this,    SLOT  ( On_pushButtonSave())  );
 connect( pushButtonRubDateChange,      SIGNAL( clicked()),         this,    SLOT  ( pushButtonRubDateChange_clicked()) );
 connect( comboBox_RubName,             SIGNAL( highlighted(int) ), this,    SLOT  ( comboBox_RubName_highlighted(int) ) );
 connect( comboBox_RubName,             SIGNAL( activated(int) ),   this,    SLOT  ( comboBox_RubName_activated(int) ) );
 connect( pushButtonDelete,             SIGNAL( clicked() ),        this,    SLOT  ( pushButtonDelete_clicked() ) );

 connect(textLabel_NbRub,               SIGNAL( pressed() ),        this,    SLOT( On_buttonDragClicked() ));

 m_iconViewDocuments->hide();
 pushButtonExporter->hide();
 QValueList <int> list;
 list.append(100);
 list.append(width()-100);
 m_splitterVertical->setSizes(list);

 //............................. charger les documents.....................................................................
 initData();
}


//----------------------------------------- ~C_RubDocument --------------------------------
C_RubDocuments::~C_RubDocuments()
{
 //ImageListClear();
 G_pCApp->m_C_ImageList.resetList();          // remet à zero la listes de references et enlève les images de la factory
 G_pCApp->m_C_ImageList.resetRef();
 m_iconViewDocuments->clear();
}

/*$SPECIALIZATION$*/

//--------------------------------- On_buttonDragClicked ------------------------------------------------------
// connect(textLabel_NbRub, SIGNAL( clicked() ), this, SLOT( On_buttonDragClicked() ));
//   virtual void          On_buttonDragClicked();
void  C_RubDocuments::On_buttonDragClicked()
{   RUBREC_LIST::iterator it = Current_RubList_Iterator();
    if ( it != m_pRubList->end() ) (*it).dragRubrique(this);
}

//----------------------------------------- SetDefautMask --------------------------------
/*! \brief charge le masque d'insertion par defaut des images
 *  \param path : chemin du masque d'insertion
*/

void  C_RubDocuments::SetDefaultMaskFile(QString path)
{m_InsertMask = path;
}
/*$SPECIALIZATION$*/
//----------------------------------------- GetDefaultMaskFile --------------------------------
/*! \brief retourne le masque d'insertion par defaut des images
 *  \param path : chemin du masque d'insertion
*/

QString  C_RubDocuments::GetDefaultMaskFile()
{if (G_pCApp->m_pDrTux->m_pFormGlossaire == 0)
    {return G_pCApp->m_PathGlossaire+CMDI_Documents::S_GetRubName()+"/STD.html";
    }
 if (m_InsertMask.length()==0 ||  !QFile::exists( m_InsertMask )) m_InsertMask = G_pCApp->m_pDrTux->m_pFormGlossaire->GetCurrentFileName();
 return m_InsertMask ;
}
/*
//--------------------------------- OnSignal_EditImage -------------------------------------------------------------
void C_RubDocuments::OnSignal_EditImage(QString &imageName)
{C_Dlg_ImageProperty* dlg = new C_Dlg_ImageProperty(m_pMyEditText, imageName, &G_pCApp->m_C_ImageList, this, "C_Dlg_ImageProperty");
 if (dlg==0) return;
 dlg->exec();
 delete dlg;
}
*/
//--------------------------------- pushButtonDelete_clicked -------------------------------------------------------------
void C_RubDocuments::pushButtonDelete_clicked()
{
 if (m_IsModifiable==0) return;

 CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) comboBox_RubName->listBox()->item ( comboBox_RubName->currentItem ()  );
 if (!pCPrtQListBoxItem) return;
 int id  =  pCPrtQListBoxItem->GetPk().toInt();

 RUBREC_LIST::iterator it = m_pRubList->at(id);
 //........................... 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 ((*it).m_State & RUB_IS_TO_DELETE)
    {m_pCMoteurBase->RubList_SetItemNotDeleted(m_pRubList, id);
    }
 else
    {m_pCMoteurBase->RubList_SetItemDeleted(m_pRubList, id);
    }
 if ((*it).m_State == RUB_IS_TO_DELETE) {pushButtonDelete->setIconSet (Theme::getIconIsDeleted()); pushButtonDelete->setDown(TRUE);}
 else                                   {pushButtonDelete->setIconSet (Theme::getIconDelete());    pushButtonDelete->setDown(FALSE);}
}

//----------------------------------------- CheckIfImageIsToRemovedFromIconView --------------------------------
/*! \brief SLOT verifie si une images est présente dans le bloc texte, ou près du curseur texte et si c'est le cas la retire de la liste et de l'iconView
 *  \param key : action au curseur  key == Qt::Key_Backspace (regarder l'image derrière) key== Qt::Key_Delete (regarder l'image devant) le curseur
*/

void C_RubDocuments::CheckIfImageIsToRemoveFromIconView(int key)
{//.................. recuperer position de depart .............................................
 QStringList    imageNameList;
 QIconViewItem *pQIconViewItem = 0;
 QString        imgName        = "";

 GetImageListToDelete(imageNameList,  key);
 for ( QStringList::Iterator it = imageNameList.begin(); it != imageNameList.end(); ++it )
     {imgName = *it;
      if (G_pCApp->m_C_ImageList.removeFromList(imgName)==0)          // retourne le nb de reference restante à l'image
         { if ( (pQIconViewItem = m_iconViewDocuments->findItem ( imgName, Qt::ExactMatch )) )                      // && refImageCount(m_pMyEditText->text(), imgName)<=1
              {delete pQIconViewItem;
              }
         }
     }
}

//----------------------------------------- refImageCount --------------------------------
/*! \brief compte le nombre de références à cette image dans le texte
*/
int C_RubDocuments::refImageCount(const QString &text, const QString &image)
{int deb_tag            = 0;          // chercher le premier tag image en partant du debut du bloc
 int end_tag            = 0;
 int     nb             = 0;
 QString           tag  = "";
 while ( (deb_tag  =  text.find("<img", end_tag)) != -1)
       {  end_tag  =  text.find('>',    deb_tag + 4);              // chercher fin du tag image
        if (end_tag ==-1)     return nb;                           // pas normal (tag non fermé)
        ++end_tag;                                                 // faire pointer après ">"
        tag = text.mid(deb_tag, end_tag-deb_tag);
        if (tag.find(image) != -1) ++nb;
        }
 return nb;
}

//----------------------------------------- refImageReinit --------------------------------
/*! \brief reinitialise le nombre de références de la liste d'images
*/
void C_RubDocuments::refImageReinit(const QString &qs_text)
{
 //................ effacer toutes les references aux images ...................
 G_pCApp->m_C_ImageList.resetRef();
 //............... reincrementer les réferences à  ces images ...................
 QString   imgName = "";
 long       from   = 0;
 long    deb_tag   = 0;
 long     lenText  = qs_text.length();
 while (from>=0 && from < lenText)
       {deb_tag     = CHtmlTools::IsThisTagImage(qs_text, from , &imgName );
        if (deb_tag>=0)  G_pCApp->m_C_ImageList.incRef(imgName);
       }

}
//----------------------------------------- On_Signal_Del_Before --------------------------------
/*! \brief SLOT verifie si une images est présente dans le bloc texte, ou près du curseur texte et si c'est le cas la retire de la liste et de l'iconView avant effacement
*/
void C_RubDocuments::On_Signal_Del_Before()
{
}

//----------------------------------------- On_Signal_Del_After --------------------------------
/*! \brief SLOT verifie si une images est présente dans le bloc texte, ou près du curseur texte et si c'est le cas la retire de la liste et de l'iconView avant effacement
*/
void C_RubDocuments::On_Signal_Del_After()
{ReinitQIconViewOnText();
}

//----------------------------------------- ReinitQIconViewOnText --------------------------------
/*! \brief reinitialise l'iconView sur les images du texte
*/
void C_RubDocuments::ReinitQIconViewOnText()
{m_iconViewDocuments->clear();
 //............. remettre toutes les references de la liste d'image sur les images du texte ...............
 refImageReinit(m_pMyEditText->text());

 //.............  parcourir la liste d'images et  ...............
 //               si une reference est trouvée afficher l'icone
 C_ImgInf *pC_ImgInf;
 QPixmap   retPixMap;
 QDictIterator <C_ImgInf> it( G_pCApp->m_C_ImageList.m_C_ImageRefDict );
 for( ; it.current(); ++it )
    {pC_ImgInf = it.current();
     if (pC_ImgInf && pC_ImgInf->m_NbRef > 0)
        {//G_pCApp->m_C_ImageList.getPixmap( pC_ImgInf->m_Name , retPixMap);
         //QImage qi = retPixMap.convertToImage().scale ( 60, 60 );
         //new QIconViewItem( m_iconViewDocuments, pC_ImgInf->m_Name, QPixmap (qi )  );
        }
    }
}

//----------------------------------------- On_Signal_Paste --------------------------------
/*! \brief SLOT qui remet à jour l'iconView aprés un paste
*/
void C_RubDocuments::On_Signal_Paste_After()
{ReinitQIconViewOnText();
}

//----------------------------------------- GetImageListToDelete --------------------------------
/*! \brief Fonction qui crée la liste d'images concernées par soit un bloc à effacer soit collées au curseur
 *  \param imageNameList : QStringList qui contiendra la liste des images concernées
 *  \param key : action au curseur  key == Qt::Key_Backspace (regarder l'image derrière) key== Qt::Key_Delete (regarder l'image devant) le curseur
*/

void C_RubDocuments::GetImageListToDelete(QStringList &imageNameList, int key)
{
 int ori_index;
 int ori_para;
 int deb_para;
 int deb_index;
 int old_deb_par;
 int old_deb_index;
 int old_end_par;
 int old_end_index;
 QString qs_text = "";
 QString imgName = "";
 //................. si positions non correctes ................................................
 //                  on utilise la position courante
 m_pMyEditText->getCursorPosition (&ori_para, &ori_index );

 //................. sauvegarder l'ancienne selection ..........................................
 m_pMyEditText->getSelection(&old_deb_par, &old_deb_index, &old_end_par, &old_end_index);
 // ................ si il y a une selection faire la liste des images contenues dans le bloc ......................
 if (old_deb_par != -1)
    {qs_text = m_pMyEditText->selectedText();
     if (qs_text.length())
        {long       from   = 0;
         long    deb_tag   = 0;
         while (from>=0 && from<(long)qs_text.length())
               {deb_tag     = CHtmlTools::IsThisTagImage(qs_text, from , &imgName );
                if (deb_tag>=0) imageNameList.append(imgName);
               } //end while (from>=0 && from<txt.length())
        }
    }
 else
    {//................. se positionner là où le boutton droit est appuyé ..........................
     m_pMyEditText->setUpdatesEnabled( FALSE );                      // inhiber l'affichage (faut pas montrer la selection)

     //.................. faire bouger le curseur un coup en avant et arrière ...............
     //                   seul moyen pour que le curseur "prenne la fonte"
     //                   et de la noter avant de l'envoyer dans des zones inconnues
     m_pMyEditText->moveCursor (QTextEdit::MoveBackward);  //MoveBackward, MoveForward
     m_pMyEditText->moveCursor (QTextEdit::MoveForward);   //MoveBackward, MoveForward
     m_pMyEditText->m_LastFont  = m_pMyEditText->currentFont();            //relever la police de caractère à l'endroit de l'insertion
     m_pMyEditText->m_LastColor = m_pMyEditText->color();
     //.................. se mettre en debut ou fin de document .......................
     if   (key== Qt::Key_Delete) m_pMyEditText->moveCursor (QTextEdit::MoveEnd);             // chercher après le curseur
     else                        m_pMyEditText->moveCursor (QTextEdit::MoveHome);            // chercher avant le curseur
     //....................... recuperer la position de début de document .................................
     //                        la recherche se fait en reculant ou avançant à partir du curseur texte
     m_pMyEditText->getCursorPosition (&deb_para, &deb_index );
     m_pMyEditText->setSelection(deb_para, deb_index, ori_para, ori_index);
     qs_text = m_pMyEditText->selectedText().remove("<!--StartFragment-->"); // recuperer le texte selectionné et virer le tag rajouter par 'selectedText()'
     m_pMyEditText->removeSelection();                        // deselectionner
     m_pMyEditText->setCurrentFont(m_pMyEditText->m_LastFont);
     m_pMyEditText->setColor(m_pMyEditText->m_LastColor);
     m_pMyEditText->setCursorPosition (ori_para, ori_index );

     if   (key== Qt::Key_Delete)
          {imgName = CHtmlTools::checkIfImageAfter(qs_text);
          }
     else
          {imgName = CHtmlTools::checkIfImageBefore(qs_text);
          }
     if (imgName.length()) imageNameList.append(imgName);
     m_pMyEditText->setUpdatesEnabled( TRUE );
    }
}

//----------------------------------------- ImageListClear --------------------------------
void C_RubDocuments::ImageListClear()
{
}

//----------------------------------------- makeData --------------------------------
/*! \brief Fonction à partir du nom du fichier à insérer, et du masque d'insertion, les données à placer en base...
 *  \param imgName : &QString qui contient le nom de l'image à insérer
 *  \param  w : int contenant la largeur maximale d'affichage l'image à insérer
 *  \param  h : int contenant la hauteur maximale d'affichage l'image à insérer
 *  \param  fileMask : &QString contenant le chemin du fichier du masque d'insertion (si vide il sera utilisé m_InsertMask de la classe )
 *  \return QString qui contient les données.
*/

QString C_RubDocuments::makeData(const QString &imageFile, int h, int w, const QString &fileMask /* = "" */)
{
 QString html_Part     = "<?xml version=\"1.0\"  encoding=\"ISO-8859-1\" standalone=\"yes\" ?>\r\n"
                         "<MedinTux_Multimedia_data>\r\n"
                         "    <HTML_Data>\r\n";
 QString image_Part    = "    </HTML_Data>\r\n"
                         "    <ImageListe>\r\n";

 makeData ( imageFile,  h,  w, html_Part, &image_Part, fileMask  );

 html_Part            += image_Part;
 html_Part            += "    </ImageListe>\r\n"
                         "</MedinTux_Multimedia_data>\r\n";
 return html_Part;

}
//----------------------------------------- makeData --------------------------------
/*! \brief Fonction à partir du nom du fichier à insérer, et du masque d'insertion, les données à placer en base...
 *  \param imgName : &QString qui contient le nom de l'image à insérer
 *  \param  w : int contenant la largeur maximale d'affichage l'image à insérer
 *  \param  h : int contenant la hauteur maximale d'affichage l'image à insérer
 *  \param  html_Part :  une référence sur une QString à laquelle sera ajoutée  la partie html des données
 *  \param  image_Part : un pointeur sur une QString à laquelle (si pointeur non egal à zéro) sera ajoutée  la partie xml des données images (par défaut à zéro)
 *  \param  fileMask : &QString contenant le chemin du fichier du masque d'insertion (si vide il sera utilisé m_InsertMask de la classe ) (par défaut vide)
 *  \return néant.
*/

void C_RubDocuments::makeData(const QString &imageFile, int h, int w, QString &html_Part, QString *image_Part /* = "" */, const QString &fileMask  /* = "" */ )
{QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
 QPixmap      *pImg  = new QPixmap(imageFile);     // format image deviné car 'const char * format = 0'
 //.................... mise à l'echelle de l'image si trop large pour l'impression .........................................
 if (pImg && pImg->width()> m_MaxImageWidth)
    { int   val_w    = pImg->width();
      int   val_h    = (int) ( ((float)m_MaxImageWidth / (float)val_w) * (float)pImg->height());
      QImage   qi    = pImg->convertToImage().smoothScale (m_MaxImageWidth, val_h );
      *pImg          = QPixmap (qi );
    }

 QString    ext        = ".png";
 QString    imgName    = m_pCMoteurBase->GUID_Create()+"-h"+ QString::number(h)+"w"+QString::number(w) + ext;                  // nom et clef pour retrouver l'image

 if (pImg &&  G_pCApp->m_C_ImageList.appendToList( pImg , imgName , imageFile) == 1 ) // si reference est la première creer l'icone de l'image
    {
     html_Part        += MixMaskWhithImageName( imgName ,  pImg->width(),  pImg->height() , fileMask);
     QStringList imgListAlreadyDump;
     QPixmap     retPixMap;
     //................. cette version ne place que les images de la liste ....................
     //                  auquelles fait référence le texte
     long       from   = 0;
     long    deb_tag   = 0;
     while (from>=0 && from<(long)html_Part.length())
           {deb_tag    = CHtmlTools::IsThisTagImage(html_Part, from , &imgName );   // rechercher le prochain tag image du texte
            if (deb_tag>=0                                   &&                     // doit etre trouvé un tag image dans le texte
                imgListAlreadyDump.findIndex(imgName)==-1    &&                     // ne doit pas déjà avoir été dumpé (peut  y avoir plusieurs références à la même image)
                G_pCApp->m_C_ImageList.getPixmap( imgName , retPixMap)              // doit exister dans la liste des images
               )
               { imgListAlreadyDump.append(imgName);                       // placer dans la liste des images déjà dumpées
                 if (image_Part)
                    {image_Part->append("      <name>\r\n          ");
                     image_Part->append(imgName+"\r\n");
                     image_Part->append("      </name>\r\n");
                     image_Part->append("      <fileName>\r\n          ");
                     image_Part->append(imageFile+"\r\n");
                     image_Part->append("      </fileName>\r\n");
                     image_Part->append("      <ext_Type>\r\n          ");
                     image_Part->append("PNG\r\n");
                     image_Part->append("      </ext_Type>\r\n");
                     image_Part->append("      <base64>\r\n");
                     image_Part->append(encodePixmapToBase64(retPixMap)+"\r\n");
                     image_Part->append("      </base64>\r\n");
                    }
               }
               //<img height=400 src=Image-0001h400w500 width=500 >
           } //end while (from>=0 && from<txt.length())     essai2.html
    }
 if (pImg) delete pImg;
 QApplication::restoreOverrideCursor();
}

//----------------------------- MixMaskWhithImage -----------------------------------
/*! \brief Fonction à partir du nom du fichier à insérer, et du masque d'insertion, crée la chaine HTML à insérer...
 *  \param in : QCString ou QByteArray ou QString qui contient le nom de l'image à insérer
 *  \return Renvoie un pointeur vers le QPixmap décodé.
*/
//   Image  {{IMAGE_NAME}}
//   {{IMAGE_WIDTH=300}} {{IMAGE_HEIGHT=100}}
//
//
QString C_RubDocuments::MixMaskWhithImageName( QString imgName , int w, int h, const QString &fileMask /* = "" */)
{QString insertMask = "";
 QString toScale    = "";
 int pos            = imgName.findRev('h');
 int    pos_egal    = -1;
 QString     tag    = "";
 int         val_w  = -1;
 int         val_h  = -1;
 int     len_tag    =  0;
 if (fileMask.length())    CGestIni::Param_UpdateFromDisk(fileMask,     insertMask);
 else                      CGestIni::Param_UpdateFromDisk(m_InsertMask, insertMask);
 if (insertMask.length()==0) // si pas de masque on insère une référence simple par défaut.
    { if (pos != -1)
         {toScale = "";
          toScale += "\" width=\""  + QString::number(w);
          toScale += "\" height=\"" + QString::number(h);
          toScale += "\"";
         }
      return (QString("<img src=\"") + imgName + toScale  + "><br>");
    }

 int deb_tag=0;
 int end_tag=0;
 while ( (deb_tag = insertMask.find("{{",deb_tag)) != -1)
  {end_tag = insertMask.find("}}", deb_tag + 2);
   if (end_tag==-1)          return tr("Erreur de syntaxe '}}' fermant non trouvé près de : ") + insertMask.mid(deb_tag + 2, 10);
   end_tag += 2;
   len_tag = end_tag - deb_tag;

   tag = insertMask.mid(deb_tag, len_tag);
   if ( tag.find("IMAGE_PICT") != -1 )
      {insertMask.replace( deb_tag, len_tag , "#~~°=|=°~~#" );
       end_tag = deb_tag + 12;
      }
   else if ( tag.find("IMAGE_NAME") != -1 )
      {insertMask.replace( deb_tag, len_tag , imgName );
       end_tag = deb_tag + imgName.length();
      }
   else if ( tag.find("IMAGE_MAX_WIDTH") != -1 )
      {pos_egal = tag.find ('=');
       if (pos_egal == -1)   return tr("Erreur de syntaxe signe '=' non trouvé près de : ") + insertMask.mid(deb_tag + 2, 10);
       ++pos_egal;
       val_w = tag.mid(pos_egal,tag.length()-2-pos_egal).stripWhiteSpace().toInt();
       val_w = Min(w, val_w);
       insertMask.remove( deb_tag, len_tag );
       end_tag = deb_tag;
      }
   else if ( tag.find("IMAGE_MAX_HEIGHT") != -1 )
      {pos_egal = tag.find ('=');
       if (pos_egal == -1)   return tr("Erreur de syntaxe signe '=' non trouvé près de : ") + insertMask.mid(deb_tag + 2, 10);
       ++pos_egal;
       val_h = tag.mid(pos_egal,tag.length()-2-pos_egal).stripWhiteSpace().toInt();
       val_h = Min(h, val_h);
       insertMask.remove( deb_tag, len_tag );
       end_tag = deb_tag;
      }
   else if ( tag.find("IMAGE_WIDTH") != -1 )
      {pos_egal = tag.find ('=');
       if (pos_egal == -1)   return tr("Erreur de syntaxe signe '=' non trouvé près de : ") + insertMask.mid(deb_tag + 2, 10);
       ++pos_egal;
       val_w = tag.mid(pos_egal,tag.length()-2-pos_egal).stripWhiteSpace().toInt();
       insertMask.remove( deb_tag, len_tag );
       end_tag = deb_tag;
      }
   else if ( tag.find("IMAGE_HEIGHT") != -1 )
      {pos_egal = tag.find ('=');
       if (pos_egal == -1)   return tr("Erreur de syntaxe signe '=' non trouvé près de : ") + insertMask.mid(deb_tag + 2, 10);
       ++pos_egal;
       val_h = tag.mid(pos_egal,tag.length()-2-pos_egal).stripWhiteSpace().toInt();
       insertMask.remove( deb_tag, len_tag );
       end_tag = deb_tag;
      }
   else
      {deb_tag = end_tag;
      }
  }
  //...................... Mise à l'echelle .........................................
 if (val_w == -1 && val_h == -1 )
    {val_w = w;
     val_h = h;
    }
 else if(val_w == -1 && val_h != -1 )
    {val_w = (int) ( ((float)val_h / (float)h) * (float)w);
    }
 else if(val_h == -1 && val_w != -1 )
    {val_h = (int) ( ((float)val_w / (float)w) * (float)h);
    }
 toScale += "";
 toScale += "\" width=\""  + QString::number(val_w);
 toScale += "\" height=\"" + QString::number(val_h);
 toScale += "\"";

 insertMask.replace("#~~°=|=°~~#",QString("<img src=\"") + imgName + toScale  + ">");
 return insertMask;
}


//----------------------------------------- On_pushButtonSave --------------------------------
void C_RubDocuments::On_pushButtonSave()
{if (m_IsModifiable) emit Sign_SaveButtonClicked();
}

//----------------------------- interfaceToData -----------------------------------
/*! \brief Fonction crée la chaine de caractères des données du MyEditText à enregistrer
*  \param len : un pointeur sur int qui si il n'est pas egal à zero sera initialisé sur la longueur des données
 *  \return Renvoie un QString des données
*/
QString C_RubDocuments::interfaceToData(int *len /*=0*/)
{QString     imgName;
 QString     text = m_pMyEditText->text();
 QString     encodedData, html_Data;
 QStringList imgListAlreadyDump;
 QPixmap     retPixMap;
 QString     imageFile;
 //................. cette version ne place que les images de la liste ....................
 //                  auquelles fait référence le texte
 long       from   = 0;
 long    deb_tag   = 0;
 while (from>=0 && from < (long)text.length() )
    {deb_tag     = CHtmlTools::IsThisTagImage(text, from , &imgName );   // rechercher le prochain tag image du texte
     if (deb_tag>=0                                   &&                 // doit etre trouvé un tag image dans le texte
         imgListAlreadyDump.findIndex(imgName)==-1    &&                 // ne doit pas déjà avoir été dumpé (peut  y avoir plusieurs références à la même image)
         G_pCApp->m_C_ImageList.getPixmap( imgName , retPixMap, &imageFile)                   // doit exister dans la liste des images
        )
        { imgListAlreadyDump.append(imgName);                       // placer dans la liste des images déjà dumpées
          encodedData.append("      <name>\r\n          ");
          encodedData.append(imgName+"\r\n");
          encodedData.append("      </name>\r\n");
          encodedData.append("      <fileName>\r\n          ");
          encodedData.append(imageFile+"\r\n");
          encodedData.append("      </fileName>\r\n");
          encodedData.append("      <ext_Type>\r\n          ");
          encodedData.append("PNG\r\n");
          encodedData.append("      </ext_Type>\r\n");
          encodedData.append("      <base64>\r\n");
          encodedData.append(encodePixmapToBase64(retPixMap)+"\r\n");
          encodedData.append("      </base64>\r\n");
        }
     //<img height=400 src=Image-0001h400w500 width=500 >
    } //end while (from>=0 && from<txt.length())     essai2.html
 encodedData.append("    </ImageListe>\r\n");
 encodedData.append("</MedinTux_Multimedia_data>\r\n");
 //.................. le construire à la fin car les noms ..................
 //                   des images sont modifiés
 html_Data.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\" ?>\r\n<MedinTux_Multimedia_data>\r\n");
 html_Data.append("    <HTML_Data>\r\n");
 html_Data.append(text);
 html_Data.append("    </HTML_Data>\r\n");
 html_Data.append("    <ImageListe>\r\n");
 encodedData.prepend(html_Data);
 if (len) *len = encodedData.length();
 return encodedData;
}

//----------------------------- clearDocument -----------------------------------
/*! \brief Fonction efface le document en cours (images, liste des références d'images, l'iconview)
*/
void C_RubDocuments::clearDocument()
{m_pMyEditText->setText("");
 //G_pCApp->m_C_ImageList.resetList();          // remet à zero la listes de references et enlève les images de la factory (pas bon pour le copier coller)
 G_pCApp->m_C_ImageList.resetRef();
 m_iconViewDocuments->clear();
}

//----------------------------- dataToInterface -----------------------------------
/*! \brief Fonction qui place les données structurées dans l'interface
*/
void C_RubDocuments::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 *C_RubDocuments::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 C_RubDocuments::decodeStringTo_QPixmap( const QString& in )
{ QByteArray ba_dec;
  QCString base64encoded = QCString( in );
  QCodecs::base64Decode( base64encoded , ba_dec);
  return QPixmap ( ba_dec );
}

//----------------------------- encodePixmapToBase64 -----------------------------------
/*! \brief Encode en base64 la QPixmap passée en paramètre */
QString  C_RubDocuments::encodePixmapToBase64(const QPixmap& pixIn)
{ QByteArray ba_enc;
  QBuffer buffer( ba_enc );
  buffer.open( IO_WriteOnly );
  pixIn.save( &buffer, "PNG" ); // writes pixmap into ba in PNG format
  return QString ( QCodecs::base64Encode( ba_enc , TRUE) );
}
//----------------------------- encodePixmapToBase64 -----------------------------------
/*! \brief Encode en base64 la QPixmap passée en paramètre */
QString  C_RubDocuments::encodePixmapToBase64(QPixmap* pQPixmap)
{ if (pQPixmap==0) return "";
  QByteArray ba_enc;
  QBuffer buffer( ba_enc );
  buffer.open( IO_WriteOnly );
  pQPixmap->save( &buffer, "PNG" ); // writes pixmap into ba in PNG format
  return QString ( QCodecs::base64Encode( ba_enc , TRUE) );
}

//----------------------------------------- C_RubDocuments --------------------------------
/*! \brief Retourne l'iterator (CRubRecord) de la RubList pour le document en cours. */
RUBREC_LIST::iterator C_RubDocuments::Current_RubList_Iterator()
{int id = Current_RubList_ID();
 if (id==-1) return  m_pRubList->end();
             return  m_pRubList->at(id);
}

//----------------------------------------- Current_RubList_ID --------------------------------
/*! \brief Retourne l'id dans la RubList du document en cours. */
int C_RubDocuments::Current_RubList_ID()
{CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) comboBox_RubName->listBox()->item ( comboBox_RubName->currentItem ()  );
 if (pCPrtQListBoxItem) return pCPrtQListBoxItem->GetPk().toInt();
 return -1;
}

//----------------------------------------- IfModified_SaveInRubList --------------------------------
/*! \brief Sauvegarde le contenu du MyEditText dans la liste des rubriques. */
int C_RubDocuments::IfModified_SaveInRubList()
{//........................... 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_IsModifiable && m_pMyEditText && m_pMyEditText->isModified()  && m_LastRub != -1)
    {SaveTextInRubList();
     return TRUE;
    }
 return FALSE;
}

//--------------------------------- initComboListHistoric -------------------------------------------------------------
/*! \brief Met à jour le comboBox avec la RubList. */
long  C_RubDocuments::initComboListHistoric(void)
{return m_pCMoteurBase->initConboBoxWithRubList(m_pRubList, comboBox_RubName, QString::number(CMDI_Documents::S_GetType()));
}

//----------------------------------------- DoPopupList --------------------------------
/*! \brief Rien. */
QString C_RubDocuments::DoPopupList( QStringList & /*list */)
{return QString::null;
}


//----------------------------------------- comboBox_RubName_activated --------------------------------
/*! \brief Met à jour l'affichage de MyEditText avec le contenu du document sélectionné. */
void C_RubDocuments::comboBox_RubName_activated( int item )
{CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) comboBox_RubName->listBox()->item ( item );
 if (pCPrtQListBoxItem == 0) return;
 int     id  =  pCPrtQListBoxItem->GetPk().toInt();

 QByteArray          data;
 char                *ptr = 0;
 RUBREC_LIST::iterator it = m_pRubList->at(id);
 //........................... 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
 int     f = 0;
 if (ret == RUB_READ_ON_DISK)      // en fait cela veut dire que ça été lu sur le disque
    {ptr        = data.data();
     if (ptr && m_pMyEditText!=0)
        {if (CGestIni::IsUtf8( ptr ))
            {dataToInterface(QString::fromUtf8 ( ptr ));     //setText(QString::fromUtf8 ( ptr ));
            }
         else
            {dataToInterface(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 && m_pMyEditText!=0)
        {if (CGestIni::IsUtf8( ptr ))
            {dataToInterface(QString::fromUtf8 ( ptr ));     //setText(QString::fromUtf8 ( ptr ));
            }
         else
            {dataToInterface(ptr );
            }
         m_pMyEditText->setModified (FALSE);
        }
     f = 1;
    }
 //........................ 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, "dov")) {                                                            pushButtonDelete->setEnabled(TRUE); pushButtonRubDateChange->setIconSet(Theme::getIconChangeDate());}
     else                                                 { m_pMyEditText->setText(G_pCApp->m_MessVisuDocNotPossible); pushButtonDelete->setEnabled(FALSE);pushButtonRubDateChange->setIconSet(Theme::getIconCadenas());pushButtonDelete->setEnabled(FALSE);}
     if (G_pCApp->IsThisDroitExist(friend_droits, "doc")) { m_pMyEditText->setReadOnly (FALSE );pushButtonAdd->setEnabled(TRUE); pushButtonDelete->setEnabled(TRUE); pushButtonRubDateChange->setIconSet(Theme::getIconChangeDate());}
     else                                                 { m_pMyEditText->setReadOnly (TRUE ); pushButtonAdd->setEnabled(FALSE);pushButtonDelete->setEnabled(FALSE);pushButtonRubDateChange->setIconSet(Theme::getIconCadenas());}
     if (G_pCApp->IsThisDroitExist(friend_droits, "dop")) { 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("");
}

//----------------------------------------- comboBox_RubName_highlighted ------------
/*! \brief Slot appelé par le ComboBox lorsqu'un item est mis en Highlight. Affiche le contenu du document sélectionné. */
void C_RubDocuments::comboBox_RubName_highlighted( int item )
{comboBox_RubName_activated(item);
}

//----------------------------------------- initData --------------------------------
/*! \brief Met à jour le ComboBox et le texte. */
void C_RubDocuments::initData()
{
 QString qstr;
 if (m_pCMoteurBase==0) return;
 //................. mettre à jour le texte ............................
 long nb = initComboListHistoric();
 if (nb>0)
    {comboBox_RubName->setCurrentItem (nb-1);
     comboBox_RubName_activated( nb-1);
     if (m_pMyEditText!=0) {m_pMyEditText->m_State = 1;
                            m_pMyEditText->show();
                           }
     show();
    }
 else
    {if (m_pMyEditText!=0){m_pMyEditText->m_State = 0;
                           m_pMyEditText->hide();
                           textLabel_UserName->setText("");
                           m_pMyEditText->setText("");
                          }
     //hide();
    }
 textLabel_NbRub->setText(qstr.setNum(nb));
}


//----------------------------------------- SetModifiableState --------------------------------
void C_RubDocuments::SetModifiableState( int state )
{m_IsModifiable = state;
 if (m_IsModifiable)
    {pushButtonSave->show();
     pushButtonRubDateChange->show();
     pushButtonDelete->show();
    }
 else
    {pushButtonSave->hide();
     pushButtonRubDateChange->hide();
     pushButtonDelete->hide();
    }
}

//----------------------------------------- setDefaultWordWrapFromIniFile --------------------------------
void C_RubDocuments::setDefaultWordWrapFromIniFile()
{   //................................. un peu de geometrie ........................................
    QString val = "-1";
    if (CGestIni::Param_ReadParam(G_pCApp->m_DrTuxParam, "Documents", "Largeur visualisation", &val) !=0 )  // zero = pas d'erreur
       {m_pMyEditText->setWordWrap(QTextEdit::WidgetWidth);   //NoWrap, WidgetWidth, FixedPixelWidth, FixedColumnWidth
       }
    else
       {m_pMyEditText->setWordWrap (QTextEdit::FixedPixelWidth);
        m_pMyEditText->setWrapColumnOrWidth ( val.toInt() );  //   (793-37 );   //( corresponds A4 width  21*72/2.54 )
       }
}

//----------------------------------------- OnMenuActivated --------------------------------
void C_RubDocuments::OnMenuActivated( int /*id */)
{
}

//--------------------- SetCurentDocByPrimkey ------------------------------------------
/*! \brief Affiche le document dont la clé primaire est le primKey passé en paramètre. Utilisé pour lier le Dock_Menu à cette CMDI.
*/
int C_RubDocuments::SetCurentDocByPrimkey(const QString &primKey)
{QListBox *pQListBox = comboBox_RubName->listBox();
 int last            = comboBox_RubName->count ();
 int i;
 for (i=0; i<last; i++)
     {CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) pQListBox->item ( i );
     if (pCPrtQListBoxItem->GetUser() == primKey)
        {comboBox_RubName->setCurrentItem(i);
         comboBox_RubName_activated(i);
         return i;
        }
     }
 return -1; // pas trouvé
}

//--------------------------------- SaveTextInRubList--------------------------------
/*! \brief Sauvegarde le contenu du document dans la RubList.
 *  \sa CMoteurBase::ReplaceDataInRubList
*/
void C_RubDocuments::SaveTextInRubList()
{if (m_IsModifiable==0) return;
 m_pCMoteurBase->ReplaceDataInRubList(interfaceToData(), m_pRubList, m_LastRub );
}

//--------------------------------- GetRubDateName -----------------------------------
/*! \brief Récupère la Date et le Libellé du document en cours. La date et le libellé sont sauvegardés dans les variables de la classe (date , name ).
*/
void C_RubDocuments::GetRubDateName( QString &name, QString &date )
{CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) comboBox_RubName->listBox()->item ( comboBox_RubName->currentItem ()  );
 if (!pCPrtQListBoxItem)             return;

 RUBREC_LIST::iterator it = m_pRubList->at(pCPrtQListBoxItem->GetPk().toInt());
 date = (*it).m_Date;
 name = (*it).m_Libelle;
}

//-------------------------- pushButtonRubDateChange_clicked ----------------------------------
/*! \brief Affiche le dialogue de modification du libelle du sous-type et de la date du document.
*/
void C_RubDocuments::pushButtonRubDateChange_clicked()
{if (m_IsModifiable==0)                  return;
 if (m_pMyEditText->isReadOnly())        return;
 CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) comboBox_RubName->listBox()->item ( comboBox_RubName->currentItem ()  );
 if (!pCPrtQListBoxItem)                 return;

 RUBREC_LIST::iterator it   =  m_pRubList->at(pCPrtQListBoxItem->GetPk().toInt());       // indice de liste
 DlgDateNom *dlg            =  new DlgDateNom(this,"DateNOm_Dlg",TRUE);                      // TRUE Pour modal
 if (dlg ==0)                            return ;
 dlg->initDialog( &(*it).m_Date, &(*it).m_Libelle, &(*it).m_SubType);

 if ( dlg->exec() == QDialog::Accepted )
    { //................... remettre à jour le comboBox ................................
//       pCPrtQListBoxItem->SetType((*it).m_Date);
      pCPrtQListBoxItem->SetDate((*it).m_Date);
      pCPrtQListBoxItem->setText((*it).m_Date.left(10) + " " +(*it).m_Libelle );
      //................... mettre le document en modified (en replaçant les data ds rubrique liste) ......................
      if (m_pMyEditText && m_LastRub != -1)
         {SaveTextInRubList();
         }
    }
 delete dlg;
}

//----------------------------------------- SetRubDateName --------------------------------
/*! \brief définit les dates et libelles du document en cours. */
void C_RubDocuments::SetRubDateName( const QString & name, const QString & date )
{if (m_IsModifiable==0)                   return;

 CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) comboBox_RubName->listBox()->item ( comboBox_RubName->currentItem ()  );
 if (!pCPrtQListBoxItem)                  return;

 RUBREC_LIST::iterator it   =  m_pRubList->at(pCPrtQListBoxItem->GetPk().toInt());
 //................... remettre à jour les valeurs de la liste ................................
 if (name.length()<=0 && date.length()<19) return; //2004-03-10 19:21:19
 if (name.length()>0)   (*it).m_Libelle = name;
 if (date.length()==19) (*it).m_Date    = date;

 //................... remettre à jour le comboBox ................................
//  pCPrtQListBoxItem->SetType((*it).m_Date);
 pCPrtQListBoxItem->SetDate((*it).m_Date);
 pCPrtQListBoxItem->setText((*it).m_Date.left(10) + " " +(*it).m_Libelle );
 //................... mettre le document en modified (en replaçant les data ds rubrique liste) ......................
 if (m_pMyEditText && m_LastRub != -1)
    {SaveTextInRubList();
    }
}

//----------------------------------------- languageChange --------------------------------
void C_RubDocuments::languageChange()
{
    setProperty( "caption", tr( "InvisibleStringFormPrescription" ) );
    textLabel_NbRub->setProperty( "text", QString::null );
    QToolTip::add( textLabel_NbRub, trUtf8( "\x4d\x6f\x64\x69\x66\x69\x65\x72\x20\x6c\x61\x20\x64\x61\x74\x65\x20\x65\x74\x20\x6c"
    "\x27\x69\x6e\x74\x69\x74\x75\x6c\xc3\xa9\x20\x64\x75\x20\x64\x6f\x63\x75\x6d\x65"
    "\x6e\x74" ) );
    pushButtonRubDateChange->setProperty( "text", QString::null );
    QToolTip::add( pushButtonRubDateChange, trUtf8( "\x4d\x6f\x64\x69\x66\x69\x65\x72\x20\x6c\x61\x20\x64\x61\x74\x65\x20\x65\x74\x20\x6c"
    "\x27\x69\x6e\x74\x69\x74\x75\x6c\xc3\xa9\x20\x64\x75\x20\x64\x6f\x63\x75\x6d\x65"
    "\x6e\x74" ) );
    textLabel1->setProperty( "text", tr( " vu par :" ) );
    textLabel_UserName->setProperty( "text", tr( "Utilisateur" ) );
    pushButtonSave->setProperty( "text", QString::null );
    QToolTip::add( pushButtonSave, tr( "Enregistrer tout le dossier" ) );
    pushButtonPrint->setProperty( "text", QString::null );
    QToolTip::add( pushButtonPrint, trUtf8( "\x49\x6d\x70\x72\x69\x6d\x65\x72\x20\x63\x65\x74\x74\x65\x20\x66\x65\x6e\xc3\xaa\x74"
    "\x72\x65" ) );
    pushButtonDelete->setProperty( "text", QString::null );
    QToolTip::add( pushButtonDelete, trUtf8( "\x50\x6c\x61\x63\x65\x72\x20\x6c\x65\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x20\x65\x6e"
    "\x20\x63\x6f\x75\x72\x73\x20\x63\x6f\x6d\x6d\x65\x20\x64\x6f\x63\x75\x6d\x65\x6e"
    "\x74\x20\xc3\xa0\x20\x65\x66\x66\x61\x63\x65\x72\x20\x28\x6e\x65\x20\x73\x65\x72"
    "\x61\x20\x65\x66\x66\x61\x63\xc3\xa9\x20\x71\x75\x27\x61\x70\x72\xc3\xa8\x73\x20"
    "\x65\x6e\x72\x65\x67\x69\x73\x74\x72\x65\x6d\x65\x6e\x74\x29" ) );
    pushButtonAdd->setProperty( "text", QString::null );
    QToolTip::add( pushButtonAdd, tr( "Charger une image..." ) );
    pushButtonExporter->setProperty( "text", QString::null );
    QToolTip::add( pushButtonExporter, tr( "Exporter cette image..." ) );
}
