/********************************* CMDI_Observation.cpp **************************
 *                                                                                *
 *   #include "CMDI_Observation.h"                                                *
 *   Project: MedinTux                                                            *
 *   Copyright (C) 2003 2004 2005 by Sevin Roland  and Data Medical Design        *
 *   E-Mail: data.medical.design@club-internet.fr                                 *
 *                                                                                *
 *   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 <qfile.h>
#include <qfileinfo.h>
#include <qfiledialog.h>

#include "CMDI_Observation.h"
#include <qvbox.h>
#include <qmenubar.h>

#include "CApp.h"
#include "drtux.h"
#include "../../MedinTuxTools/CHtmlTools.h"
#include "../../MedinTuxTools/CPrtQListBoxItem.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//---------------------------------- CMDI_Observation -----------------------------------------------------------------------------
CMDI_Observation::CMDI_Observation( QWidget* parent, const char* name, int wflags,  CMoteurBase *pCMoteurBase, RUBREC_LIST *pRubList,
                                    const char* num_GUID, const char* id_doss, const char* dossNom, const char* dossPrenom, const char* user)
    :CMDI_Generic( parent, name, wflags , pCMoteurBase, pRubList) //: QMainWindow( parent, name, wflags )
{   SetType(TYP_OBSERVATION);
    SetPrintableState(TRUE);

    m_CustomMenuRequestState = 0;
    //............... placer en premier un gestionnaire vertical de QWidget ..............................
    //                en fils de la fenetre mère:
    //                les enfants de ce gestionnaire seront:
    //                             le dialogue: m_pFormRubObservation    qui sera en haut
    //                             l'éditeur de texte: m_pMyEditText     qui sera en dessous
    QVBox *pQVCentral = new QVBox( this );
    pQVCentral->setMargin( 0 );
    pQVCentral->setSpacing(0);
    pQVCentral->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );

    //......................... creation du dialogue:  m_pFormRubObservation .............................
    m_pFormRubObservation = new FormRubObservation(pQVCentral, QString("Form") + name );
    if (m_pFormRubObservation)
       {m_pFormRubObservation->m_pCMoteurBase = pCMoteurBase;
        m_pFormRubObservation->m_pRubList     = pRubList;
        if (num_GUID)   m_pFormRubObservation->m_NumGUID    = num_GUID;
        else            m_pFormRubObservation->m_NumGUID    = "";
        if (id_doss)    m_pFormRubObservation->m_ID_Doss    = id_doss;
        else            m_pFormRubObservation->m_ID_Doss    = "";
        if (dossNom)    m_pFormRubObservation->m_DossNom    = dossNom;
        else            m_pFormRubObservation->m_DossNom    = "";
        if (dossPrenom) m_pFormRubObservation->m_DossPrenom = dossPrenom;
        else            m_pFormRubObservation->m_DossPrenom = "";
        if (user)       m_pFormRubObservation->m_User       = user;
        else            m_pFormRubObservation->m_User       = "";

        //.................... creation de l'éditeur de texte: m_pMyEditText...............................
        //                     à ratacher au membre: MyEditText *m_pMyEditText de :  m_pFormRubObservation
        //                     afin d'en disposer à l'interieur de sa classe.
        m_pMyEditText = new MyEditText(pCMoteurBase->m_DataBase, pQVCentral);
        m_pMyEditText->setPaletteForegroundColor( QColor( 0, 0, 0 ) );
        m_pMyEditText->SetTypeRubrique(TYP_OBSERVATION);
        //m_pMyEditText->setPaletteBackgroundColor( QColor( 58, 141, 141 ) );
        m_pFormRubObservation->InitText(m_pMyEditText);
        m_pFormRubObservation->SetData();
        //..................... connecter impression ......................................................
        connect( m_pFormRubObservation->pushButtonPrint,     SIGNAL( clicked()),
                 this,                                       SLOT  ( OnPrint())
               );
        //.................. connecter les plugin de l'editeur de texte.............................................
        //                   au systeme de menu Custom

        connect( m_pMyEditText,   SIGNAL( Sign_ExeCommand(QString&)),
                this,             SLOT  ( Slot_ExeCommand(QString&))
               );
        connect( m_pMyEditText,   SIGNAL( Sign_Get_Custom_Menu(const QString &, QString&, QString &, QKeySequence &)),
                 this,            SLOT  ( Slot_Get_Custom_Menu(const QString &, QString&, QString &, QKeySequence &))
               );

       }
    setIcon(Theme::getIconListTypeObservation().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
    setFocusProxy( m_pFormRubObservation );
    setCentralWidget( pQVCentral );
}

//---------------------------------- ~CMDI_Observation -----------------------------------------------------------------------------
CMDI_Observation::~CMDI_Observation()
{emit Sign_RubIsDeleted(CMDI_Observation::S_GetRubName());
 if (G_pCApp->m_pDrTux) G_pCApp->m_pDrTux->m_pCMDI_Observation = 0;
}

//---------------------------------- GetCurrent_RubList_ID -----------------------------------------------------------------------------
int     CMDI_Observation::GetCurrent_RubList_ID()
{IfModified_SaveInRubList();
 return m_pFormRubObservation->Current_RubList_ID();   // noter rubrique affichée;
}

//---------------------------------- Current_RubList_Iterator -----------------------------------------------------------------------------
RUBREC_LIST::iterator CMDI_Observation::Current_RubList_Iterator()
{return m_pFormRubObservation->Current_RubList_Iterator();
}


//----------------------------- initData -----------------------------------
/*! \brief initialise la rubrique avec les données la concernant */
int  CMDI_Observation::initData()
{ m_pFormRubObservation->m_LastRub    = -1;   // tres tres important
  m_pFormRubObservation->SetData();
  return 0;
}

