/*****************************************************************
ksmserver - the KDE session management server

Copyright (C) 2012 Serghei Amelian <serghei.amelian@gmail.com>
Copyright (C) 2000 Matthias Ettrich <ettrich@kde.org>
******************************************************************/

#ifndef SHUTDOWNDLG_H
#define SHUTDOWNDLG_H

#include <tqpixmap.h>
#include <tqimage.h>
#include <tqdatetime.h>
#include <kdialog.h>
#include <kpushbutton.h>
#include <tqpushbutton.h>
#include <tqframe.h>
#include <kguiitem.h>
#include <tqtoolbutton.h>
#include <krootpixmap.h>
#include <ntqprogressbar.h>

class TQPushButton;
class TQVButtonGroup;
class TQPopupMenu;
class TQTimer;
class TQPainter;
class TQString;
class TDEAction;

#include "timed.h"
#include <tdeapplication.h>
#include <kpixmapio.h>

#include <config.h>

#ifdef COMPILE_HALBACKEND
	#ifndef NO_QT3_DBUS_SUPPORT
	/* We acknowledge the the dbus API is unstable */
	#define DBUS_API_SUBJECT_TO_CHANGE
	#include <dbus/connection.h>
	#endif // NO_QT3_DBUS_SUPPORT

	#include <hal/libhal.h>
#endif // COMPILE_HALBACKEND

namespace SuspendType {
enum SuspendType {
	NotSpecified = 0,
	Freeze,
	Standby,
	Suspend,
	Hibernate,
	HybridSuspend
};
};

// The (singleton) widget that makes/fades the desktop gray.
class KSMShutdownFeedback : public TQWidget
{
	Q_OBJECT

public:
	static void start() { s_pSelf = new KSMShutdownFeedback(); }
	static void stop() { if ( s_pSelf != 0L ) s_pSelf->fadeBack(); delete s_pSelf; s_pSelf = 0L; }
	static KSMShutdownFeedback * self() { return s_pSelf; }

protected:
	~KSMShutdownFeedback() {}

private slots:
	void slotPaintEffect();

private:
	static KSMShutdownFeedback * s_pSelf;
	KSMShutdownFeedback();
	int m_currentY;
	TQPixmap m_root;
	void fadeBack( void );
	float  m_grayOpacity;
	float  m_compensation;
	bool   m_fadeBackwards;
	bool   m_readDelayComplete;
	TQImage m_unfadedImage;
	TQImage m_grayImage;
	TQTime  m_fadeTime;
	int    m_rowsDone;
	KPixmapIO m_pmio;
	bool m_greyImageCreated;
};

// The (singleton) widget that shows either pretty pictures or a black screen during logout
class KSMShutdownIPFeedback : public TQWidget
{
	Q_OBJECT

public:
	static void start() { s_pSelf = new KSMShutdownIPFeedback(); }
	static void showit() { if ( s_pSelf != 0L ) s_pSelf->showNow(); }
	static void stop() { if ( s_pSelf != 0L ) s_pSelf->fadeBack(); delete s_pSelf; s_pSelf = 0L; }
	static KSMShutdownIPFeedback * self() { return s_pSelf; }
	static bool ispainted() { if ( s_pSelf != 0L ) return s_pSelf->m_isPainted; else return false; }

protected:
	~KSMShutdownIPFeedback();
	virtual void resizeEvent(TQResizeEvent* re);

public slots:
	void slotPaintEffect();
	void slotSetBackgroundPixmap(const TQPixmap &);

private:
	/**
	* Asks KDesktop to export the desktop background as a TDESharedPixmap.
	* This method uses DCOP to call KBackgroundIface/setExport(int).
	*/
	void enableExports();

private:
	static KSMShutdownIPFeedback * s_pSelf;
	KSMShutdownIPFeedback();
	int m_currentY;
	TQPixmap m_root;
	void fadeBack( void );
	void showNow( void );
	int m_timeout;
	bool m_isPainted;
	bool m_paintedFromSharedRootPixmap;
	KRootPixmap* m_sharedRootPixmap;
	TQPixmap m_rootPixmap;
	int mPixmapTimeout;
	TQRect m_screenGeometry;
};

// The confirmation dialog
class KSMShutdownDlg : public TQDialog
{
	Q_OBJECT

public:
	static bool confirmShutdown( bool maysd, bool mayrb, TDEApplication::ShutdownType& sdtype, TQString& bopt, int* selection=0 );

public slots:
	void slotLogout();
	void slotHalt();
	void slotReboot();
	void slotReboot(int);
	void slotSuspend();
	void slotHibernate();
	void slotFreeze();
	void slotHybridSuspend();

protected:
	~KSMShutdownDlg();

private:
	KSMShutdownDlg( TQWidget* parent, bool maysd, bool mayrb, TDEApplication::ShutdownType sdtype, int* selection=0 );
	TDEApplication::ShutdownType m_shutdownType;
	TQString m_bootOption;
	TQPopupMenu *targets;
	TQStringList rebootOptions;
#ifdef COMPILE_HALBACKEND
	LibHalContext* m_halCtx;
	DBusConnection *m_dbusConn;
#endif
	bool m_lockOnResume;
	int* m_selection;
};

// The shutdown-in-progress dialog
class KSMShutdownIPDlg : public KSMModalDialog
{
	Q_OBJECT

public:
	static TQWidget* showShutdownIP();

	void showNotificationActionButtons();
	void hideNotificationActionButtons();
	void setNotificationActionButtonsSkipText(TQString text);
	void setProgressBarTotalSteps(int total_steps);
	void setProgressBarProgress(int step);

signals:
	void abortLogoutClicked();
	void skipNotificationClicked();

protected:
	~KSMShutdownIPDlg();

private:
	KSMShutdownIPDlg( TQWidget* parent );

	TQProgressBar *m_progressbar;
};

class KSMDelayedPushButton : public KPushButton
{
  Q_OBJECT

public:

  KSMDelayedPushButton( const KGuiItem &item, TQWidget *parent, const char *name = 0 );
  void setPopup( TQPopupMenu *pop);

private slots:
  void slotTimeout();
  void slotPressed();
  void slotReleased();

private:
  TQPopupMenu *pop;
  TQTimer *popt;
};

class KSMPushButton : public KPushButton
{
  Q_OBJECT

public:

  KSMPushButton( const KGuiItem &item, TQWidget *parent, const char *name = 0 );

protected:
  virtual void keyPressEvent(TQKeyEvent*e);
  virtual void keyReleaseEvent(TQKeyEvent*e);

private:

 bool m_pressed;

};



class FlatButton : public TQToolButton
{
  Q_OBJECT

 public:

  FlatButton( TQWidget *parent = 0, const char *name = 0 );
  ~FlatButton();

 protected:
  virtual void keyPressEvent(TQKeyEvent*e);
  virtual void keyReleaseEvent(TQKeyEvent*e);

 private slots:

 private:
  void init();

  bool m_pressed;
  TQString m_text;
  TQPixmap m_pixmap;

};




class TQLabel;

class  KSMDelayedMessageBox : public TimedLogoutDlg
{
	Q_OBJECT

public:
	KSMDelayedMessageBox( TDEApplication::ShutdownType sdtype, const TQString &bootOption, int confirmDelay );
	static bool showTicker( TDEApplication::ShutdownType sdtype, const TQString &bootOption, int confirmDelay );

protected slots:
	void updateText();

private:
	TQString m_template;
	int m_remaining;
};

#endif