/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
 *            mainwindow.cc
 *
 *  Wed Sep 17 09:41:09 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 "mainwindow.h"

#include <QApplication>
#include <QDomDocument>
#include <QDomNodeList>
#include <QDomNode>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QScrollArea>
#include <QSettings>
#include <QStatusBar>

#include "macrodrawer.h"

MainWindow::MainWindow(QString cpr, QString course, QString host, quint16 port, QString user)
  : QMainWindow(0, Qt::WindowContextHelpButtonHint),
    netcom(host, port, user, cpr)
{
  setWindowTitle("Pracro - " + cpr);

  QStatusBar *status = statusBar();
  status->addPermanentWidget(new QLabel("Pracro v.1.0.0 - test2"));

  QScrollArea *s = new QScrollArea();
  setCentralWidget(s);
  w = new QWidget();
  s->setWidget(w);
  s->setWidgetResizable(true);

  w->setLayout(new QVBoxLayout());
  this->course = course;

  init();

  status->showMessage("Makroen blev succesfuldt indl�st.");
}

MainWindow::~MainWindow()
{
}

void MainWindow::closeEvent(QCloseEvent *)
{
  QSettings settings("Aasimon.org", "Pracro");

  settings.beginGroup("MainWindow");
  settings.setValue("size", size());
  settings.setValue("pos", pos());
  settings.endGroup();
}

void MainWindow::init()
{
  QSettings settings("Aasimon.org", "Pracro");

  settings.beginGroup("MainWindow");
  resize(settings.value("size", QSize(700, 800)).toSize());
  move(settings.value("pos", QPoint(0, 0)).toPoint());
  settings.endGroup();

  initialising = true;
  update();
  initialising = false;
}

void MainWindow::update()
{
  QDomDocument xml_doc = netcom.send(course);

  QDomNodeList courses = xml_doc.documentElement().childNodes();
  QDomNode coursenode = courses.at(0); // There can be only one! (Swush, flomp)
  QDomNodeList macronodes = coursenode.childNodes();
  for(int j = 0; j < macronodes.count(); j++) {
    QDomNode macronode = macronodes.at(j);

    QDomElement xml_elem = macronode.toElement();

    if(xml_elem.tagName() == "macro") {

      if(xml_elem.hasAttribute("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"));
          QFont headerfont = header->font();
          headerfont.setBold(true);
          headerfont.setPointSize(headerfont.pointSize() + 2);
          header->setFont(headerfont);
          w->layout()->addWidget(header);
        }

        continue;
      }

      QString macroname;
      if(xml_elem.hasAttribute("name")) macroname = xml_elem.attribute("name");

      if(macros.find(macroname) == macros.end()) {
        bool isstatic = false;
        bool iscompact = false;
        if(xml_elem.attribute("static", "false") == "true") isstatic = true;
        if(xml_elem.attribute("compact", "false") == "true") iscompact = true;
        macros[macroname] = new MacroWindow(&netcom, macronode, course, !isstatic, iscompact);
        macros[macroname]->isstatic = isstatic;

        MacroDrawer *g = new MacroDrawer(macros[macroname], xml_elem.attribute("caption", macroname));
        ((QBoxLayout*)w->layout())->addWidget(g);
        
        QHBoxLayout *l = new QHBoxLayout();
        l->setContentsMargins(10,0,10,0);
        g->setLayout(l);
        l->addWidget(macros[macroname]);
        connect(macros[macroname], SIGNAL(updateOnCommit()), this, SLOT(update()));
        {
          QFont f = macros[macroname]->font();
          f.setBold(false);
          f.setItalic(false);
          macros[macroname]->setFont(f);
        }

      } else {

        macros[macroname]->update(macronode);
        if(xml_elem.attribute("static", "false") == "false") {
          macros[macroname]->setCollapsed(true);
        }

      }
    }
  }

  // Make sure that all macros will collapse when a new one is expanded.
  QMap< QString, MacroWindow* >::iterator i = macros.begin();
  while(i != macros.end()) {
    MacroWindow *m1 = i.value();

    QMap< QString, MacroWindow* >::iterator j = macros.begin();
    while(j != macros.end()) {
      MacroWindow *m2 = j.value();

      if(m1 != m2 && m2->isstatic == false) {
        // Remove old connection (if any), to avoid multiple connections.
        disconnect(m1, SIGNAL(expanding()), m2, SLOT(collapseWrapper()));

        connect(m1, SIGNAL(expanding()), m2, SLOT(collapseWrapper()));
      }

      j++;
    }

    i++;
  }
}