/**
	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
	qu'un editeur peut accepter ou refuser d'editer une primitive.
	L'editeur de texte dynamique acceptera d'editer la primitive new_part s'il
	s'agit d'un objet de la classe PartTextField.
	@param new_part Nouvelle primitive a editer
	@return true si l'editeur a accepter d'editer la primitive, false sinon
*/
bool TextFieldEditor::setPart(CustomElementPart *new_part) {
	if (!new_part) {
		part = 0;
		return(true);
	}
	if (PartTextField *part_textfield = dynamic_cast<PartTextField *>(new_part)) {
		part = part_textfield;
		updateForm();
		return(true);
	} else {
		return(false);
	}
}
/**
	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
	qu'un editeur peut accepter ou refuser d'editer une primitive.
	L'editeur de borne acceptera d'editer la primitive new_part s'il s'agit d'un
	objet de la classe PartTerminal.
	@param new_part Nouvelle primitive a editer
	@return true si l'editeur a accepter d'editer la primitive, false sinon
*/
bool TerminalEditor::setPart(CustomElementPart *new_part) {
	if (!new_part) {
		part = 0;
		return(true);
	}
	if (PartTerminal *part_terminal = dynamic_cast<PartTerminal *>(new_part)) {
		part = part_terminal;
		updateForm();
		return(true);
	} else {
		return(false);
	}
}
/**
	Constructeur
	@param editor L'editeur d'element concerne
	@param textfield Le champ de texte a editer
	@param parent QWidget parent
*/
TextFieldEditor::TextFieldEditor(QETElementEditor *editor, PartTextField *textfield, QWidget *parent) :
	ElementItemEditor(editor, parent),
	part(textfield)
{
	qle_x     = new QLineEdit();
	qle_y     = new QLineEdit();
	qle_text  = new QLineEdit();
	font_size = new QSpinBox();
	font_size -> setRange(0, 144);
	rotate    = new QCheckBox(tr("Ne pas subir les rotations de l'\351l\351ment parent"));
	rotate -> setChecked(true);
	QLabel *rotation_angle_label = new QLabel(tr("Angle de rotation par d\351faut : "));
	rotation_angle_label -> setWordWrap(true);
	rotation_angle_ = QETApp::createTextOrientationSpinBoxWidget();
	
	qle_x -> setValidator(new QDoubleValidator(qle_x));
	qle_y -> setValidator(new QDoubleValidator(qle_y));
	
	QVBoxLayout *main_layout = new QVBoxLayout();
	main_layout -> addWidget(new QLabel(tr("Position : ")));
	
	QHBoxLayout *position = new QHBoxLayout();
	position -> addWidget(new QLabel(tr("x : ")));
	position -> addWidget(qle_x                 );
	position -> addWidget(new QLabel(tr("y : ")));
	position -> addWidget(qle_y                 );
	main_layout -> addLayout(position);
	
	QHBoxLayout *fs = new QHBoxLayout();
	fs -> addWidget(new QLabel(tr("Taille : ")));
	fs -> addWidget(font_size);
	main_layout -> addLayout(fs);
	
	QHBoxLayout *t = new QHBoxLayout();
	t -> addWidget(new QLabel(tr("Texte par d\351faut : ")));
	t -> addWidget(qle_text);
	main_layout -> addLayout(t);
	
	QHBoxLayout *rotation_angle_layout = new QHBoxLayout();
	rotation_angle_layout -> addWidget(rotation_angle_label);
	rotation_angle_layout -> addWidget(rotation_angle_);
	main_layout -> addLayout(rotation_angle_layout);
	
	QHBoxLayout *r = new QHBoxLayout();
	r -> addWidget(rotate);
	main_layout -> addLayout(r);
	
	main_layout -> addStretch();
	setLayout(main_layout);
	updateForm();
}
/**
	Permet de specifier a cet editeur quelle primitive il doit editer. A noter
	qu'un editeur peut accepter ou refuser d'editer une primitive.
	L'editeur de rectangle acceptera d'editer la primitive new_part s'il s'agit
	d'un objet de la classe PartRectangle.
	@param new_part Nouvelle primitive a editer
	@return true si l'editeur a accepter d'editer la primitive, false sinon
*/
bool RectangleEditor::setPart(CustomElementPart *new_part) {
	if (!new_part) {
		part = 0;
		style_ -> setPart(0);
		return(true);
	}
	if (PartRectangle *part_rectangle = dynamic_cast<PartRectangle *>(new_part)) {
		part = part_rectangle;
		style_ -> setPart(part);
		updateForm();
		return(true);
	} else {
		return(false);
	}
}
void TilemapViewer::refresh() {
    if(SNES::cartridge.loaded()) {
        bool loadMode = customScreenMode->isChecked() == false;
        bool loadTilemap = customTilemap->isChecked() == false;

        if(loadMode) renderer.loadScreenMode();
        if(loadTilemap) renderer.loadTilemapSettings();
        if(loadMode || loadTilemap) updateForm();

        renderer.buildPalette();

        QImage image = renderer.drawTilemap();
        scenePixmap->setPixmap(QPixmap::fromImage(image));

        scene->setSceneRect(scenePixmap->boundingRect());
    }
}
/**
	Constructeur
	@param editor L'editeur d'element concerne
	@param term La borne a editer
	@param parent QWidget parent de ce widget
*/
TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWidget *parent) :
	ElementItemEditor(editor, parent),
	part(term)
{
	qle_x = new QDoubleSpinBox();
	qle_y = new QDoubleSpinBox();
	
	qle_x -> setRange(-1000, 1000);
	qle_y -> setRange(-1000, 1000);
	
	orientation = new QComboBox();
	orientation -> addItem(QET::Icons::North, tr("Nord"),  Qet::North);
	orientation -> addItem(QET::Icons::East,  tr("Est"),   Qet::East);
	orientation -> addItem(QET::Icons::South, tr("Sud"),   Qet::South);
	orientation -> addItem(QET::Icons::West,  tr("Ouest"), Qet::West);
	
	QVBoxLayout *main_layout = new QVBoxLayout();
	main_layout -> addWidget(new QLabel(tr("Position : ")));
	
	QHBoxLayout *position = new QHBoxLayout();
	position -> addWidget(new QLabel(tr("x : ")));
	position -> addWidget(qle_x                 );
	position -> addWidget(new QLabel(tr("y : ")));
	position -> addWidget(qle_y                 );
	main_layout -> addLayout(position);
	
	QHBoxLayout *ori = new QHBoxLayout();
	ori -> addWidget(new QLabel(tr("Orientation : ")));
	ori -> addWidget(orientation                     );
	main_layout -> addLayout(ori);
	
	main_layout -> addStretch();
	setLayout(main_layout);
	
	activeConnections(true);
	updateForm();
}
/**
	Constructeur
	@param editor L'editeur d'element concerne
	@param rect Le rectangle a editer
	@param parent le Widget parent
*/
RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, QWidget *parent) :
	ElementItemEditor(editor, parent),
	part(rect)
{
	style_ = new StyleEditor(editor);
	
	x = new QLineEdit();
	y = new QLineEdit();
	w = new QLineEdit();
	h = new QLineEdit();
	
	x -> setValidator(new QDoubleValidator(x));
	y -> setValidator(new QDoubleValidator(y));
	w -> setValidator(new QDoubleValidator(w));
	h -> setValidator(new QDoubleValidator(h));
	
	QVBoxLayout *v_layout = new QVBoxLayout(this);
	
	QGridLayout *grid = new QGridLayout();
	grid -> addWidget(new QLabel(tr("Coin sup\351rieur gauche\240: ")), 0, 0, 1, 4);
	grid -> addWidget(new QLabel("x"),                                  1, 0, Qt::AlignRight);
	grid -> addWidget(x,                                                1, 1);
	grid -> addWidget(new QLabel("y"),                                  1, 2);
	grid -> addWidget(y,                                                1, 3);
	grid -> addWidget(new QLabel(tr("Dimensions\240: ")),               2, 0, 1, 4);
	grid -> addWidget(new QLabel(tr("Largeur\240:")),                   3, 0);
	grid -> addWidget(w,                                                3, 1);
	grid -> addWidget(new QLabel(tr("Hauteur\240:")),                   4, 0);
	grid -> addWidget(h,                                                4, 1);
	
	v_layout -> addWidget(style_);
	v_layout -> addLayout(grid);
	
	activeConnections(true);
	updateForm();
}
RSipRegistrations::RSipRegistrations(const SipRegistrationData& regData, SipClient *sipClient, SipPhoneProxy *phoneObject, QWidget *parentWidget, const char *prefix )
{
  _parentWidget = parentWidget;
  _extSipClient = sipClient;
  _extPhoneObject = phoneObject;
  _userPrefix = prefix;
  _useStun = false;

  _pIdentityForm = new RIdentityForm( _parentWidget, _userPrefix.toLatin1(), this );
  connect( _pIdentityForm, SIGNAL( updateForm() ), this, SLOT( update() ) );

  _sipRegister = 0;

  //QString uristr;
  //SipUri uri;
  //QSettings settings;
  //QString pp = "/settings/local/";

  _expires = regData.registrationExpiresTime;// settings.value( pp + "/RegistrationExpiresTime", constRegistrationExpiresTime ).toInt();
  if( _expires == 0 )
  {
	_expires = -1;
  }

  //pp = "/settings/Registration/";
  if( !regData.sipUserUri.isEmpty() )// settings.value( pp + "/SipUri", "" ).toString() != "" )
  {
	QString uristr = regData.sipUserUri; //settings.value( pp + "/SipUri" ).toString();
	SipUri uri = SipUri( uristr );
	_pSipUser = _extSipClient->getUser( uri );
	if( _pSipUser == NULL )
	{
	  _pSipUser = new SipUser( _extSipClient, uri );
	}

	_stunServer = "";
	if( regData.useStun )//  settings.value( "/settings/STUN/UseStun", "" ).toString() == "Yes" )
	{
	  _useStun = regData.useStun; //true;
	  //_stunServer = settings.value( "/settings/STUN/StunServer", constStunServer ).toString();
	  _stunServer = regData.stunServerWithPort;

	  if( _stunServer.isEmpty() )
	  {
	QString dname = _pSipUser->getMyUri()->getHostname();
	_stunServer = dname;
	QString srv = sipClient->getSRV( QString( "_stun._udp." ) + dname );
	if( !srv.isEmpty() )
	{
	  _stunServer = srv;
	}
	_stunServer += ":3478";
	  }
	  else
	  {
	if( !_stunServer.contains( ':' ) )
	{
	  _stunServer += ":3478";
	}
	  }
	}

	QString sipServerUri = regData.sipServerUri;
	// uristr = "";
	//if( settings.value( pp + "/SipServer", "" ).toString() != "" )
	//{
	//  uristr = settings.value( pp + "/SipServer" ).toString();
	//}
	//QString qvalue = settings.value( pp + "/qValue", "" ).toString();
	QString qValue = regData.qValue;

	//_sipReg = new SipRegister( _sipUser, SipUri( uristr ), _expires, qvalue );
	_sipRegister = new SipRegister( _pSipUser, SipUri( sipServerUri ), _expires, qValue );
	connect( _sipRegister, SIGNAL( statusUpdated() ), this, SLOT( registerStatusUpdated() ) );
	connect( _sipRegister, SIGNAL(trueRegistrationStatus(bool)), this, SIGNAL(proxyTrueRegistrationStatus(bool)));

		// ОТЛАДКА
		//connect( _sipRegister, SIGNAL(trueRegistrationStatus(bool)), this, SLOT(trueRegistrationStatusSlot(bool)));


	_extPhoneObject->updateIdentity( _pSipUser, _sipRegister );
	_extSipClient->updateIdentity( _pSipUser, _sipRegister->getOutboundProxy() );

		if(!regData.userName.isEmpty())
			_pSipUser->getMyUri()->setProxyUsername( regData.userName );
		if(!regData.password.isEmpty())
			_pSipUser->getMyUri()->setPassword( regData.password );

		_autoRegister = regData.autoRegister;
	if( _autoRegister )
	{
	  if( _useStun )
	  {
	_sipRegister->setAutoRegister( _autoRegister );
	  }
	  else
	  {
	_sipRegister->requestRegister();
	  }
	}
	else
	{
	  _sipRegister->setAutoRegister( _autoRegister );
	}




	//////////QString str;
	//////////str = settings.value( pp + "/UserName" ).toString();
	//////////_sipUser->getMyUri()->setProxyUsername( str );
	//////////str = settings.value( pp + "/Password" ).toString();
	//////////_sipUser->getMyUri()->setPassword( str );
	//////////str = settings.value( pp + "/AutoRegister" ).toString();
	//////////if( str == "Yes" )
	//////////{
	//////////  _autoRegister = true;
	//////////  if( _useStun )
	//////////  {
	//////////    _sipReg->setAutoRegister( true );
	//////////  }
	//////////  else
	//////////  {
	//////////    _sipReg->requestRegister();
	//////////  }
	//////////}
	//////////else
	//////////{
	//////////  _autoRegister = false;
	//////////  _sipReg->setAutoRegister( false );
	//////////}
  }
/// Met a jour l'ordonnee de la position du champ de texte et cree un objet d'annulation
void TextFieldEditor::updateTextFieldY() { addChangePartCommand(tr("ordonn\351e"),     part, "y",      qle_y -> text().toDouble()); updateForm(); }
/// Met a jour l'abscisse de la position du champ de texte et cree un objet d'annulation
void TextFieldEditor::updateTextFieldX() { addChangePartCommand(tr("abscisse"),        part, "x",      qle_x -> text().toDouble()); updateForm(); }
/**
	@param os l'OrientationSet a editer
*/
void OrientationSetWidget::setOrientationSet(const OrientationSet &os) {
	ori = os;
	updateForm();
}