Esempio n. 1
0
        public void AddMessage(MessageModel msg, bool addLinebreak)
        {
            Trace.Call(msg, addLinebreak);

            if (msg == null)
            {
                throw new ArgumentNullException("msg");
            }

            var buffer = Buffer;
            var iter   = buffer.EndIter;

            Gdk.Color bgColor = DefaultAttributes.Appearance.BgColor;
            if (_ThemeSettings.BackgroundColor != null)
            {
                bgColor = _ThemeSettings.BackgroundColor.Value;
            }
            TextColor bgTextColor = ColorConverter.GetTextColor(bgColor);

            if (_ShowTimestamps)
            {
                var msgTimeStamp = msg.TimeStamp.ToLocalTime();
                if (_LastMessage != null)
                {
                    var    lastMsgTimeStamp = _LastMessage.TimeStamp.ToLocalTime();
                    var    span             = msgTimeStamp.Date - lastMsgTimeStamp.Date;
                    string dayLine          = null;
                    if (span.Days > 1)
                    {
                        dayLine = String.Format(
                            "-!- " + _("Day changed from {0} to {1}"),
                            lastMsgTimeStamp.ToShortDateString(),
                            msgTimeStamp.ToShortDateString()
                            );
                    }
                    else if (span.Days > 0)
                    {
                        dayLine = String.Format(
                            "-!- " + _("Day changed to {0}"),
                            msgTimeStamp.ToLongDateString()
                            );
                    }

                    if (dayLine != null)
                    {
                        buffer.Insert(ref iter, dayLine + "\n");
                    }
                }

                string timestamp = null;
                try {
                    string format = (string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"];
                    if (!String.IsNullOrEmpty(format))
                    {
                        timestamp = msgTimeStamp.ToString(format);
                    }
                } catch (FormatException e) {
                    timestamp = "Timestamp Format ERROR: " + e.Message;
                }

                if (timestamp != null)
                {
                    timestamp = String.Format("{0} ", timestamp);
                    if (msg.MessageType == MessageType.Event)
                    {
                        // get best contrast for the event font color
                        Gtk.TextTag eventTag       = _MessageTextTagTable.Lookup("event");
                        Gdk.Color   eventColor     = eventTag.ForegroundGdk;
                        TextColor   eventTextColor = TextColorTools.GetBestTextColor(
                            ColorConverter.GetTextColor(eventColor),
                            bgTextColor,
                            TextColorContrast.High
                            );
                        eventTag.ForegroundGdk = ColorConverter.GetGdkColor(
                            eventTextColor
                            );
                        buffer.InsertWithTagsByName(ref iter, timestamp, "event");
                    }
                    else
                    {
                        buffer.Insert(ref iter, timestamp);
                    }
                }
            }

            bool hasHighlight = false;

            foreach (MessagePartModel msgPart in msg.MessageParts)
            {
                // supposed to be used only in a ChatView
                if (msgPart.IsHighlight)
                {
                    hasHighlight = true;
                }

                // TODO: implement all types
                if (msgPart is UrlMessagePartModel)
                {
                    var urlPart = (UrlMessagePartModel)msgPart;
                    // HACK: the engine should set a color for us!
                    var linkStyleTag = _MessageTextTagTable.Lookup("link");
                    var linkColor    = ColorConverter.GetTextColor(
                        linkStyleTag.ForegroundGdk
                        );
                    linkColor = TextColorTools.GetBestTextColor(
                        linkColor, bgTextColor
                        );
                    var linkText = urlPart.Text ?? urlPart.Url;

                    var url = urlPart.Url;
                    // HACK: assume http if no protocol/scheme was specified
                    if (urlPart.Protocol == UrlProtocol.None ||
                        !Regex.IsMatch(url, @"^[a-zA-Z0-9\-]+:"))
                    {
                        url = String.Format("http://{0}", url);
                    }
                    Uri uri;
                    try {
                        uri = new Uri(url);
                    } catch (UriFormatException ex) {
#if LOG4NET
                        _Logger.Error("AddMessage(): Invalid URL: " + url, ex);
#endif
                        buffer.Insert(ref iter, linkText);
                        continue;
                    }

                    var linkTag = new LinkTag(uri);
                    linkTag.ForegroundGdk = ColorConverter.GetGdkColor(linkColor);
                    linkTag.TextEvent    += OnLinkTagTextEvent;
                    _MessageTextTagTable.Add(linkTag);
                    buffer.InsertWithTags(ref iter, linkText, linkStyleTag, linkTag);
                }
                else if (msgPart is TextMessagePartModel)
                {
                    TextMessagePartModel fmsgti = (TextMessagePartModel)msgPart;
                    List <string>        tags   = new List <string>();
                    if (fmsgti.ForegroundColor != TextColor.None)
                    {
                        var bg = bgTextColor;
                        if (fmsgti.BackgroundColor != TextColor.None)
                        {
                            bg = fmsgti.BackgroundColor;
                        }
                        TextColor color = TextColorTools.GetBestTextColor(
                            fmsgti.ForegroundColor, bg
                            );
                        //Console.WriteLine("GetBestTextColor({0}, {1}): {2}",  fmsgti.ForegroundColor, bgTextColor, color);
                        string tagname = GetTextTagName(color, null);
                        //string tagname = _GetTextTagName(fmsgti.ForegroundColor, null);
                        tags.Add(tagname);
                    }
                    if (fmsgti.BackgroundColor != TextColor.None)
                    {
                        // TODO: get this from ChatView
                        string tagname = GetTextTagName(null, fmsgti.BackgroundColor);
                        tags.Add(tagname);
                    }
                    if (fmsgti.Underline)
                    {
#if LOG4NET
                        _Logger.Debug("AddMessage(): fmsgti.Underline is true");
#endif
                        tags.Add("underline");
                    }
                    if (fmsgti.Bold)
                    {
#if LOG4NET
                        _Logger.Debug("AddMessage(): fmsgti.Bold is true");
#endif
                        tags.Add("bold");
                    }
                    if (fmsgti.Italic)
                    {
#if LOG4NET
                        _Logger.Debug("AddMessage(): fmsgti.Italic is true");
#endif
                        tags.Add("italic");
                    }
                    if (msg.MessageType == MessageType.Event &&
                        fmsgti.ForegroundColor == TextColor.None)
                    {
                        // only mark parts that don't have a color set
                        tags.Add("event");
                    }

                    if (tags.Count > 0)
                    {
                        buffer.InsertWithTagsByName(ref iter, fmsgti.Text, tags.ToArray());
                    }
                    else
                    {
                        buffer.Insert(ref iter, fmsgti.Text);
                    }
                }
            }
            if (addLinebreak)
            {
                buffer.Insert(ref iter, "\n");
            }

            CheckBufferSize();

            // HACK: force a redraw of the widget, as for some reason
            // GTK+ 2.17.6 is not redrawing some lines we add here, especially
            // for local messages. See:
            // http://projects.qnetp.net/issues/show/185
            QueueDraw();

            if (MessageAdded != null)
            {
                MessageAdded(this, new MessageTextViewMessageAddedEventArgs(msg));
            }

            if (hasHighlight)
            {
                if (MessageHighlighted != null)
                {
                    MessageHighlighted(this, new MessageTextViewMessageHighlightedEventArgs(msg));
                }
            }

            _LastMessage = msg;
        }
Esempio n. 2
0
        public static string ToMarkup(MessageModel msg, Gdk.Color?bgColor)
        {
            if (msg == null)
            {
                return(String.Empty);
            }

            /* Pango Markup doesn't support hyperlinks:
             *     (smuxi-frontend-gnome:9824): Gtk-WARNING **: Failed to set
             *     text from markup due to error parsing markup: Unknown tag
             *     'a' on line 1 char 59
             *
             * For this reason, for UrlMessagePartModels, we'll render them as
             * plaintext.
             *
             * Here we loop over the MessageModel to build up a proper Pango
             * Markup.
             *
             * The colour codes/values have been taken from BuildTagTable(), in
             * MessageTextView.cs.
             *
             * Documentation for Pango Markup is located at:
             *    http://library.gnome.org/devel/pango/unstable/PangoMarkupFormat.html
             */
            StringBuilder markup = new StringBuilder();

            foreach (MessagePartModel msgPart in msg.MessageParts)
            {
                if (msgPart is UrlMessagePartModel)
                {
                    UrlMessagePartModel url = (UrlMessagePartModel)msgPart;

                    string str = GLib.Markup.EscapeText(url.Text);

                    Gdk.Color gdkColor = Gdk.Color.Zero;
                    Gdk.Color.Parse("darkblue", ref gdkColor);
                    TextColor urlColor = ColorConverter.GetTextColor(gdkColor);
                    if (bgColor != null)
                    {
                        // we have a bg color so lets try to get a url color
                        // with a good contrast
                        urlColor = TextColorTools.GetBestTextColor(
                            urlColor, ColorConverter.GetTextColor(bgColor.Value)
                            );
                    }

                    str = String.Format("<span color='#{0}'><u>{1}</u></span>",
                                        urlColor.HexCode,
                                        str);
                    markup.Append(str);
                }
                else if (msgPart is TextMessagePartModel)
                {
                    TextMessagePartModel text = (TextMessagePartModel)msgPart;
                    List <string>        tags = new List <string>();

                    string str = GLib.Markup.EscapeText(text.Text);
                    if (text.ForegroundColor != TextColor.None)
                    {
                        TextColor fgColor;
                        if (bgColor == null)
                        {
                            fgColor = text.ForegroundColor;
                        }
                        else
                        {
                            var bgTextColor = ColorConverter.GetTextColor(
                                bgColor.Value
                                );
                            fgColor = TextColorTools.GetBestTextColor(
                                text.ForegroundColor, bgTextColor
                                );
                        }
                        tags.Add(String.Format("span color='#{0}'",
                                               fgColor.HexCode));
                    }

                    if (text.Underline)
                    {
                        tags.Add("u");
                    }
                    if (text.Bold)
                    {
                        tags.Add("b");
                    }
                    if (text.Italic)
                    {
                        tags.Add("i");
                    }

                    if (tags.Count > 0)
                    {
                        tags.Reverse();
                        foreach (string tag in tags)
                        {
                            string endTag;
                            if (tag.Contains(" "))
                            {
                                // tag contains attributes, only get tag name
                                endTag = tag.Split(' ')[0];
                            }
                            else
                            {
                                endTag = tag;
                            }
                            str = String.Format("<{0}>{1}</{2}>",
                                                tag, str, endTag);
                        }
                    }

                    markup.Append(str);
                }
            }

            return(markup.ToString());
        }
Esempio n. 3
0
        void WriteToConfig()
        {
            Trace.Call();

            var userConf = Frontend.UserConfig;
            var conf     = new Dictionary <string, object>();

            // manually handled widgets
            if (f_ProxySwitch.Active)
            {
                Gtk.TreeIter iter;
                f_ProxyTypeComboBox.GetActiveIter(out iter);
                var proxyType = (ProxyType)f_ProxyTypeComboBox.Model.GetValue(iter, 0);
                conf["Connection/ProxyType"] = proxyType.ToString();
            }
            else
            {
                conf["Connection/ProxyType"] = ProxyType.None.ToString();
            }

            conf["Interface/Notebook/StripColors"]      = !f_ShowColorsCheckButton.Active;
            conf["Interface/Notebook/StripFormattings"] = !f_ShowFormattingsCheckButton.Active;

            if (f_CustomFontRadioButton.Active)
            {
                string fontName = f_FontButton.FontName;
                Pango.FontDescription fontDescription = Pango.FontDescription.FromString(fontName);
                conf["Interface/Chat/FontFamily"] = fontDescription.Family;
                conf["Interface/Chat/FontStyle"]  = fontDescription.Weight + " " + fontDescription.Style;
                conf["Interface/Chat/FontSize"]   = fontDescription.Size / 1024;
            }
            else
            {
                conf["Interface/Chat/FontFamily"] = String.Empty;
                conf["Interface/Chat/FontStyle"]  = String.Empty;
                conf["Interface/Chat/FontSize"]   = 0;
            }

            // mapped widgets
            foreach (var confEntry in ConfigKeyToWidgetNameMap)
            {
                var confKey = confEntry.Key;
                // get type from config value
                var confValue = userConf[confKey];
                var widgetId  = confEntry.Value;
                var widget    = Builder.GetObject(widgetId);
                if (widget is Gtk.SpinButton)
                {
                    var spinButton = (Gtk.SpinButton)widget;
                    if (confValue is Int32)
                    {
                        conf[confKey] = spinButton.ValueAsInt;
                    }
                }
                else if (widget is Gtk.ColorButton)
                {
                    var colorButton = (Gtk.ColorButton)widget;
                    if (confValue is string)
                    {
                        conf[confKey] = ColorConverter.GetHexCode(colorButton.Color);
                    }
                }
                else if (widget is Gtk.CheckButton)
                {
                    var checkButton = (Gtk.CheckButton)widget;
                    if (confValue is bool)
                    {
                        conf[confKey] = checkButton.Active;
                    }
#if GTK_SHARP_3
                }
                else if (widget is Gtk.Switch)
                {
                    var @switch = (Gtk.Switch)widget;
                    if (confValue is bool)
                    {
                        conf[confKey] = @switch.Active;
                    }
#endif
                }
                else if (widget is Gtk.TextView)
                {
                    var textView = (Gtk.TextView)widget;
                    if (confValue is string[])
                    {
                        conf[confKey] = textView.Buffer.Text.Split('\n');
                    }
                    else
                    {
                        conf[confKey] = textView.Buffer.Text;
                    }
                }
                else if (widget is Gtk.Entry)
                {
                    var entry = (Gtk.Entry)widget;
                    if (confValue is string[])
                    {
                        conf[confKey] = entry.Text.Split('\n');
                    }
                    else
                    {
                        conf[confKey] = entry.Text;
                    }
                }
            }

            // reset colors as there is no distinct key if they are custom or not
            if (f_SystemWideFontColorRadioButton.Active)
            {
                conf["Interface/Chat/ForegroundColor"] = String.Empty;
                conf["Interface/Chat/BackgroundColor"] = String.Empty;
            }

            if (Frontend.EngineProtocolVersion >= new Version(0, 14))
            {
                // with >= 0.14 we can set many keys in a single call
                // REMOTING CALL
                userConf.SetAll(conf);
            }
            else
            {
                // < 0.14 we need to set key by key
                foreach (var entry in conf)
                {
                    // REMOTING CALL
                    userConf[entry.Key] = entry.Value;
                }
            }
            // REMOTING CALL
            userConf.Save();
        }
Esempio n. 4
0
        public void AddMessage(MessageModel msg, bool addLinebreak, bool showTimestamps)
        {
#if MSG_DEBUG
            Trace.Call(msg, addLinebreak);
#endif

            if (msg == null)
            {
                throw new ArgumentNullException("msg");
            }

            var buffer    = Buffer;
            var iter      = buffer.EndIter;
            var startMark = new Gtk.TextMark(null, true);
            buffer.AddMark(startMark, iter);


            var         senderPrefixWidth = GetSenderPrefixWidth(msg);
            Gtk.TextTag indentTag         = null;
            if (senderPrefixWidth != 0)
            {
                // TODO: re-use text tags that have the same indent width
                indentTag = new Gtk.TextTag(null)
                {
                    Indent = -senderPrefixWidth
                };
                _MessageTextTagTable.Add(indentTag);
            }

            if (showTimestamps)
            {
                var msgTimeStamp = msg.TimeStamp.ToLocalTime();
                if (_LastMessage != null)
                {
                    var lastMsgTimeStamp = _LastMessage.TimeStamp.ToLocalTime();
                    var span             = msgTimeStamp.Date - lastMsgTimeStamp.Date;
                    if (span.Days > 0)
                    {
                        var dayLine = new MessageBuilder().
                                      AppendEventPrefix();
                        if (span.Days > 1)
                        {
                            dayLine.AppendText(_("Day changed from {0} to {1}"),
                                               lastMsgTimeStamp.ToShortDateString(),
                                               msgTimeStamp.ToShortDateString());
                        }
                        else
                        {
                            dayLine.AppendText(_("Day changed to {0}"),
                                               msgTimeStamp.ToLongDateString());
                        }
                        dayLine.AppendText("\n");
                        var dayLineMsg = dayLine.ToMessage().ToString();
                        Buffer.InsertWithTags(ref iter, dayLineMsg, EventTag);
                    }
                }

                string timestamp = null;
                try {
                    string format = (string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"];
                    if (!String.IsNullOrEmpty(format))
                    {
                        timestamp = msgTimeStamp.ToString(format);
                    }
                } catch (FormatException e) {
                    timestamp = "Timestamp Format ERROR: " + e.Message;
                }

                if (timestamp != null)
                {
                    timestamp = String.Format("{0} ", timestamp);
                    buffer.Insert(ref iter, timestamp);

                    // apply timestamp width to indent tag
                    if (indentTag != null)
                    {
                        indentTag.Indent -= GetPangoWidth(timestamp);
                    }
                }
            }

            var msgStartMark = new Gtk.TextMark(null, true);
            buffer.AddMark(msgStartMark, iter);

            bool hasHighlight = false;
            foreach (MessagePartModel msgPart in msg.MessageParts)
            {
                // supposed to be used only in a ChatView
                if (msgPart.IsHighlight)
                {
                    hasHighlight = true;
                }

                // TODO: implement all types
                if (msgPart is UrlMessagePartModel)
                {
                    var urlPart  = (UrlMessagePartModel)msgPart;
                    var linkText = urlPart.Text ?? urlPart.Url;

                    var url = urlPart.Url;
                    Uri uri;
                    try {
                        uri = new Uri(url);
                    } catch (UriFormatException ex) {
#if LOG4NET
                        _Logger.Error("AddMessage(): Invalid URL: " + url, ex);
#endif
                        buffer.Insert(ref iter, linkText);
                        continue;
                    }

                    var tags = new List <Gtk.TextTag>();
                    // link URI tag
                    var linkTag = new LinkTag(uri);
                    linkTag.TextEvent += OnLinkTagTextEvent;
                    _MessageTextTagTable.Add(linkTag);
                    tags.Add(linkTag);

                    // link style tag
                    tags.Add(LinkTag);

                    buffer.InsertWithTags(ref iter, linkText, tags.ToArray());
                }
                else if (msgPart is TextMessagePartModel)
                {
                    var tags = new List <Gtk.TextTag>();
                    TextMessagePartModel fmsgti = (TextMessagePartModel)msgPart;
                    if (fmsgti.ForegroundColor != TextColor.None)
                    {
                        var bg = ColorConverter.GetTextColor(BackgroundColor);
                        if (fmsgti.BackgroundColor != TextColor.None)
                        {
                            bg = fmsgti.BackgroundColor;
                        }
                        TextColor color = TextColorTools.GetBestTextColor(
                            fmsgti.ForegroundColor, bg
                            );
                        string tagname = GetTextTagName(color, null);
                        var    tag     = _MessageTextTagTable.Lookup(tagname);
                        tags.Add(tag);
                    }
                    if (fmsgti.BackgroundColor != TextColor.None)
                    {
                        // TODO: get this from ChatView
                        string tagname = GetTextTagName(null, fmsgti.BackgroundColor);
                        var    tag     = _MessageTextTagTable.Lookup(tagname);
                        tags.Add(tag);
                    }
                    if (fmsgti.Underline)
                    {
#if LOG4NET && MSG_DEBUG
                        _Logger.Debug("AddMessage(): fmsgti.Underline is true");
#endif
                        tags.Add(UnderlineTag);
                    }
                    if (fmsgti.Bold)
                    {
#if LOG4NET && MSG_DEBUG
                        _Logger.Debug("AddMessage(): fmsgti.Bold is true");
#endif
                        tags.Add(BoldTag);
                    }
                    if (fmsgti.Italic)
                    {
#if LOG4NET && MSG_DEBUG
                        _Logger.Debug("AddMessage(): fmsgti.Italic is true");
#endif
                        tags.Add(ItalicTag);
                    }

                    if (tags.Count > 0)
                    {
                        buffer.InsertWithTags(ref iter, fmsgti.Text, tags.ToArray());
                    }
                    else
                    {
                        buffer.Insert(ref iter, fmsgti.Text);
                    }
                }
            }
            var startIter = buffer.GetIterAtMark(startMark);
            if (msg.MessageType == MessageType.Event)
            {
                buffer.ApplyTag(EventTag, startIter, iter);
            }
            if (indentTag != null)
            {
                buffer.ApplyTag(indentTag, startIter, iter);
            }
            var nick = msg.GetNick();
            if (nick != null)
            {
                // TODO: re-use the same person tag for the same nick
                var personTag = new PersonTag(nick, nick);
                personTag.TextEvent += OnPersonTagTextEvent;
                _MessageTextTagTable.Add(personTag);

                var msgStartIter = buffer.GetIterAtMark(msgStartMark);
                var nickEndIter  = msgStartIter;
                nickEndIter.ForwardChars(nick.Length + 2);
                buffer.ApplyTag(PersonTag, msgStartIter, nickEndIter);
                buffer.ApplyTag(personTag, msgStartIter, nickEndIter);
            }
            buffer.DeleteMark(startMark);
            buffer.DeleteMark(msgStartMark);
            if (addLinebreak)
            {
                buffer.Insert(ref iter, "\n");
            }

            CheckBufferSize();

            if (IsGtk2_17)
            {
                // HACK: force a redraw of the widget, as for some reason
                // GTK+ 2.17.6 is not redrawing some lines we add here, especially
                // for local messages. See:
                // http://projects.qnetp.net/issues/show/185
                QueueDraw();
            }
            if (Frontend.IsWindows && _LastMessage == null)
            {
                // HACK: workaround rendering issue on Windows where the
                // first inserted text is not showing up until the next insert
                QueueDraw();
            }

            if (MessageAdded != null)
            {
                MessageAdded(this, new MessageTextViewMessageAddedEventArgs(msg));
            }

            if (hasHighlight)
            {
                if (MessageHighlighted != null)
                {
                    MessageHighlighted(this, new MessageTextViewMessageHighlightedEventArgs(msg));
                }
            }

            _LastMessage = msg;
        }
Esempio n. 5
0
        void ReadFromConfig()
        {
            Trace.Call();

            var conf = Frontend.UserConfig;

            // manually handled widgets
            ProxyType proxyType = (ProxyType)Enum.Parse(
                typeof(ProxyType),
                (string)conf["Connection/ProxyType"]
                );
            int i = 0;

            foreach (object[] row in  (Gtk.ListStore)f_ProxyTypeComboBox.Model)
            {
                if (((ProxyType)row[0]) == proxyType)
                {
                    f_ProxyTypeComboBox.Active = i;
                    break;
                }
                i++;
            }
            f_ProxySwitch.Active = proxyType != ProxyType.None;
            CheckProxySwitch();

            f_ShowColorsCheckButton.Active      = !(bool)conf["Interface/Notebook/StripColors"];
            f_ShowFormattingsCheckButton.Active = !(bool)conf["Interface/Notebook/StripFormattings"];

            var fontButton = (Gtk.FontButton)Builder.GetObject("FontButton");
            var fontFamily = (string)conf["Interface/Chat/FontFamily"];
            var fontStyle  = (string)conf["Interface/Chat/FontStyle"];
            int fontSize   = 0;

            if (conf["Interface/Chat/FontSize"] != null)
            {
                fontSize = (int)conf["Interface/Chat/FontSize"];
            }
            if (String.IsNullOrEmpty(fontFamily) &&
                String.IsNullOrEmpty(fontStyle) &&
                fontSize == 0)
            {
                f_SystemWideFontRadioButton.Active = true;
            }
            else
            {
                f_CustomFontRadioButton.Active = true;
                Pango.FontDescription fontDescription = new Pango.FontDescription();
                fontDescription.Family = fontFamily;
                string frontWeigth = null;
                if (fontStyle.Contains(" "))
                {
                    int pos = fontStyle.IndexOf(" ");
                    frontWeigth = fontStyle.Substring(0, pos);
                    fontStyle   = fontStyle.Substring(pos + 1);
                }
                fontDescription.Style = (Pango.Style)Enum.Parse(typeof(Pango.Style), fontStyle);
                if (frontWeigth != null)
                {
                    fontDescription.Weight = (Pango.Weight)Enum.Parse(typeof(Pango.Weight), frontWeigth);
                }
                fontDescription.Size = fontSize * 1024;
                fontButton.FontName  = fontDescription.ToString();
            }
            var bgColorHexCode = (string)conf["Interface/Chat/BackgroundColor"];
            var fgColorHexCode = (string)conf["Interface/Chat/ForegroundColor"];

            if (String.IsNullOrEmpty(bgColorHexCode) &&
                String.IsNullOrEmpty(fgColorHexCode))
            {
                f_SystemWideFontRadioButton.Active = true;
            }
            else
            {
                f_CustomFontColorRadioButton.Active = true;
            }

            // mapped widgets
            foreach (var confEntry in ConfigKeyToWidgetNameMap)
            {
                var confKey   = confEntry.Key;
                var confValue = conf[confKey];
                var widgetId  = confEntry.Value;
                var widget    = Builder.GetObject(widgetId);
                if (widget is Gtk.SpinButton)
                {
                    var spinButton = (Gtk.SpinButton)widget;
                    if (confValue is Int32)
                    {
                        spinButton.Value = (Int32)confValue;
                    }
                    else
                    {
                        spinButton.Value = Int32.Parse((string)confValue);
                    }
                }
                else if (widget is Gtk.ColorButton)
                {
                    var colorButton  = (Gtk.ColorButton)widget;
                    var colorHexCode = (string)confValue;
                    if (String.IsNullOrEmpty(colorHexCode))
                    {
                        colorButton.Color = Gdk.Color.Zero;
                    }
                    else
                    {
                        colorButton.Color = ColorConverter.GetGdkColor(colorHexCode);
                    }
                }
                else if (widget is Gtk.CheckButton)
                {
                    var checkButton = (Gtk.CheckButton)widget;
                    checkButton.Active = (bool)confValue;
#if GTK_SHARP_3
                }
                else if (widget is Gtk.Switch)
                {
                    var @switch = (Gtk.Switch)widget;
                    @switch.Active = (bool)confValue;
#endif
                }
                else if (widget is Gtk.TextView)
                {
                    var textView = (Gtk.TextView)widget;
                    if (confValue is string[])
                    {
                        textView.Buffer.Text = String.Join("\n", (string[])confValue);
                    }
                    else
                    {
                        textView.Buffer.Text = (string)confValue;
                    }
                }
                else if (widget is Gtk.Entry)
                {
                    var entry = (Gtk.Entry)widget;
                    if (confValue is string[])
                    {
                        entry.Text = String.Join(" ", (string[])confValue);
                    }
                    else
                    {
                        entry.Text = (string)confValue;
                    }
                }
            }
        }