/****************************************************************************
 ** 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.
 *****************************************************************************/


void pressePap::init()
{
	qDebug("pressePap::init()");
	//création de la socket
	maSocket=new QSocket(this);


	//on attache le signal  recoitdonnées de la socket au slot recevpoir de notre forme
	connect ( maSocket, SIGNAL( readyRead() ), this, SLOT( recevoirDonnees() ) );
	connect ( maSocket, SIGNAL( connectionClosed() ), this, SLOT( actDesaDeconnecter()) );
	connect(maSocket,SIGNAL(connected()),this,SLOT(actDesacConnecter()));
	//du focus
	currentLineEdit->setFocus();
	//connexion au pressepapier
	cb = qApp->clipboard();
	//lorsque le contenu du pressepap change on execute dataChanged
	connect( cb, SIGNAL( dataChanged() ), SLOT( dataChanged()));
	if (cb->supportsSelection())
		connect( cb, SIGNAL( selectionChanged() ), SLOT( selectionChanged()));
	//executons datachanged
	dataChanged();	
}


void pressePap::dataChanged()
{
	qDebug("pressePap::dataChanged()");
	//appelée par: init.
	//appelée sur modif du contenu du presse papier
	//le contenu du pressePapier a changé
	QString text;
	//recup du contenu actuel du presse-papier
	text=cb->text();
	//text=cb->text(QClipboard::Clipboard);
	//if (cb->supportsSelection()) text = cb->text(QClipboard::Selection);
	//s'il n'est pas vide
	if(!text.isNull())
	{
		qDebug("text %s n'est pas vide",text.latin1());
		//ce chgt vient-il de moi ou du réseau ?
		bool leMessageVientDuReseau =(text.find(":>")!=-1);
		//si le chgt ne vient pas du réseau et qu'on est connecté on envoie au serveur le contenu du presse papier
		if(!(leMessageVientDuReseau) && pushButtonDeconnecter->isEnabled())
		{
			maSocket->writeBlock(qstringToLine(text),strlen(qstringToLine(text)));
		}
		//mise à jour des composants sur la fiche
		clippingChanged( text );
	}
	else qDebug("text est vide");
}


void pressePap::selectionChanged()
{
    cb->setSelectionMode( TRUE );
    dataChanged();
    cb->setSelectionMode( FALSE );

}


void pressePap::clippingChanged(QString clipping)
{
	qDebug("pressePap::clippingChanged(QString clipping)");
	//met à jour les composants de la fiche
	currentLineEdit->setText( clipping );

}


void pressePap::addClipping()
{

}



void pressePap::recevoirDonnees()
{
	qDebug("pressePap::recevoirDonnees()");
	//reception d'un nouveau contenu
	QCString contenu;
	QString good;
	contenu.resize(maSocket->bytesAvailable()+1);
	maSocket->readBlock( contenu.data(), maSocket->bytesAvailable() );
	//ajout dans le pressepap
	good=QString(contenu.data());
	//cb->setText(good);
	historiseMessageReseau(good);
                //cb->setText(good,QClipboard::Clipboard);
	//if (cb->supportsSelection())cb->setText(good,QClipboard::Selection);	
	qDebug("j'ai reçu %s",good.latin1());
}

void pressePap::quitter()
{
	qDebug("pressePap::quitter()");
	//testé et approuvé
	accept();
}



QString pressePap::qstringToLine(QString qs)
{
	qDebug("pressePap::qstringToLine(QString qs)");
	//ajoute les caractères de fin de ligne
	return (qs+"\r\n");
}


void pressePap::connecter()
{
	qDebug("pressePap::connecter()");
	//ok testée
	maSocket->connectToHost( lineEditServeur->text(), 9995);
	//recup du username et du hostname et envoie au serveur
	system("echo $USER >tmp.tmp.tmp");
	FILE * bidon;
	bidon=fopen("tmp.tmp.tmp","r");
	if(bidon)
	{
		qDebug("ouverture du fichier tmp.tmp.tmp réalisée");
		QTextIStream tmp1(bidon);
		//je renseigne la variable de classe nomUtilisateur 
		tmp1>>nomUtilisateur;
		qDebug("lecture du fichier réalisée");
		//j'efface le fichier temporaire
		qDebug("avant le rm");
		system("rm -f tmp.tmp.tmp");
		qDebug("aprés le rm");
		QString chaineIdentification="user:"+nomUtilisateur;
		maSocket->writeBlock(qstringToLine(chaineIdentification),strlen(qstringToLine(chaineIdentification)));
		qDebug("ecrit ds la socket");
	}
}


void pressePap::actDesacConnecter()
{
	//ok testée
                qDebug("pressePap::actDesacConnecter()");
	pushButtonConnecter->setEnabled(false);
	pushButtonDeconnecter->setEnabled(true);
	pushButtonQuitter->setEnabled(false);
}


void pressePap::deconnecter()
{
	qDebug("pressePap::deconnecter()");
	//ok testée
	maSocket->writeBlock(qstringToLine("q"),strlen(qstringToLine("q")));
}


void pressePap::actDesaDeconnecter()
{
	qDebug("pressePap::actDesaDeconnecter()");
	//ok testée
	pushButtonDeconnecter->setEnabled(false);
	pushButtonConnecter->setEnabled(true);
	pushButtonQuitter->setEnabled(true);
}


void pressePap::effacerHistorique()
{
	qDebug("pressePap::effacerHistorique()");
	//ok testée
	clippingsListBox->clear();
	actDesactBoutonsHisto();
	
}



void pressePap::effacerElementHisto()
{  
	qDebug("pressePap::effacerElementHisto()");
	//ok testée
	clippingsListBox->removeItem(clippingsListBox->index(clippingsListBox->selectedItem()));
	actDesactBoutonsHisto();
}

void pressePap::toPressePapier()
{
	qDebug("pressePap::toPressePapier()");
                cb->setText(clippingsListBox->selectedItem()->text());
	//cb->setText(clippingsListBox->selectedItem()->text());
	//ajout dans le pressepap
	//if (cb->supportsSelection())
		//cb->setText(clippingsListBox->selectedItem()->text(), QClipboard::Selection);

}


void pressePap::actDesactBoutonsHisto()
{
              qDebug("pressePap::actDesactBoutonsHisto()");
	pushButtonEffacer->setEnabled(clippingsListBox->numRows()!=0);

	if( clippingsListBox->currentItem()!=-1)
	{
		pushButtonEffacerElts->setEnabled(true);
		pushButtonCopier->setEnabled(true);
	}
	else  
	{
		//desactiver 
		pushButtonEffacerElts->setEnabled(false);
		pushButtonCopier->setEnabled(false);
		
	}
}

void pressePap::historiseMessageReseau( QString message )
{
        if ( ! message.isEmpty() ) {
		
		int i;
		for (i=0 ; i < (int)clippingsListBox->count(); i++ ) {
			if ( clippingsListBox->text( i ) == message) {
				i = -1; // Do not add duplicates
				break;
			}
		}
		if ( i != -1 )
			clippingsListBox->insertItem( message, 0 );
	}
	pushButtonEffacer->setEnabled(true);
}
