//
// C++ Implementation:
//
// Description:
//
//
// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
//
// Copyright: See COPYING file that comes with this distribution
//
//


#include "kmfprotocollistview.h"

// QT includes
#include <tqlistview.h>
#include <tqcheckbox.h>
#include <tqspinbox.h>
#include <tqcombobox.h>
#include <tqlabel.h>
#include <tqlayout.h>
#include <tqgroupbox.h>
#include <tqwidgetstack.h>
#include <tqtextedit.h>
#include <tqtimer.h>


// KDE includes
#include <kdebug.h>
#include <klocale.h>
#include <klistview.h>
#include <kcombobox.h>
#include <kpopupmenu.h>
#include <kiconloader.h>
#include <kinputdialog.h>
#include <knuminput.h>

// Project includes
#include "../core/kmfprotocolcategory.h"
#include "../core/kmfprotocol.h"
#include "../core/kmfprotocollibrary.h"
#include "../core/kmfprotocolusage.h"
#include "../core/kmfnetzone.h"
#include "../core/kmfnethost.h"
#include "../kmfwidgets/kmflistviewitem.h"
#include "../kmfwidgets/kmfchecklistitem.h"
namespace KMF {
KMFProtocolListView::KMFProtocolListView ( TQWidget* parent, const char* name, WFlags fl )
		: KMyFirewallProtocolListView ( parent,name,fl ) {
	m_reloading = false;
	loadProtocols();
	connect( m_lv_protocols, TQT_SIGNAL( pressed( TQListViewItem* ) ),
		this, TQT_SLOT( slotNewProtocolSelected( TQListViewItem* ) ) );
	
}

KMFProtocolListView::~KMFProtocolListView() {}

/*$SPECIALIZATION$*/
void KMFProtocolListView::setHost( KMFNetHost* host ) {
	setEnabled( true );
	
 	TQValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols();
	TQValueList<KMFProtocol*>::iterator it;
	for( it = allProts.begin(); it != allProts.end(); ++it ) {
/*	TQPtrListIterator<KMFProtocol> it( *KMFProtocol::protocolLibrary() );
	while ( it.current() ) {*/
		KMFProtocol * prot = *it;
		TQListViewItem *qitem = m_lv_protocols->findItem( prot->name(), 0 );
		if ( ! qitem ) {
			kdDebug() << "No item found for protocol: " << prot->name() << endl;
		}
		
		KMFCheckListItem *item = dynamic_cast<KMFCheckListItem*>( qitem );
		if ( ! item ) {
			kdDebug() << "Item is no KMFCheckListItem" << endl;
		}
		
		if ( host->findProtocolUsageByProtocolUuid( prot->uuid() ) ) {
			item->setOn( true );
			item->setEnabled( true );
		}
		if ( host->protocolInherited( prot->uuid() ) ) {
			item->setOn( true );
			item->setEnabled( false );
		}
		if ( ! host->findProtocolUsageByProtocolUuid( prot->uuid() )  && ! host->protocolInherited( prot->uuid() ) ) {
			item->setOn( false );
			item->setEnabled( true );
		}
	}
}
void KMFProtocolListView::setZone( KMFNetZone* zone ) {
	setEnabled( true );
	TQValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols();
	TQValueList<KMFProtocol*>::iterator it;
	for( it = allProts.begin(); it != allProts.end(); ++it ) {
		KMFProtocol * prot = *it;
		TQListViewItem *qitem = m_lv_protocols->findItem( prot->name(), 0 );
		if ( ! qitem ) {
			kdDebug() << "No item found for protocol: " << prot->name() << endl;
		}
		
		KMFCheckListItem *item = dynamic_cast<KMFCheckListItem*>( qitem );
		if ( ! item ) {
			kdDebug() << "Item is no KMFCheckListItem" << endl;
		}
		
		if ( zone->findProtocolUsageByProtocolUuid( prot->uuid() ) ) {
			item->setOn( true );
			item->setEnabled( true );
		}
		if ( zone->protocolInherited( prot->uuid() ) ) {
			item->setOn( true );
			item->setEnabled( false );
		}
		if ( 	! zone->findProtocolUsageByProtocolUuid( prot->uuid() )  && 
				! zone->protocolInherited( prot->uuid() ) ) {
			item->setOn( false );
			item->setEnabled( true );
		}
	}
}

void KMFProtocolListView::loadProtocols() {
	kdDebug() << "KMFProtocolListView::loadProtocols(" << endl;
	
	m_reloading = true;
	TQListViewItemIterator listViewIt( m_lv_protocols );
	while ( listViewIt.current() ) {
		TQListViewItem * qitem = listViewIt.current();
		++listViewIt;
		KMFCheckListItem * item = 0;
		item = dynamic_cast<KMFCheckListItem*> ( qitem );
		if( item && item->protocolUsage() ) {
			item->protocolUsage()->deleteLater();
		}
		
	}
	m_lv_protocols->clear();
	
	
	setEnabled( false );
	TQValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols();
	TQValueList<KMFProtocol*>::iterator it;
	for( it = allProts.begin(); it != allProts.end(); ++it ) {
		KMFProtocol * prot = *it;
/*		disconnect( prot, TQT_SIGNAL( destroyed( TQObject* ) ),
			this, TQT_SLOT( slotOnProtocolDeleted( TQObject* ) ) );
		connect( prot, TQT_SIGNAL( destroyed( TQObject* ) ),
			this, TQT_SLOT( slotOnProtocolDeleted( TQObject* ) ) );*/
		
		KMFProtocolUsage *protUsage = prot->createUsage();
		protUsage->setProtocol( prot );
		
			

		
		TQString cat = prot->category()->name();
		TQListViewItem *parentItem = m_lv_protocols->findItem( cat, 0 );
		
		if ( ! parentItem ) {
			KMFListViewItem *newParentItem = new KMFListViewItem( m_lv_protocols, 0, prot->category() );
			newParentItem->setText( 0, cat );
			newParentItem->loadNetfilterObject( prot->category() );
			newParentItem->setOpen( true );
			parentItem = newParentItem;
		}
		
		KMFCheckListItem *item = new KMFCheckListItem( parentItem, 0 , prot->name() , TQCheckListItem::CheckBox, protUsage );
		item->setText( 0, prot->name() );
		// item->setText( 1, prot->uuid().toString() );
	}
	m_reloading = false;
}

void KMFProtocolListView::slotOnProtocolDeleted( TQObject* ) {
	if ( m_reloading ) {
		return;
	}
	// loadProtocols();
}

void KMFProtocolListView::slotNewProtocolSelected( TQListViewItem* qitem ) {
	if ( KMFCheckListItem * item = dynamic_cast<KMFCheckListItem*> ( qitem ) ) {
		emit sigProtocolClicked( item->protocolUsage(), item->isOn() );
	} else if ( KMFListViewItem * item = dynamic_cast<KMFListViewItem*> ( qitem ) ){
		emit sigProtocolCategoryClicked( item->protocolCategory() );
	}
}

}


#include "kmfprotocollistview.moc"

