/**************************************************************************
 *   KT main GUI view implementation                                       *
 *   --------------------------------------------------------------------  *
 *   Copyright (C) 1999, Gary Meyer <gary@meyer.net>                       *
 *   --------------------------------------------------------------------  *
 *   This program 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.                                   *
 ***************************************************************************/

#include "ktview.h"


#include <config.h>

// #ifdef HAVE_SSTREAM
// #include <sstream>
// #else
// #include <strstream.h>
// #endif


#include <tqfileinfo.h>

#include "cthost.h"
#include "ctcron.h"
#include "ctvariable.h"
#include "cttask.h"



#include "ktlistcron.h"
//#include "ktlistvars.h"
//#include "ktlistvar.h"
#include "ktlisttasks.h"
#include "ktlisttask.h"
//#include "ktapp.h"
//#include "ktvariable.h"
//#include "kttask.h"
//#include "ktprint.h"

#include "schedule.h"

#include <stdlib.h>      // system

KTView::KTView(TQWidget *parent, const char* name) :
  TQWidget(parent, name),
  listView(0),
  currentCTCron(0),
  currentIsTask(true),
  currentCTTask(0),
  currentCTVariable(0),
  clipboardIsTask(true),
  clipboardCTTask(0),
  clipboardCTVariable(0)
{
  sched = (Schedule*)parentWidget()->parentWidget();
  //cthost = new CTHost();
  //const CTHost& cth(*cthost);

  setBackgroundMode(PaletteBase);
  refresh();
  listView->setSelected(listView->firstChild(), true);
  
//   connect(this, SIGNAL(enableModificationButtons(bool)), parent,
//     SLOT(slotEnableModificationButtons(bool)));
//     
//   connect(this, SIGNAL(enablePaste(bool)), parent,
//     SLOT(slotEnablePaste(bool)));
//     
//   connect(this, SIGNAL(enableRunNow(bool)), parent,
//     SLOT(slotEnableRunNow(bool)));
//   
//   connect(this, SIGNAL(enableEnabled(bool)), parent,
//     SLOT(slotEnableEnabled(bool)));
//   
//   emit(enableModificationButtons(false));
//   emit(enablePaste(clipboardCTVariable));
//   emit(enableRunNow(false));

  listView->setColumnWidthMode(1, TQListView::Manual);
  listView->hideColumn(1);
            
}

void KTView::refresh()
{
  TQListView* tmpListView(listView);

  listView = new TQListView(this);

  listView->setFrameStyle(TQListView::Panel | TQListView::Sunken);
  listView->setRootIsDecorated(true);
  listView->setAllColumnsShowFocus(true);
  listView->setShowSortIndicator(true);

  const CTHost& cth(sched->getCTHost());
  //const CTHost& cth(*cthost);

/*  if (cth.root())
    listView->addColumn(i18n("Users/Tasks/Variables"));
  else*/
  listView->addColumn(i18n("Scan Description"));

  listView->addColumn(i18n("Value"));
  listView->addColumn(i18n("When to Scan"));

  //for (int item = 0; item <=2; item++)
    //listView->setColumnWidthMode(item, TQListView::Maximum);

  // for each user
  for (CTCronIterator i = const_cast<CTHost&>(cth).cron.begin();
    i != cth.cron.end(); i++)
  {
    CTCron* ctcron((CTCron*)*i);

//     KTListVars* variables(0);
    KTListTasks* tasks(0);

/*    if (cth.root())
    {
      KTListCron* user = new KTListCron(listView, ctcron);
      if (currentCTCron == ctcron)
      {
        listView->setSelected(user, true);
      }

      variables = new KTListVars(user, ctcron);
      tasks = new KTListTasks(user, ctcron);
    }
    else
    {
      variables = new KTListVars(listView, ctcron);*/
      tasks = new KTListTasks(listView, ctcron);
//     }

    if (currentIsTask)
    {
      listView->setSelected(tasks, true);
      slotSetCurrent(tasks);
    }
//     else
//     {
//       listView->setSelected(variables, true);
//       slotSetCurrent(variables);
//     }

/*    for (CTVariableIterator j = (CTVariableIterator)ctcron->variable.begin();
      j != ctcron->variable.end(); j++)
    {
      new KTListVar(variables, ctcron, (CTVariable*)*j);
    }
*/
    for (CTTaskIterator k = (CTTaskIterator)ctcron->task.begin();
      k != ctcron->task.end(); k++)
    {
      new KTListTask(tasks, ctcron, (CTTask*)*k);
    }
  }

  resizeEvent();

  connect(listView, SIGNAL(contextMenuRequested(TQListViewItem*, const TQPoint&, int)),
    SLOT(slotMenu(TQListViewItem*, const TQPoint&, int)));

  connect(listView, SIGNAL(selectionChanged(TQListViewItem*)),
    SLOT(slotSetCurrent(TQListViewItem*)));

  connect(listView, SIGNAL(doubleClicked(TQListViewItem*)),
    SLOT(slotEdit(TQListViewItem*)));

  connect(listView, SIGNAL(returnPressed(TQListViewItem*)),
    SLOT(slotEdit(TQListViewItem*)));


  // switch to the new view
  if (tmpListView)
  {
    tmpListView->hide();
    listView->show();
    listView->setFocus();
    delete tmpListView;
  }

  listView->setColumnWidthMode(1, TQListView::Manual);
  listView->hideColumn(1);

   TQListViewItemIterator it( listView);

   while ( it.current() ) {

	TQListViewItem* tItem = it.current();
	//kdDebug() << tItem->text(1) << endl;

	if ((tItem->text(1).contains("klamav")) || (tItem->text(1).contains("Klamav")) || (tItem->text(0).contains("Tasks")))
		tItem->setVisible(true);
	else
		tItem->setVisible(false);
	++it;
   }

}

