1using Gee;
2using Gtk;
3
4using Xmpp;
5using Dino.Entities;
6
7namespace Dino.Ui.ConversationSummary {
8
9public class ContentProvider : ContentItemCollection, Object {
10
11    private StreamInteractor stream_interactor;
12    private Conversation? current_conversation;
13    private Plugins.ConversationItemCollection? item_collection;
14
15    public ContentProvider(StreamInteractor stream_interactor) {
16        this.stream_interactor = stream_interactor;
17    }
18
19    public void init(Plugins.ConversationItemCollection item_collection, Conversation conversation, Plugins.WidgetType type) {
20        if (current_conversation != null) {
21            stream_interactor.get_module(ContentItemStore.IDENTITY).uninit(current_conversation, this);
22        }
23        current_conversation = conversation;
24        this.item_collection = item_collection;
25        stream_interactor.get_module(ContentItemStore.IDENTITY).init(conversation, this);
26    }
27
28    public void insert_item(ContentItem item) {
29        item_collection.insert_item(create_content_meta_item(item));
30    }
31
32    public void remove_item(ContentItem item) { }
33
34
35    public Gee.List<ContentMetaItem> populate_latest(Conversation conversation, int n) {
36        Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_n_latest(conversation, n);
37        Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
38        foreach (ContentItem item in items) {
39            ret.add(create_content_meta_item(item));
40        }
41        return ret;
42    }
43
44    public Gee.List<ContentMetaItem> populate_before(Conversation conversation, ContentItem before_item, int n) {
45        Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
46        Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_before(conversation, before_item, n);
47        foreach (ContentItem item in items) {
48            ret.add(create_content_meta_item(item));
49        }
50        return ret;
51    }
52
53    public Gee.List<ContentMetaItem> populate_after(Conversation conversation, ContentItem after_item, int n) {
54        Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
55        Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_after(conversation, after_item, n);
56        foreach (ContentItem item in items) {
57            ret.add(create_content_meta_item(item));
58        }
59        return ret;
60    }
61
62    public ContentMetaItem get_content_meta_item(ContentItem content_item) {
63        return create_content_meta_item(content_item);
64    }
65
66    private ContentMetaItem create_content_meta_item(ContentItem content_item) {
67        if (content_item.type_ == MessageItem.TYPE) {
68            return new MessageMetaItem(content_item, stream_interactor);
69        } else if (content_item.type_ == FileItem.TYPE) {
70            return new FileMetaItem(content_item, stream_interactor);
71        }
72        return null;
73    }
74}
75
76public abstract class ContentMetaItem : Plugins.MetaConversationItem {
77
78    public ContentItem content_item;
79
80    protected ContentMetaItem(ContentItem content_item) {
81        this.jid = content_item.jid;
82        this.sort_time = content_item.sort_time;
83        this.seccondary_sort_indicator = (long) content_item.display_time.to_unix();
84        this.tertiary_sort_indicator = content_item.id;
85        this.display_time = content_item.display_time;
86        this.encryption = content_item.encryption;
87        this.mark = content_item.mark;
88
89        content_item.bind_property("mark", this, "mark");
90
91        this.can_merge = true;
92        this.requires_avatar = true;
93        this.requires_header = true;
94
95        this.content_item = content_item;
96    }
97}
98
99}
100