/***************************************************************************
                          abbreviation.cpp  -  description
                             -------------------
    copyright            : (C) 2003 by Andras Mantia <amantia@kde.org>
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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; version 2 of the License.               *
 *                                                                         *
 ***************************************************************************/

//qt includes
#include <tqdom.h>
#include <tqfile.h>
#include <tqfileinfo.h>
#include <tqlineedit.h>
#include <tqtextedit.h>
#include <tqtextstream.h>
#include <tqtimer.h>

//kde includes
#include <kcombobox.h>
#include <kdebug.h>
#include <kdialogbase.h>
#include <kglobal.h>
#include <kinputdialog.h>
#include <klistbox.h>
#include <klistview.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>

//app includes
#include "abbreviation.h"
#include "codetemplatedlgs.h"
#include "resource.h"
#include "quantacommon.h"
#include "dtds.h"


AbbreviationDlg::AbbreviationDlg(TQWidget *tqparent, const char *name):
    AbbreviationDlgS(tqparent, name)
{
  m_oldItem = 0L;
  m_currentAbbrev = 0L;

  TQMapConstIterator<TQString, Abbreviation> it;
  for (it = qConfig.abbreviations.constBegin(); it != qConfig.abbreviations.constEnd(); ++it)
  {
    groupCombo->insertItem(it.key());
  }
  slotGroupChanged(groupCombo->currentText());
}

AbbreviationDlg::~AbbreviationDlg()
{
}

void AbbreviationDlg::slotGroupChanged(const TQString& newGroupName)
{
  //save the current template
  TQListViewItem *item = templatesList->currentItem();
  if (item && m_currentAbbrev)
     m_currentAbbrev->abbreviations.insert(item->text(0) + " " + item->text(1), codeEdit->text());
  dtepList->clear();
  templatesList->clear();
  codeEdit->clear();
  m_oldItem = 0L;
  m_currentAbbrev = &qConfig.abbreviations[newGroupName];
  TQString templateStr;
  TQString templateName;
  TQMap<TQString, TQString>::ConstIterator it;
  for ( it = m_currentAbbrev->abbreviations.constBegin(); it != m_currentAbbrev->abbreviations.constEnd(); ++it )
  {
    templateStr = it.key();
    templateName = templateStr.mid(templateStr.tqfind(' ') + 1);
    templateStr = templateStr.left(templateStr.tqfind(' '));
    new KListViewItem(templatesList, templateStr, templateName);
  }
  for ( TQStringList::ConstIterator dtepit = m_currentAbbrev->dteps.constBegin(); dtepit != m_currentAbbrev->dteps.constEnd(); ++dtepit )
  {
      dtepList->insertItem(DTDs::ref()->getDTDNickNameFromName(*dtepit));
  }
  templatesList->sort();
  templatesList->setCurrentItem(templatesList->firstChild());
  templatesList->setSelected(templatesList->firstChild(), true);
}

void AbbreviationDlg::slotNewGroup()
{
   bool ok;
   TQString groupName = KInputDialog::getText(i18n("New Abbreviation Group"), i18n("Group name:"), "", &ok, this);
   if (ok && !groupName.isEmpty())
   {
      if (qConfig.abbreviations.tqcontains(groupName))
      {
          KMessageBox::error(this, i18n("<qt>There is already an abbreviation group called <b>%1</b>. Choose an unique name for the new group.</qt>").tqarg(groupName), i18n("Group already exists"));
          TQTimer::singleShot(0, this, TQT_SLOT(slotNewGroup()));
      } else
      {
         groupCombo->insertItem(groupName);
         groupCombo->setCurrentItem(groupCombo->count()-1);
         slotGroupChanged(groupName);
      }
   }
}

void AbbreviationDlg::slotAddDTEP()
{
  TQStringList lst = DTDs::ref()->nickNameList(false);
  for (uint i = 0; i < dtepList->count(); i++)
     lst.remove(dtepList->text(i));
  bool ok = false;
  TQStringList res = KInputDialog::getItemList(
                  i18n( "Add DTEP" ),
                  i18n( "Select a DTEP:" ), lst, 0, true, &ok, this );
  if (ok)
  {
    dtepList->insertStringList(res);
    for (TQStringList::ConstIterator it = res.constBegin(); it != res.constEnd(); ++it)
    {
      m_currentAbbrev->dteps.append(DTDs::ref()->getDTDNameFromNickName(*it));
    }
  }
}

void AbbreviationDlg::slotRemoveDTEP()
{
  bool hasSelected = false;
  for (uint i = 0; i < dtepList->count(); i++)
  {
    if (dtepList->isSelected(i))
    {
      m_currentAbbrev->dteps.remove(DTDs::ref()->getDTDNameFromNickName(dtepList->text(i)));
      dtepList->removeItem(i);
      i--;
      hasSelected = true;
    }
  }
  if (!hasSelected)
  {
    KMessageBox::error(this, i18n("<qt>Select a DTEP from the list before using <b>Remove</b>.</qt>"), i18n("No DTEP Selected"));
  }
}