// void KTView::print () const
// {
//   bool crontab, allUsers;
//   KTListItem *ktli, *user;
// 
//   const CTHost& cth(ktapp->getCTHost());
// 
//   KTPrint printer(cth.root());
// 
//   if (printer.start())
//   {
//     crontab = printer.crontab();
//     allUsers = printer.allUsers();
// 
//     printer.createColumns(3);
// 
//     int copies = printer.numCopies();
//     while (copies != 0)
//     {
//       if (allUsers || !cth.root())
//       {
//         ktli = (KTListItem*)listView->firstChild();
//       }
//       else
//       {
//         ktli = (KTListItem*)listView->currentItem();
//       }
// 
//       //Check that the correct item is selected, they must
//       //select the top level entry for all items to print
//       while (ktli->depth() != 0)
//         ktli = (KTListItem*)ktli->parent();
// 
//       user = ktli; //Used to store user's name
// 
//       if (allUsers)
//       {
//         while (ktli)
//         {
//           pageHeading(ktli, printer);
//           ktli->print(printer);
//           if (crontab)
//             pageFooter(ktli, printer);
//           ktli = (KTListItem*)ktli->nextSibling();
//           if (ktli)
//             printer.newPage();
//         }
//       }
//       else
//       {
//         //ktli goes out of range here hence the need for user
//         pageHeading(user, printer);
//         if (!cth.root())
//         {
//           while (ktli)
//           {
//             ktli->print(printer);
//             ktli = (KTListItem*)ktli->nextSibling();
//           }
//         }
//         else
//           ktli->print(printer);
// 
//         if (crontab)
//           pageFooter(user, printer);
// 
//       }
// 
//     copies--; //Keep a track of how many copies we have printed
//     if (copies != 0) printer.newPage();
//     }//End printing loop (for more than one copy)
// 
//     printer.finished(); //End the print
// 
//   }//End Printing if
// }

// void KTView :: pageHeading (KTListItem* user, KTPrint &printer) const
// {
//   TQFont stnd;
//   TQString logonInfo;
//   TQDateTime now (TQDateTime::currentDateTime());
//   char hostName[20];
// 
//   gethostname(hostName, 20);
//   // SSA : Fix Me user name, logon name and host name musst be
//   // SSA : not only in us-ascii ??
//   logonInfo = i18n("user on host", "%1 <%2> on %3")
//     .arg(TQString::fromLocal8Bit(user->getCTCron()->name.c_str()))
//     .arg(TQString::fromLocal8Bit(user->getCTCron()->login.c_str()))
//     .arg(TQString::fromLocal8Bit(hostName));
// 
//   stnd = printer.getFont();
//   printer.setFont(TQFont( TDEGlobalSettings::generalFont().family(), 14, TQFont::Bold ));
// 
//   printer.print (i18n("Scheduled Tasks"), 2, KTPrint::alignTextCenter, false);
//   printer.print (logonInfo, 2, KTPrint::alignTextCenter, false);
//   printer.print (TDEGlobal::locale()->formatDateTime(now), 2, KTPrint::alignTextCenter, false);
//   printer.setFont(stnd);
// 
//   printer.levelColumns(20);
// 
// }

