static ChunkStyle GetChunkStyle(ColorSheme style, IEnumerable <Tag> tagStack)
        {
            ChunkStyle result = new ChunkStyle();

            if (style == null)
            {
                style = new DefaultStyle(null);
            }
            result.CairoColor = style.Default.CairoColor;

            foreach (Tag tag in tagStack)
            {
                //System.Console.WriteLine("'" + tag.Command + "'");
                switch (tag.Command)
                {
                case "B":
                    result.ChunkProperties |= ChunkProperties.Bold;
                    break;

                case "SPAN":
                    string val;
                    if (tag.Arguments.TryGetValue("style", out val))
                    {
                        ChunkStyle chunkStyle = style.GetChunkStyle(val);
                        if (chunkStyle != null)
                        {
                            result.CairoColor       = chunkStyle.CairoColor;
                            result.ChunkProperties |= chunkStyle.ChunkProperties;
                        }
                        else
                        {
                            throw new Exception("Style " + val + " not found.");
                        }
                    }
                    if (tag.Arguments.TryGetValue("foreground", out val))
                    {
                        result.CairoColor = style.GetColorFromString(val);
                    }
                    if (tag.Arguments.TryGetValue("background", out val))
                    {
                        result.CairoBackgroundColor = style.GetColorFromString(val);
                    }
                    break;

                case "A":
                    result.Link = tag.Arguments["ref"];
                    break;

                case "I":
                    result.ChunkProperties |= ChunkProperties.Italic;
                    break;

                case "U":
                    result.ChunkProperties |= ChunkProperties.Underline;
                    break;
                }
            }
            return(result);
        }
		Mono.TextEditor.Highlighting.Style LoadStyle (string styleName, bool showException = true)
		{
			try {
				return Mono.TextEditor.Highlighting.SyntaxModeService.GetColorStyle (Style, styleName);
			} catch (Exception e) {
				if (showException)
					MessageService.ShowError ("Error while importing color style.", e.InnerException.Message);
				var result = new Mono.TextEditor.Highlighting.DefaultStyle (Style);
				result.Name = styleName;
				result.Description = "Error";
				return result;
			}
		
		}
 Mono.TextEditor.Highlighting.Style LoadStyle(string styleName, bool showException = true)
 {
     try {
         return(Mono.TextEditor.Highlighting.SyntaxModeService.GetColorStyle(Style, styleName));
     } catch (Exception e) {
         if (showException)
         {
             MessageService.ShowError("Error while importing color style.", e.InnerException.Message);
         }
         var result = new Mono.TextEditor.Highlighting.DefaultStyle(Style);
         result.Name        = styleName;
         result.Description = "Error";
         return(result);
     }
 }
		static Cairo.Color[,,,,] CreateColorMatrix (TextEditor editor, bool isError)
		{
			string typeString = isError ? "error" : "warning";
			Cairo.Color[,,,,] colorMatrix = new Cairo.Color[2, 2, 3, 2, 2];
			
			ColorSheme style = editor.ColorStyle;
			if (style == null)
				style = new DefaultStyle (editor.Style);
			
			var baseColor = style.GetChunkStyle ("bubble." + typeString + "").CairoBackgroundColor;
			
			AdjustColorMatrix (colorMatrix, 0, baseColor);
			
			var hsl = (HslColor)baseColor;
			hsl.S *= 0.6;
			baseColor = hsl;
			AdjustColorMatrix (colorMatrix, 1, hsl);
			
			double factor = 1.03;
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < 2; j++) {
					for (int k = 0; k < 3; k++) {
						HslColor color = colorMatrix [i, j, k, 0, 0];
						color.L *= factor;
						colorMatrix [i, j, k, 1, 0] = color;
					}
				}
			}
			var selectionColor = ColorSheme.ToCairoColor (style.Selection.BackgroundColor);
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < 2; j++) {
					for (int k = 0; k < 3; k++) {
						for (int l = 0; l < 2; l++) {
							var color = colorMatrix [i, j, k, l, 0];
							colorMatrix [i, j, k, l, 1] = new Cairo.Color ((color.R + selectionColor.R * 1.5) / 2.5, (color.G + selectionColor.G * 1.5) / 2.5, (color.B + selectionColor.B * 1.5) / 2.5);
						}
					}
				}
			}
			return colorMatrix;
		}
		void SetColors ()
		{
			ColorSheme style = editor.ColorStyle;
			if (style == null)
				style = new DefaultStyle (editor.Style);
			errorGc = (HslColor)(style.GetChunkStyle ("bubble.error").Color);
			warningGc = (HslColor)(style.GetChunkStyle ("bubble.warning").Color);
			errorMatrix = CreateColorMatrix (editor, true);
			warningMatrix = CreateColorMatrix (editor, false);
			
			gcSelected = (HslColor)style.Selection.Color;
			gcLight = new Cairo.Color (1, 1, 1);
		}
		static ChunkStyle GetChunkStyle (Style style, IEnumerable<Tag> tagStack)
		{
			ChunkStyle result = new ChunkStyle ();
			if (style == null)
				style = new DefaultStyle (null);
			result.Color = style.Default.Color;
			
			foreach (Tag tag in tagStack) {
				//System.Console.WriteLine("'" + tag.Command + "'");
				switch (tag.Command) {
				case "B":
					result.ChunkProperties |= ChunkProperties.Bold;
					break;
				case "SPAN":
					string val;
					if (tag.Arguments.TryGetValue ("style", out val)) {
						ChunkStyle chunkStyle = style.GetChunkStyle (val);
						if (chunkStyle != null) {
							result.Color = chunkStyle.Color;
							result.ChunkProperties |= chunkStyle.ChunkProperties;
						} else {
							throw new Exception ("Style " + val + " not found.");
						}
					}
					if (tag.Arguments.TryGetValue ("foreground", out val))
						result.Color = style.GetColorFromString (val);
					if (tag.Arguments.TryGetValue ("background", out val))
						result.BackgroundColor = style.GetColorFromString (val);
					break;
				case "A":
					result.Link = tag.Arguments["ref"];
					break;
				case "I":
					result.ChunkProperties |= ChunkProperties.Italic;
					break;
				case "U":
					result.ChunkProperties |= ChunkProperties.Underline;
					break;
				}
			}
			return result;
		}