/***************************************************************************
 *   Copyright (C) 2004 by Thomas Lübking                                  *
 *   thomas@home                                                           *
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <tqdesktopwidget.h>
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <tqcombobox.h>
#include <tqcheckbox.h>
#include <tqdir.h>
#include <tqfile.h>
#include <tqfileinfo.h>
#include <tqgroupbox.h>
#include <tdefiledialog.h>
#include <tqpainter.h>
//#include <tqpalette.h>
// #include <tqsettings.h>
#include <tqslider.h>
#include <tqspinbox.h>
#include <tqstringlist.h>
#include <tqlabel.h>
#include <tqlineedit.h>
#include <tqpixmap.h>
#include <tdelistview.h>
#include <tqtabwidget.h>
#include <tqtimer.h>
#include <dcopclient.h>
#include <tdeapplication.h>
#include <kcolorbutton.h>
#include <tdeconfig.h>
#include <kimageeffect.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <tdeglobal.h>
#include <tdeglobalsettings.h>
#include <kprocess.h>
#include <tdeparts/genericfactory.h>
#include <kstandarddirs.h>

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#include <fixx11h.h>

#include "tdestyle_baghira_config.h"
#include "pixmaps.h"
#include "colordialog.h"
#include "colorpicker.h"

//#define VERSION "0.7"

#ifndef TDE_VERSION_STRING
#define TDE_VERSION_STRING "error"
#endif
#ifndef TQT_BUILD_KEY
#define TQT_BUILD_KEY "error error error error"
#endif

#define CLAMP(x,l,u) x < l ? l :\
		     x > u ? u :\
		     x

#define SATURATION_COLOR(R,G,B) \
    grey = (299 * R + 587 * G + 114 * B) / 1000; \
    delta = 255 - grey; \
    grey = (grey *(10 - 5)) / 10; \
    iGrey = 255 - grey;\
    destR = (iGrey * (srcR - delta) + grey * R) / 255; \
    destG = (iGrey * (srcG - delta) + grey * G) / 255; \
    destB = (iGrey * (srcB - delta) + grey * B) / 255;

#define SATURATION_COLOR2(S,R,G,B) \
   int max = (int)(255+0.65*(100-S)); \
   destR = CLAMP((srcR + R - 128), 0, max); \
   destG = CLAMP((srcG + G - 128), 0, max); \
   destB = CLAMP((srcB + B - 128), 0, max); \
   destR = (S*destR + (100-S)*R)/100; \
   destG = (S*destG + (100-S)*G)/100; \
   destB = (S*destB + (100-S)*B)/100;

#define COLOR_SPACE(R,G,B) \
    if ( R < 0 ) R = 0; else if ( R > 255 ) R = 255; \
    if ( G < 0 ) G = 0; else if ( G > 255 ) G = 255; \
    if ( B < 0 ) B = 0; else if ( B > 255 ) B = 255;


void tdestyle_baghira_config::openHtml1()
{
   TQStringList args;
   args << "exec" << "http://baghira.sf.net/";
   kapp->tdeinitExec("kfmclient", args);
}

void tdestyle_baghira_config::openHtml2()
{
   TQStringList args;
   args << "exec" << "http://www.sf.net/projects/baghira/files/";
   kapp->tdeinitExec("kfmclient", args);
}

void tdestyle_baghira_config::startBab()
{
   kapp->tdeinitExec("bab");
}

void tdestyle_baghira_config::startKRuler()
{
   kapp->tdeinitExec("kruler");
}

TQImage* tdestyle_baghira_config::tintButton(TQImage &src, TQColor c)
{
    TQImage *dest = new TQImage( src.width(), src.height(), 32, 0 );
    dest->setAlphaBuffer( true );
    unsigned int *data = ( unsigned int * ) src.bits();
    unsigned int *destData = ( unsigned int* ) dest->bits();
    int total = src.width() * src.height();
    int red, green, blue;
    int destR, destG, destB, alpha;
    int srcR = c.red();
    int srcG = c.green();
    int srcB = c.blue();
    int hue, s, v;
    c.getHsv( &hue, &s, &v );
    int sq = CLAMP((int)((45.0/128.0)*s+55),0,100);
    // float srcPercent, destPercent;
    for ( int current = 0 ; current < total ; ++current ) {
	alpha = tqAlpha( data[ current ] );
	blue = tqBlue( data[ current ] );
	red = tqRed( data[ current ] );
	green = tqGreen( data[ current ] );
	SATURATION_COLOR2(sq, red, green, blue);
	// force back to valid colorspace !
	COLOR_SPACE(destR, destG, destB);
	destData[ current ] = tqRgba( destR, destG, destB, alpha );
    }
    return ( dest );
}

TQImage* tdestyle_baghira_config::tintBrush( TQImage &img, TQColor c)
{
    TQImage *dest = new TQImage( img.width(), img.height(), 32, 0 );
    unsigned int *data = ( unsigned int * ) img.bits();
    unsigned int *destData = ( unsigned int* ) dest->bits();
    int total = img.width() * img.height();
    int current;
    int delta;
    int red, green, blue, grey, iGrey;
    int destR, destG, destB, alpha;

    int srcR = c.red();
    int srcG = c.green();
    int srcB = c.blue();


    // float srcPercent, destPercent;
    for ( current = 0 ; current < total ; ++current ) {
	alpha = tqAlpha( data[ current ] );
	blue = tqBlue( data[ current ] );
	red = tqRed( data[ current ] );
	green = tqGreen( data[ current ] );
	SATURATION_COLOR(red, green, blue);
	// force back to valid colorspace !
	COLOR_SPACE(destR, destG, destB);
	destData[ current ] = tqRgba( destR, destG, destB, alpha );
    }
    return ( dest );
}

void tdestyle_baghira_config::sliderButtonRedChanged(int value)
{
    sliderButtonRedValue = value;
    dialog_->valueButtonRed->setNum(value);
    dialog_->pixmapButtonPreview->setPixmap(*tintButton(baseImage, TQColor(sliderButtonRedValue, sliderButtonGreenValue, sliderButtonBlueValue)));
    dialog_->pixmapButtonPreview->repaint(false);
    configChanged();
}

void tdestyle_baghira_config::sliderButtonGreenChanged(int value)
{
    sliderButtonGreenValue = value;
    dialog_->valueButtonGreen->setNum(value);
    dialog_->pixmapButtonPreview->setPixmap(*tintButton(baseImage, TQColor(sliderButtonRedValue, sliderButtonGreenValue, sliderButtonBlueValue)));
    dialog_->pixmapButtonPreview->repaint(false);
    configChanged();
}

void tdestyle_baghira_config::sliderButtonBlueChanged(int value)
{
    sliderButtonBlueValue = value;
    dialog_->valueButtonBlue->setNum(value);
    dialog_->pixmapButtonPreview->setPixmap(*tintButton(baseImage, TQColor(sliderButtonRedValue, sliderButtonGreenValue, sliderButtonBlueValue)));
    dialog_->pixmapButtonPreview->repaint(false);
    configChanged();
}

void tdestyle_baghira_config::sliderBrushRedChanged(int value)
{
    sliderBrushRedValue = value;
    dialog_->pixmapBrushPreview->setPixmap(*tintBrush(baseImage2, TQColor(sliderBrushRedValue, sliderBrushGreenValue, sliderBrushBlueValue)));
    dialog_->pixmapBrushPreview->repaint(false);
    configChanged();
}

void tdestyle_baghira_config::sliderBrushGreenChanged(int value)
{
    sliderBrushGreenValue = value;
    dialog_->pixmapBrushPreview->setPixmap(*tintBrush(baseImage2, TQColor(sliderBrushRedValue, sliderBrushGreenValue, sliderBrushBlueValue)));
    dialog_->pixmapBrushPreview->repaint(false);
    configChanged();
}

void tdestyle_baghira_config::sliderBrushBlueChanged(int value)
{
    sliderBrushBlueValue = value;
    dialog_->pixmapBrushPreview->setPixmap(*tintBrush(baseImage2, TQColor(sliderBrushRedValue, sliderBrushGreenValue, sliderBrushBlueValue)));
    dialog_->pixmapBrushPreview->repaint(false);
    configChanged();
}

// void tdestyle_baghira_config::sliderBrushSaturationChanged(int value)
// {
// 	sliderBrushSaturationValue = value;
// 	dialog_->pixmapBrushPreview->setPixmap(*tintBrush(baseImage2, TQColor(sliderBrushRedValue, sliderBrushGreenValue, sliderBrushBlueValue), sliderBrushSaturationValue));
// 	dialog_->pixmapBrushPreview->repaint(false);
// 	emit changed(true);
// }

// button color preset table - internal only, AND DON'T CHANGE ONLY ONE!

enum ColorPreset {Aqua = 0, Graphite, GraphiteDark, Orange, Lime, Black, Smoke, Girlie, Smaragd, Emerald, Yellow, DeepBlueSea, Blood, Turquoise, Lilac, NUMBEROFCOLORS};

const char * presetColorName[NUMBEROFCOLORS] = {
    "Aqua", "Graphite", "Graphite (Dark)", "Orange", "Lime", "Black", "Smoke", "Girlie", "Smaragd", "Emerald", "Yellow", "Deep Blue Sea", "Blood", "Turquoise", "Lilac"
};

int presetColor[NUMBEROFCOLORS][3] = {{84,144,218},{130,170,190},{103,118,134},{200,130,30},{130,180,80},{0,0,0},{106,110,120},{255,130,200},{100,160,75},{255,100,90},{160,160,70},{50,100,200},{150,25,25},{60,170,190},{150,130,220}};

// --------------------------------

typedef KGenericFactory<tdestyle_baghira_config, TQWidget> tdestyle_baghira_configFactory;
K_EXPORT_COMPONENT_FACTORY( tdecm_tdestyle_baghira_config, tdestyle_baghira_configFactory("tdestyle_baghira_config"))

//extern TQImage uic_findImage(const TQString& name);
//extern void qInitImages_baghira();
//extern void qCleanupImages_baghira();

void tdestyle_baghira_config::updateCR()
{
   if (!about_->isShown())
   {
     timer->stop();
      return;
   }
   if (crCurrent <  2)
      crCurrent++;
   else
      crCurrent = 0;
   about_->crLabel->setText(crNotes[crCurrent]);
}

void tdestyle_baghira_config::showAbout()
{
   crCurrent = 0;
   about_->crLabel->setText(crNotes[0]);
   timer->start( 4000 );
   about_->exec();
}

tdestyle_baghira_config::tdestyle_baghira_config(TQWidget *parent, const char *name, const TQStringList&) : TQWidget(parent, name )//, myAboutData(0)
{
   loadDone = false;
   if (parent) parent->setCaption("Configure Your Cat");
   TQVBoxLayout *layout = new TQVBoxLayout(this);
   dialog_ = new Config(this);

   for (int i = 0; i < NUMBEROFCOLORS; i++)
      dialog_->colorPresets->insertItem ( presetColorName[i], i );

   TQWidget *rulesWidget = new TQWidget(dialog_->tabWidget);
   TQHBoxLayout *rwlh = new TQHBoxLayout(rulesWidget);
   applist = new TDEListView(rulesWidget);
   applist->setFullWidth(true);
   applist->setShadeSortColumn(false);
   applist->setAllColumnsShowFocus( true );
   applist->setSelectionMode(TQListView::Single);
   applist->addColumn ( i18n("Name") );
   applist->addColumn ( i18n("Links to") );
   TQDir d( TQDir::homeDirPath() + "/.baghira", 0L, TQDir::Name | TQDir::IgnoreCase, TQDir::Files | TQDir::Readable | TQDir::Writable );
   if (!d.exists())
      d.mkdir(TQDir::homeDirPath() + "/.baghira");
   else
   {
      for ( uint i = 0; i < d.count(); i++ )
      {
         TQFileInfo FI = TQFileInfo(d, d[i]);
         if (FI.isSymLink())
            applist->insertItem(new TDEListViewItem(applist, d[i], FI.readLink().section('/',-1,-1)));
         else
            applist->insertItem(new TDEListViewItem(applist, d[i]));
      }
   }
   rwlh->addWidget(applist);
//     rwlh->addLayout(rwlv);
   TQVBoxLayout *rwlv = new TQVBoxLayout(rwlh);
   rwlv->addStretch();
   TQPushButton *btnNew = new TQPushButton("New...", rulesWidget);
   TQPushButton *btnEdit = new TQPushButton("Edit...", rulesWidget);
   TQPushButton *btnDel = new TQPushButton("Remove", rulesWidget);
   TQPushButton *btnDet = new TQPushButton("Detect", rulesWidget);
   rwlv->addWidget(btnNew);
   rwlv->addWidget(btnEdit);
   rwlv->addWidget(btnDel);
   rwlv->addSpacing( 5 );
   rwlv->addWidget(btnDet);
   rwlv->addStretch();
   dialog_->tabWidget->addTab( rulesWidget, TQString("Rules") );
   appsetter = new AppSetter(this);
   connect(btnNew, SIGNAL(clicked()), appsetter, SLOT(show()));
   connect(btnEdit, SIGNAL(clicked()), this, SLOT(editApp()));
   connect(this, SIGNAL(editApp(TQString, TQString)), appsetter, SLOT(show(TQString, TQString)));
   connect(btnDel, SIGNAL(clicked()), this, SLOT(removeApp()));
   connect(btnDet, SIGNAL(clicked()), this, SLOT(selectWindow()));
   connect(appsetter, SIGNAL(addApp(TQString, TQString)), this, SLOT(addApp(TQString, TQString)));
   connect(appsetter, SIGNAL(removeApp(TQString)), this, SLOT(removeApp(TQString)));
   // preview stuff
   baseImage = uic_findImage("button-base");

   layout->addWidget(dialog_);

   dialog_->show();
   help_ = new Help(dialog_);
   about_ = new About(dialog_);
   about_->versionLabel->setText(VERSION);
   about_->kdeLabel->setText(TDE_VERSION_STRING);
   crCurrent = 0;
   crNotes[0] = "<qt>© 2003-2005 by Thomas Lübking<br>http://baghira.SourceForge.net</qt>";
   crNotes[1] = "<qt>© \"Design\" 2001-2005 by Apple inc.<br>http://www.apple.com";
   crNotes[2] = "<qt>© \"Milk\" 2002-2005 by Max Rudberg<br>http://www.maxthemes.com</qt>";
   timer = new TQTimer();
   connect( timer, SIGNAL(timeout()), this, SLOT(updateCR()) );
   TQString tmpString(TQT_BUILD_KEY);
   about_->systemLabel->setText(tmpString.section(' ',1,1));
   about_->cpuLabel->setText(tmpString.section(' ',0,0));
   about_->setFixedSize (380, 430);

   // connections
   // buttons
   connect(dialog_->buttonHelp, SIGNAL(clicked()), help_, SLOT(exec()));
   connect(dialog_->buttonAbout, SIGNAL(clicked()), this, SLOT(showAbout()));
   connect(about_->buttonInfo, SIGNAL(clicked()), this, SLOT(openHtml1()));
   connect(about_->buttonDownload, SIGNAL(clicked()), this, SLOT(openHtml2()));
   connect(help_->startBAB, SIGNAL(clicked()), this, SLOT(startBab()));
   connect(dialog_->startKRuler, SIGNAL(clicked()), this, SLOT(startKRuler()));
   connect(dialog_->buttonLoad, SIGNAL(clicked()), this, SLOT(buttonLoadAction()));
   connect(dialog_->buttonSaveAs, SIGNAL(clicked()), this, SLOT(buttonSaveAsAction()));
   connect(dialog_->colorPresets, SIGNAL(activated(int)), this, SLOT(setPresetColor(int)));

   // changes
   connect(dialog_->defaultStyle, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->buttonStyle, SIGNAL(activated(int)), this, SLOT(handleButtonStyles(int)));
   connect(dialog_->toolbuttonStyle, SIGNAL(activated(int)), this, SLOT(handleButtonStyles(int)));
   connect(dialog_->animateButtons, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->stippleBackground, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->bevelHighlights, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->stippleContrast, SIGNAL(valueChanged (int)), this, SLOT(configChanged()));
   connect(dialog_->shadowGroups,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->shadowIntensity, SIGNAL(valueChanged (int)), this, SLOT(configChanged()));
   connect(dialog_->centerTabs,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->colorMode, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->inactiveColorType, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->animateSlider,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->shadowSlider,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->squeezeSlider,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->unhoveredToolButtons,  SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->aquaTabs,  SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->brushedTabs,  SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->drawTreeLines,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->useCustomExpanderColor,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->treeLineMode, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->expanderMode, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->useCustomExpanderColor,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->useRectLVH,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->removeKickerBevel,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->replaceMenubar,  SIGNAL(toggled(bool)), this, SLOT(menuToggled(bool)));
   connect(dialog_->roundTasks,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->showProgressValue,  SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->progressType, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->menuBackground, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->menuOpacity, SIGNAL(valueChanged (int)), this, SLOT(configChanged()));
   connect(dialog_->shadowMenuText, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->menuColorMode, SIGNAL(activated(int)), this, SLOT(configChanged()));
   connect(dialog_->useCustomColors, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->drawMenuStripe, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));
   connect(dialog_->glossyMenus, SIGNAL(stateChanged(int)), this, SLOT(configChanged()));

   connect(dialog_->customInactiveColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
connect(dialog_->toolbuttonHighColor, SIGNAL(changed(const TQColor &)), this, SLOT(changeTooluttonHighlightColor(const TQColor &)));
   connect(dialog_->treeLineColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->customExpanderColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->menuTextColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->menuTextColorHigh, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->menuColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->menuColorHigh, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->menuColor2, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->radioOffColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->radioOnColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->checkOffColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->checkOnColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->sliderColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->hoverSliderColorColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->pressedSliderColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->inactiveTabColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->activeTabColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));
   connect(dialog_->menuStripeColor, SIGNAL(changed(const TQColor &)), this, SLOT(configChanged()));

   connect(dialog_->sliderButtonRed, SIGNAL(valueChanged (int)), this, SLOT(sliderButtonRedChanged(int)));
   connect(dialog_->sliderButtonGreen, SIGNAL(valueChanged (int)), this, SLOT(sliderButtonGreenChanged(int)));
   connect(dialog_->sliderButtonBlue, SIGNAL(valueChanged (int)), this, SLOT(sliderButtonBlueChanged(int)));

   connect(dialog_->sliderBrushRed, SIGNAL(valueChanged (int)), this, SLOT(sliderBrushRedChanged(int)));
   connect(dialog_->sliderBrushGreen, SIGNAL(valueChanged (int)), this, SLOT(sliderBrushGreenChanged(int)));
   connect(dialog_->sliderBrushBlue, SIGNAL(valueChanged (int)), this, SLOT(sliderBrushBlueChanged(int)));

   // GUI
   connect (dialog_->defaultStyle, SIGNAL(activated(int)), this, SLOT(setDesign(int)));
   connect (dialog_->inactiveColorType, SIGNAL(activated(int)), this, SLOT(enableInButtonColor(int)));
   connect (dialog_->drawTreeLines, SIGNAL(toggled(bool)), dialog_->treeLineMode, SLOT(setEnabled(bool)));
   connect (dialog_->drawTreeLines, SIGNAL(toggled(bool)), dialog_->treeLineColor, SLOT(setEnabled(bool)));
   connect (dialog_->useCustomExpanderColor, SIGNAL(toggled(bool)), dialog_->customExpanderColor, SLOT(setEnabled(bool)));
   connect (dialog_->menuColorMode, SIGNAL(activated(int)), this, SLOT(enableMenuColorStuff(int)));
   connect (dialog_->menuBackground, SIGNAL(activated(int)), this, SLOT(enableMenuColorStuff(int)));
   connect (dialog_->drawMenuStripe, SIGNAL(toggled(bool)), dialog_->menuStripeColor, SLOT(setEnabled(bool)));
//     connect (dialog_->tintBrush, SIGNAL(toggled(bool)), dialog_->brushBox, SLOT(setEnabled(bool)));
   connect (dialog_->useCustomColors, SIGNAL(toggled(bool)), dialog_->colorFrame, SLOT(setEnabled(bool)));

   // load settings
   load();
   loadDone = true;

   dialog_->pixmapButtonPreview->setPixmap(*tintButton(baseImage, TQColor(sliderButtonRedValue, sliderButtonGreenValue, sliderButtonBlueValue)));

};

tdestyle_baghira_config::~tdestyle_baghira_config()
{
   if (timer) delete timer;
}

void tdestyle_baghira_config::setPresetColor(int i)
{
    dialog_->sliderButtonRed->setValue(presetColor[i][0]);
    dialog_->sliderButtonGreen->setValue(presetColor[i][1]);
    dialog_->sliderButtonBlue->setValue(presetColor[i][2]);
}

void tdestyle_baghira_config::load()
{
    TQString tmpString = TQDir::homeDirPath() + "/.qt/baghirarc";
    load (tmpString);
}

void tdestyle_baghira_config::load(TQString &fileName)
{
   TDEConfig *config = new TDEConfig(fileName);
//    TQSettings config;
   config->setGroup("BAB");
   // general Design
    dialog_->defaultStyle->setCurrentItem(config->readNumEntry("defaultState", 0 ));
//     config->endGroup();
    config->setGroup("Style");
   dialog_->buttonStyle->setCurrentItem(config->readNumEntry("Special_ButtonStyle", 1 ));
   dialog_->toolbuttonStyle->setCurrentItem(config->readNumEntry("Special_ToolbuttonStyle", 1 ));
    dialog_->stippleBackground->setChecked( config->readBoolEntry( "Design_StippleBackground", true));
   dialog_->animateButtons->setChecked( config->readBoolEntry( "Design_AnimateButtons", true));
    dialog_->stippleContrast->setValue( config->readNumEntry( "Design_StippleContrast", 3));
    dialog_->shadowGroups->setChecked( config->readBoolEntry( "Design_ShadowGroupBoxes", true));
    dialog_->shadowIntensity->setValue( config->readNumEntry( "Design_GroupBoxeShadowDarkness", 6));
    dialog_->bevelHighlights->setChecked( config->readBoolEntry( "Design_BevelAsHighlight", true));
    dialog_->colorMode->setCurrentItem(config->readNumEntry("Design_ButtonStyle", 0));
    dialog_->inactiveColorType->setCurrentItem(config->readNumEntry( "Design_InactiveButtonStyle", 1));
    dialog_->customInactiveColor->setColor(TQColor(config->readNumEntry("Design_InactiveButtonColor",(int)colorGroup().background().rgb())));
    dialog_->centerTabs->setChecked( config->readBoolEntry( "Design_CenterTabs", true));
    // button color stuff
    TQColor tmpColor = TQColor(config->readNumEntry("Design_ButtonColor",(int)colorGroup().button().rgb()));
    dialog_->sliderButtonRed->setValue(sliderButtonRedValue = tmpColor.red());
    dialog_->sliderButtonGreen->setValue(sliderButtonGreenValue = tmpColor.green());
    dialog_->sliderButtonBlue->setValue(sliderButtonBlueValue = tmpColor.blue());
    dialog_->valueButtonRed->setNum(sliderButtonRedValue);
    dialog_->valueButtonGreen->setNum(sliderButtonGreenValue);
    dialog_->valueButtonBlue->setNum(sliderButtonBlueValue);

    // special Widgets
    //ListViews
    dialog_->useRectLVH->setChecked( config->readBoolEntry( "Special_UseFlatLVH", false));
    dialog_->drawTreeLines->setChecked( config->readBoolEntry( "Special_DrawTreeLines", false));
    dialog_->treeLineMode->setCurrentItem(config->readNumEntry( "Special_TreelineStyle", 0));
    dialog_->treeLineColor->setColor( TQColor( config->readNumEntry( "Special_TreelineColor", (int) colorGroup().mid().rgb())));
    dialog_->expanderMode->setCurrentItem(config->readNumEntry( "Special_ExpanderStyle", 0));
    dialog_->useCustomExpanderColor->setChecked( config->readBoolEntry( "Special_CustomExpanderColor", false));
    dialog_->customExpanderColor->setColor( TQColor( config->readNumEntry( "Special_ExpanderColor", (int) colorGroup().text().rgb())));
    //Kicker
    dialog_->removeKickerBevel->setChecked( config->readBoolEntry( "Special_RemoveKickerBevel", true));
    dialog_->roundTasks->setChecked( config->readBoolEntry( "Special_RoundTaskbuttons", false));
    TQFile file(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data") + "kicker/applets/menuapplet.desktop");
    dialog_->replaceMenubar->setChecked( menuReplaced = file.exists() );
    //Scrollbars
    dialog_->animateSlider->setChecked( config->readBoolEntry( "Special_AnimateSlider", true));
    dialog_->shadowSlider->setChecked( config->readBoolEntry( "Special_ShadowSlider", false));
    dialog_->squeezeSlider->setChecked( config->readBoolEntry( "Special_SqueezeSlider", false));
    //Progress
    dialog_->progressType->setCurrentItem( config->readNumEntry( "Special_ProgressStyle", 0));
    dialog_->showProgressValue->setChecked( config->readBoolEntry( "Special_ShowProgressValue", false));
    //Toolbars
    dialog_->unhoveredToolButtons->setCurrentItem(config->readNumEntry( "Special_UnhoveredToolButtons", 2));
     //Tabs
    dialog_->aquaTabs->setCurrentItem(config->readNumEntry("Design_TabStyleAqua", 0 ));
    dialog_->brushedTabs->setCurrentItem(config->readNumEntry("Design_TabStyleBrushed", 1 ));

    // menus
    dialog_->menuBackground->setCurrentItem( config->readNumEntry( "Menu_Background", 0));
    dialog_->menuOpacity->setValue( config->readNumEntry( "Menu_Opacity", 70));
    //Look
    dialog_->shadowMenuText->setChecked( config->readBoolEntry( "Menu_ShadowText", true));
    dialog_->menuColorMode->setCurrentItem(config->readNumEntry("Menu_ColorStyle"));
    dialog_->menuTextColor->setColor( TQColor( config->readNumEntry( "Menu_TextColor", (int) colorGroup().text().rgb())));
    dialog_->menuTextColorHigh->setColor( TQColor( config->readNumEntry( "Menu_TextColorHighlight", (int) colorGroup().highlightedText().rgb())));
    dialog_->menuColor->setColor( TQColor( config->readNumEntry( "Menu_Color1", (int) colorGroup().background().rgb())));
    dialog_->menuColor2->setColor( TQColor( config->readNumEntry( "Menu_Color2", (int) colorGroup().background().dark(130).rgb())));
    dialog_->menuColorHigh->setColor( TQColor( config->readNumEntry( "Menu_ColorHighlight", (int) colorGroup().highlight().rgb())));
    dialog_->drawMenuStripe->setChecked(config->readBoolEntry( "Menu_DrawMenuStripe", false));
   dialog_->glossyMenus->setChecked(config->readBoolEntry( "Menu_Glossy", true));
    dialog_->menuStripeColor->setColor( TQColor( config->readNumEntry( "Menu_StripeColor", (int) TQt::white.rgb())));

    // custom colors
    dialog_->useCustomColors->setChecked( config->readBoolEntry( "Colors_UseCustomColors", false));
    dialog_->radioOffColor->setColor( TQColor( config->readNumEntry( "Colors_RadioOff", ( int ) colorGroup().background().rgb())));
    dialog_->radioOnColor->setColor( TQColor( config->readNumEntry( "Colors_RadioOn", ( int ) colorGroup().button().rgb())));
    dialog_->checkOffColor->setColor( TQColor( config->readNumEntry( "Colors_CheckOff", ( int ) colorGroup().background().rgb())));
    dialog_->checkOnColor->setColor( TQColor( config->readNumEntry( "Colors_CheckOn", ( int ) colorGroup().button().rgb())));
    dialog_->sliderColor->setColor( TQColor( config->readNumEntry( "Colors_Slider", ( int ) colorGroup().button().rgb())));
    dialog_->hoverSliderColorColor->setColor(TQColor(config->readNumEntry("Colors_SliderHovered",(int)colorGroup().button().rgb())));
    dialog_->pressedSliderColor->setColor(TQColor(config->readNumEntry("Colors_SliderPressed",(int) colorGroup().button().dark(110).rgb())));
    dialog_->sliderGrooveColor->setColor(TQColor(config->readNumEntry("Colors_SliderGroove",(int)colorGroup().background().rgb())));
    dialog_->inactiveTabColor->setColor(TQColor(config->readNumEntry("Colors_TabInactive",(int) colorGroup().background().rgb())));
    dialog_->activeTabColor->setColor(TQColor(config->readNumEntry("Colors_TabActive",(int)colorGroup().button().rgb())));
    dialog_->tintBrush->setChecked( config->readBoolEntry( "Colors_TintBrushedMetal", false));
    brushTint = TQColor(config->readNumEntry("Colors_BrushTint",(int)colorGroup().background().rgb()));
//    dialog_->brushTintSaturaion->setValue(settings.readNumEntry( "/qt/Baghira/brushTintSaturation", 3));
    baseImage2 = uic_findImage("brush-me");
    dialog_->pixmapBrushPreview->setPixmap(*tintBrush(baseImage2, brushTint));
    dialog_->sliderBrushRed->setValue(sliderBrushRedValue = brushTint.red());
    dialog_->sliderBrushGreen->setValue(sliderBrushGreenValue = brushTint.green());
    dialog_->sliderBrushBlue->setValue(sliderBrushBlueValue = brushTint.blue());
   config->setGroup("Menubar");
   dialog_->menuMaxWidth->setValue(config->readNumEntry("Width", TQDesktopWidget().availableGeometry().width()));
   config->setGroup("Sidebar");
   delete config;

   config = new TDEConfig("kdeglobals");
   config->setGroup( "Toolbar style" );
   dialog_->toolbuttonHighColor->setColor(config->readColorEntry("HighlightColor", new TQColor(103,141,178)) );
   delete config;
}


void tdestyle_baghira_config::defaults()
{
    dialog_->defaultStyle->setCurrentItem(0);
   dialog_->buttonStyle->setCurrentItem(1);
   dialog_->toolbuttonStyle->setCurrentItem(1);
   dialog_->animateButtons->setChecked( true);
    dialog_->stippleBackground->setChecked( true);
    dialog_->stippleContrast->setValue( 30);
    dialog_->shadowGroups->setChecked( true);
    dialog_->shadowIntensity->setValue( 50);
    dialog_->bevelHighlights->setChecked( true );
    dialog_->centerTabs->setChecked( true);
    dialog_->colorMode->setCurrentItem(0);
    dialog_->inactiveColorType->setCurrentItem(1);
    dialog_->customInactiveColor->setColor(colorGroup().background().rgb());
    // button color stuff
    dialog_->sliderButtonRed->setValue(sliderButtonRedValue = colorGroup().button().red());
    dialog_->sliderButtonGreen->setValue(sliderButtonGreenValue = colorGroup().button().green());
    dialog_->sliderButtonBlue->setValue(sliderButtonBlueValue = colorGroup().button().blue());
    dialog_->valueButtonRed->setNum(sliderButtonRedValue);
    dialog_->valueButtonGreen->setNum(sliderButtonGreenValue);
    dialog_->valueButtonBlue->setNum(sliderButtonBlueValue);

    // special Widgets
//    dialog_->animateSlider;
    dialog_->shadowSlider->setChecked( false);
    dialog_->squeezeSlider->setChecked( false);
    dialog_->unhoveredToolButtons->setCurrentItem(2);
    dialog_->toolbuttonHighColor->setColor( TQColor(103,141,178) );
    dialog_->drawTreeLines->setChecked( false);
    dialog_->useCustomExpanderColor->setChecked( false);
    dialog_->treeLineMode->setCurrentItem(0);
    dialog_->treeLineColor->setColor( colorGroup().mid().rgb());
    dialog_->expanderMode->setCurrentItem(0);
    dialog_->customExpanderColor->setColor( colorGroup().text().rgb());
    dialog_->useRectLVH->setChecked( false);
    dialog_->removeKickerBevel->setChecked( true);
    dialog_->roundTasks->setChecked( false);
    dialog_->showProgressValue->setChecked( false);
    dialog_->progressType->setCurrentItem( 0);
    dialog_->aquaTabs->setCurrentItem( 0 );
    dialog_->brushedTabs->setCurrentItem(1);

    // menus
//    dialog_->transGroup;
    dialog_->menuBackground->setCurrentItem(0);
    dialog_->menuOpacity->setValue( 70);
    dialog_->shadowMenuText->setChecked( true);
    dialog_->menuColorMode->setCurrentItem(0);
    dialog_->menuTextColor->setColor( colorGroup().text().rgb());
    dialog_->menuTextColorHigh->setColor( colorGroup().highlightedText().rgb());
    dialog_->menuColor->setColor( colorGroup().background().rgb());
    dialog_->menuColor2->setColor( colorGroup().background().dark(130).rgb());
    dialog_->menuColorHigh->setColor( colorGroup().highlight().rgb());
    dialog_->drawMenuStripe->setChecked(false);
   dialog_->glossyMenus->setChecked(true);
    dialog_->menuStripeColor->setColor( TQt::white.rgb());

    // custom colors
    dialog_->useCustomColors->setChecked( false);
    dialog_->radioOffColor->setColor( colorGroup().background().rgb());
    dialog_->radioOnColor->setColor( colorGroup().button().rgb());
    dialog_->checkOffColor->setColor( colorGroup().background().rgb());
    dialog_->checkOnColor->setColor( colorGroup().button().rgb());
    dialog_->sliderColor->setColor( colorGroup().button().rgb());
    dialog_->hoverSliderColorColor->setColor(colorGroup().button().rgb());
    dialog_->pressedSliderColor->setColor(colorGroup().button().dark(110).rgb());
    dialog_->sliderGrooveColor->setColor(colorGroup().background().rgb());
    dialog_->inactiveTabColor->setColor(colorGroup().background().rgb());
    dialog_->activeTabColor->setColor(colorGroup().button().rgb());
    dialog_->tintBrush->setChecked( false);
    emit changed(true);
}

void tdestyle_baghira_config::save()
{
    TQString tmpString = TQDir::homeDirPath() + "/.qt/baghirarc";
    save(tmpString);
//     emit changed(true);
}

void tdestyle_baghira_config::changeTooluttonHighlightColor(const TQColor & color)
{
   TDEConfig *config = new TDEConfig("kdeglobals");
   config->setGroup( "Toolbar style" );
   config->writeEntry("HighlightColor", color);
   delete config;
}

void tdestyle_baghira_config::handleButtonStyles(int i)
{
   if (i != 2 && sender() == dialog_->buttonStyle && dialog_->toolbuttonStyle->currentItem() != 2)
         dialog_->toolbuttonStyle->setCurrentItem(i);
   else if (i != 2 && sender() == dialog_->toolbuttonStyle && dialog_->buttonStyle->currentItem() != 2)
      dialog_->buttonStyle->setCurrentItem(i);
   configChanged();
}

void tdestyle_baghira_config::save(TQString &fileName)
{
//     TQSettings *config = new TQSettings;
    TDEConfig *config = new TDEConfig(fileName);
    config->setGroup("BAB");
    //General Design
    config->writeEntry("defaultState", dialog_->defaultStyle->currentItem());
//     config->endGroup();
    config->setGroup("Style");
   config->writeEntry("Special_ButtonStyle", dialog_->buttonStyle->currentItem());
   config->writeEntry("Special_ToolbuttonStyle", dialog_->toolbuttonStyle->currentItem());
   config->writeEntry("Design_AnimateButtons", dialog_->animateButtons->isOn());
    config->writeEntry("Design_Default", dialog_->defaultStyle->currentItem());
    config->writeEntry("Design_StippleBackground", dialog_->stippleBackground->isOn());
    config->writeEntry("Design_StippleContrast", dialog_->stippleContrast->value());
    config->writeEntry("Design_ShadowGroupBoxes", dialog_->shadowGroups->isOn());
    config->writeEntry("Design_GroupBoxeShadowDarkness", dialog_->shadowIntensity->value());
    config->writeEntry("Design_BevelAsHighlight", dialog_->bevelHighlights->isOn());
    config->writeEntry("Design_ButtonStyle", dialog_->colorMode->currentItem());
    config->writeEntry("Design_InactiveButtonStyle", dialog_->inactiveColorType->currentItem());
    config->writeEntry("Design_InactiveButtonColor", (int)dialog_->customInactiveColor->color().rgb());
    config->writeEntry("Design_CenterTabs", dialog_->centerTabs->isOn());
    //button color stuff
    config->writeEntry("Design_ButtonColor", (int)(TQColor(sliderButtonRedValue, sliderButtonGreenValue, sliderButtonBlueValue).rgb()));

    // special Widgets
    //listviews
//    dialog_->animateSlider;
    config->writeEntry("Special_UseFlatLVH", dialog_->useRectLVH->isOn());
    config->writeEntry("Special_DrawTreeLines", dialog_->drawTreeLines->isOn());
    config->writeEntry("Special_TreelineStyle", dialog_->treeLineMode->currentItem());
    config->writeEntry("Special_TreelineColor", (int)dialog_->treeLineColor->color().rgb());
    config->writeEntry("Special_ExpanderStyle", dialog_->expanderMode->currentItem());
    config->writeEntry("Special_CustomExpanderColor", dialog_->useCustomExpanderColor->isOn());
    config->writeEntry("Special_ExpanderColor", (int)dialog_->customExpanderColor->color().rgb());
    //Kicker
    config->writeEntry("Special_RemoveKickerBevel", dialog_->removeKickerBevel->isOn());
    config->writeEntry("Special_RoundTaskbuttons", dialog_->roundTasks->isOn());
   TQDir tmpDir(TDEGlobal::dirs()->localtdedir());
   if (!tmpDir.exists()) tmpDir.mkdir(TDEGlobal::dirs()->localtdedir());
   tmpDir.setPath(TDEGlobal::dirs()->localtdedir() + "share");
   if (!tmpDir.exists()) tmpDir.mkdir(TDEGlobal::dirs()->localtdedir() + "share");
   tmpDir.setPath(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data"));
   if (!tmpDir.exists()) tmpDir.mkdir(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data"));
   tmpDir.setPath(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data") + "kicker");
   if (!tmpDir.exists()) tmpDir.mkdir(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data") + "kicker");
   tmpDir.setPath(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data") + "kicker/applets");
   if (!tmpDir.exists()) tmpDir.mkdir(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data") + "kicker/applets");
    TQFile file(TDEGlobal::dirs()->localtdedir() + TDEStandardDirs::kde_default("data") + "kicker/applets/menuapplet.desktop");
    if (dialog_->replaceMenubar->isOn())
    {
        file.open(IO_WriteOnly);
        const char *msg  =
"[Desktop Entry]\n\
Hidden=true\n\
Type=Plugin\n\
Encoding=UTF-8\n\
Name=BaghiraMenu\n\
X-TDE-Library=b_menu_panelapplet\n\
X-TDE-UniqueApplet=true\n";
        file.writeBlock( msg, tqstrlen(msg) );
        file.close();
    }
    else
        file.remove();
    if (dialog_->replaceMenubar->isOn() != menuReplaced)
        TDEApplication::dcopClient()->send("kicker", "default", "restart()", "");
    //Srollbars
    config->writeEntry("Special_AnimateSlider", dialog_->animateSlider->isOn());
    config->writeEntry("Special_ShadowSlider", dialog_->shadowSlider->isOn());
    config->writeEntry("Special_SqueezeSlider", dialog_->squeezeSlider->isOn());
    //Progress
    config->writeEntry("Special_ProgressStyle", dialog_->progressType->currentItem());
    config->writeEntry("Special_ShowProgressValue", dialog_->showProgressValue->isOn());
    //Toolbars
    config->writeEntry("Special_UnhoveredToolButtons", dialog_->unhoveredToolButtons->currentItem());
    //Tabs
    config->writeEntry("Design_TabStyleAqua", dialog_->aquaTabs->currentItem() );
    config->writeEntry("Design_TabStyleBrushed", dialog_->brushedTabs->currentItem() );
    // menus
    config->writeEntry("Menu_Background", dialog_->menuBackground->currentItem());
    config->writeEntry("Menu_Opacity", dialog_->menuOpacity->value());
    //Look
    config->writeEntry("Menu_ShadowText", dialog_->shadowMenuText->isOn());
    config->writeEntry("Menu_ColorStyle", dialog_->menuColorMode->currentItem());
    config->writeEntry("Menu_TextColor", (int)dialog_->menuTextColor->color().rgb());
    config->writeEntry("Menu_TextColorHighlight", (int)dialog_->menuTextColorHigh->color().rgb());
    config->writeEntry("Menu_Color1", (int)dialog_->menuColor->color().rgb());
    config->writeEntry("Menu_Color2", (int)dialog_->menuColor2->color().rgb());
    config->writeEntry("Menu_ColorHighlight", (int)dialog_->menuColorHigh->color().rgb());
    config->writeEntry("Menu_DrawMenuStripe", dialog_->drawMenuStripe->isOn());
   config->writeEntry("Menu_Glossy", dialog_->glossyMenus->isOn());
    config->writeEntry("Menu_StripeColor", (int)dialog_->menuStripeColor->color().rgb());

    // custom colors
    config->writeEntry("Colors_UseCustomColors", dialog_->useCustomColors->isOn());
    config->writeEntry("Colors_RadioOff", (int)dialog_->radioOffColor->color().rgb());
    config->writeEntry("Colors_RadioOn", (int)dialog_->radioOnColor->color().rgb());
    config->writeEntry("Colors_CheckOff",(int) dialog_->checkOffColor->color().rgb());
    config->writeEntry("Colors_CheckOn", (int)dialog_->checkOnColor->color().rgb());
    config->writeEntry("Colors_Slider",(int) dialog_->sliderColor->color().rgb());
    config->writeEntry("Colors_SliderHovered", (int)dialog_->hoverSliderColorColor->color().rgb());
    config->writeEntry("Colors_SliderPressed", (int)dialog_->pressedSliderColor->color().rgb());
    config->writeEntry("Colors_SliderGroove",(int) dialog_->sliderGrooveColor->color().rgb());
    config->writeEntry("Colors_TabInactive",(int) dialog_->inactiveTabColor->color().rgb());
    config->writeEntry("Colors_TabActive", (int)dialog_->activeTabColor->color().rgb());
    config->writeEntry("Colors_TintBrushedMetal", dialog_->tintBrush->isOn());
    config->writeEntry("Colors_BrushTint",(int)tqRgb(sliderBrushRedValue, sliderBrushGreenValue, sliderBrushBlueValue));
   config->setGroup("Menubar");
   config->writeEntry("Width", dialog_->menuMaxWidth->value());
    config->sync();
//     config->endGroup();
    delete config;
}


void tdestyle_baghira_config::configChanged()
{
   if (loadDone)
    {
    dialog_->statusWarning->setText("Config changed");
    emit changed(true);
    }
}


TQString tdestyle_baghira_config::quickHelp() const
{
    return i18n("Configure Your Cat");
}

void tdestyle_baghira_config::setDesign(int d)
{
    bool b = (d == 0);
    dialog_->stippleBackground->setEnabled(b);
    dialog_->stippleContrast->setEnabled(b);
    dialog_->shadowGroups->setEnabled(b);
    dialog_->shadowIntensity->setEnabled(b);
}

void tdestyle_baghira_config::enableInButtonColor(int d)
{
    dialog_->customInactiveColor->setEnabled(d == 3);
}

void tdestyle_baghira_config::enableMenuColorStuff(int d)
{
   bool b = (d == 2);
   dialog_->menuTextColor->setEnabled(b);
   dialog_->menuColor->setEnabled(b && dialog_->menuBackground->currentItem() > 0);
   dialog_->menuColor2->setEnabled(b && dialog_->menuBackground->currentItem() > 1);
}

void tdestyle_baghira_config::buttonLoadAction()
{
    TQString tmpString = KFileDialog::getOpenFileName(TQDir::homeDirPath(), "*", this, "Select a Baghira config file");
    if (!tmpString.isEmpty())
        load(tmpString);
}

void tdestyle_baghira_config::buttonSaveAsAction()
{
    TQString tmpString = KFileDialog::getSaveFileName(TQDir::homeDirPath(), "*", this, "Save current Baghira configuration as");
    save(tmpString);
}

void tdestyle_baghira_config::editApp()
{
   emit editApp(applist->currentItem()->text(0), applist->currentItem()->text(1));
}

void tdestyle_baghira_config::removeApp()
{
   TQString string = TQDir::homeDirPath() + "/.baghira/" + applist->currentItem()->text(0);
   TQFile::remove(string);
   applist->takeItem(applist->currentItem());
}

void tdestyle_baghira_config::removeApp(TQString name)
{
   TQString string = TQDir::homeDirPath() + "/.baghira/" + name;
   TQFile::remove(string);
   applist->takeItem(applist->findItem(name, 0, TQt::ExactMatch));
}

void tdestyle_baghira_config::addApp(TQString string, TQString linkString)
{
   applist->insertItem(new TDEListViewItem(applist, string, linkString));
   applist->sort();
}

void tdestyle_baghira_config::selectWindow()
// taken from kcmkwin
{
   // use a dialog, so that all user input is blocked
   // use WX11BypassWM and moving away so that it's not actually visible
   // grab only mouse, so that keyboard can be used e.g. for switching windows
   grabber = new TQDialog( NULL, NULL, true, WX11BypassWM );
   grabber->move( -1000, -1000 );
   grabber->show();
   grabber->grabMouse( crossCursor );
   grabber->installEventFilter( this );
}

Atom wm_state = XInternAtom( tqt_xdisplay(), "WM_STATE", False );
// Atom wm_state = XInternAtom( tqt_xdisplay(), "WM_COMMAND", False );

bool tdestyle_baghira_config::eventFilter( TQObject* o, TQEvent* e )
// adapted from kcmkwin... again ;)
{
   if( o != grabber )
      return false;
   if( e->type() != TQEvent::MouseButtonRelease )
      return false;
   delete grabber;
   grabber = NULL;
   if( static_cast< TQMouseEvent* >( e )->button() != LeftButton )
      return true;
   WId winId = findWindow();
   XClassHint classHint;
   if (XGetClassHint(tqt_xdisplay(), winId, &classHint))
   {
      TQString tmpString = TQString( classHint.res_class ).lower() + " (uncertain)";
      appsetter->show(tmpString, TQString());
//       tqWarning("class: %s",TQString( classHint.res_class ).lower().ascii());
      XFree( classHint.res_name );
      XFree( classHint.res_class );
   }
   return true;
}

WId tdestyle_baghira_config::findWindow()
// taken from kcmkwin... as well =)
{
   Window root;
   Window child;
   uint mask;
   int rootX, rootY, x, y;
   Window parent = tqt_xrootwin();
//    Atom wm_state = XInternAtom( tqt_xdisplay(), "WM_STATE", False );
   for( int i = 0;
        i < 10;
        ++i )
   {
      XQueryPointer( tqt_xdisplay(), parent, &root, &child,
                     &rootX, &rootY, &x, &y, &mask );
      if( child == None )
         return 0;
      Atom type;
      int format;
      unsigned long nitems, after;
      unsigned char* prop;
      if( XGetWindowProperty( tqt_xdisplay(), child, wm_state, 0, 0, False, AnyPropertyType, &type, &format, &nitems, &after, &prop ) == Success )
      {
         if( prop != NULL )
            XFree( prop );
         if( type != None )
            return child;
      }
      parent = child;
   }
   return 0;
}


void tdestyle_baghira_config::menuToggled(bool active)
{
    if (!active || !loadDone)
        return;
    TDEConfigGroup menuConfig(TDEGlobal::config(), "KDE");
    if (!menuConfig.readBoolEntry("macStyle", false))
        if (KMessageBox::questionYesNo(0, i18n("<qt>You just selected to replace kickers menu applet for the Mac like Menubar on top of the screen, but the Mac like style isn't selected anyway<br>Do you want to activate it now?</qt>"), 0L, KStdGuiItem::yes(), KStdGuiItem::no()) == KMessageBox::Yes)
    {
        TDEProcess proc;
        proc << "tdecmshell" << "desktopbehavior";
        proc.start(TDEProcess::DontCare);
        proc.detach();
    }
    configChanged();
}

//////////////////////////////////////////////////////////////////////////////
// Plugin Stuff                                                             //
//////////////////////////////////////////////////////////////////////////////

extern "C"
{
    KDE_EXPORT TQWidget* allocate_tdestyle_config(TQWidget* parent){
         return(new tdestyle_baghira_config(parent, "BaghiraConfig"));
    }
}

AppSetter::AppSetter(TQWidget *parent, const char *name) : TQWidget(parent, name, TQt::WType_Dialog | TQt::WShowModal )
{
   isEdit = FALSE;

   TQLabel *label1 = new TQLabel(i18n("<qt><b>Application Name</b></qt>"), this);
   command = new TQLineEdit(this);

   TQLabel *linkTo = new TQLabel(i18n("<qt><b>Just like</b></qt>"),this);
   link = new TQComboBox(this);

   box = new TQGroupBox(2,TQt::Horizontal,i18n("Custom Settings"),this);
   box->setCheckable( true );

   new TQLabel(i18n("<qt><b>Style</b></qt>"), box);
   new TQLabel("<qt><b>Deco</b></qt>", box);

   style = new TQComboBox(box);
   style->insertItem(i18n("Don't set"));
   style->insertItem("Jaguar");
   style->insertItem("Panther");
   style->insertItem("Brushed Metal");
   style->insertItem("Tiger");
   style->insertItem("Milk");

   deco = new TQComboBox(box);
   deco->insertItem(i18n("Don't set"));
   deco->insertItem("Jaguar");
   deco->insertItem("Panther");
   deco->insertItem("Brushed Metal");
   deco->insertItem("Tiger");
   deco->insertItem("Milk");

   new TQLabel(i18n("<qt><b>Buttons</b></qt>"), box);
   new TQLabel(i18n("<qt><b>Toolbuttons</b></qt>"), box);

   buttons = new TQComboBox(box);
   buttons->insertItem("Jaguar");
   buttons->insertItem("Panther");
   buttons->insertItem("iTunes");
   buttons->insertItem("Tiger");
   buttons->insertItem("Milk");


   toolButtons = new TQComboBox(box);
   toolButtons->insertItem("Jaguar");
   toolButtons->insertItem("Panther");
   toolButtons->insertItem("iTunes");
   toolButtons->insertItem("Tiger");
   toolButtons->insertItem("Milk");

   new TQLabel(i18n("<qt><b>Tab vs. Chooser</b></qt>"), box);
   new TQLabel(i18n("<qt>Inactive Button</qt>"), box);

   tabs = new TQComboBox(box);
   tabs->insertItem(i18n("Don't set"));
   tabs->insertItem("Tabs");
   tabs->insertItem("Adaptive");
   tabs->insertItem("Choosers");


   inbutton = new TQComboBox(box);
   inbutton->insertItem("Fixed");
   inbutton->insertItem("Background");
   inbutton->insertItem("Active Button");

   scanlines = new TQCheckBox("Show scanlines", box);

   TQWidget *dumb = new TQWidget(box);
   customColors = new TQCheckBox(dumb);
   buttonColors = new TQPushButton("Custom Colors", dumb);
   TQHBoxLayout *clh = new TQHBoxLayout(dumb);
   clh->addWidget(customColors);
   clh->addWidget(buttonColors);

   TQVBoxLayout *lv = new TQVBoxLayout(this,11,6);
   lv->addWidget(label1);
   lv->addWidget(command);
   TQHBoxLayout *lh0 = new TQHBoxLayout(lv);
   lh0->addWidget(linkTo);
   lh0->addWidget(link);
   lv->addWidget(box);
   TQHBoxLayout *lh = new TQHBoxLayout(lv);
   TQPushButton *cancel = new TQPushButton("Cancel",this);
   lh->addWidget(cancel);
   TQPushButton *ok = new TQPushButton("Ok",this);
   lh->addWidget(ok);

   colorDialog = new ColorDialog(this);

   connect(box, SIGNAL(toggled( bool )), link, SLOT(setDisabled(bool)));
   connect(box, SIGNAL(toggled( bool )), linkTo, SLOT(setDisabled(bool)));
   connect(style, SIGNAL(activated( int )), this, SLOT(handler(int)));
   connect(buttons, SIGNAL(activated( int )), this, SLOT(handleButtonStyles(int)));
   connect(toolButtons, SIGNAL(activated( int )), this, SLOT(handleButtonStyles(int)));
   connect(cancel, SIGNAL(clicked()), this, SLOT(reset()));
   connect(ok, SIGNAL(clicked()), this, SLOT(save()));
   connect(customColors, SIGNAL(toggled( bool )), buttonColors, SLOT(setEnabled(bool)));
   connect(buttonColors, SIGNAL(clicked()), colorDialog, SLOT(exec()));
   connect(colorDialog->buttonOk, SIGNAL(clicked()), this, SLOT(updateColors()));
   connect(colorDialog->buttonCancel, SIGNAL(clicked()), this, SLOT(resetColorPicker()));
   reset();
}

AppSetter::~AppSetter()
{
}

void AppSetter::handleButtonStyles(int i)
{
   if (i != 2 && sender() == buttons && toolButtons->currentItem() != 2)
      toolButtons->setCurrentItem(i);
   else if (i != 2 && sender() == toolButtons && buttons->currentItem() != 2)
      buttons->setCurrentItem(i);
}

void AppSetter::handler(int i)
{
   scanlines->setEnabled(i != 3);
}

void AppSetter::updateColors()
{
   for (int i = 0; i < 8; i++)
      colors[i] = (int)colorDialog->picker[i]->color().rgb();
}

void AppSetter::show()
{
   link->clear();
   TQDir d( TQDir::homeDirPath() + "/.baghira", 0L, TQDir::Name | TQDir::IgnoreCase, TQDir::Files | TQDir::NoSymLinks | TQDir::Readable | TQDir::Writable );
   for ( uint i = 0; i < d.count(); i++ )
      link->insertItem(d[i]);
   TQWidget::show();
}

void AppSetter::show(TQString appName, TQString linkString)
{
   isEdit = true;
   oldName = appName;
   oldLink = linkString;
   command->setText(appName);
   FILE *file = NULL;
   TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + appName;
   if( (file = fopen(tmpString.latin1(), "r")) != NULL )
   {
      uint s, d, b, t, tc, sc, ib;
      s = d = 4;
      b = t = sc = 2;
      tc = 3;
      for (int i = 0; i < 8; i++)
         colors[i] = -1;
      fscanf(file,"%u\n%u\n%u\n%u\n%u\n%u\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",&s,&d,&b,&t,&tc,&sc,&colors[0],&colors[1],&colors[2],&colors[3],&colors[4],&colors[5],&colors[6],&colors[7],&ib);
      fclose(file);
      if (s < 5) style->setCurrentItem(s+1);
      if (d < 5) deco->setCurrentItem(d+1);
      if (b < 5) buttons->setCurrentItem(b);
      if (t < 5) toolButtons->setCurrentItem(t);
      if (tc < 3) tabs->setCurrentItem(tc+1);
      if (ib < 3) inbutton->setCurrentItem(ib);
      scanlines->setChecked(sc < 2 ? sc : true);
      scanlines->setEnabled(s != 2);
      customColors->setChecked(colors[0] != -1);
      buttonColors->setEnabled(customColors->isChecked());
      resetColorPicker();
   }
   show();
   if (!linkString.isNull())
   {
      for (int i = 0; i < link->count(); i++)
      {
         if (link->text(i) == linkString)
         {
            link->setCurrentItem(i);
            break;
         }
      }
   }
   else
   {
      box->setChecked(true);
   }
}

void AppSetter::resetColorPicker()
{
   if (colors[0] != -1)
   {
      for (int i = 0; i < 8; i++)
      {
         colorDialog->picker[i]->blockSignals(true);
         colorDialog->picker[i]->setColor(TQColor(colors[i]));
         colorDialog->picker[i]->blockSignals(false);
      }
      ((TQWidget*)colorDialog->demo)->repaint(false);
   }
   else
   {
      for (int i = 0; i < 8; i++)
         colorDialog->picker[i]->blockSignals(true);
      colorDialog->picker[Back]->setColor(colorGroup().background());
      colorDialog->picker[Button]->setColor(colorGroup().button());
      colorDialog->picker[Base]->setColor(colorGroup().base());
      colorDialog->picker[Text]->setColor(colorGroup().text());
      colorDialog->picker[High]->setColor(colorGroup().highlight());
      colorDialog->picker[HighText]->setColor(colorGroup().highlightedText());
      colorDialog->picker[ButText]->setColor(colorGroup().buttonText ());
      colorDialog->picker[Alternate]->setColor(TDEGlobalSettings::alternateBackgroundColor());
      for (int i = 0; i < 8; i++)
         colorDialog->picker[i]->blockSignals(false);
      ((TQWidget*)colorDialog->demo)->repaint(false);
   }
}

void AppSetter::save()
{
   if (command->text() != "" && (!box->isChecked() || (style->currentItem() != 0 && deco->currentItem() != 0)))
   {
      if (!isEdit)
         emit addApp(command->text(), box->isChecked() ? TQString() : link->currentText());
      else if (command->text() != oldName || link->currentText() != oldLink)
      {
         emit removeApp(oldName);
         emit addApp(command->text(), box->isChecked() ? TQString() : link->currentText());
      }
      if (!customColors->isChecked())
      {
         for (int i = 0; i < 8; i++)
            colors[i] = -1;
      }
      FILE *file = NULL;
      TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + command->text();
      if (box->isChecked()) // custom settings
      {
         if( (file = fopen(tmpString.latin1(), "w")) != NULL )
         {
            fprintf(file,"%u\n%u\n%u\n%u\n%u\n%u\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",style->currentItem()-1, deco->currentItem()-1, buttons->currentItem(), toolButtons->currentItem(), tabs->currentItem()-1, scanlines->isChecked(), colors[0], colors[1], colors[2], colors[3], colors[4], colors[5], colors[6], colors[7], inbutton->currentItem());
            fclose(file);
         }
      }
      else // just link
      {
         TQString tmpString2 = TQDir::homeDirPath() + "/.baghira/" + link->currentText();
         TQFile::remove(tmpString); // just to be sure ;)
         symlink (tmpString2.latin1(), tmpString.latin1());
      }
   }
   reset();
}

void AppSetter::reset()
{
   hide();
   isEdit = false;
   style->setCurrentItem(0);
   deco->setCurrentItem(0);
   buttons->setCurrentItem(1);
   inbutton->setCurrentItem(0);
   toolButtons->setCurrentItem(1);
   tabs->setCurrentItem(0);
   scanlines->setChecked(false);
   command->clear();
   customColors->setChecked(false);
   for (int i = 0; i < 8; i++)
      colors[i] = -1;
   box->setChecked ( false );
}

#include "tdestyle_baghira_config.moc"
