//---------------------------------------------------------------------------
//
//             kPPP: A pppd front end for the KDE project
//
//---------------------------------------------------------------------------
//
// (c) 1997-1998 Bernd Johannes Wuebben <wuebben@kde.org>
// (c) 1997-1999 Mario Weilguni <mweilguni@kde.org>
// (c) 1998-1999 Harri Porten <porten@kde.org>
//
// derived from Jay Painters "ezppp"
//
//---------------------------------------------------------------------------
//
//  $Id$
//
//---------------------------------------------------------------------------
//
//  This program is free software; you can redistribute it and-or
//  modify it under the terms of the GNU Library General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Library General Public License for more details.
//
//  You should have received a copy of the GNU Library General Public
//  License along with this program; if not, write to the Free
//  Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
//
//---------------------------------------------------------------------------

#include <tqlabel.h>
#include <kbuttonbox.h>
#include <tqlayout.h>
#include "modemdb.h"
#include <tdelocale.h>
#include <tqpushbutton.h>
#include <tqlistbox.h>
#include <tdeconfig.h>
#include <kstdguiitem.h>

ModemSelector::ModemSelector(TQWidget *parent) : TQDialog(parent, 0, true) {
  // set up widgets and such
  setCaption(i18n("Select Modem Type"));
  TQVBoxLayout *tl = new TQVBoxLayout(this, 10, 10);
  TQLabel *l1 = new TQLabel(i18n("To set up your modem, first choose its vendor in the "
			       "list to the left, and then select the model from the "
			       "right list. If you don't know which modem you have, "
			       "you can try out one of the \"Generic\" modems."),
			this);
  l1->setAlignment(AlignLeft | WordBreak);
  l1->setFixedWidth(400);
  l1->setMinimumHeight(50);
  tl->addWidget(l1, 0);

  tl->addSpacing(10);

  TQHBoxLayout *tl1 = new TQHBoxLayout(10);
  tl->addLayout(tl1, 1);
  vendor = new TQListBox(this);
  model  = new TQListBox(this);
  vendor->setMinimumSize(200, 130);
  model->setMinimumSize(200, 130);
  tl1->addWidget(vendor, 2);
  tl1->addWidget(model, 3);

  KButtonBox *bbox = new KButtonBox(this);
  bbox->addStretch(1);
  ok = bbox->addButton(KStdGuiItem::ok());
  ok->setDefault(true);
  ok->setEnabled(false);
  cancel =   bbox->addButton(KStdGuiItem::cancel());
  bbox->layout();
  tl->addWidget(bbox);
  setFixedSize(sizeHint());

  // set up modem database
  db = new ModemDatabase();

  // set up signal/slots
  connect(ok, TQ_SIGNAL(clicked()),
	  this, TQ_SLOT(reject()));
  connect(cancel, TQ_SIGNAL(clicked()),
	  this, TQ_SLOT(reject()));
  connect(vendor, TQ_SIGNAL(highlighted(int)),
	  this, TQ_SLOT(vendorSelected(int)));
  connect(model, TQ_SIGNAL(highlighted(int)),
	  this, TQ_SLOT(modelSelected(int)));
  connect(model, TQ_SIGNAL(selected(int)),
	  this, TQ_SLOT(selected(int)));

  // fill vendor list with life
  vendor->insertStringList(*db->vendors());

  vendor->setCurrentItem(0);
}


ModemSelector::~ModemSelector() {
  delete db;
}


void ModemSelector::vendorSelected(int idx) {
  ok->setEnabled(false);

  TQString name = vendor->text(idx);
  TQStringList *models = db->models(name);
  model->clear();
  model->insertStringList(*models);

  // FIXME: work around TQt bug
  if(models->count() == 0)
    model->update();
  delete models;
}


void ModemSelector::modelSelected(int) {
  ok->setEnabled(true);
}

void ModemSelector::selected(int) {
  accept();
}


ModemDatabase::ModemDatabase() {
  load();
}


ModemDatabase::~ModemDatabase() {
  delete lvendors;
  delete modemDB;
}


const TQStringList *ModemDatabase::vendors() {
  return lvendors;
}


TQStringList *ModemDatabase::models(TQString vendor)  {
  TQStringList *sl = new TQStringList;
  TQString s = i18n("<Generic>");
  if(vendor == s)
    vendor = i18n("<Generic>");

  for(uint i = 0; i < modems.count(); i++) {
    CharDict *dict = modems.at(i);
    if(dict->find("Vendor") != 0) {
      if(vendor == *(*dict)["Vendor"] && (*(*dict)["Name"]).at(0) != '!')
	sl->append(*(*dict)["Name"]);
    }
  }
  sl->sort();

  return sl;
}


void ModemDatabase::loadModem(const TQString &key, CharDict &dict) {
  //  KEntryIterator *it = modemDB->entryIterator(key);
  //  KEntryDictEntry *e;
  TQMap <TQString, TQString> map;
  TQMap <TQString, TQString>::Iterator it;
  //  KEntryMapConstIterator e;
  KEntry e;
  map = modemDB->entryMap(key);
  it = map.begin();

  // remove parent attribute
  dict.setAutoDelete(true);
  dict.remove("Parent");

  //  e = it->current();
  while(!it.key().isNull()) {
    if(dict.find(it.key()) == 0) {
      dict.insert(it.key(), new TQString(it.data()));
    }
    it++;
  }

  // check name attribute
  if(dict["Name"] == 0 || key[0]=='!') {
    dict.replace("Name", new TQString(key));
  }

  // check parent attribute
  if(dict["Parent"] != 0)
    loadModem(*dict["Parent"], dict);
  else
    // inherit common at last
    if (key != "Common")
      loadModem("Common", dict);

}


void ModemDatabase::load() {
  modemDB = new TDEConfig("DB/modemDB.rc", 0);
  lvendors = new TQStringList;
  modems.setAutoDelete(true);

  TQStringList list = modemDB->groupList();
  TQStringList::Iterator it = list.begin();
  while(it != list.end()) {
    modemDB->setGroup(*it);
    CharDict *c = new CharDict;
    c->setAutoDelete(true);
    loadModem(*it, *c);

    //    if(strcmp(it->latin1(), "Common") == 0) {
    if(*it == "Common") {
      TQString s = i18n("Hayes(tm) compatible modem");
      c->replace("Name", new TQString (s));

      s = i18n("<Generic>");
      c->replace("Vendor", new TQString(s));
    }
    modems.append(c);

    if(modemDB->hasKey("Vendor")) {
      TQString vendor = modemDB->readEntry("Vendor");
      if(lvendors->findIndex(vendor) == -1)
	lvendors->append(vendor);
    }
    ++it;
  }

  lvendors->sort();

  lvendors->insert(0, i18n("<Generic>"));
}


void ModemDatabase::save(TDEConfig *) {
}

#include "modemdb.moc"
