/*
 * Project: MoleCuilder
 * Description: creates and alters molecular systems
 * Copyright (C)  2010-2012 University of Bonn. All rights reserved.
 * 
 *
 *   This file is part of MoleCuilder.
 *
 *    MoleCuilder 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.
 *
 *    MoleCuilder 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 MoleCuilder.  If not, see .
 */
/*
 * QtMoleculeList.cpp
 *
 *  Created on: Jan 21, 2010
 *      Author: crueger
 */
// include config.h
#ifdef HAVE_CONFIG_H
#include 
#endif
#include "Views/Qt4/QtMoleculeList.hpp"
#include 
#include 
#include "CodePatterns/MemDebug.hpp"
#include "Atom/atom.hpp"
#include "Formula.hpp"
#include "molecule.hpp"
#include "MoleculeListClass.hpp"
#include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp"
#include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp"
using namespace std;
// maybe this should go with the definition of molecules
// some attributes need to be easier to find for molecules
// these attributes are skipped so far
const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX;
const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/};
QtMoleculeList::QtMoleculeList(QWidget * _parent) :
  QTreeWidget (_parent),
  Observer("QtMoleculeList")
{
  setColumnCount(COLUMNCOUNT);
  setSelectionMode(QAbstractItemView::MultiSelection);
  QStringList header;
  for(int i=0; i &molecules = World::getInstance().getAllMolecules();
  clear();
  // list of (unique) formulas in the world
  std::vector formula;
  for (std::vector::const_iterator iter = molecules.begin();
      iter != molecules.end();
      iter++) {
    // find group if already in list
    QTreeWidgetItem *groupItem = NULL;
    for (unsigned int j=0;jgetFormula() == formula[j]){
        groupItem = topLevelItem(j);
        break;
      }
    // new molecule type -> create new group
    if (!groupItem){
      formula.push_back((*iter)->getFormula());
      groupItem = new QTreeWidgetItem(this);
      groupItem->setText(0, QString((*iter)->getName().c_str()));
      groupItem->setText(1, QString::number((*iter)->getAtomCount()));
      groupItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
      groupItem->setText(3, "0");
      groupItem->setData(0, Qt::UserRole, QVariant(-1));
    }
    // add molecule
    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
    molItem->setText(0, QString((*iter)->getName().c_str()));
    molItem->setText(1, QString::number((*iter)->getAtomCount()));
    molItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
    const int index = (*iter)->getId();
    molItem->setData(0, Qt::UserRole, QVariant(index));
    molItem->setSelected(World::getInstance().isSelected(*iter));
    // increase group occurrence
    int count = groupItem->text(3).toInt() + 1;
    groupItem->setText(3, QString::number(count));
  }
  dirty = false;
  clearing = false;
}
void QtMoleculeList::paintEvent(QPaintEvent * event)
{
  if (dirty)
    refill();
  QTreeWidget::paintEvent(event);
}
void QtMoleculeList::subjectKilled(Observable *publisher) {
}
void QtMoleculeList::moleculeChanged() {
  /*int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt();
  molecule *mol = molecules->ReturnIndex(idx);
  string cellValue = item(row,NAME)->text().toStdString();
  if(mol->getName() != cellValue && cellValue !="") {
    mol->setName(cellValue);
  }
  else if(cellValue==""){
    item(row,NAME)->setText(QString(mol->getName().c_str()));
  }*/
}
void QtMoleculeList::rowsSelected(const QItemSelection & selected, const QItemSelection & deselected){
  if (clearing)
    return;
  if (selecting)
    return;
  selecting = true;
  // Select all molecules which belong to newly selected rows.
  QModelIndex index;
  QModelIndexList items = selected.indexes();
  foreach (index, items)
    if (index.column() == 0){
      int mol_id = model()->data(index, Qt::UserRole).toInt();
      if (mol_id < 0)
        continue;
      //std::cout << "select molecule" << std::endl;
      MoleCuilder::SelectionMoleculeById(mol_id);
    }
  // Unselect all molecules which belong to newly unselected rows.
  items = deselected.indexes();
  foreach (index, items)
    if (index.column() == 0){
      int mol_id = model()->data(index, Qt::UserRole).toInt();
      if (mol_id < 0)
        continue;
      //std::cout << "unselect molecule" << std::endl;
      MoleCuilder::SelectionNotMoleculeById(mol_id);
    }
  selecting = false;
}