//----------------------------- SetCurentDocByPrimkey -----------------------------------
/*! \brief initialise l'affichage sur le document désigné par const QString &pk */
int  CMDI_Observation::SetCurentDocByPrimkey(const QString &pk)
{return m_pFormRubObservation->SetCurentDocByPrimkey(pk);
}

//----------------------------- ChangeCurrentComboBoxItemName -----------------------------------
/*! \brief SLOT qui change le nom de l'item courant de la comboBox */
void CMDI_Observation::ChangeCurrentComboBoxItemName(const QString &name)
{if (name.length()==0)               return;
 CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) m_pFormRubObservation->comboBox_RubName->listBox()->item (  m_pFormRubObservation->comboBox_RubName->currentItem ()  );
 if (!pCPrtQListBoxItem)             return;
 pCPrtQListBoxItem->setText ( name );
}

//----------------------------- GetCurrentEditor -----------------------------------
/*! \brief retourne l'éditeur de texte courant avancé type MyEditText */
MyEditText  *CMDI_Observation::GetCurrentEditor()
{return m_pMyEditText;
}

//---------------------------------- SetInterfaceOnDroits ----------------------------------------------------------------------------------------
/*! \brief positionne l'interface sur les droits */
void CMDI_Observation::SetInterfaceOnDroits(const QString &/*droits*/)
{m_pFormRubObservation->comboBox_RubName_activated( m_pFormRubObservation->comboBox_RubName->currentItem() );
}

