/***************************************************************************
 *   Copyright (C) 2007 by Danny Kukawka                                   *
 *                         <dkukawka@suse.de>, <danny.kukawka@web.de>      *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of version 2 of the GNU General Public License     *
 *   as published by the Free Software Foundation.                         *
 *                                                                         *
 *   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.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
 ***************************************************************************/

/*! \file countdowndialog.cpp
 * \brief 	In this file can be found the countdown dialog related code.
 * \author 	Danny Kukawka, <dkukawka@suse.de, danny.kukawka@web.de>
 * \date    	2007
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

// own header
#include "countdowndialog.h"
#include "tdepowersave_debug.h"

// KDE headers:
#include <tdelocale.h>
#include <kiconloader.h>
#include <kprogress.h>

// TQt headers:
#include <tqdialog.h>
#include <tqlabel.h>
#include <tqprogressbar.h>
#include <tqpushbutton.h>
#include <tqstring.h>
#include <tqtimer.h>

/*! This is the default constructor of class countDownDialog . */
countDownDialog::countDownDialog( int timeout, TQWidget *parent, const char *name)
		:countdown_Dialog(parent, name, false, TQt::WStyle_StaysOnTop | TQt::WDestructiveClose )
{
	kdDebugFuncIn(trace);
	remaining = timeout;
	timeOut = timeout;

	PROGRESS = new TQTimer(this);
	connect(PROGRESS, TQ_SIGNAL(timeout()), this, TQ_SLOT(updateProgress()));

	this->setCaption(i18n("TDEPowersave"));

	kdDebugFuncOut(trace);
}

/*! This is the default destructor of class countDownDialog . */
countDownDialog::~countDownDialog() {
	kdDebugFuncIn(trace);
	// no need to delete child widgets, TQt does it all for us
	emit dialogClosed(remaining > 0);

	kdDebugFuncOut(trace);
}

/*!
 * This used to set Icon/pixmap for the dialog.
 * \param type TQString with the type of the current suspend
 *             to set the pixmap in the dialog
 */
void countDownDialog::setPixmap( TQString type )
{
	TQPixmap pixmap = 0;

	if(type.startsWith("suspend2disk")){
		pixmap = TDEGlobal::iconLoader()->loadIcon("suspend_to_disk", TDEIcon::NoGroup, TDEIcon::SizeLarge);
	} else if(type.startsWith("suspend_hybrid")){
		pixmap = TDEGlobal::iconLoader()->loadIcon("suspend_to_disk", TDEIcon::NoGroup, TDEIcon::SizeLarge);
	} else if (type.startsWith("suspend2ram")) {
		pixmap = TDEGlobal::iconLoader()->loadIcon("suspend_to_ram", TDEIcon::NoGroup, TDEIcon::SizeLarge);
	} else if (type.startsWith("freeze")) {
		pixmap = TDEGlobal::iconLoader()->loadIcon("suspend_to_ram", TDEIcon::NoGroup, TDEIcon::SizeLarge);
	} else if (type.startsWith("standby")) {
		pixmap = TDEGlobal::iconLoader()->loadIcon("stand_by", TDEIcon::NoGroup, TDEIcon::SizeLarge);
	} else {
		pixmap = TDEGlobal::iconLoader()->loadIcon("tdepowersave", TDEIcon::NoGroup, TDEIcon::SizeLarge);
	}
	iconPixmap->setPixmap( pixmap );
}

/*!
 * To set the message to the dialog, which should be shown to the user.
 * \param text	TQString with the message.
 */
void countDownDialog::setMessageText(TQString text) {
	kdDebugFuncIn(trace);

	if (!text.isEmpty()) {
		textLabel->setText(text);
	}

	kdDebugFuncOut(trace);
}

/*!
 * To show the dialog and start the countdown.
 * \return boolean with the result of the operation
 * \retval true		if the dialog could get displayed
 * \retval false	if there is any problem
 */
bool countDownDialog::showDialog() {
	kdDebugFuncIn(trace);

	bool _retval = false;

	if (!textLabel->text().isEmpty() && timeOut > 0) {
		// init the progressbar
		progressBar->setFormat(i18n("%1 seconds").arg(remaining));
		progressBar->setPercentageVisible(true);
		progressBar->setProgress(100);
		progressBar->setEnabled(true);

		this->adjustSize();
		this->show();

		PROGRESS->start(1000, true);
	}

	kdDebugFuncOut(trace);
	return _retval;
}

/*!
 * \b Slot to get the event if the 'Cancel' button was pressed.
 */
void countDownDialog::pB_cancel_pressed() {
	kdDebugFuncIn(trace);

	if (PROGRESS->isActive())
		PROGRESS->stop();

	close();

	kdDebugFuncOut(trace);
}

void countDownDialog::reject() {
	kdDebugFuncIn(trace);

	if (PROGRESS->isActive())
		PROGRESS->stop();

	countdown_Dialog::reject();

	kdDebugFuncOut(trace);
}

/*!
 * \b Slot to handle the change of the progressbar.
 */
void countDownDialog::updateProgress() {
	kdDebugFuncIn(trace);

	if (remaining == 0 ) {
		if (PROGRESS->isActive())
			PROGRESS->stop();

		close();
	} else if ( remaining > 0) {
		int setTo = (int)((100.0/(float)timeOut)*(float)remaining);

		// set the progressBar
		progressBar->setFormat(i18n("%1 seconds").arg(remaining));
		progressBar->setPercentageVisible(true);
		progressBar->setProgress(setTo);
		progressBar->setEnabled(true);

		// increase counter
		remaining--;
		// start needed timer
		PROGRESS->start(1000, true);
	}

	kdDebugFuncOut(trace);
}

#include "countdowndialog.moc"
