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