//---------------------------------- DoActionWithThisDocument -----------------------------------------------------------------------------
/*! \brief fait avec le document donné en entrée une action dépendante du verbe  */
void   CMDI_Observation::DoActionWithThisDocument(const QString &verbe, int /*typ*/, const char *path /* =0 */, const QDateTime */*pQDateTime =0 */, const QString */*libelle =0 */, const QString */*subType =0 */)
{if (verbe==tr("Tout") || verbe==tr("Ajouter"))
    {QFile file( path );
     if ( file.open( IO_ReadOnly ) )
        {QString   txt_f = "";
         int isUtf8;
         CGestIni::Param_UpdateFromDisk(path, txt_f, &isUtf8);
         if (CHtmlTools::IsRtf(txt_f))
            {QString   txt;
             CHtmlTools::RtfToQtextEdit_HTML(txt_f, txt_f.length(), txt, 1);
             txt_f = txt;
            }
         file.close();
         QString libelle = QFileInfo(path).fileName();
         int       pos   = libelle.findRev('.'); if (pos != -1) libelle.truncate (pos);
         int rubObs_id   = -1;

         rubObs_id = m_pFormRubObservation->Current_RubList_ID();
         if (rubObs_id==-1)
            {if (QMessageBox::warning ( this, tr("MedinTux vous solicite"),
                                          tr ( "Il n'existe pas de document valide pour cette action.<br>"
                                               "Faut-il en créer un avec celui :<br><b>«")
                                               +QFileInfo(path).fileName()+tr(" »</b><br>sélectionné dans le Glossaire "),
                                          tr ("Annu&ler"), tr ("&Créer"), 0,
                                          1, 1 )==1
                )
                {AddNewDocument(txt_f, 0, path);
                }
            }
         else
            {
             G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Observation::S_GetRubName()+"_$FUSION_ADD_"+verbe);
             G_pCApp->m_pDrTux->FusionneDocument(&txt_f, G_pCApp->m_SignUser, &(*m_pRubList->at(rubObs_id)));
             G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Observation::S_GetRubName()+"_$FUSION_END");
             //....................... reajuster les combobox et editeurs de texte ...................................
             m_pMyEditText->setModified(TRUE);
             if (verbe==tr("Tout"))
                {if (QMessageBox::warning ( this, tr("MedinTux vous solicite"),
                                            tr ( "Êtes vous certain de tout remplacer<br>"
                                                 "par ce document :<br><b>«")
                                            +QFileInfo(path).fileName()+tr(" »</b><br>sélectionné dans le Glossaire "),
                                            tr ("Annu&ler"), tr ("&Tout remplacer"), 0,
                                            0, 1 )==1
                    )
                    { m_pMyEditText->setText(txt_f);
                      m_pMyEditText->setModified(TRUE); // indispensable à placer juste apres: setText(txt) !!!
                      m_pFormRubObservation->SetRubDateName( libelle, (*m_pRubList->at(rubObs_id)).m_Date );
                    }
                }
             else if (verbe==tr("Ajouter"))
                {CHtmlTools::insertHtml(m_pMyEditText, txt_f);
                }//end else if (action=="Remplacer")
            } //end else if if (rubDoc_id==-1)
        }//end if ( file.open( IO_ReadOnly ) )
    }//end if (verbe==tr("Tout") || verbe==tr("Ajouter"))
}

