/*

Dialog class that handles input focus in absence of a wm

Copyright (C) 1997, 1998 Steffen Hansen <hansen@kde.org>
Copyright (C) 2000-2003 Oswald Buddenhagen <ossi@kde.org>


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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

*/

#include "kfdialog.h"
#include "tdmconfig.h"

#include <tdelocale.h>
#include <kpushbutton.h>
#include <kstdguiitem.h>
#include <tdeglobalsettings.h>

#include <tqlabel.h>
#include <tqlayout.h>
#include <tqapplication.h>
#include <tqcursor.h>

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

extern bool has_twin;
extern bool is_themed;

FDialog::FDialog( TQWidget *parent, bool framed )
	: inherited( parent, 0, true, (framed&&has_twin)?0:WX11BypassWM ), winFrame(NULL), m_wmTitle(has_twin)
{
	if (framed) {
		// Signal that we do not want any window controls to be shown at all
		Atom kde_wm_system_modal_notification;
		kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False);
		XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L);
	}

	if (framed) {
		winFrame = new TQFrame( this, 0, TQt::WNoAutoErase );
		if (m_wmTitle)
			winFrame->setFrameStyle( TQFrame::NoFrame );
		else
			winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised );
		winFrame->setLineWidth( 2 );
	} else
		winFrame = 0;

	setCaption(TDM_LOGIN_SCREEN_BASE_TITLE);

	if (framed) {
		if (m_wmTitle) {
			TQSize sh = sizeHint();
			if ((sh.width() > 0) && (sh.height() > 0)) {
				setFixedSize(sh);
			}
		}
	}
}

void
FDialog::resizeEvent( TQResizeEvent *e )
{
	inherited::resizeEvent( e );
	if (winFrame) {
		winFrame->resize( size() );
		winFrame->erase();
		if (m_wmTitle) setFixedSize(sizeHint());
	}
}

void
FDialog::adjustGeometry()
{
	TQDesktopWidget *dsk = tqApp->desktop();

	if (_greeterScreen < 0)
		_greeterScreen = _greeterScreen == -2 ?
			dsk->screenNumber( TQPoint( dsk->width() - 1, 0 ) ) :
			dsk->screenNumber( TQPoint( 0, 0 ) );

	TQRect scr = dsk->screenGeometry( _greeterScreen );
	if (!winFrame)
		setFixedSize( scr.size() );
	else {
		setMaximumSize( scr.size() * .9 );
		adjustSize();
	}

	if (parentWidget())
		return;

	TQRect grt( rect() );
	if (winFrame) {
		unsigned x = 50, y = 50;
		sscanf( _greeterPos, "%u,%u", &x, &y );
		grt.moveCenter( TQPoint( scr.x() + scr.width() * x / 100,
		                        scr.y() + scr.height() * y / 100 ) );
		int di;
		if ((di = scr.right() - grt.right()) < 0)
			grt.moveBy( di, 0 );
		if ((di = scr.left() - grt.left()) > 0)
			grt.moveBy( di, 0 );
		if ((di = scr.bottom() - grt.bottom()) < 0)
			grt.moveBy( 0, di );
		if ((di = scr.top() - grt.top()) > 0)
			grt.moveBy( 0, di );
		setGeometry( grt );
	}

	if (dsk->screenNumber( TQCursor::pos() ) != _greeterScreen)
		TQCursor::setPos( grt.center() );
}

struct WinList {
	struct WinList *next;
	TQWidget *win;
};

int
FDialog::exec()
{
	static WinList *wins;
	WinList *win;

	win = new WinList;
	win->win = this;
	win->next = wins;
	wins = win;
	show();
	setActiveWindow();
	inherited::exec();
	hide();
	wins = win->next;
	delete win;
	if (wins)
		wins->win->setActiveWindow();
	return result();
}

void
FDialog::box( TQWidget *parent, TQMessageBox::Icon type, const TQString &text )
{
	KFMsgBox dlg( parent, type, text.stripWhiteSpace() );
	dlg.exec();
}

KFMsgBox::KFMsgBox( TQWidget *parent, TQMessageBox::Icon type, const TQString &text )
	: inherited( parent, !is_themed )
{
	if (type == TQMessageBox::NoIcon) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE);
	if (type == TQMessageBox::Question) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Question"));
	if (type == TQMessageBox::Information) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Information"));
	if (type == TQMessageBox::Warning) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Warning"));
	if (type == TQMessageBox::Critical) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Error"));

	TQLabel *label1 = new TQLabel( this );
	label1->setPixmap( TQMessageBox::standardIcon( type ) );
	TQLabel *label2 = new TQLabel( text, this );
	TQRect d = TDEGlobalSettings::desktopGeometry(this);
	if ( label2->fontMetrics().size( 0, text).width() > d.width() * 3 / 5) 
		label2->setAlignment(TQt::WordBreak | TQt::AlignAuto );
	KPushButton *button = new KPushButton( KStdGuiItem::ok(), this );
	button->setDefault( true );
	button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) );
	connect( button, TQT_SIGNAL(clicked()), TQT_SLOT(accept()) );

	TQGridLayout *grid = new TQGridLayout( this, 2, 2, 10 );
	grid->addWidget( label1, 0, 0, Qt::AlignCenter );
	grid->addWidget( label2, 0, 1, Qt::AlignCenter );
	grid->addMultiCellWidget( button, 1,1, 0,1, Qt::AlignCenter );
}