예제 #1
0
 static void AddAlternativeText(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart)
 {
     if (!String.IsNullOrEmpty(imgPart.AlternativeText))
     {
         buffer.Insert(ref iter, imgPart.AlternativeText);
     }
 }
예제 #2
0
        void AddEmoji(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart, string shortName)
        {
            var unicode = Emojione.ShortnameToUnicode(shortName);

            if (unicode == null)
            {
                AddAlternativeText(buffer, ref iter, imgPart);
                return;
            }

            // A mark here serves two pusposes. One is to allow us to apply the
            // tag across the pixbuf. It also lets us know later where to put
            // the pixbuf if we need to load it from the network
            var mark = new Gtk.TextMark(null, true);

            buffer.AddMark(mark, iter);

            var    emojiName = unicode + ".png";
            string emojiPath;

            if (EmojiCache.TryGetIcon("emojione", emojiName, out emojiPath))
            {
                var emojiFile = new FileInfo(emojiPath);
                if (emojiFile.Exists && emojiFile.Length > 0)
                {
                    AddEmoji(buffer, ref iter, imgPart, shortName, mark, emojiPath);
                }
                else
                {
                    AddAlternativeText(buffer, ref iter, imgPart);
                }

                return;
            }

            var emojiUrl = Emojione.UnicodeToUrl(unicode);

            EmojiCache.BeginDownloadFile("emojione", emojiName, emojiUrl,
                                         (path) => {
                GLib.Idle.Add(delegate {
                    var markIter = buffer.GetIterAtMark(mark);
                    AddEmoji(buffer, ref markIter, imgPart, shortName, mark, path);
                    return(false);
                });
            },
                                         (ex) => {
                GLib.Idle.Add(delegate {
                    var markIter = buffer.GetIterAtMark(mark);
                    buffer.DeleteMark(mark);
                    AddAlternativeText(buffer, ref markIter, imgPart);
                    return(false);
                });
            }
                                         );
        }
예제 #3
0
        public MessageModel ToMessage()
        {
            var msg = new MessageModel()
            {
                MessageType = this.MessageType,
                TimeStamp   = this.TimeStamp
            };

            foreach (var msgPart in MessageParts)
            {
                MessagePartModel part = null;
                switch (msgPart.Type)
                {
                case "Text":
                    var textPart = new TextMessagePartModel()
                    {
                        ForegroundColor = msgPart.ForegroundColor,
                        BackgroundColor = msgPart.BackgroundColor,
                        Underline       = msgPart.Underline,
                        Bold            = msgPart.Bold,
                        Italic          = msgPart.Italic,
                        Text            = msgPart.Text
                    };
                    part = textPart;
                    break;

                case "URL":
                    var urlPart = new UrlMessagePartModel()
                    {
                        Url  = msgPart.Url,
                        Text = msgPart.Text
                    };
                    part = urlPart;
                    break;

                case "Image":
                    var imagePart = new ImageMessagePartModel()
                    {
                        ImageFileName   = msgPart.ImageFileName,
                        AlternativeText = msgPart.AlternativeText
                    };
                    part = imagePart;
                    break;
                }
                if (part == null)
                {
                    continue;
                }
                part.IsHighlight = msgPart.IsHighlight;
                msg.MessageParts.Add(part);
            }
            return(msg);
        }
예제 #4
0
        void AddEmoji(Gtk.TextBuffer buffer, ref Gtk.TextIter iter,
                      ImageMessagePartModel imgPart, string shortName,
                      Gtk.TextMark emojiMark, string imagePath)
        {
            int width, height;
            int descent;

            using (var layout = CreatePangoLayout(null)) {
                layout.GetPixelSize(out width, out height);
                descent = layout.Context.GetMetrics(layout.FontDescription, null).Descent;
            }

            Gdk.Pixbuf emojiPixBuf;
            try {
                emojiPixBuf = new Gdk.Pixbuf(imagePath, -1, height);
            } catch (Exception ex) {
#if LOG4NET
                _Logger.ErrorFormat(
                    "AddEmoji(): error loading " +
                    "image file: '{0}' " +
                    "emoji: '{1}' into Gdk.Pixbuf(), " +
                    "Exception: {2}",
                    imagePath, shortName, ex
                    );
#endif

                // delete the broken image file, maybe after the
                // next download this will be a valid image
                File.Delete(imagePath);

                // show alternative text as fallback instead
                buffer.DeleteMark(emojiMark);
                AddAlternativeText(buffer, ref iter, imgPart);
                return;
            }

            buffer.InsertPixbuf(ref iter, emojiPixBuf);
            var beforeIter = buffer.GetIterAtMark(emojiMark);
            var emojiTag   = new EmojiTag(emojiMark, imagePath)
            {
                Rise = -descent
            };
            _MessageTextTagTable.Add(emojiTag);
            buffer.ApplyTag(emojiTag, beforeIter, iter);
        }