//---------------------------------- AddNewDocument -----------------------------------------------------------------------------
/*! \brief replace le document en cours en replaçant le contenu dans la liste des rubriques, et ajoute un nouveau document à la liste */
CRubRecord*   CMDI_Observation::AddNewDocument(const QString &strData, int typ, const char *path /*=0*/ , const QDateTime *pQDateTime/*=0*/, const QString *libelle /*=0*/, const QString *subType /*=0*/, int noInquire /*=0*/)
{if ( strData.length()==0 )                                   return 0;
 int                           ret = 0;
 QString                      date;
 QDateTime                     qdt       =   QDateTime::currentDateTime();
 if (pQDateTime)               qdt       = *pQDateTime;

 if (G_pCApp->IsThisDroitExist(G_pCApp->m_Droits, "obc"))
    {//................... demander confirmation pour creation d'une autre à la même date ...........................
     if (noInquire==0 && G_pCApp->m_pCMoteurBase->GetAllRubriqueFromDate(m_pRubList, QDate::currentDate(), QString::number(TYP_OBSERVATION) )>0)
        {ret = QMessageBox::warning ( this,       tr ("Nouvelle Observation ") ,
                                                  tr ("Une observation existe déjà pour cette date\r\n"
                                                      "Faut-il vraiment en créer une deuxième ?\r\n"
                                                      "ou ajouter les données à l'emplacement du curseur ?"),
                                                   tr ("&Créer"), tr("A&jouter"), tr("Annu&ler"),
                                                   1, 1 );
               if (ret == 2) return 0;
        }
     //............. placer les données de la rubrique en cours d'edition, si necessaire
     //              dans la liste des rubriques, donc à sauver (que si necessaire CAD modifiées)
     IfModified_SaveInRubList();
     if (ret==1)
        {G_pCApp->m_pDrTux->OnGlossaireFileToEdit(path, tr("Ajouter"), typ);
         return 0;
        }
     else
        {//............. ajouter la nouvelle rubrique ...................................
         QString rubName(tr("Nouvelle Observation"));          // si pas plus de renseignement nom rubrique = Prescription
         if (path && strlen(path))
            {//....... placer nom fichier comme nom rubrique ............................
             rubName = QFileInfo( path ).baseName();
            }
         date = qdt.toString ("yyyy-MM-ddThh:mm:ss");          // date est celle courante
         if (libelle) rubName       = *libelle;
         RUBREC_LIST::Iterator last =  m_pRubList->append( CRubRecord(G_pCApp->m_pCMoteurBase->GetPkDoc_Provisoire(m_pRubList),                          // PrimKey
                                                           rubName,                                 // libelle
                                                           QString::number(typ),                    // type
                                                           subType ? *subType : "Default SubType",  // sous type
                                                           date,                                    // date l'enregistrement
                                                           G_pCApp->m_User,                         // utilisateur
                                                           G_pCApp->m_SignUser)                     // utilisateur signataire
                                                         );
        //.......................... le fusionner .........................................
        (*last).m_LastErr = "";
        QString data(strData);
        G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Observation::S_GetRubName()+"_$FUSION_CREATE");
        G_pCApp->m_pDrTux->FusionneDocument(&data, G_pCApp->m_User, &(*last));
        G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Observation::S_GetRubName()+"_$FUSION_END");
        if ((*last).m_LastErr[0]=='_'||data.find("__ERREUR Fusion :__") != -1)
           {m_pRubList->remove ( last );
            return 0;
           }
        else
           {//.......................... on replace les données dans la liste apres fusion ....
            G_pCApp->m_pCMoteurBase->ReplaceDataInRubList(data, last);
            //.......................... on replace les données dans la rubrique ..............
            // cela permet de reinitialiser les combos box & cie
             m_pFormRubObservation->SetData();
            return &*(last);
           }
       }
   }
 return 0;
}

//---------------------------------- IfModified_SaveInRubList -----------------------------------------------------------------------------
void CMDI_Observation::IfModified_SaveInRubList()
{m_pFormRubObservation->IfModified_SaveInRubList();
}

//---------------------------------- OnPrint -----------------------------------------------------------------------------
void CMDI_Observation::OnPrint()
{m_pFormRubObservation->IfModified_SaveInRubList();
 emit Sign_Print();
}

//---------------------------------- RubOnUserChange -----------------------------------------------------------------------------
void CMDI_Observation::RubOnUserChange(const char*user, const char*/*sign_user*/)
{m_pFormRubObservation->m_User       = user;
}

//---------------------------------- OnIdentChange ----------------------------------------------------------------------------------
// ACTION: ce slot est appelé par qui veut, pour signaler un changement d'identité à cette fenetre MDI
//         qui doit donc adapter son contenu à un nouveau malade.

