/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set et sw=2 ts=2: */
/***************************************************************************
 *            macro.cc
 *
 *  Tue Jun 30 11:49:46 CEST 2009
 *  Copyright 2009 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 "macro.h"

#include <QDomElement>
#include <QHBoxLayout>
#include <QApplication>
#include <QLabel>

#include "macrodrawer.h"
#include "macrowindow.h"

Macro::Macro(QDomNode &n)
{
  window = NULL;
  drawer = NULL;

  update(n);
}

void Macro::update(QDomNode &n)
{
  node = n.cloneNode(true);

  QDomElement xml_elem = node.toElement();

  if(xml_elem.tagName() != "macro" && xml_elem.tagName() != "header") return;
  //  if(xml_elem.hasAttribute("header")) return;

  name = xml_elem.attribute("name");

  iscompleted = xml_elem.attribute("completed", "false") == "true";
}

void Macro::init(QBoxLayout *layout, Macros &macros,
                 bool initialising, NetCom &netcom, QString templ)
{
  QDomElement xml_elem = node.toElement();

  if(xml_elem.tagName() != "macro" && xml_elem.tagName() != "header") return;

  isstatic = xml_elem.attribute("static", "false") == "true";
  iscompact = xml_elem.attribute("compact", "false") == "true";

  if(xml_elem.hasAttribute("requires")) {
    // Read and parse requirement list.
    requires = xml_elem.attribute("requires").split(QRegExp("\\W+"),
                                                    QString::SkipEmptyParts);
  }

  //  if(xml_elem.hasAttribute("header")) {
  if(xml_elem.tagName() == "header") {
    // Macro is a special headline macro.
    // Simply create a headline, and ignore the rest.
      
    // Only add header on initial contruction.
    if(initialising == true) {
      QLabel *header = new QLabel();
      //      header->setText(xml_elem.attribute("header"));
      header->setText(xml_elem.attribute("caption"));
      QFont headerfont = header->font();
      headerfont.setBold(true);
      headerfont.setPointSize(headerfont.pointSize() + 2);
      header->setFont(headerfont);
      layout->addWidget(header);
    }
    
    return;
  }
  
  //  if(macros.find(name) == macros.end()) {
  if(window == NULL && drawer == NULL) {
    window = new MacroWindow(netcom, node, templ, isstatic, iscompact);
    
    /*
    QWidget *edge = new QWidget();
    edge->setContentsMargins(1,1,1,1);
    edge->setAutoFillBackground(true);
    edge->setAttribute(Qt::WA_WindowPropagation, true);
    QHBoxLayout *edgelayout = new QHBoxLayout();
    edgelayout->setContentsMargins(0,0,0,0);
    edge->setLayout(edgelayout);
    layout->addWidget(edge);
    */

    drawer = new MacroDrawer(this, xml_elem.attribute("caption", name),
                             NULL/*edge*/);
    drawer->connect(drawer, SIGNAL(toggle()), window, SLOT(toggleMacro()));
    drawer->connect(window, SIGNAL(activationChanged(bool)), drawer,
                    SLOT(activationChange(bool)));
    //drawer->setAutoFillBackground(true);
    //drawer->setContentsMargins(1,1,1,1);
    window->setActive(false);
    //drawer->setPalette(QApplication::palette());
    //edge->layout()->addWidget(g);
    layout->addWidget(drawer);
    
    QHBoxLayout *l = new QHBoxLayout();
    l->setContentsMargins(10,0,10,0);
    drawer->setLayout(l);
    l->addWidget(window);
    {
      QFont f = window->font();
      f.setBold(false);
      f.setItalic(false);
      window->setFont(f);
    }
    
  } else {
    
    window->update(node);
    if(xml_elem.attribute("static", "false") == "false") {
      window->setCollapsed(true);
    }
  }

  QStringList::iterator rs = requires.begin();
  QStringList blocking;
  bool active = true;
  while(rs != requires.end()) {
    //    printf("Testing if %s is completed...", rs->toStdString().c_str());

    Macros::iterator ms = macros.begin();
    while(ms != macros.end()) {
      if(ms->name == *rs) {
        //  printf("Found it %d", ms->iscompleted);
        if(ms->iscompleted == false) blocking.append(ms->name);
        active = active && ms->iscompleted;
      }
      ms++;
    }

    //    printf("\n");
    rs++;
  }
  window->setActive(active);
  if(!active) drawer->setToolTip(QObject::tr("Depends on: ") + blocking.join(", "));
  else drawer->setToolTip("");
}