/***************************************************************************
                          kkeyleddtlcfg.cpp  -  description
                             -------------------
    begin                : Tue Aug 14 2001
    copyright            : (C) 2001 by Dieter Landolt
    email                : dieter.landolt@secs.ch
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 <kconfig.h>
#include <klocale.h>
#include <kfiledialog.h>
#include <qcheckbox.h>
#include <kcombobox.h>
#include <kstandarddirs.h>
#include <qfile.h>
#include <kapp.h>
#include <qmovie.h>
#include "kkeyleddtlcfg.h"
#include "ksoundcfg.h"
#include "dockwidget.h"


kkeyleddtlcfg::kkeyleddtlcfg(QWidget *parent, const char *name, bool modal, WFlags fl) : ledcfgdia(parent,name,modal,fl) 
{
    // Bugworkaround for QT designer and signal usage
    // ThemSupport->setEnabled(false);
    mainFrame->setEnabled(false);
    soundFrame->setEnabled(false);
    iconFrame->setEnabled(false);

     readConfig("Ledpictures");

     connect(ThemeSupport,SIGNAL(clicked()), this,SLOT(enableApply()));
     connect(PlaySounds,SIGNAL(clicked()), this,SLOT(enableApply()));
     connect(PaintPix,SIGNAL(clicked()), this,SLOT(enableApply()));

     connect(PlaySounds,SIGNAL(clicked()), this,SLOT(enableSave()));
     connect(PaintPix,SIGNAL(clicked()), this,SLOT(enableSave()));


     connect(numlockoff,SIGNAL(clicked()),  this,SLOT(numlockoff_click()));
     connect(numlockon,SIGNAL(clicked()),   this,SLOT(numlockon_click()));
     connect(capslockoff,SIGNAL(clicked()), this,SLOT(capslockoff_click()));
     connect(capslockon,SIGNAL(clicked()),  this,SLOT(capslockon_click()));
     connect(scrollockoff,SIGNAL(clicked()),this,SLOT(scrollockoff_click()));
     connect(scrollockon,SIGNAL(clicked()), this,SLOT(scrollockon_click()));
     
     connect(ApplyButton,SIGNAL(clicked()), this,SLOT(applyConfig()));
     connect(OkButton,SIGNAL(clicked()), this,SLOT(applyConfig()));
     
     // Clearing path's
     connect(clearnumlock,SIGNAL(clicked()), this, SLOT(clearnum()));
     connect(clearcapslock,SIGNAL(clicked()), this, SLOT(clearcaps()));
     connect(clearscrollock,SIGNAL(clicked()), this, SLOT(clearscroll()));
     
     // Setting Paths for dnd's 
     connect(numlockoff,SIGNAL(newPath(QString)),this, SLOT(setNumOffPath(QString)));
     connect(numlockon,SIGNAL(newPath(QString)),this, SLOT(setNumOnPath(QString)));
     connect(capslockoff,SIGNAL(newPath(QString)),this, SLOT(setCapsOffPath(QString)));
     connect(capslockon,SIGNAL(newPath(QString)),this, SLOT(setCapsOnPath(QString)));
     connect(scrollockoff,SIGNAL(newPath(QString)),this, SLOT(setScrollOffPath(QString)));
     connect(scrollockon,SIGNAL(newPath(QString)),this, SLOT(setScrollOnPath(QString)));

     // Setting Paths for sound Paths
     connect(numOffSound,SIGNAL(newPath(QString)), this, SLOT(setSoundPath(QString)));
     connect(numOnSound,SIGNAL(newPath(QString)), this, SLOT(setSoundPath(QString)));
     connect(scrollOffSound,SIGNAL(newPath(QString)), this, SLOT(setSoundPath(QString)));
     connect(scrollOnSound,SIGNAL(newPath(QString)), this, SLOT(setSoundPath(QString)));
     connect(capsOffSound,SIGNAL(newPath(QString)), this, SLOT(setSoundPath(QString)));
     connect(capsOnSound,SIGNAL(newPath(QString)), this, SLOT(setSoundPath(QString)));

     // Signals to handel for themes
     connect(ThemeBox,SIGNAL(textChanged(const QString&)),this,SLOT(setCurrentTheme()));
     connect(ThemeSave,SIGNAL(clicked()),this, SLOT(saveThisTheme()));
     connect(ThemeBox,SIGNAL(activated(int)),this,SLOT(activateTheme(int)));
     connect(ThemeDel,SIGNAL(clicked()),this, SLOT(delThisTheme()));
     connect(ThemeRename,SIGNAL(clicked()),this,SLOT(renThisTheme()));

}
kkeyleddtlcfg::~kkeyleddtlcfg(){
}

/** Apply Configuration */
void kkeyleddtlcfg::applyConfig(){
  
     ApplyButton->setEnabled(false);     
     KGlobal::config()->setGroup("Ledpictures");
     
     KGlobal::config()->writeEntry("UseTheme",ThemeSupport->isChecked(), true,false,false );

     if( ! ThemeSave->isEnabled() ) {
          KGlobal::config()->writeEntry("ActualTheme",ThemeBox->currentItem(),true,false,false);
     } else {          
          KGlobal::config()->writeEntry("ActualTheme",-1,true,false,false);
     }
     saveTheme("Ledpictures");     
     
     configChanged(); // Call signal to notify
}