void CMDI_Observation::OnIdentChange(const char* num_GUID,  const char* id_doss,
                                     const char* dossNom ,  const char* dossPrenom )
{ m_pFormRubObservation->m_NumGUID    = num_GUID;
  m_pFormRubObservation->m_ID_Doss    = id_doss;
  m_pFormRubObservation->m_DossNom    = dossNom;
  m_pFormRubObservation->m_DossPrenom = dossPrenom;
  m_pFormRubObservation->m_LastRub    = -1;          // tres tres important
  m_pFormRubObservation->SetData();
}
//---------------------------------- SetZoom ----------------------------------------------------------------------------------------
void CMDI_Observation::SetZoom(int /*zoom*/)
{//m_pFormRubObservation->m_pMyEditText->SetZoom (zoom);
}
//---------------------------------- Slot_Get_Custom_Menu -----------------------------------------------------------------------------
void CMDI_Observation::Slot_Get_Custom_Menu(const QString &state, QString &menuIcon, QString &menuItem, QKeySequence &accel)
{if (state == "$StartRequest")    m_CustomMenuRequestState = 0;
 else                           ++m_CustomMenuRequestState;
 switch(m_CustomMenuRequestState)
   {case 0:
         menuIcon = G_pCApp->m_PathAppli + "Ressources/icones/backup_section.png";
         menuItem = tr("Enregi&strer comme document type");
         accel    = CTRL+Key_S;
         break;
    default:
         menuIcon = "";
         menuItem = "";
   }
}
//---------------------------------- Slot_ExeCommand -----------------------------------------------------------------------------
void CMDI_Observation::Slot_ExeCommand(QString &command)
{  RUBREC_LIST::iterator it = Current_RubList_Iterator();
   if (it ==  m_pFormRubObservation->m_pRubList->end() )  return;

   if (command==tr("Enregi&strer comme document type"))
      { QString   path    = G_pCApp->m_PathGlossaire + S_GetRubName();
        //int        typ    = (*it).m_Type.toInt();
        QString    ext    = ".html";
        QString    txt    = m_pMyEditText->text();
        QString  filtre   = tr( " Fichiers HTML (*.htm *.html);;  Tous les fichiers (*)");
         //.................. selectionner le fichier .......................................
        QFileDialog fd (path,  filtre,  this, "SaveDlg" ) ;
        fd.setMode(QFileDialog::AnyFile );    // selection multiple
        if ( fd.exec() != QDialog::Accepted )           return;
        QString fn = fd.selectedFile();
        if ( fn.isEmpty() )                             return;
        fn         = QFileInfo(fn).dirPath() + "/" + QFileInfo(fn).baseName() + ext;
        QFile file( fn);
        if ( !file.open( IO_WriteOnly ) )               return;
        QTextStream ts( &file );
        CHtmlTools::ElimineAncresRedondantes(txt);
        CHtmlTools::setTextDefaultAtribut(txt, "text",          m_pMyEditText->m_DefaultTextColor);
        CHtmlTools::setTextDefaultAtribut(txt, "bgcolor",       m_pMyEditText->m_DefaultBackgroundColor);
        CHtmlTools::QRichTextToHtml(txt);
        ts << txt;
      }
}
//---------------------------------- setWordWrap ----------------------------------------------------------------------------------------
void CMDI_Observation::setWordWrap(int width)
{if (m_pMyEditText==0) return;
 if (width == -1)
    {m_pMyEditText->setWordWrap(QTextEdit::WidgetWidth);   //NoWrap, WidgetWidth, FixedPixelWidth, FixedColumnWidth
     //setWrapColumnOrWidth (793-37 );
    }
 else
    {m_pMyEditText->setWordWrap (QTextEdit::FixedPixelWidth);
     m_pMyEditText->setWrapColumnOrWidth (width );  //   (793-37 );   //( corresponds A4 width  21*72/2.54 )
    }
}
//---------------------------------- SetModifiableState -----------------------------------------------------------------------------
void CMDI_Observation::SetModifiableState(int state)
{m_pFormRubObservation->SetModifiableState(state);
}

//---------------------------------- setDataToModifiedState -----------------------------------------------------------------------------
/*! \brief place le document en etat modifié, afin qu'au prochain enregistrement elles soient mises à jour */
void CMDI_Observation::setDataToModifiedState()
{ if (m_pFormRubObservation->m_pMyEditText && m_pFormRubObservation->m_LastRub != -1)
     {m_pFormRubObservation->SaveTextInRubList();
     }
}
