/***************************************************************************
                          kxeattributedialog.cpp  -  description
                          ----------------------
    begin                : Fre Jul 12 2002
    copyright            : (C) 2002, 2003 by The KXMLEditor Team
    email                : lvanek@users.sourceforge.net
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "kxeattributedialog.h"

#include <klineedit.h>
#include <kdebug.h>
#include <tdelocale.h>

#include <tqpushbutton.h>
#include <tqlabel.h>

KXEAttributeDialog::KXEAttributeDialog( TQWidget * pParent, const char * pszName, bool fModal, WFlags fl )
	: KXEAttributeDialogBase( pParent, pszName, fModal, fl )
{
  connect( m_pEditNamespace, TQ_SIGNAL(textChanged(const TQString &)), this, TQ_SLOT(slotNamespaceChanged(const TQString &)) );
	connect( m_pEditQName, TQ_SIGNAL(textChanged(const TQString &)), this, TQ_SLOT(slotNameChanged(const TQString &)) );
	connect( m_pEditValue, TQ_SIGNAL(textChanged(const TQString &)), this, TQ_SLOT(slotValueChanged(const TQString &)) );
}

void KXEAttributeDialog::clearDialog()
{
	m_pEditNamespace->clear();
	m_pEditQName->clear();
	m_pEditValue->clear();
}

int KXEAttributeDialog::exec()
{
	clearDialog();

  m_pBtnOK->setEnabled(false);

	m_pEditQName->setFocus();
	m_pBtnOK->setDefault(true);

	int iReturn = KXEAttributeDialogBase::exec();
	if ( iReturn == Accepted )
	{
    m_strNamespace = m_pEditNamespace->text();
    m_strQName = m_pEditQName->text();
    m_strValue = m_pEditValue->text();
	}

	return iReturn;
}

void KXEAttributeDialog::slotNameChanged(const TQString & strNewName)
{
	TQString strMessage = checkName(strNewName);
  if(strMessage.isEmpty())
     {
       strMessage = checkNamespace(m_pEditNamespace->text());
       if(strMessage.isEmpty())
         strMessage = checkValue(m_pEditValue->text());
     }
     
  m_pTextLabelMessage->setText(strMessage);

	if ( strNewName.isEmpty() || (strMessage.length() > 0) )
		m_pBtnOK->setEnabled(false);
	else
		m_pBtnOK->setEnabled(true);
}

void KXEAttributeDialog::slotValueChanged(const TQString & strNewValue)
{
	TQString strMessage = checkName(m_pEditQName->text());
  if(strMessage.isEmpty())
     {
       strMessage = checkNamespace(m_pEditNamespace->text());
       if(strMessage.isEmpty())
         strMessage = checkValue(strNewValue);
     }

  m_pTextLabelMessage->setText(strMessage);

	if ( m_pEditQName->text().isEmpty() || (strMessage.length() > 0) )
		m_pBtnOK->setEnabled(false);
	else
		m_pBtnOK->setEnabled(true);
}

void KXEAttributeDialog::slotNamespaceChanged(const TQString & strNewNamespace)
{
	TQString strMessage = checkName(m_pEditQName->text());
  if(strMessage.isEmpty())
     {
       strMessage = checkNamespace(strNewNamespace);
       if(strMessage.isEmpty())
         strMessage = checkValue(m_pEditValue->text());
     }

  m_pTextLabelMessage->setText(strMessage);

	if ( m_pEditQName->text().isEmpty() || (strMessage.length() > 0) )
		m_pBtnOK->setEnabled(false);
	else
		m_pBtnOK->setEnabled(true);
}

// Check, if XML attribute name is OK
TQString KXEAttributeDialog::checkNamespace(const TQString strAtttributeName)
{
  if(strAtttributeName.length() == 0)
    return  "";

  // test for space 
  if(strAtttributeName.find(' ') >= 0)
    return i18n("Atttribute namespace cannot contain space !");

  // Forbidden characters
  TQString strForbiddenChars("<>\"'");
  for(unsigned int i = 0; i < strForbiddenChars.length(); i++)
  {
    TQChar ch = strForbiddenChars[i];

    if(strAtttributeName.find(ch) >= 0)
      return i18n("Atttribute namespace cannot contain character: %1 !").arg(ch);
  }

  return "";
}

// Check, if XML attribute name is OK
TQString KXEAttributeDialog::checkName(const TQString strAtttributeName)
{
  if(strAtttributeName.length() == 0)
    return  "";

  // test for space 
  if(strAtttributeName.find(' ') >= 0)
    return i18n("Atttribute name cannot contain space !");

  // Forbidden characters
  TQString strForbiddenChars("&@#$%^()%+?=:<>;\"'*");
  for(unsigned int i = 0; i < strForbiddenChars.length(); i++)
  {
    TQChar ch = strForbiddenChars[i];

    if(strAtttributeName.find(ch) >= 0)
      return i18n("Atttribute name cannot contain character: %1 !").arg(ch);
  }

  return "";
}

// Check, if XML attribute value is OK
TQString KXEAttributeDialog::checkValue(const TQString strData)
{
  if(strData.length() == 0)
    return  "";

  // Forbidden characters
  TQString strForbiddenChars("<>\"");
  for(unsigned int i = 0; i < strForbiddenChars.length(); i++)
  {
    TQChar ch = strForbiddenChars[i];

    if(strData.find(ch) >= 0)
      return i18n("Attribute value cannot contain character: %1 !").arg(ch);
  }

  return "";
}

#include "kxeattributedialog.moc"
