// This is the SIP interface definition for QPEApplication.
//
// Copyright (c) 2003
// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk>
// 
// This file is part of PyQt.
// 
// This copy of PyQt 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, or (at your option) any later
// version.
// 
// PyQt is supplied 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
// PyQt; see the file LICENSE.  If not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


// The documentation is in the main documentation file because SIP isn't clever
// enough to handle the resulting %Timeline complexity.


%If (WS_QWS)

class QPEApplication : QApplication
{
%HeaderCode
#include <qpe/qpeapplication.h>
%End

public:
	QPEApplication(int &,char **,Type = GuiClient);
%MemberCode
		// The Python interface is a list of argument strings that is
		// modified.

		PyObject *argvlist;
		int gtype = QApplication::GuiClient;

		if (sipParseArgs(&sipArgsParsed,sipArgs,"L|i",&argvlist,&gtype))
		{
			int argc, nargc;
			char **argv;

			// Convert the list.

			if ((argv = pyArgvToC(argvlist,&argc)) == NULL)
				return NULL;

			// Create it now the arguments are right.

			nargc = argc;

			Py_BEGIN_ALLOW_THREADS
			sipNew = new sipQPEApplication(nargc,argv,(QApplication::Type)gtype);
			Py_END_ALLOW_THREADS

			// Now modify the original list.

			updatePyArgv(argvlist,argc,argv);
		}
%End

	~QPEApplication();
%MemberCode
		// See the comments in ~QApplication() to understand what's
		// being done here.

		QWidgetList *tlw = QApplication::topLevelWidgets();
		QWidgetListIt it(*tlw);
		QWidget *w;

		while ((w = it.current()) != 0)
		{
			sipThisType *sipThis;

			if ((sipThis = sipGetThisWrapper(w,sipClass_QWidget)) != NULL)
				sipResetPyOwned(sipThis);

			++it;
		}

		delete tlw;
%End

%ConvertToSubClassCode
	// The table of Python class objects indexed by their names.  The table
	// must be sorted by name.

	static sipStringTypeClassMap map[] = {
		{sipName_FileSelector,		&sipClass_FileSelector},
		{sipName_MenuButton,		&sipClass_MenuButton},
		{sipName_QPEApplication,	&sipClass_QPEApplication},
		{sipName_QPEMenuBar,		&sipClass_QPEMenuBar},
		{sipName_QPEToolBar,		&sipClass_QPEToolBar},
	};

	sipClass = sipMapStringToClass(sipCpp -> className(),map,
				       sizeof (map)/sizeof (map[0]));
%End
 
	static QString qpeDir();
	static QString documentDir();
	void applyStyle();
	static int defaultRotation();
	static void setDefaultRotation(int);
	static void grabKeyboard();
	static void ungrabKeyboard();

	enum StylusMode {
		LeftOnly,
		RightOnHold
	};

	static void setStylusOperation(QWidget *,StylusMode);
	static StylusMode stylusOperation(QWidget *);

	enum InputMethodHint {
		Normal,
		AlwaysOff,
		AlwaysOn
	};
    
	enum screenSaverHint {
		Disable,
		DisableLightOff,
		DisableSuspend,
		Enable
	};
 
	static void setInputMethodHint(QWidget *,InputMethodHint);
	static InputMethodHint inputMethodHint(QWidget *);

	void showMainWidget(QWidget *,bool = 0);
	void showMainDocumentWidget(QWidget *,bool = 0);

	static void setKeepRunning();
	bool keepRunning() const;

	int exec() /PyName=exec_loop,
		    PreHook=__pyQtPreEventLoopHook__,
		    PostHook=__pyQtPostEventLoopHook__/;

signals:
	void clientMoused();
	void timeChanged();
	void clockChanged(bool);
	void volumeChanged(bool);
	void appMessage(const QCString &,const QByteArray &);
	void weekChanged(bool);
	void dateFormatChanged(DateFormat);
	void flush();
	void reload();

protected:
//	bool qwsEventFilter(QWSEvent *);
//	void internalSetStyle(const QString &);
	void prepareForTermination(bool);
	virtual void restart();
	virtual void shutdown();
	bool eventFilter(QObject *,QEvent *);
	void timerEvent(QTimerEvent *);
	bool keyboardGrabbed() const;
	bool raiseAppropriateWindow();
	virtual void tryQuit();


%C++Code
#include <string.h>


// Convert a Python argv list to a conventional C argc count and argv array.
static char **pyArgvToC(PyObject *argvlist,int *argcp)
{
	int argc;
	char **argv;

	argc = PyList_Size(argvlist);

	// Allocate space for two copies of the argument pointers, plus the
	// terminating NULL.
	if ((argv = (char **)sipMalloc(2 * (argc + 1) * sizeof (char *))) == NULL)
		return NULL;

	// Convert the list.
	for (int a = 0; a < argc; ++a)
	{
		char *arg;

		// Get the argument and allocate memory for it.
		if ((arg = PyString_AsString(PyList_GetItem(argvlist,a))) == NULL ||
		    (argv[a] = (char *)sipMalloc(strlen(arg) + 1)) == NULL)
			return NULL;

		// Copy the argument and save a pointer to it.
		strcpy(argv[a],arg);
		argv[a + argc + 1] = argv[a];
	}

	argv[argc + argc + 1] = argv[argc] = NULL;

	*argcp = argc;

	return argv;
}


// Remove arguments from the Python argv list that have been removed from the
// C argv array.
static void updatePyArgv(PyObject *argvlist,int argc,char **argv)
{
	for (int a = 0, na = 0; a < argc; ++a)
	{
		// See if it was removed.
		if (argv[na] == argv[a + argc + 1])
			++na;
		else
			PyList_SetSlice(argvlist,na,na + 1,NULL);
	}
}
%End

};

%End
