text: /* This file is part of the KDE project
     Copyright 2007 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
     Copyright 2002-2003 Norbert Andres <nandres@web.de>
     Copyright 2002 Ariya Hidayat <ariya@kde.org>
     Copyright 2002 John Dailey <dailey@vt.edu>
     Copyright 2001-2002 Philipp Mueller <philipp.mueller@gmx.de>
     Copyright 2000-2002 Laurent Montel <montel@kde.org>
     Copyright 2000 Werner Trobin <trobin@kde.org>
     Copyright 1998-2000 Torben Weis <weis@kde.org>
  
     This library 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 library 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 library; see the file COPYING.LIB.  If not, write to
     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     Boston, MA 02110-1301, USA.
  */
  
  // Local
  #include "AutoFormatDialog.h"
  
  #include <QFile>
  #include <QLabel>
  #include <QPixmap>
  #include <QVBoxLayout>
  
  #include <kcombobox.h>
  #include <kglobal.h>
  #include <kconfig.h>
  #include <kmessagebox.h>
  
  #include <KoResourcePaths.h>
  
  #include <KoXmlReader.h>
  
  #include "Cell.h"
  #include "CellStorage.h"
  #include "Localization.h"
  #include "ui/Selection.h"
  #include "Sheet.h"
  #include "Style.h"
  #include "StyleManager.h"
  
  #include "commands/AutoFormatCommand.h"
  
  using namespace Calligra::Sheets;
  
  struct Entry {
      QString xml;
      QString image;
      QString config;
      QString name;
  };
  
  class AutoFormatDialog::Private
  {
  public:
      Selection* selection;
      KComboBox* combo;
      QLabel* label;
      QList<Entry> entries;
      QList<Style> styles;
  
  public:
      bool parseXML(const KoXmlDocument& doc);
  };
  
  AutoFormatDialog::AutoFormatDialog(QWidget* parent, Selection* selection)
          : KoDialog(parent)
          , d(new Private())
  {
      setCaption(i18n("Sheet Style"));
      setObjectName(QLatin1String("AutoAutoFormatDialog"));
      setModal(true);
      setButtons(Ok | Cancel);
  
      d->selection = selection;
      QWidget *page = mainWidget();
  
      QVBoxLayout *vbox = new QVBoxLayout(page);
  
      QLabel *toplabel = new QLabel(i18n("Select the sheet style to apply:"), page);
      d->combo = new KComboBox(page);
      d->label = new QLabel(page);
  
      vbox->addWidget(toplabel);
      vbox->addWidget(d->combo);
      vbox->addWidget(d->label, 1);
  
      const QStringList lst = KoResourcePaths::findAllResources("sheet-styles", "*.ksts", KoResourcePaths::Recursive);
  
      int index = 0;
      QStringList::ConstIterator it = lst.begin();
      for (; it != lst.end(); ++it) {
          KConfig config(*it, KConfig::SimpleConfig);
          const KConfigGroup sheetStyleGroup = config.group("Sheet-Style");
  
          Entry e;
          e.config = *it;
          e.xml = sheetStyleGroup.readEntry("XML");
          e.image = sheetStyleGroup.readEntry("Image");
          e.name = sheetStyleGroup.readEntry("Name");
  
          d->entries.append(e);
  
          d->combo->insertItem(index++, e.name);
      }
  
      slotActivated(0);
  
      connect(this, SIGNAL(okClicked()), this, SLOT(slotOk()));
      connect(d->combo, SIGNAL(activated(int)), this, SLOT(slotActivated(int)));
  }
  
  AutoFormatDialog::~AutoFormatDialog()
  {
      delete d;
  }
  
  void AutoFormatDialog::slotActivated(int index)
  {
      enableButtonOk(true);
  
      QString image = KoResourcePaths::findResource("sheet-styles", d->entries[index].image);
      if (image.isEmpty()) {
          KMessageBox::error(this, i18n("Could not find image %1.", d->entries[index].image));
          enableButtonOk(false);
          return;
      }
  
      QPixmap pixmap(image);
      if (pixmap.isNull()) {
          KMessageBox::error(this, i18n("Could not load image %1.", image));
          enableButtonOk(false);
          return;
      }
      d->label->setPixmap(pixmap);
  }
  
  void AutoFormatDialog::slotOk()
  {
      QString xml = KoResourcePaths::findResource("sheet-styles", d->entries[d->combo->currentIndex()].xml);
      if (xml.isEmpty()) {
          KMessageBox::error(this, i18n("Could not find sheet-style XML file '%1'.", d->entries[d->combo->currentIndex()].xml));
          return;
      }
  
      QFile file(xml);
      file.open(QIODevice::ReadOnly);
      KoXmlDocument doc;
      doc.setContent(&file);
      file.close();
  
      if (!d->parseXML(doc)) {
          KMessageBox::error(this, i18n("Parsing error in sheet-style XML file %1.", d->entries[d->combo->currentIndex()].xml));
          return;
      }
  
      //
      // Set colors, borders etc.
      //
      AutoFormatCommand* command = new AutoFormatCommand();
      command->setSheet(d->selection->activeSheet());
      command->setStyles(d->styles);
      command->add(*d->selection);
      if (!command->execute(d->selection->canvas()))
          delete command;
  
      accept();
  }
  
  bool AutoFormatDialog::Private::parseXML(const KoXmlDocument& doc)
  {
      styles.clear();
      for (int i = 0; i < 16; ++i)
          styles.append(Style());
  
      KoXmlElement e = doc.documentElement().firstChild().toElement();
      for (; !e.isNull(); e = e.nextSibling().toElement()) {
          if (e.tagName() == "cell") {
              Style style;
              KoXmlElement tmpElement(e.namedItem("format").toElement());
              if (!style.loadXML(tmpElement))
                  return false;
  
              int row = e.attribute("row").toInt();
              int column = e.attribute("column").toInt();
              int i = (row - 1) * 4 + (column - 1);
              if (i < 0 || i >= 16)
                  return false;
  
              styles[i] = style;
          }
      }
      return true;
  }
  