Skip to content
Snippets Groups Projects
Select Git revision
  • b4784ab7e49c8a86f77fe2beccf4ebf51a6ee1d8
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/windowsReleaseTest
  • release/releaseTest
  • release/releaseWindowsTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 4.0.0
  • 2.2.0
  • 2.1.0
  • 2.0.1
  • 2.0.0
  • 1.4.1
  • 1.4.0
  • 1.3.0
  • 1.2.0
  • 1.1.0
31 results

eventthread.h

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ConfigDialog.cpp 26.87 KiB
    #include "ConfigDialog.h"
    
    #include <QtGui/QStyle>
    #include <QErrorMessage>
    #include <QtGui/QAbstractItemView>
    #include <QtGui/QInputDialog>
    #include <QtGui/QHeaderView>
    
    
    
    #include "sflphone_const.h"
    #include "metatypes.h"
    #include "configurationmanager_interface_singleton.h"
    
    
    AccountList * ConfigurationDialog::accountList;
    
    ConfigurationDialog::ConfigurationDialog(sflphone_kdeView *parent) : QDialog(parent)
    {
    	//configuration qt designer
    	setupUi(this);
    	
    	//configuration complémentaire
    	QStyle * style = QApplication::style();
    	errorWindow = new QErrorMessage(this);
    	codecPayloads = new MapStringString();
    	horizontalSlider_historyCapacity->setMaximum(MAX_HISTORY_CAPACITY);
    	label_WarningSIP->setVisible(false);
    	for(int i = 0 ; i < list_options->count() ; i++)
    	{
    		list_options->item(i)->setTextAlignment(Qt::AlignHCenter);
    	}
    	button_accountUp->setIcon(style->standardIcon(QStyle::SP_ArrowUp));
    	button_accountDown->setIcon(style->standardIcon(QStyle::SP_ArrowDown));
    	toolButton_codecUp->setIcon(style->standardIcon(QStyle::SP_ArrowUp));
    	toolButton_codecDown->setIcon(style->standardIcon(QStyle::SP_ArrowDown));
    	tableWidget_codecs->verticalHeader()->hide();
    	tableWidget_codecs->setSelectionBehavior(QAbstractItemView::SelectRows);
    	//tableWidget_codecs->setStyleSheet("border-style: hidden;");
    
    
    
    	//TODO ajouter les items de l'interface audio ici avec les constantes
    	
    
    // 	accountsChangedEnableWarning = true;
    	
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	connect(&configurationManager, SIGNAL(accountsChanged()),
    	        this,                  SLOT(on1_accountsChanged()));
    	
    	loadOptions();
    	
    }
    
    ConfigurationDialog::~ConfigurationDialog()
    {
    	delete accountList;
    	delete errorWindow;
    	delete codecPayloads;
    }
    
    AccountList * ConfigurationDialog::getAccountList()
    {
    	return accountList;
    }
    
    void ConfigurationDialog::loadOptions()
    {
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	
    	////////////////////////
    	////General settings////
    	////////////////////////
    	
    	//Call history settings
    	spinBox_historyCapacity->setValue(configurationManager.getMaxCalls());
    	
    	//SIP port settings
    	int sipPort = configurationManager.getSipPort();
    	if(sipPort<1025){
    		spinBox_SIPPort->setMinimum(sipPort);
    		label_WarningSIP->setText("Attention : le port SIP doit être supérieur à 1024 !");
    		label_WarningSIP->setVisible(true);
    	}
    	if(sipPort>65535){
    		spinBox_SIPPort->setMaximum(sipPort);
    		label_WarningSIP->setText("Attention : le port SIP doit être inférieur à 65536 !");
    		label_WarningSIP->setVisible(true);
    	}
    	spinBox_SIPPort->setValue(configurationManager.getSipPort());
    	
    	////////////////////////
    	////Display settings////
    	////////////////////////
    
    	//Notification settings
    	checkBox1_notifOnCalls->setCheckState(configurationManager.getNotify() ? Qt::Checked : Qt::Unchecked);
    	checkBox2_notifOnMessages->setCheckState(configurationManager.getMailNotify() ? Qt::Checked : Qt::Unchecked);
    	
    	//Window display settings
    	checkBox1_displayOnStart->setCheckState(configurationManager.isStartHidden() ? Qt::Unchecked : Qt::Checked);
    	checkBox2_displayOnCalls->setCheckState(configurationManager.popupMode() ? Qt::Checked : Qt::Unchecked);
    	
    	/////////////////////////
    	////Accounts settings////
    	/////////////////////////
    	
    	loadAccountList();
    
    	//Stun settings
    	checkBox_stun->setCheckState(configurationManager.isStunEnabled() ? Qt::Checked : Qt::Unchecked);
    	lineEdit_stun->setText(QString(configurationManager.getStunServer()));
    	
    	//////////////////////
    	////Audio settings////
    	//////////////////////
    	
    	//Audio Interface settings
    	int audioManager = configurationManager.getAudioManager();
    	comboBox_interface->setCurrentIndex(audioManager);
    	stackedWidget_interfaceSpecificSettings->setCurrentIndex(audioManager);
    	
    	//ringtones settings
    	checkBox_ringtones->setCheckState(configurationManager.isRingtoneEnabled() ? Qt::Checked : Qt::Unchecked);
    	urlComboRequester_ringtone->setUrl(KUrl::fromPath(configurationManager.getRingtoneChoice()));
    	
    	//codecs settings
    	loadCodecs();
    
    	//
    	//alsa settings
    	comboBox1_alsaPlugin->clear();
    	QStringList pluginList = configurationManager.getOutputAudioPluginList();
    	comboBox1_alsaPlugin->addItems(pluginList);
    	comboBox1_alsaPlugin->setCurrentIndex(comboBox1_alsaPlugin->findText(configurationManager.getCurrentAudioOutputPlugin()));
    	
    	
    	comboBox2_in->clear();
    	comboBox3_out->clear();
    	
    	if(audioManager == ALSA)
    	{
    		QStringList devices = configurationManager.getCurrentAudioDevicesIndex();
    		
    		int inputDevice = devices[1].toInt();
    		qDebug() << "inputDevice = " << devices[1];
    		QStringList inputDeviceList = configurationManager.getAudioInputDeviceList();
    		comboBox2_in->addItems(inputDeviceList);
    		comboBox2_in->setCurrentIndex(inputDevice);
    		
    		int outputDevice = devices[0].toInt();
    		qDebug() << "outputDevice = " << devices[0];
    		QStringList outputDeviceList = configurationManager.getAudioOutputDeviceList();
    		comboBox3_out->addItems(outputDeviceList);
    		comboBox3_out->setCurrentIndex(outputDevice);
    	}
    	
    	//pulseaudio settings
    	checkBox_pulseAudioVolumeAlter->setCheckState(configurationManager.getPulseAppVolumeControl() ? Qt::Checked : Qt::Unchecked);
    	
    	///////////////////////
    	////Record settings////
    	///////////////////////
    	
    	urlcomborequester_destinationFolder->setUrl(KUrl::fromPath(configurationManager.getRecordPath()));
    	
    	
    	/////////////////////////////
    	////Address book settings////
    	/////////////////////////////
    	
    	MapStringInt addressBookSettings = configurationManager.getAddressbookSettings().value();
    	qDebug() << "getAddressbookSettings() : " << addressBookSettings;
    	spinBox_maxResults->setValue(addressBookSettings[ADDRESSBOOK_MAX_RESULTS]);
    	checkBox_displayPhoto->setChecked(addressBookSettings[ADDRESSBOOK_DISPLAY_CONTACT_PHOTO]);
    	checkBox_business->setChecked(addressBookSettings[ADDRESSBOOK_DISPLAY_BUSINESS]);
    	checkBox_mobile->setChecked(addressBookSettings[ADDRESSBOOK_DISPLAY_MOBILE]);
    	checkBox_home->setChecked(addressBookSettings[ADDRESSBOOK_DISPLAY_HOME]);
    	
    	/////////////////////////////
    	///////Hooks settings////////
    	/////////////////////////////
    	
    	MapStringString hooksSettings = configurationManager.getHookSettings().value();
    	qDebug() << "getHooksSettings() : " << hooksSettings;
    	checkBox_addPrefix->setChecked(hooksSettings[HOOKS_ENABLED]=="1");
    	lineEdit_prepend->setText(hooksSettings[HOOKS_ADD_PREFIX]);
    	checkBox_hooksSIP->setChecked(hooksSettings[HOOKS_SIP_ENABLED]=="1");
    	checkBox_hooksIAX->setChecked(hooksSettings[HOOKS_IAX2_ENABLED]=="1");
    	lineEdit_SIPHeader->setText(hooksSettings[HOOKS_SIP_FIELD]);
    	lineEdit_command->setText(hooksSettings[HOOKS_COMMAND]);
    	
    	
    	
    }
    
    
    void ConfigurationDialog::saveOptions()
    {
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	
    	accountsChangedEnableWarning = false;
    	////////////////////////
    	////General settings////
    	////////////////////////
    	
    	//Call history settings
    	configurationManager.setMaxCalls(spinBox_historyCapacity->value());
    	
    	//SIP port settings
    	int sipPort = spinBox_SIPPort->value();
    	
    	if(sipPort<1025){
    		errorWindow->showMessage("Attention : le port SIP doit être supérieur à 1024 !");
    	}
    	if(sipPort>65535){
    		errorWindow->showMessage("Attention : le port SIP doit être inférieur à 65536 !");
    	}
    	configurationManager.setSipPort(sipPort);
    	
    	////////////////////////
    	////Display settings////
    	////////////////////////
    
    	//Notification settings
    	if(checkBox1_notifOnCalls->checkState() != (configurationManager.getNotify() ? Qt::Checked : Qt::Unchecked)) configurationManager.setNotify();
    	if(checkBox2_notifOnMessages->checkState() != (configurationManager.getMailNotify() ? Qt::Checked : Qt::Unchecked)) configurationManager.setMailNotify();
    	
    	//Window display settings
    	//WARNING états inversés
    	if(checkBox1_displayOnStart->checkState() != (configurationManager.isStartHidden() ? Qt::Unchecked : Qt::Checked)) configurationManager.startHidden();
    	if(checkBox2_displayOnCalls->checkState() != (configurationManager.popupMode() ? Qt::Checked : Qt::Unchecked)) configurationManager.switchPopupMode();
    	
    	/////////////////////////
    	////Accounts settings////
    	/////////////////////////
    	
    	saveAccountList();
    
    	//Stun settings
    	if(checkBox_stun->checkState() != (configurationManager.isStunEnabled() ? Qt::Checked : Qt::Unchecked)) configurationManager.enableStun();
    	configurationManager.setStunServer(lineEdit_stun->text());
    
    	//////////////////////
    	////Audio settings////
    	//////////////////////
    	
    	//Audio Interface settings
    	qDebug() << "setting audio manager";
    	int manager = comboBox_interface->currentIndex();
    	configurationManager.setAudioManager(manager);
    	
    	//ringtones settings
    	qDebug() << "setting ringtone options";
    	if(checkBox_ringtones->checkState() != (configurationManager.isRingtoneEnabled() ? Qt::Checked : Qt::Unchecked)) configurationManager.ringtoneEnabled();
    	configurationManager.setRingtoneChoice(urlComboRequester_ringtone->url().url());
    	
    	//codecs settings
    	qDebug() << "saving codecs";
    	saveCodecs();
    
    	//alsa settings
    	if(manager == ALSA)
    	{
    		qDebug() << "setting alsa settings";
    		configurationManager.setOutputAudioPlugin(comboBox1_alsaPlugin->currentText());
    		int audioInputDevice = comboBox2_in->currentIndex();
    		if( audioInputDevice != -1)
    		{
    			configurationManager.setAudioInputDevice(audioInputDevice);
    		}
    		int audioOutputDevice = comboBox3_out->currentIndex();
    		if( audioOutputDevice != -1)
    		{
    			configurationManager.setAudioOutputDevice(audioOutputDevice);
    		}
    	}
    	//pulseaudio settings
    	if(manager == PULSEAUDIO)
    	{
    		qDebug() << "setting pulseaudio settings";
    		if(checkBox_pulseAudioVolumeAlter->checkState() != (configurationManager.getPulseAppVolumeControl() ? Qt::Checked : Qt::Unchecked)) configurationManager.setPulseAppVolumeControl();
    	}
    	
    	///////////////////////
    	////Record settings////
    	///////////////////////
    	
    	configurationManager.setRecordPath(urlcomborequester_destinationFolder->url().url());
    	
    	/////////////////////////////
    	////Address Book settings////
    	/////////////////////////////
    	
    	MapStringInt addressBookSettings = MapStringInt();
    	addressBookSettings[ADDRESSBOOK_MAX_RESULTS] = spinBox_maxResults->value();
    	addressBookSettings[ADDRESSBOOK_DISPLAY_CONTACT_PHOTO] = checkBox_displayPhoto->isChecked();
    	addressBookSettings[ADDRESSBOOK_DISPLAY_BUSINESS] = checkBox_business->isChecked();
    	addressBookSettings[ADDRESSBOOK_DISPLAY_MOBILE] = checkBox_mobile->isChecked();
    	addressBookSettings[ADDRESSBOOK_DISPLAY_HOME] = checkBox_home->isChecked();
    	configurationManager.setAddressbookSettings(addressBookSettings);
    	
    	/////////////////////////////
    	///////Hooks settings////////
    	/////////////////////////////
    	
    	MapStringString hooksSettings = MapStringString();
    	hooksSettings[HOOKS_ENABLED] = checkBox_addPrefix->isChecked() ? "1" : "0";
    	hooksSettings[HOOKS_ADD_PREFIX] = lineEdit_prepend->text();
    	hooksSettings[HOOKS_SIP_ENABLED] = checkBox_hooksSIP->isChecked() ? "1" : "0";
    	hooksSettings[HOOKS_IAX2_ENABLED] = checkBox_hooksIAX->isChecked() ? "1" : "0";
    	hooksSettings[HOOKS_SIP_FIELD] = lineEdit_SIPHeader->text();
    	hooksSettings[HOOKS_COMMAND] = lineEdit_command->text();
    	configurationManager.setHookSettings(hooksSettings);
    	
    // 	accountsChangedEnableWarning = true;
    }
    
    
    void ConfigurationDialog::loadAccountList()
    {
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	//ask for the list of accounts ids to the configurationManager
    	QStringList accountIds = configurationManager.getAccountList().value();
    	//create the AccountList object with the ids
    	accountList = new AccountList(accountIds);
    	//initialize the QListWidget object with the AccountList
    	listWidget_accountList->clear();
    	for (int i = 0; i < accountList->size(); ++i){
    		addAccountToAccountList(&(*accountList)[i]);
    	}
    	if (listWidget_accountList->count() > 0 && listWidget_accountList->currentItem() == NULL) 
    		listWidget_accountList->setCurrentRow(0);
    	else 
    		frame2_editAccounts->setEnabled(false);
    }
    
    void ConfigurationDialog::saveAccountList()
    {
    	//get the configurationManager instance
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	//save the account being edited
    	if(listWidget_accountList->currentItem())
    		saveAccount(listWidget_accountList->currentItem());
    	//ask for the list of accounts ids to the configurationManager
    	QStringList accountIds= QStringList(configurationManager.getAccountList().value());
    	//create or update each account from accountList
    	for (int i = 0; i < accountList->size(); i++){
    		Account & current = (*accountList)[i];
    		QString currentId;
    		//if the account has no instanciated id, it has just been created in the client
    		if(current.isNew())
    		{
    			MapStringString details = current.getAccountDetails();
    			currentId = configurationManager.addAccount(details);
    			current.setAccountId(currentId);
    		}
    		//if the account has an instanciated id but it's not in configurationManager
    		else{
    			if(! accountIds.contains(current.getAccountId()))
    			{
    				qDebug() << "The account with id " << current.getAccountId() << " doesn't exist. It might have been removed by another SFLPhone client.";
    				currentId = QString();
    			}
    			else
    			{
    				configurationManager.setAccountDetails(current.getAccountId(), current.getAccountDetails());
    				currentId = QString(current.getAccountId());
    			}
    		}
    		qDebug() << currentId << " : " << current.isChecked();
    		configurationManager.sendRegister(currentId, current.isChecked() ? 1 : 0 );
    	}
    	//remove accounts that are in the configurationManager but not in the client
    	for (int i = 0; i < accountIds.size(); i++)
    	{
    		if(! accountList->getAccountById(accountIds[i]))
    		{
    			qDebug() << "remove account " << accountIds[i];
    			configurationManager.removeAccount(accountIds[i]);
    		}
    	}
    }
    
    void ConfigurationDialog::loadAccount(QListWidgetItem * item)
    {
    	if(! item )  {  qDebug() << "Attempting to load details of an account from a NULL item";  return;  }
    
    	Account * account = accountList->getAccountByItem(item);
    	if(! account )  {  qDebug() << "Attempting to load details of an unexisting account";  return;  }
    
    	edit1_alias->setText( account->getAccountDetail(ACCOUNT_ALIAS));
    	
    	QString protocolsTab[] = ACCOUNT_TYPES_TAB;
    	QList<QString> * protocolsList = new QList<QString>();
    	for(int i = 0 ; i < (int) (sizeof(protocolsTab) / sizeof(QString)) ; i++)
    	{ 
    		protocolsList->append(protocolsTab[i]);
    	}
    	QString accountName = account->getAccountDetail(ACCOUNT_TYPE);
    	int protocolIndex = protocolsList->indexOf(accountName);
    	delete protocolsList;
    	
    	edit2_protocol->setCurrentIndex( (protocolIndex < 0) ? 0 : protocolIndex );
    	edit3_server->setText( account->getAccountDetail(ACCOUNT_HOSTNAME));
    	edit4_user->setText( account->getAccountDetail(ACCOUNT_USERNAME));
    	edit5_password->setText( account->getAccountDetail(ACCOUNT_PASSWORD));
    	edit6_mailbox->setText( account->getAccountDetail(ACCOUNT_MAILBOX));
    	QString status = account->getAccountDetail(ACCOUNT_STATUS);
    	qDebug() << "Color : " << account->getStateColorName();
    	edit7_state->setText( "<FONT COLOR=\"" + account->getStateColorName() + "\">" + status + "</FONT>" );
    	//edit7_Etat->setTextColor( account->getStateColor );
    }
    
    
    void ConfigurationDialog::saveAccount(QListWidgetItem * item)
    {
    	if(! item)  { qDebug() << "Attempting to save details of an account from a NULL item"; return; }
    	
    	Account * account = accountList->getAccountByItem(item);
    	if(! account)  {  qDebug() << "Attempting to save details of an unexisting account : " << item->text();  return;  }
    
    	account->setAccountDetail(ACCOUNT_ALIAS, edit1_alias->text());
    	QString protocolsTab[] = ACCOUNT_TYPES_TAB;
    	account->setAccountDetail(ACCOUNT_TYPE, protocolsTab[edit2_protocol->currentIndex()]);
    	account->setAccountDetail(ACCOUNT_HOSTNAME, edit3_server->text());
    	account->setAccountDetail(ACCOUNT_USERNAME, edit4_user->text());
    	account->setAccountDetail(ACCOUNT_PASSWORD, edit5_password->text());
    	account->setAccountDetail(ACCOUNT_MAILBOX, edit6_mailbox->text());
    	account->setAccountDetail(ACCOUNT_ENABLED, account->isChecked() ? ACCOUNT_ENABLED_TRUE : ACCOUNT_ENABLED_FALSE);
    }
    
    void ConfigurationDialog::addAccountToAccountList(Account * account)
    {
    	qDebug() << "addAccountToAccountList";
    	QListWidgetItem * item = account->getItem();
    	QWidget * widget = account->getItemWidget();
    	listWidget_accountList->addItem(item);
    	listWidget_accountList->setItemWidget(item, widget);
    }
    
    void ConfigurationDialog::loadCodecs()
    {
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	QStringList codecList = configurationManager.getCodecList();
    	QStringList activeCodecList = configurationManager.getActiveCodecList();
    	qDebug() << codecList;
    	qDebug() << activeCodecList;
    	tableWidget_codecs->setRowCount(0);
    	codecPayloads->clear();
    	for(int i=0 ; i<codecList.size() ; i++)
    	{
    		bool ok;
    		qDebug() << codecList[i];
    		QString payloadStr = QString(codecList[i]);
    		int payload = payloadStr.toInt(&ok);
    		if(!ok)	
    			qDebug() << "The codec's payload sent by the configurationManager is not a number : " << codecList[i];
    		else
    		{
    			QStringList details = configurationManager.getCodecDetails(payload);
    			tableWidget_codecs->insertRow(i);
    			QTableWidgetItem * headerItem = new QTableWidgetItem("");
    			tableWidget_codecs->setVerticalHeaderItem (i, headerItem);
    			//headerItem->setVisible(false);
    			tableWidget_codecs->setItem(i,0,new QTableWidgetItem(""));
    			tableWidget_codecs->setItem(i,1,new QTableWidgetItem(details[CODEC_NAME]));
    			//qDebug() << "tableWidget_Codecs->itemAt(" << i << "," << 2 << ")->setText(" << details[CODEC_NAME] << ");";
    			//tableWidget_Codecs->item(i,2)->setText(details[CODEC_NAME]);
    			tableWidget_codecs->setItem(i,2,new QTableWidgetItem(details[CODEC_SAMPLE_RATE]));
    			tableWidget_codecs->setItem(i,3,new QTableWidgetItem(details[CODEC_BIT_RATE]));
    			tableWidget_codecs->setItem(i,4,new QTableWidgetItem(details[CODEC_BANDWIDTH]));
    			tableWidget_codecs->item(i,0)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    			tableWidget_codecs->item(i,0)->setCheckState(activeCodecList.contains(codecList[i]) ? Qt::Checked : Qt::Unchecked);
    			tableWidget_codecs->item(i,1)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
    			tableWidget_codecs->item(i,2)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
    			tableWidget_codecs->item(i,3)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
    			tableWidget_codecs->item(i,4)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
    
    			(*codecPayloads)[details[CODEC_NAME]] = payloadStr;
    			qDebug() << "Added to codecs : " << payloadStr << " , " << details[CODEC_NAME];
    		}
    	}
    	tableWidget_codecs->resizeColumnsToContents();
    	tableWidget_codecs->resizeRowsToContents();
    }
    
    
    void ConfigurationDialog::saveCodecs()
    {
    	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    	QStringList activeCodecs;
    	for(int i = 0 ; i < tableWidget_codecs->rowCount() ; i++)
    	{
    		//qDebug() << "Checked if active : " << tableWidget_Codecs->item(i,1)->text();
    		if(tableWidget_codecs->item(i,0)->checkState() == Qt::Checked)
    		{
    			//qDebug() << "Added to activeCodecs : " << tableWidget_Codecs->item(i,1)->text();
    			activeCodecs << (*codecPayloads)[tableWidget_codecs->item(i,1)->text()];
    		}
    	}
    	qDebug() << "Calling setActiveCodecList with list : " << activeCodecs ;
    	configurationManager.setActiveCodecList(activeCodecs);
    }
    
    void ConfigurationDialog::setPage(int page)
    {
    	stackedWidget_options->setCurrentIndex(page);
    	list_options->setCurrentRow(page);
    }
    
    void ConfigurationDialog::updateAccountListCommands()
    {
    	bool buttonsEnabled[4] = {true,true,true,true};
    	if(! listWidget_accountList->currentItem())
    	{
    		buttonsEnabled[0] = false;
    		buttonsEnabled[1] = false;
    		buttonsEnabled[3] = false;
    	}
    	else if(listWidget_accountList->currentRow() == 0)
    	{
    		buttonsEnabled[0] = false;
    	}
    	else if(listWidget_accountList->currentRow() == listWidget_accountList->count() - 1)
    	{
    		buttonsEnabled[1] = false;
    	}
    	button_accountUp->setEnabled(buttonsEnabled[0]);
    	button_accountDown->setEnabled(buttonsEnabled[1]);
    	button_accountAdd->setEnabled(buttonsEnabled[2]);
    	button_accountRemove->setEnabled(buttonsEnabled[3]);
    }
    
    void ConfigurationDialog::updateCodecListCommands()
    {
    	bool buttonsEnabled[2] = {true,true};
    	if(! tableWidget_codecs->currentItem())
    	{
    		buttonsEnabled[0] = false;
    		buttonsEnabled[1] = false;
    	}
    	else if(tableWidget_codecs->currentRow() == 0)
    	{
    		buttonsEnabled[0] = false;
    	}
    	else if(tableWidget_codecs->currentRow() == tableWidget_codecs->rowCount() - 1)
    	{
    		buttonsEnabled[1] = false;
    	}
    	toolButton_codecUp->setEnabled(buttonsEnabled[0]);
    	toolButton_codecDown->setEnabled(buttonsEnabled[1]);
    }
    
    void ConfigurationDialog::on_edit1_alias_textChanged(const QString & text)
    {
    	qDebug() << "on_edit1_alias_textChanged";
    	AccountItemWidget * widget = (AccountItemWidget *) listWidget_accountList->itemWidget(listWidget_accountList->currentItem());
    	widget->setAccountText(text);
    }
    
    void ConfigurationDialog::on_spinBox_SIPPort_valueChanged ( int value )
    {
    	qDebug() << "on_spinBox_SIPPort_valueChanged";
    	if(value>1024 && value<65536)
    		label_WarningSIP->setVisible(false);
    	else
    		label_WarningSIP->setVisible(true);
    }
    
    
    void ConfigurationDialog::on_toolButton_codecUp_clicked()
    {
    	qDebug() << "on_toolButton_codecUp_clicked";
    	int currentCol = tableWidget_codecs->currentColumn();
    	int currentRow = tableWidget_codecs->currentRow();
    	int nbCol = tableWidget_codecs->columnCount();
    	for(int i = 0 ; i < nbCol ; i++)
    	{
    		QTableWidgetItem * item1 = tableWidget_codecs->takeItem(currentRow, i);
    		QTableWidgetItem * item2 = tableWidget_codecs->takeItem(currentRow - 1, i);
    		tableWidget_codecs->setItem(currentRow - 1, i , item1);
    		tableWidget_codecs->setItem(currentRow, i , item2);
    	}
    	tableWidget_codecs->setCurrentCell(currentRow - 1, currentCol);
    }
    
    void ConfigurationDialog::on_toolButton_codecDown_clicked()
    {
    	qDebug() << "on_toolButton_codecDown_clicked";
    	int currentCol = tableWidget_codecs->currentColumn();
    	int currentRow = tableWidget_codecs->currentRow();
    	int nbCol = tableWidget_codecs->columnCount();
    	for(int i = 0 ; i < nbCol ; i++)
    	{
    		QTableWidgetItem * item1 = tableWidget_codecs->takeItem(currentRow, i);
    		QTableWidgetItem * item2 = tableWidget_codecs->takeItem(currentRow + 1, i);
    		tableWidget_codecs->setItem(currentRow + 1, i , item1);
    		tableWidget_codecs->setItem(currentRow, i , item2);
    	}
    	tableWidget_codecs->setCurrentCell(currentRow + 1, currentCol);
    }
    
    void ConfigurationDialog::on_listWidget_accountList_currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )
    {
    	qDebug() << "on_listWidget_accountList_currentItemChanged : " << ((accountList->getAccountByItem(current) != NULL) ? accountList->getAccountByItem(current)->getAlias() : "null");
    	if(previous)
    		saveAccount(previous);
    	if(current)
    		loadAccount(current);
    	updateAccountListCommands();
    }
    
    void ConfigurationDialog::on_button_accountUp_clicked()
    {
    	qDebug() << "on_button_accountUp_clicked";
    	int currentRow = listWidget_accountList->currentRow();
    	QListWidgetItem * prevItem = listWidget_accountList->takeItem(currentRow);
    	Account * account = accountList->getAccountByItem(prevItem);
    	//we need to build a new item to set the itemWidget back
    	QListWidgetItem * item = account->renewItem();
    	delete prevItem;
    	listWidget_accountList->insertItem(currentRow - 1 , item);
    	listWidget_accountList->setItemWidget(item, account->getItemWidget());
    	listWidget_accountList->setCurrentItem(item);
    	//qDebug() << "setItemWidget " << account->getAccountDetail(ACCOUNT_ALIAS) << " , " << account->getItemWidget();
    	
    }
    
    void ConfigurationDialog::on_button_accountDown_clicked()
    {
    	int currentRow = listWidget_accountList->currentRow();
    	QListWidgetItem * prevItem = listWidget_accountList->takeItem(currentRow);
    	Account * account = accountList->getAccountByItem(prevItem);
    	QListWidgetItem * item = account->renewItem();
    	delete prevItem;
    	listWidget_accountList->insertItem(currentRow + 1 , item);
    	listWidget_accountList->setItemWidget(item, account->getItemWidget());
    	listWidget_accountList->setCurrentItem(item);
    }
    
    void ConfigurationDialog::on_button_accountAdd_clicked()
    {
    	qDebug() << "on_button_accountAdd_clicked";
    	QString itemName = QInputDialog::getText(this, "New account", "Enter new account's alias");
    	itemName = itemName.simplified();
    	if (!itemName.isEmpty()) {
    		Account * account = accountList->addAccount(itemName);
    		addAccountToAccountList(account);
    		int r = listWidget_accountList->count() - 1;
    		listWidget_accountList->setCurrentRow(r);
    		frame2_editAccounts->setEnabled(true);
    	}
    }
    
    void ConfigurationDialog::on_button_accountRemove_clicked()
    {
    	qDebug() << "on_button_accountRemove_clicked";
    	int r = listWidget_accountList->currentRow();
    	QListWidgetItem * item = listWidget_accountList->takeItem(r);
    	accountList->removeAccount(item);
    	listWidget_accountList->setCurrentRow( (r >= listWidget_accountList->count()) ? r-1 : r );
    }
    
    void ConfigurationDialog::on_toolButton_accountsApply_clicked()
    {
    	qDebug() << "on_toolButton_accountsApply_clicked";
    	toolButton_accountsApply->setEnabled(false);
    	saveAccountList();
    	loadAccountList();
    	qDebug() << "setEnabled1";
    	toolButton_accountsApply->setEnabled(true);
    	qDebug() << "setEnabled2";
    }
    
    
    void ConfigurationDialog::on_buttonBoxDialog_clicked(QAbstractButton * button)
    {
    	qDebug() << "on_buttonBoxDialog_clicked";
    	if(buttonBoxDialog->standardButton(button) == QDialogButtonBox::Apply)
    	{
    		this->saveOptions();
    		this->loadOptions();
    	}
    	if(buttonBoxDialog->standardButton(button) == QDialogButtonBox::RestoreDefaults)
    	{
    		this->loadOptions();
    	}
    	if(buttonBoxDialog->standardButton(button) == QDialogButtonBox::Ok)
    	{
    		this->saveOptions();
    		this->setVisible(false);
    	}
    	if(buttonBoxDialog->standardButton(button) == QDialogButtonBox::Cancel)
    	{
    		this->setVisible(false);
    	}
    }
    
    void ConfigurationDialog::on_tableWidget_codecs_currentCellChanged(int currentRow)
    {
    	qDebug() << "on_tableWidget_codecs_currentCellChanged";
    	int nbCol = tableWidget_codecs->columnCount();
    	for(int i = 0 ; i < nbCol ; i++)
    	{
    		tableWidget_codecs->setRangeSelected(QTableWidgetSelectionRange(currentRow, 0, currentRow, nbCol - 1), true);
    	}
    	updateCodecListCommands();
    }
    
    void ConfigurationDialog::on1_accountsChanged()
    {
    	qDebug() << "on1_accountsChanged";
    // 	ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance();
    // 	disconnect(&configurationManager, SIGNAL(accountsChanged()),
    // 	           this,                  SLOT(on1_accountsChanged()));
    // 	accountList->update();
    // 	loadAccountList();
    // 	connect(&configurationManager, SIGNAL(accountsChanged()),
    // 	        this,                  SLOT(on1_accountsChanged()));
    	if(isVisible() && accountsChangedEnableWarning)
    	{
    		errorWindow->showMessage(tr2i18n("Accounts changed : another client may be changing accounts or an account is unstable. \nIf another client is changing the settings, you may cancel your changes to avoid overwriting one's changes."));
    	}
    	if(! isVisible())
    	{
    		loadAccountList();
    	}
    }
    
    void ConfigurationDialog::on1_parametersChanged()
    {
    	qDebug() << "on1_parametersChanged";
    }
    
    void ConfigurationDialog::on1_errorAlert(int code)
    {
    	qDebug() << "on1_errorAlert code : " << code ;
    }