/*
 * newsscroller.h
 *
 * Copyright (c) 2000, 2001 Frerich Raabe <raabe@kde.org>
 * Copyright (c) 2001 Malte Starostik <malte@kde.org>
 *
 * This program is distributed 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. For licensing and distribution details, check the
 * accompanying file 'COPYING'.
 */
#ifndef NEWSSCROLLER_H
#define NEWSSCROLLER_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "configaccess.h"
#include "newsengine.h"

#include <tqframe.h>
#include <tqptrlist.h>
#include <tqpixmap.h>

class TQTimer;
class Headline;
template <class> class TQPtrList;
typedef TQPtrList<Headline> HeadlineList;

class NewsScroller : public TQFrame
{
	Q_OBJECT
  

	public:
		NewsScroller(TQWidget *, ConfigAccess *, const char * = 0);

		virtual TQSize sizeHint() const;
		virtual TQSizePolicy sizePolicy() const;
	
		// Convenience stuff. Somehow ugly, no?	
		inline bool horizontal() const
		{
			return m_cfg->horizontal(static_cast<ConfigAccess::Direction>(m_cfg->scrollingDirection()));
		}

		inline bool vertical() const
		{
			return m_cfg->vertical(static_cast<ConfigAccess::Direction>(m_cfg->scrollingDirection()));
		}

		inline bool rotated() const
		{
			return m_cfg->rotated(static_cast<ConfigAccess::Direction>(m_cfg->scrollingDirection()));
		}

	public slots:
		void clear();
		void addHeadline(Article::Ptr);
		void reset(bool bSeparatorOnly = false);

	signals:
		void contextMenu();

	protected:
		virtual void enterEvent(TQEvent *);
		virtual void mousePressEvent(TQMouseEvent *);
		virtual void mouseReleaseEvent(TQMouseEvent *);
		virtual void mouseMoveEvent(TQMouseEvent *);
		virtual void wheelEvent(TQWheelEvent *);
		virtual void leaveEvent(TQEvent *);
		virtual void drawContents(TQPainter *);
		virtual void dragEnterEvent( TQDragEnterEvent *);
		virtual void dropEvent(TQDropEvent *);

	protected slots:
		void scroll(int = 1, bool = true);
		void slotTimeout();

	private:
		int scrollWidth() const;
		int scrollHeight() const;
		bool updateActive(const TQPoint &);
		bool isHeadline(const TQString &) const;
		int speedAsInterval( int speed );

	private:
		friend class Headline;
		ConfigAccess *m_cfg;
		TQTimer       *m_scrollTimer;
		mutable HeadlineList m_headlines;
		Headline     *m_activeHeadline;
		TQPixmap      m_separator;
		int          m_offset;
		TQPoint       m_dragPos;
		bool         m_mouseDrag;
		TQString      m_tempHeadline;
		float        m_totalStepping;
		float        m_stepping;
};

#endif // NEWSSCROLLER_H