/*
 * Copyright (C) 2000 by Ian Reinhart Geiser <geiseri@kde.org>
 *
 * Licensed under the Artistic License.
 */

#include "kdcoplistview.h"
#include "kdcoplistview.moc"
#include <kdebug.h>
#include <tqdragobject.h>
#include <tqstringlist.h>
#include <tqregexp.h>


KDCOPListView::KDCOPListView ( TQWidget *parent, const char *name)
    : TDEListView(parent, name)
{
	kdDebug() << "Building new list." << endl;
	setDragEnabled(true);
}


KDCOPListView::~KDCOPListView ()
{

}

TQDragObject *KDCOPListView::dragObject()
{
	kdDebug() << "Drag object called... " << endl;
	if(!currentItem())
		return 0;
	else
		return new TQTextDrag(encode(this->selectedItem()), this);
}

void KDCOPListView::setMode( const TQString &theMode )
{
	mode = theMode;
}

TQString KDCOPListView::encode(TQListViewItem *theCode)
{
	DCOPBrowserItem * item = static_cast<DCOPBrowserItem *>(theCode);

	if (item->type() != DCOPBrowserItem::Function)
	return "";

	DCOPBrowserFunctionItem * fitem =
	static_cast<DCOPBrowserFunctionItem *>(item);

	TQString function = TQString::fromUtf8(fitem->function());
	TQString application = TQString::fromUtf8(fitem->app());
	TQString object = TQString::fromUtf8(fitem->object());

	kdDebug() << function << endl;
	TQString returnType = function.section(' ', 0,0);
	TQString returnCode = "";
	TQString normalisedSignature;
	TQStringList types;
	TQStringList names;

	TQString unNormalisedSignature(function);

	int s = unNormalisedSignature.find(' ');

	if ( s < 0 )
		s = 0;
	else
		s++;

	unNormalisedSignature = unNormalisedSignature.mid(s);

	int left  = unNormalisedSignature.find('(');
	int right = unNormalisedSignature.findRev(')');

	if (-1 == left)
	{
	// Fucked up function signature.
	return "";
	}
	if (left > 0 && left + 1 < right - 1)
	{
		types = TQStringList::split
		(',', unNormalisedSignature.mid(left + 1, right - left - 1));
		for (TQStringList::Iterator it = types.begin(); it != types.end(); ++it)
		{
			(*it) = (*it).stripWhiteSpace();
			int s = (*it).find(' ');
			if (-1 != s)
			{
				names.append((*it).mid(s + 1));
				(*it) = (*it).left(s);
			}
		}
	}

	if ( mode == "C++")
	{
		TQString args;
		for( unsigned int i = 0; i < names.count(); i++)
		{
			args += types[i] + " " + names[i] + ";\n";
		}
		TQString dcopRef = "DCOPRef m_" + application + object
			+ "(\""+ application + "\",\"" + object +"\");\n";

		TQString stringNames = names.join(",");
		TQString stringTypes = types.join(",");
		if( returnType != "void")
			returnType += " return" + returnType + " =";
		else
			returnType = "";
		returnCode = args
			+ dcopRef
			+ returnType
			+ "m_" + application + object
			+ ".call(\"" + unNormalisedSignature.left(left)
			+ "(" + stringTypes + ")\"";
			if(!stringNames.isEmpty())
				returnCode += ", ";
			returnCode += stringNames + ");\n";
	}
	else if (mode == "Shell")
	{
		returnCode = "dcop " + application + " " + object + " "
			+ unNormalisedSignature.left(left) + " " + names.join(" ");
	}
	else if (mode == "Python")
	{
		TQString setup;
		setup = "m_"
			+ application + object
			+ " = dcop.DCOPObject( \""
			+ application + "\",\""
		 	+ object + "\")\n";

		for( unsigned int i = 0; i < names.count(); i++)
		{
			setup += names[i] + " #set value here.\n";
		}
		returnCode = setup
			+ "reply"
			+ returnType
			+ " = m_"
			+ application + object + "."
			+ unNormalisedSignature.left(left)
			+ "(" + names.join(",") + ")\n";
	}
	return returnCode;
}

TQString KDCOPListView::getCurrentCode() const
{
	// fixing warning
	return TQString::null;
}