+/*************************************************************************************************/
+
+//! A ChatItem for the timestamp column
+class TimestampChatItem : public ChatItem {
+
+public:
+ TimestampChatItem(QAbstractItemModel *model, QGraphicsItem *parent) : ChatItem(column(), model, parent) {}
+ inline ChatLineModel::ColumnType column() const { return ChatLineModel::TimestampColumn; }
+
+};
+
+/*************************************************************************************************/
+
+//! A ChatItem for the sender column
+class SenderChatItem : public ChatItem {
+
+public:
+ SenderChatItem(QAbstractItemModel *model, QGraphicsItem *parent) : ChatItem(column(), model, parent) {}
+ inline ChatLineModel::ColumnType column() const { return ChatLineModel::SenderColumn; }
+
+ virtual void updateLayout();
+};
+
+/*************************************************************************************************/
+
+//! A ChatItem for the contents column
+class ContentsChatItem : public ChatItem {
+
+public:
+ ContentsChatItem(QAbstractItemModel *model, QGraphicsItem *parent);
+ virtual ~ContentsChatItem();
+
+ inline ChatLineModel::ColumnType column() const { return ChatLineModel::ContentsColumn; }
+
+ virtual void clearLayout();
+ virtual void updateLayout();
+ virtual inline bool haveLayout() const { return _layoutData != 0 && layout() != 0; }
+
+protected:
+ virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+ virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+ virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+ virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
+
+ virtual inline QTextLayout *layout() const;
+ virtual void setLayout(QTextLayout *l);
+
+private:
+ struct LayoutData;
+ class WrapColumnFinder;
+
+ qreal computeHeight();
+
+ LayoutData *_layoutData;
+};
+
+struct ContentsChatItem::LayoutData {
+ QTextLayout *layout;
+
+ LayoutData() { layout = 0; }
+ ~LayoutData() { delete layout; }
+};
+
+class ContentsChatItem::WrapColumnFinder {
+public:
+ WrapColumnFinder(ChatItem *parent);
+ ~WrapColumnFinder();
+
+ qint16 nextWrapColumn();
+
+private:
+ ChatItem *item;
+ QTextLayout *layout;
+ QTextLine line;
+ ChatLineModel::WrapList wrapList;
+ qint16 wordidx;
+ qint16 lastwrapcol;
+ qreal lastwrappos;
+ qreal w;
+};
+
+/*************************************************************************************************/
+
+// Avoid circular include deps
+#include "chatline.h"
+int ChatItem::row() const { return static_cast<ChatLine *>(parentItem())->row(); }
+QTextLayout *ContentsChatItem::layout() const { return _layoutData->layout; }
+