/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
 *            multilist.cc
 *
 *  Mon Jun 16 15:31:24 CEST 2008
 *  Copyright 2008 Bent Bisballe Nyeng
 *  deva@aasimon.org
 ****************************************************************************/

/*
 *  This file is part of Pracro.
 *
 *  Pracro 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.
 *
 *  Pracro 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Pracro; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
#include "multilist.h"

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QPushButton>

#include "widgetbuilder.h"
#include "formatparser.h"

#include "common.h"

MultiList::MultiList(QDomNode &node, MacroWindow *macrowindow)
  : QFrame(), Widget(node, macrowindow)
{
  setCommonAttributes(this, node);

  QGridLayout *layout = new QGridLayout();
  setLayout(layout);

  QWidget *inputbox = new QWidget(this);
  inputbox->setContentsMargins(0,0,0,0);
  layout->addWidget(inputbox, 0, 0, 1, 2, Qt::AlignTop);

  QDomElement elem = node.toElement();
  if(elem.hasAttribute("layout")) {
    if(elem.attribute("layout") == "hbox") {
      QHBoxLayout *layout = new QHBoxLayout();
      inputbox->setLayout(layout);
    } else if (elem.attribute("layout") == "vbox") {
      QVBoxLayout *layout = new QVBoxLayout();
      inputbox->setLayout(layout);      
    }
  } else {
    QHBoxLayout *layout = new QHBoxLayout();
    inputbox->setLayout(layout);
  }
  
  inputbox->layout()->setContentsMargins(0,0,0,0);
  
  QDomNodeList children = node.childNodes();
  
  for (int i=0; i<children.count();i++) {
    QDomNode child = children.at(i);
    widgets += widgetBuilder(child, inputbox, macrowindow);
  }
  macrowindow->addAuxWidgets(widgets);
  
  QPushButton *add = new QPushButton(this);
  connect(add, SIGNAL(clicked()), this, SLOT(add()));
  add->setText("Tilf�j");
  //  layout->addWidget(add, 0, 1, Qt::AlignTop);
  layout->addWidget(add, 1, 0, 1, 1, Qt::AlignTop);

  QPushButton *rem = new QPushButton(this);
  connect(rem, SIGNAL(clicked()), this, SLOT(remove()));
  rem->setText("Fjern");
  //  layout->addWidget(rem, 1, 1, Qt::AlignTop);
  layout->addWidget(rem, 1, 1, 1, 1, Qt::AlignTop);

  list = new QListWidget(this);
  //  layout->addWidget(list, 1, 0, Qt::AlignTop);
  layout->addWidget(list, 2, 0, 1, 2, Qt::AlignTop);

  /* // This is done later
  if(elem.hasAttribute("value")) {
    setValue(elem.attribute("value"));
  }
  */

  if(elem.hasAttribute("format")) {
    format = elem.attribute("format");
  } else {
    QVector< Widget* >::iterator i = widgets.begin();
    while (i != widgets.end()) {
      Widget* w = *i;
      if(format != "") format += ", ";
      format += "${" + w->getName() + "}";
      i++;
    }
  }

  /*
  QVector< Widget* >::iterator i = widgets.begin();
  while (i != widgets.end()) {
    for (int j = 0; j < children.count(); j++) {
      QDomNode child = children.at(j);
      QDomElement elem = child.toElement();
      if(elem.attribute("name") == (*i)->getName()) {
        printf("Set\n");
        (*i)->setValue(elem.attribute("value"));
      }
    }
    i++;
  }
  */

  if(elem.hasAttribute("width")) {
    setMinimumWidth(elem.attribute("width").toInt());
  }

  if(elem.hasAttribute("height")) {
    setMinimumHeight(elem.attribute("height").toInt());
  }

  layout->setContentsMargins(0,0,0,0);
}

void MultiList::changed()
{
}

QString MultiList::getValue()
{
  QString values;

  QList<QListWidgetItem *> items = list->findItems("*", Qt::MatchWildcard);
  QList<QListWidgetItem *>::iterator i = items.begin();
  while(i != items.end()) {
    QListWidgetItem *item = *i;
    if(values != "") values += "\n";
    values += item->text();
    i++;
  }

  return values;
}

void MultiList::setValue(QString values)
{
  QString value;

  list->clear();

  int idx = 0;
  do {
    value = values.section('\n', idx, idx);
    if(value != "") list->addItem(value);
    idx++;
  } while(value != "");
}

void MultiList::remove()
{
  list->takeItem(list->currentRow());
}

void MultiList::add()
{
  QVector< Widget * >::iterator i = widgets.begin();
  while(i != widgets.end()) {
    if(!(*i)->isValid()) return;
    i++;
  }
  list->addItem(format_parser(format, widgets));
}

void MultiList::enable()
{
  setEnabled(true);
}

void MultiList::disable()
{
  setEnabled(false);
}