void AbbreviationDlg::slotTemplateSelectionChanged(TQListViewItem* item)
{
  if (!item)
      return;
  //TQListViewItem *m_oldItem = templatesList->currentItem();
  if (m_oldItem)
  {
    TQString key = m_oldItem->text(0)+" " +m_oldItem->text(1);
    m_currentAbbrev->abbreviations.insert(key, codeEdit->text());
  }

  TQString code = m_currentAbbrev->abbreviations[item->text(0)+" " +item->text(1)];
  codeEdit->setText(code);
  m_oldItem = item;
}

void AbbreviationDlg::slotAddTemplate()
{
  KDialogBase dlg(this, 0, true, i18n("Add Code Template"), KDialogBase::Ok | KDialogBase::Cancel);
  CodeTemplateDlgS w(&dlg);
  dlg.setMainWidget(&w);
  w.templateEdit->setFocus();
  if (dlg.exec())
  {
    TQString templateName = w.templateEdit->text();
    TQString description = w.descriptionEdit->text();
    if (!templateName.isEmpty())
    {
      TQListViewItem *item = new KListViewItem(templatesList, templateName, description);
      templatesList->setCurrentItem(item);
      templatesList->setSelected(item, true);
      templatesList->ensureItemVisible(item);
      codeEdit->setFocus();
    }
  }
}

void AbbreviationDlg::slotRemoveTemplate()
{
  TQListViewItem *item = templatesList->currentItem();
  if (item &&
      KMessageBox::warningContinueCancel(this, i18n("<qt>Do you really want to remove the <b>%1</b> template?</qt>").tqarg(item->text(1)),TQString(),KStdGuiItem::del()) == KMessageBox::Continue)
  {
    m_currentAbbrev->abbreviations.remove(item->text(0)+" "+item->text(1));
    delete item;
    m_oldItem = 0L;
    slotTemplateSelectionChanged(templatesList->currentItem());
  }
}

void AbbreviationDlg::slotEditTemplate()
{
  TQListViewItem *item = templatesList->currentItem();
  if (!item)
      return;
  KDialogBase dlg(this, 0, true, i18n("Edit Code Template"), KDialogBase::Ok | KDialogBase::Cancel);
  CodeTemplateDlgS w(&dlg);
  dlg.setMainWidget(&w);
  w.templateEdit->setText(item->text(0));
  w.descriptionEdit->setText(item->text(1));
  if (dlg.exec())
  {
    m_currentAbbrev->abbreviations.remove(item->text(0)+" "+item->text(1));
    item->setText(0, w.templateEdit->text());
    item->setText(1, w.descriptionEdit->text());
    m_currentAbbrev->abbreviations.insert(item->text(0) + " " + item->text(1), codeEdit->text());
  }
}


void AbbreviationDlg::saveTemplates()
{
  TQListViewItem *item = templatesList->currentItem();
  if (item && m_currentAbbrev)
     m_currentAbbrev->abbreviations.insert(item->text(0) + " " + item->text(1), codeEdit->text());
  TQString abbrevFile = KGlobal::dirs()->saveLocation("data") + resourceDir + "abbreviations.xml";
  TQString s = "<!DOCTYPE Templates>\n<Templates>\n</Templates>\n";
  TQString s2;
  TQDomDocument doc;
  doc.setContent(s);
  TQDomNode firstNode = doc.firstChild();
  Abbreviation abbrev;
  TQMap<TQString, Abbreviation>::ConstIterator abbrevIt;
  for (abbrevIt = qConfig.abbreviations.constBegin(); abbrevIt != qConfig.abbreviations.constEnd(); ++abbrevIt)
  {
    TQDomElement groupEl = doc.createElement("Group");
    groupEl.setAttribute("name", abbrevIt.key());
    abbrev = abbrevIt.data();
    for (TQStringList::ConstIterator dtepIt = abbrev.dteps.constBegin(); dtepIt != abbrev.dteps.constEnd(); ++dtepIt)
    {
      TQDomElement el = doc.createElement("DTEP");
      el.setAttribute("name", *dtepIt);
      groupEl.appendChild(el);
    }
    int pos;
    TQMap<TQString,TQString>::ConstIterator it;
    for (it = abbrev.abbreviations.constBegin(); it != abbrev.abbreviations.constEnd(); ++it)
    {
      TQDomElement el = doc.createElement("Template");
      el.setAttribute("code", it.data());
      s = it.key();
      s2 = "";
      pos = s.tqfind(' ');
      if (pos != -1)
      {
        s2 = s.mid(pos+1);
        s = s.left(pos);
      }
      el.setAttribute("name", s);
      el.setAttribute("description", s2);
      groupEl.appendChild(el);
    }
    firstNode.appendChild(groupEl);
  }

  TQFile f(abbrevFile);
  if (f.open(IO_WriteOnly | IO_Truncate))
  {
    TQTextStream str(&f);
    str.setEncoding(TQTextStream::UnicodeUTF8);
    str << doc.toString();
    f.close();
  } else
  {
    KMessageBox::error(this, i18n("<qt>Cannot open the file <b>%1</b> for writing.\nModified abbreviations will be lost when you quit Quanta.</qt>").tqarg(s));
  }
}

#include "abbreviation.moc"