/** Handler for all buttons */
void kkeyleddtlcfg::lockbutton_click(kDndButton *button){
     QString retPath;
     // QPixmap *fp = new QPixmap(20,20);
     retPath = KFileDialog::getOpenFileName(QString::null,
               i18n("*.png *.mng *.gif *.xpm|All supported image format\n*.png|Portable network graphics (PNG)\n*.xpm|Pixmap format (XPM)\n*.gif|Grafic image format (GIF)\n*.mng|Multiple-image network graphics format(MNG)"),
               this,i18n("Select the right graphic file"));
     if (retPath != button->path && retPath != QString::null ) {
          // qDebug(retPath);
          button->setMovie(retPath);
          // button->setPixmap(QPixmap(retPath)); old Function
          button->path = retPath;
          ApplyButton->setEnabled(true);
          ThemeSave->setEnabled(true);          
     }
}
/** clear the path of the numlock buttons */
void kkeyleddtlcfg::clearnum(){
     if ( numlockoff->path != QString::null || numlockon->path != QString::null ) {

          numlockoff->setMovie("");
          numlockoff->setPixmap( DockWidget::paintIcon(DockWidget::Off) );
          numlockon->setMovie("");
          numlockon->setPixmap( DockWidget::paintIcon(DockWidget::On) );
     
          numlockon->path = numlockoff->path = QString::null;
          ApplyButton->setEnabled(true);          
          ThemeSave->setEnabled(true);          
     }
}
/** clear the capslock button */
void kkeyleddtlcfg::clearcaps(){
     if ( capslockoff->path != QString::null || capslockon->path != QString::null ) {

          capslockoff->setMovie("");
          capslockoff->setPixmap( DockWidget::paintIcon(DockWidget::Off) );
          capslockon->setMovie("");
          capslockon->setPixmap( DockWidget::paintIcon(DockWidget::On) );
     
          capslockon->path = capslockoff->path = QString::null;
                    
          ApplyButton->setEnabled(true);          
          ThemeSave->setEnabled(true);          
     }
}
/** clear the scrollockbuttons */
void kkeyleddtlcfg::clearscroll(){
     if ( scrollockoff->path != QString::null || scrollockon->path != QString::null ) {

          scrollockoff->setMovie("");
          scrollockoff->setPixmap( DockWidget::paintIcon(DockWidget::Off) );
          scrollockon->setMovie("");
          scrollockon->setPixmap( DockWidget::paintIcon(DockWidget::On) );
     
          scrollockon->path = scrollockoff->path = QString::null;
          
          ApplyButton->setEnabled(true);          
          ThemeSave->setEnabled(true);          
     }
}
/** read a spezific configuration. for active or theme */
void kkeyleddtlcfg::readConfig(QString confName){
     // KSimpleConfig conf ("Kkeyledrc");
     
     KGlobal::config()->setGroup(confName);
     
     if ( confName == "Ledpictures" ) { // Ledpicures hold's the activ configuration
          ThemeSupport->setChecked(KGlobal::config()->readBoolEntry("UseThemes",true ));
     }

      /***/

     loadTheme(confName);
     
     ThemeBox->insertStringList(KGlobal::config()->readListEntry("Themes"));
     // If locale is not possible read independend entry
     if(ThemeBox->count() == 0) {                              
          ThemeDel->setEnabled(false);
     }    
     
     ThemeBox->setCurrentItem(KGlobal::config()->readNumEntry("ActualTheme",-1));
}
/** Loads a them to activate */
void kkeyleddtlcfg::loadTheme(QString theme,bool display){

     KGlobal::config()->setGroup(theme);

     PaintPix->setChecked( KGlobal::config()->readBoolEntry("UsePictures",false ));
     PlaySounds->setChecked( KGlobal::config()->readBoolEntry("UseSounds",false ));


     numlockoff->path    = locate("data",KGlobal::config()->readPathEntry("numoff_path"));
     numlockon->path     = locate("data",KGlobal::config()->readPathEntry("numon_path"));
     capslockoff->path   = locate("data",KGlobal::config()->readPathEntry("capsoff_path"));
     capslockon->path    = locate("data",KGlobal::config()->readPathEntry("capson_path"));
     scrollockoff->path  = locate("data",KGlobal::config()->readPathEntry("scrolloff_path"));
     scrollockon->path   = locate("data",KGlobal::config()->readPathEntry("scrollon_path"));

     numOffSound->setText(locate("data",KGlobal::config()->readPathEntry("numoffsound_path")));
     numOnSound->setText(locate("data",KGlobal::config()->readPathEntry("numonsound_path")));
     capsOffSound->setText(locate("data",KGlobal::config()->readPathEntry("capsoffsound_path")));
     capsOnSound->setText(locate("data",KGlobal::config()->readPathEntry("capsonsound_path")));
     scrollOffSound->setText(locate("data",KGlobal::config()->readPathEntry("scrolloffsound_path")));
     scrollOnSound->setText(locate("data",KGlobal::config()->readPathEntry("scrollonsound_path")));

     if ( display ) {
     
          if (numlockoff->path != QString::null && QFile::exists(numlockoff->path) ) {
               // numlockoff->setPixmap(QPixmap(numlockoff->path));
               numlockoff->setMovie(numlockoff->path);
          } else {
               numlockoff->setMovie("");
               numlockoff->setPixmap( DockWidget::paintIcon(DockWidget::Off) );
               numlockoff->path = QString::null;
          }    
          if (numlockon->path != QString::null && QFile::exists(numlockon->path) ) {
               // numlockon->setPixmap(QPixmap(numlockon->path));
               numlockon->setMovie(numlockon->path);
          } else {
               numlockon->setMovie("");
               numlockon->setPixmap( DockWidget::paintIcon(DockWidget::On) );
               numlockon->path = QString::null;
          }
          if (capslockoff->path != QString::null && QFile::exists(capslockoff->path) ) {
               // capslockoff->setPixmap(QPixmap(capslockoff->path));
               capslockoff->setMovie(capslockoff->path);
          } else {
               capslockoff->setMovie("");
               capslockoff->setPixmap( DockWidget::paintIcon(DockWidget::Off) );
               capslockoff->path = QString::null;
          }
          if (capslockon->path != QString::null && QFile::exists(capslockon->path) ) {
               // capslockon->setPixmap(QPixmap(capslockon->path));
               capslockon->setMovie(capslockon->path);
          } else {
               capslockon->setMovie("");
               capslockon->setPixmap( DockWidget::paintIcon(DockWidget::On) );
               capslockon->path = QString::null;
          }
          if (scrollockoff->path != QString::null && QFile::exists(scrollockoff->path) ) {
               // scrollockoff->setPixmap(QPixmap(scrollockoff->path));
               scrollockoff->setMovie(scrollockoff->path);
          } else {
               scrollockoff->setMovie("");
               scrollockoff->setPixmap( DockWidget::paintIcon(DockWidget::Off) );
               scrollockoff->path = QString::null;
          }
          if (scrollockon->path != QString::null && QFile::exists(scrollockon->path) ) {
               // scrollockon->setPixmap(QPixmap(scrollockon->path));
               scrollockon->setMovie(scrollockon->path);
          } else {
               scrollockon->setMovie("");
               scrollockon->setPixmap( DockWidget::paintIcon(DockWidget::On) );
               scrollockon->path = QString::null;
          }
          ThemeSave->setEnabled(false);
          ThemeRename->setEnabled(false);
     }
}
/** Function witch saves a spezific theme */
void kkeyleddtlcfg::saveTheme(QString theme){
     // KSimpleConfig conf ("Kkeyledrc");
     KGlobal::config()->setGroup(theme);
     
     KGlobal::config()->writeEntry("UsePictures", PaintPix->isChecked(), true,false,false);
     KGlobal::config()->writePathEntry("scrolloff_path",KGlobal::dirs()->relativeLocation("data",scrollockoff->path), true,false,false);
     KGlobal::config()->writePathEntry("scrollon_path", KGlobal::dirs()->relativeLocation("data",scrollockon->path), true,false,false);
     KGlobal::config()->writePathEntry("numoff_path",   KGlobal::dirs()->relativeLocation("data",numlockoff->path), true,false,false);
     KGlobal::config()->writePathEntry("numon_path",    KGlobal::dirs()->relativeLocation("data",numlockon->path), true,false,false);
     KGlobal::config()->writePathEntry("capsoff_path",  KGlobal::dirs()->relativeLocation("data",capslockoff->path), true,false,false);
     KGlobal::config()->writePathEntry("capson_path",   KGlobal::dirs()->relativeLocation("data",capslockon->path), true,false,false);

     // Save the Sound Part of the thme +*+
     KGlobal::config()->writeEntry("UseSounds", PlaySounds->isChecked(), true,false,false);
     KGlobal::config()->writePathEntry("numoffsound_path",   KGlobal::dirs()->relativeLocation("data",numOffSound->text()),    true,false,false);
     KGlobal::config()->writePathEntry("numonsound_path",    KGlobal::dirs()->relativeLocation("data",numOnSound->text()),     true,false,false);
     KGlobal::config()->writePathEntry("capsoffsound_path",  KGlobal::dirs()->relativeLocation("data",capsOffSound->text()),   true,false,false);
     KGlobal::config()->writePathEntry("capsonsound_path",   KGlobal::dirs()->relativeLocation("data",capsOnSound->text()),    true,false,false);
     KGlobal::config()->writePathEntry("scrolloffsound_path",KGlobal::dirs()->relativeLocation("data",scrollOffSound->text()), true,false,false);
     KGlobal::config()->writePathEntry("scrollonsound_path", KGlobal::dirs()->relativeLocation("data",scrollOnSound->text()),  true,false,false);

}
/** set the them from the combobox */
void kkeyleddtlcfg::setCurrentTheme(){
     ThemeSave->setEnabled(true);
     ThemeRename->setEnabled(true);
     ThemeDel->setEnabled(true);
}
/** save the them under the Name and into the list of the box */
void kkeyleddtlcfg::saveThisTheme(){
     QString themeName;
     QStringList allEntrys;
     bool inList = false;
     
     for(int i=0;i < ThemeBox->count();i++) {
          allEntrys.append(ThemeBox->text(i));
          if ( ThemeBox->text(i) == ThemeBox->currentText() ) {
               inList = true;
          }
     }          

     int tIndex = 0;
     themeName = ThemeBox->currentText();
     tIndex = ThemeBox->currentItem();
     if( ! inList ) {
          ThemeBox->insertItem(themeName);
          tIndex = ThemeBox->count() -1;
          allEntrys.append(themeName);
     } 
     saveTheme("Theme" + QString::number( tIndex ));
     ThemeSave->setEnabled(false);
     ThemeDel->setEnabled(true);
     
     // KSimpleConfig conf ("Kkeyledrc");
     KGlobal::config()->setGroup("Ledpictures");
     
     // conf->writeEntry("Themes",allEntrys,',',true,false,true); // Language specific
     KGlobal::config()->writeEntry("Themes",allEntrys,',',true,false,true); // Language unspecific if a switch is done
}
/** For renaming a displayed Theme */
void kkeyleddtlcfg::renThisTheme(){
     QStringList allEntrys;
     ThemeBox->changeItem(ThemeBox->currentText(),ThemeBox->currentItem());
     
     for(int i=0;i < ThemeBox->count();i++) {
          allEntrys.append(ThemeBox->text(i));
     }          
     ThemeRename->setEnabled(false);
     
     KGlobal::config()->setGroup("Ledpictures");
     KGlobal::config()->writeEntry("Themes",allEntrys,',',true,false,true); // Language unspecific if a switch is done
}
/** Called to activate the them selected in the Combobox */
void kkeyleddtlcfg::activateTheme(int themeNr){
     loadTheme("Theme" + QString::number( themeNr ));
     ApplyButton->setEnabled(true);
}
/** Notfy's that the displayed Theme should be deleted */
void kkeyleddtlcfg::delThisTheme(){
     delTheme(ThemeBox->currentText());
     activateTheme(ThemeBox->currentItem());
     saveThisTheme();
}
/** delete a theme width this name (theme) i must be esisting in the combobox */
void kkeyleddtlcfg::delTheme(QString theme){
     // QString themeName;
     QStringList allEntrys;
     bool inList = false;
     int posList =-1;
     
     for(int i=0;i < ThemeBox->count();i++) {
          // allEntrys.append(ThemeBox->text(i));
          if ( ThemeBox->text(i) == theme ) {
               inList = true;
               posList = i;
          }
     }
     for ( int i=posList; i<ThemeBox->count();i++) {
          
          // qDebug("move theme from " + QString::number(i + 1) + " to " + QString::number(i) + "\n");
          loadTheme("Theme" + QString::number(i + 1) );
          saveTheme("Theme" + QString::number(i) );
     }
     
     ThemeBox->removeItem(posList);
}