예제 #5
0
        private void InsertToBuffer(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgpart)
        {
            Uri    uri    = null;
            string scheme = null;

            try {
                uri    = new Uri(imgpart.ImageFileName);
                scheme = uri.Scheme;
            } catch (UriFormatException) {
                AddAlternativeText(buffer, ref iter, imgpart);
            }
            switch (scheme)
            {
            case "smuxi-emoji":
                var shortName = uri.Host;
                AddEmoji(buffer, ref iter, imgpart, shortName);
                break;

            default:
                AddAlternativeText(buffer, ref iter, imgpart);
                break;
            }
        }
예제 #6
0
        void AddEmoji(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart, string shortName)
        {
            var unicode = Emojione.ShortnameToUnicode(shortName);

            if (unicode == null)
            {
                AddAlternativeText(buffer, ref iter, imgPart);
                return;
            }

            int width, height;
            int descent;

            using (var layout = CreatePangoLayout(null)) {
                layout.GetPixelSize(out width, out height);
                descent = layout.Context.GetMetrics(layout.FontDescription, null).Descent;
            }

            // A mark here serves two pusposes. One is to allow us to apply the
            // tag across the pixbuf. It also lets us know later where to put
            // the pixbuf if we need to load it from the network
            var mark = new Gtk.TextMark(null, true);

            buffer.AddMark(mark, iter);

            var    emojiName = unicode + ".png";
            string emojiPath;

            if (EmojiCache.TryGetIcon("emojione", emojiName, out emojiPath))
            {
                var emojiFile = new FileInfo(emojiPath);
                if (emojiFile.Exists && emojiFile.Length > 0)
                {
                    var pix = new Gdk.Pixbuf(emojiPath, -1, height);
                    buffer.InsertPixbuf(ref iter, pix);
                    var beforeIter = buffer.GetIterAtMark(mark);
                    var imgTag     = new EmojiTag(mark, emojiFile.FullName);
                    imgTag.Rise = -descent;
                    _MessageTextTagTable.Add(imgTag);
                    buffer.ApplyTag(imgTag, beforeIter, iter);
                }
                else
                {
                    AddAlternativeText(buffer, ref iter, imgPart);
                }

                return;
            }

            var emojiUrl = Emojione.UnicodeToUrl(unicode);

            EmojiCache.BeginDownloadFile("emojione", emojiName, emojiUrl,
                                         (path) => {
                GLib.Idle.Add(delegate {
                    var afterIter = buffer.GetIterAtMark(mark);
                    buffer.InsertPixbuf(ref afterIter, new Gdk.Pixbuf(path, -1, height));
                    var beforeIter = buffer.GetIterAtMark(mark);
                    var emojiTag   = new EmojiTag(mark, path);
                    _MessageTextTagTable.Add(emojiTag);
                    emojiTag.Rise = -descent;
                    buffer.ApplyTag(emojiTag, beforeIter, afterIter);
                    return(false);
                });
            },
                                         (ex) => {
                GLib.Idle.Add(delegate {
                    var markIter = buffer.GetIterAtMark(mark);
                    buffer.DeleteMark(mark);
                    AddAlternativeText(buffer, ref markIter, imgPart);
                    return(false);
                });
            }
                                         );
        }
예제 #7
0
 public virtual MessageModel ToMessage()
 {
     var msg = new MessageModel() {
         MessageType = this.MessageType,
         TimeStamp = this.TimeStamp
     };
     foreach (var msgPart in MessageParts) {
         MessagePartModel part = null;
         switch (msgPart.Type) {
             case "Text":
                 var textPart = new TextMessagePartModel() {
                     ForegroundColor = msgPart.ForegroundColor,
                     BackgroundColor = msgPart.BackgroundColor,
                     Underline = msgPart.Underline,
                     Bold = msgPart.Bold,
                     Italic = msgPart.Italic,
                     Text = msgPart.Text
                 };
                 part = textPart;
                 break;
             case "URL":
                 var urlPart = new UrlMessagePartModel() {
                     Url = msgPart.Url,
                     Text = msgPart.Text
                 };
                 part = urlPart;
                 break;
             case "Image":
                 var imagePart = new ImageMessagePartModel() {
                     ImageFileName = msgPart.ImageFileName,
                     AlternativeText = msgPart.AlternativeText
                 };
                 part = imagePart;
                 break;
         }
         if (part == null) {
             continue;
         }
         part.IsHighlight = msgPart.IsHighlight;
         msg.MessageParts.Add(part);
     }
     return msg;
 }