// void KTView :: pageFooter (KTListItem* user, KTPrint &printer) const
// {
// #ifdef HAVE_SSTREAM
//   ostringstream oss;
// #else
//   char buffer[4096];
//   ostrstream oss(buffer, sizeof(buffer));
// #endif
// 
//   oss<<*(user->getCTCron())<<ends;
// 
//   if (oss) {
//     string crontab(oss.str());
//     printer.print(crontab.c_str(), 1, KTPrint::alignTextLeft, false);
//   }
// }

KTView::~KTView()
{
  delete listView;
}

void KTView::resizeEvent (TQResizeEvent*)
{
  listView->setFixedWidth(width());
  listView->setFixedHeight(height());
  repaint();
}

// void KTView::copy()
// {
//   if (clipboardCTTask)
//   {
//     delete clipboardCTTask;
//     clipboardCTTask = 0;
//   }
// 
//   if (clipboardCTVariable)
//   {
//     delete clipboardCTVariable;
//     clipboardCTVariable = 0;
//   }
// 
//   if (currentIsTask)
//   {
//     clipboardCTTask = new CTTask(*currentCTTask);
//   }
//   else
//   {
//     clipboardCTVariable = new CTVariable(*currentCTVariable);
//   }
//   clipboardIsTask = currentIsTask;
// }

/*void KTView::paste()
{
  KTListItem* qlvi = (KTListItem*)listView->currentItem();

  if (currentIsTask)
  {
    CTTask* temptask = new CTTask(*clipboardCTTask);
    currentCTCron->task.push_back(temptask);
    KTListTask* ktlt = new KTListTask(qlvi, currentCTCron, temptask);
    listView->setSelected(ktlt, true);
  }
  else
  {
    CTVariable* tempvar = new CTVariable(*clipboardCTVariable);
    currentCTCron->variable.push_back(tempvar);
    KTListVar* ktlv = new KTListVar(qlvi, currentCTCron, tempvar);
    listView->setSelected(ktlv, true);
  }
}
*/
void KTView::create()
{
  KTListItem* ktli = (KTListItem*)listView->currentItem();
  if ((ktli->text(0) != KTListTasks::getDescription()) ) {
    ktli = (KTListItem*)ktli->parent();
  }
  TQ_CHECK_PTR(ktli);
  ktli->create();
  listView->triggerUpdate();
}

// void KTView::edit()
// {
//   KTListItem* ktli = (KTListItem*)listView->currentItem();
//   TQ_CHECK_PTR(ktli);
//   ktli->edit();
//   listView->triggerUpdate();
// }

void KTView::remove()
{
  if (currentIsTask)
  {
    if (currentCTTask)
    {
      for (CTTaskIterator i = (CTTaskIterator)
        (currentCTCron->task.begin());
        i != currentCTCron->task.end(); i++)
      {
        if (*i == currentCTTask)
        {
          currentCTCron->task.erase(i);
          delete currentCTTask;
          currentCTTask = 0;
          break;
        }
      }
    }
  }
  else
  {
    if (currentCTVariable)
    {
      for (CTVariableIterator j = (CTVariableIterator)
        (currentCTCron->variable.begin());
        j != currentCTCron->variable.end(); j++)
      {
        if (*j == currentCTVariable)
        {
          currentCTCron->variable.erase(j);
          delete currentCTVariable;
          currentCTVariable = 0;
          break;
        }
      }
    }
  }
  refresh();
}

