/**********************************************************************
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2006-2014  Georg Rudoy
 *
 * Boost Software License - Version 1.0 - August 17th, 2003
 *
 * Permission is hereby granted, free of charge, to any person or organization
 * obtaining a copy of the software and accompanying documentation covered by
 * this license (the "Software") to use, reproduce, display, distribute,
 * execute, and transmit the Software, and to prepare derivative works of the
 * Software, and to permit third-parties to whom the Software is furnished to
 * do so, all subject to the following:
 *
 * The copyright notices in the Software and this entire statement, including
 * the above license grant, this restriction and the following disclaimer,
 * must be included in all copies of the Software, in whole or in part, and
 * all derivative works of the Software, unless such copies or derivative
 * works are solely in the form of machine-executable object code generated by
 * a source language processor.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **********************************************************************/

#include "modeliterator.h"
#include <QAbstractItemModel>
#include <QtDebug>

namespace LeechCraft
{
namespace Util
{
	ModelIterator::ModelIterator (QAbstractItemModel *model,
			int row, int col, ModelIterator::Direction dir, const QModelIndex& parent)
	: Model_ (model)
	, Parent_ (parent)
	, Row_ (row)
	, Col_ (col)
	, Dir_ (dir)
	{
	}

	ModelIterator& ModelIterator::operator++ ()
	{
		++GetIncrementable ();
		return *this;
	}

	ModelIterator ModelIterator::operator++ (int)
	{
		ModelIterator oldThis (*this);
		++GetIncrementable ();
		return oldThis;
	}

	ModelIterator& ModelIterator::operator-- ()
	{
		--GetIncrementable ();
		return *this;
	}

	ModelIterator ModelIterator::operator-- (int)
	{
		ModelIterator oldThis (*this);
		--GetIncrementable ();
		return oldThis;
	}

	ModelIterator& ModelIterator::operator+= (int diff)
	{
		GetIncrementable () += diff;
		return *this;
	}

	ModelIterator& ModelIterator::operator-= (int diff)
	{
		GetIncrementable () -= diff;
		return *this;
	}

	int ModelIterator::operator- (const ModelIterator& other) const
	{
		return GetIncrementable () - other.GetIncrementable ();
	}

	bool operator== (const ModelIterator& left, const ModelIterator& right)
	{
		return left.Row_ == right.Row_ &&
				left.Col_ == right.Col_ &&
				left.Model_ == right.Model_ &&
				left.Parent_ == right.Parent_;
	}

	bool operator!= (const ModelIterator& left, const ModelIterator& right)
	{
		return !(left == right);
	}

	QModelIndex ModelIterator::operator*() const
	{
		return Model_->index (Row_, Col_, Parent_);
	}

	int ModelIterator::GetRow () const
	{
		return Row_;
	}

	int ModelIterator::GetCol () const
	{
		return Col_;
	}

	int& ModelIterator::GetIncrementable ()
	{
		switch (Dir_)
		{
		case Direction::Rows:
			return Row_;
		case Direction::Cols:
			return Col_;
		}

		qWarning () << Q_FUNC_INFO
				<< "unknown direction";
		return Row_;
	}

	int ModelIterator::GetIncrementable () const
	{
		switch (Dir_)
		{
		case Direction::Rows:
			return Row_;
		case Direction::Cols:
			return Col_;
		}

		qWarning () << Q_FUNC_INFO
				<< "unknown direction";
		return Row_;
	}
}
}
