// This is the SIP interface definition for TQPEApplication.
//
// Copyright (c) 2007
// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk>
// 
// This file is part of PyTQt.
// 
// This copy of PyTQt 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.
// 
// PyTQt 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
// PyTQt; 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 TQPEApplication : TQApplication
{
%TypeHeaderCode
#include <tqpe/qpeapplication.h>
#include <tqwidgetlist.h>
%End

public:
	TQPEApplication(SIP_PYLIST,Type=GuiClient) [(int &,char **,Type=GuiClient)];
%MethodCode
		// The Python interface is a list of argument strings that is
		// modified.

		int argc;
		char **argv;

		// Convert the list.
		if ((argv = pyArgvToC(a0,&argc)) == NULL)
			sipIsErr = 1;
		else
		{
			// Create it now the arguments are right.
			int nargc = argc;

			Py_BEGIN_ALLOW_THREADS
			sipCpp = new sipTQPEApplication(nargc,argv,(TQApplication::Type)a1);
			Py_END_ALLOW_THREADS

			// Now modify the original list.
			updatePyArgv(a0,argc,argv);
		}
%End

	~TQPEApplication();
%MethodCode
		// See the comments in ~TQApplication() to understand what's
		// being done here.

		TQWidgetList *tlw = TQApplication::topLevelWidgets();
		TQWidgetListIt it(*tlw);
		TQWidget *w;

		while ((w = it.current()) != 0)
		{
			PyObject *sw;

			if ((sw = sipGetWrapper(w,sipClass_TQWidget)) != NULL)
				sipTransferTo(sw,NULL);

			++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_TQPEApplication,	&sipClass_TQPEApplication},
		{sipName_TQPEMenuBar,		&sipClass_TQPEMenuBar},
		{sipName_TQPEToolBar,		&sipClass_TQPEToolBar},
	};

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

	enum StylusMode {
		LeftOnly,
		RightOnHold
	};

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

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

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

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

	int exec() /PyName=exec_loop, ReleaseGIL,
		    PreHook=__pyTQtPreEventLoopHook__,
		    PostHook=__pyTQtPostEventLoopHook__/;

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

protected:
//	bool qwsEventFilter(TQWSEvent *);
//	void internalSetStyle(const TQString &);
	void prepareForTermination(bool);
	virtual void restart();
	virtual void shutdown();
	bool eventFilter(TQObject *,TQEvent *);
	void timerEvent(TQTimerEvent *);
	bool keyboardGrabbed() const;
	bool raiseAppropriateWindow();
	virtual void tryQuit();


%TypeCode
#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 = (char *)sipBytes_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