TQString KTView::absolute() const
{
  TQString fullCommand = TQString::fromLocal8Bit(currentCTTask->command.c_str());
  TQString command(fullCommand);
  int pos(command.find(" "));
  if (pos > 0) command = command.left(pos);

  if (command.find("/") == 0)
   return fullCommand;

  TQString path = TQString::fromLocal8Bit(currentCTCron->path().c_str());
  int begin(0);
  int end(0);
  TQString prefix;
  TQString full;

  while ((end = path.find(":", begin)) > 0)
  {
    prefix = path.mid(begin, begin + end) + "/";
    full = prefix + command;
    if (TQFileInfo(full).isExecutable())
      return TQString(prefix + fullCommand);
    begin = end + 1;
  }
  prefix = path.mid(begin, begin + end) + "/";
  full = prefix + command;
  if (TQFileInfo(full).isExecutable())
    return TQString(prefix + fullCommand);
  return TQString("");
}

void KTView::run() const
{
  TQString command(absolute() + " &");
  system(TQFile::encodeName(command));
}

void KTView::enable(bool enable)
{
  TQListViewItem* qlvi = listView->currentItem();

  if (currentIsTask)
  {
    if (currentCTTask)
    {
      currentCTTask->enabled = enable;
      ((KTListTask*)(qlvi))->refresh();
    }
  }
/*  else
  {
    if (currentCTVariable)
    {
      currentCTVariable->enabled = enable;
      ((KTListVar*)(qlvi))->refresh();
    }
  }*/
}

void KTView::slotMenu(TQListViewItem* qlvi, const TQPoint& /*qp*/, int /*i*/)
{
  if (qlvi !=0 ) {
    listView->setSelected(qlvi, true);
    slotSetCurrent(qlvi);
    //ktapp->slotEdit(qp);
  }
}

void KTView::slotEdit(TQListViewItem* /*qlvi*/)
{
  //edit();
}

void KTView::slotSetCurrent (TQListViewItem* qlvi)
{
  TQListViewItem* parent = qlvi->parent();

/*  if (qlvi->text(0) == KTListVars::getDescription())
  {
    // variable label
    currentCTCron     = ((KTListCron*)qlvi)->getCTCron();
    currentCTVariable = 0;
    currentCTTask     = 0;
    currentIsTask     = false;
    emit(enableModificationButtons(false));
    emit(enablePaste(clipboardCTVariable));
    emit(enableRunNow(false));
    emit(enableEnabled(false));
    
  }
  else*/ if (qlvi->text(0) == KTListTasks::getDescription())
  {
    // task label
    currentCTCron     = ((KTListCron*)qlvi)->getCTCron();
    currentCTVariable = 0;
    currentCTTask     = 0;
    currentIsTask     = true;
    
    emit(enableModificationButtons(false));
    emit(enablePaste(clipboardCTTask));
    emit(enableRunNow(false));
    emit(enableEnabled(false));
    
  }
  else if (parent)
  {
/*    if (parent->text(0) == KTListVars::getDescription())
    {
      // variable
      currentCTCron     = ((KTListVar*)qlvi)->getCTCron();
      currentCTVariable = ((KTListVar*)qlvi)->getCTVariable();
      currentCTTask     = 0;
      currentIsTask     = false;
      
      emit(enableModificationButtons(true));
      emit(enableRunNow(false));
      emit(enableEnabled(currentCTTask->enabled));

    }
    else*/ if (parent->text(0) == KTListTasks::getDescription())
    {
      // task
      currentCTCron     = ((KTListTask*)qlvi)->getCTCron();
      currentCTVariable = 0;
      currentCTTask     = ((KTListTask*)qlvi)->getCTTask();
      currentIsTask     = true;

      emit(enableModificationButtons(true));
      emit(enableRunNow((currentCTTask->enabled) &&
              (!absolute().isEmpty())));
      emit(enableEnabled(currentCTTask->enabled));
              
    }
  }
  else
  {
    // user
    currentCTCron     = ((KTListCron*)qlvi)->getCTCron();
    currentCTVariable = 0;
    currentCTTask     = 0;
    currentIsTask     = true;
    
    emit(enableModificationButtons(true));
    emit(enablePaste(false));
    emit(enableRunNow(false));
    emit(enableEnabled(false));
    
  }
}

CTCron* KTView::getCTCron()
{
  return currentCTCron;
}

TQListViewItem* KTView::currentItem()
{
  //kdDebug() << listView->currentItem()->text(1) << endl;
  return listView->currentItem();
}

void KTView::hideCommand()
{
  listView->hideColumn(1);
}

#include "ktview.moc"