protected override bool OnExposeEvent (Gdk.EventExpose args) { using (var context = Gdk.CairoHelper.Create (args.Window)) { var scalef = GtkWorkarounds.GetScaleFactor (this); context.LineWidth = 1; var alloc = Allocation; int width = alloc.Width; int height = alloc.Height; context.Rectangle (args.Area.X, args.Area.Y, args.Area.Width, args.Area.Height); var backgroundColor = Styles.CodeCompletion.BackgroundColor.ToCairoColor (); var textColor = Styles.CodeCompletion.TextColor.ToCairoColor (); var categoryColor = Styles.CodeCompletion.CategoryColor.ToCairoColor (); context.SetSourceColor (backgroundColor); context.Fill (); int xpos = iconTextSpacing; int yPos = (int)-vadj.Value; //when there are no matches, display a message to indicate that the completion list is still handling input if (filteredItems.Count == 0) { context.Rectangle (0, yPos, width, height - yPos); context.SetSourceColor (backgroundColor); context.Stroke (); noMatchLayout.SetText (win.DataProvider.ItemCount == 0 ? NoSuggestionsMsg : NoMatchesMsg); int lWidth, lHeight; noMatchLayout.GetPixelSize (out lWidth, out lHeight); context.SetSourceColor (textColor); context.MoveTo ((width - lWidth) / 2, yPos + (height - lHeight - yPos) / 2 - lHeight / 2); Pango.CairoHelper.ShowLayout (context, noMatchLayout); return false; } var matcher = CompletionMatcher.CreateCompletionMatcher (CompletionString); Iterate (true, ref yPos, delegate (Category category, int ypos) { if (ypos >= height) return; if (ypos < -rowHeight) return; // window.DrawRectangle (this.Style.BackgroundGC (StateType.Insensitive), true, 0, yPos, width, rowHeight); int x = 2; if (category.CompletionCategory != null && !string.IsNullOrEmpty (category.CompletionCategory.Icon)) { var icon = ImageService.GetIcon (category.CompletionCategory.Icon, IconSize.Menu); context.DrawImage (this, icon, 0, ypos); x = (int)icon.Width + 4; } context.Rectangle (0, ypos, Allocation.Width, rowHeight); context.SetSourceColor (backgroundColor); context.Fill (); // layout.SetMarkup ("<span weight='bold' foreground='#AAAAAA'>" + (category.CompletionCategory != null ? category.CompletionCategory.DisplayText : "Uncategorized") + "</span>"); // window.DrawLayout (textGCInsensitive, x - 1, ypos + 1 + (rowHeight - py) / 2, layout); // layout.SetMarkup ("<span weight='bold'>" + (category.CompletionCategory != null ? category.CompletionCategory.DisplayText : "Uncategorized") + "</span>"); categoryLayout.SetMarkup ((category.CompletionCategory != null ? category.CompletionCategory.DisplayText : "Uncategorized")); int px, py; categoryLayout.GetPixelSize (out px, out py); context.MoveTo (x, ypos + (rowHeight - py) / 2); context.SetSourceColor (categoryColor); Pango.CairoHelper.ShowLayout (context, categoryLayout); }, delegate (Category curCategory, int item, int itemidx, int ypos) { if (ypos >= height) return false; if (ypos < -rowHeight) return true; const int categoryModeItemIndenting = 0; if (InCategoryMode && curCategory != null && curCategory.CompletionCategory != null) { xpos = iconTextSpacing + categoryModeItemIndenting; } else { xpos = iconTextSpacing; } string markup = win.DataProvider.HasMarkup (item) ? (win.DataProvider.GetMarkup (item) ?? "<null>") : GLib.Markup.EscapeText (win.DataProvider.GetText (item) ?? "<null>"); string description = win.DataProvider.GetDescription (item, item == SelectedItem); if (string.IsNullOrEmpty (description)) { layout.SetMarkup (markup); } else { layout.SetMarkup (markup + " " + description); } string text = win.DataProvider.GetText (item); if (!string.IsNullOrEmpty (text)) { int [] matchIndices = matcher.GetMatch (text); if (matchIndices != null) { Pango.AttrList attrList = layout.Attributes ?? new Pango.AttrList (); for (int newSelection = 0; newSelection < matchIndices.Length; newSelection++) { int idx = matchIndices [newSelection]; var bold = new AttrWeight (Weight.Bold); bold.StartIndex = (uint)idx; bold.EndIndex = (uint)(idx + 1); attrList.Insert (bold); if (item != SelectedItem) { var highlightColor = (item == SelectedItem) ? Styles.CodeCompletion.SelectionHighlightColor : Styles.CodeCompletion.HighlightColor; var fg = new AttrForeground ((ushort)(highlightColor.Red * ushort.MaxValue), (ushort)(highlightColor.Green * ushort.MaxValue), (ushort)(highlightColor.Blue * ushort.MaxValue)); fg.StartIndex = (uint)idx; fg.EndIndex = (uint)(idx + 1); attrList.Insert (fg); } } layout.Attributes = attrList; } } Xwt.Drawing.Image icon = win.DataProvider.GetIcon (item); int iconHeight, iconWidth; if (icon != null) { if (item == SelectedItem) icon = icon.WithStyles ("sel"); iconWidth = (int)icon.Width; iconHeight = (int)icon.Height; } else if (!Gtk.Icon.SizeLookup (IconSize.Menu, out iconWidth, out iconHeight)) { iconHeight = iconWidth = 24; } int wi, he, typos, iypos; layout.GetPixelSize (out wi, out he); typos = he < rowHeight ? ypos + (int)Math.Ceiling ((rowHeight - he) / 2.0) : ypos; if (scalef <= 1.0) typos -= 1; // 1px up on non HiDPI iypos = iconHeight < rowHeight ? ypos + (rowHeight - iconHeight) / 2 : ypos; if (item == SelectedItem) { var barStyle = SelectionEnabled ? Styles.CodeCompletion.SelectionBackgroundColor : Styles.CodeCompletion.SelectionBackgroundInactiveColor; context.Rectangle (0, ypos, Allocation.Width, rowHeight); context.SetSourceColor (barStyle.ToCairoColor ()); context.Fill (); } if (icon != null) { context.DrawImage (this, icon, xpos, iypos); xpos += iconTextSpacing; } context.SetSourceColor ((item == SelectedItem ? Styles.CodeCompletion.SelectionTextColor : Styles.CodeCompletion.TextColor).ToCairoColor ()); var textXPos = xpos + iconWidth + 2; context.MoveTo (textXPos, typos); layout.Width = (int)((Allocation.Width - textXPos) * Pango.Scale.PangoScale); layout.Ellipsize = EllipsizeMode.End; Pango.CairoHelper.ShowLayout (context, layout); int textW, textH; layout.GetPixelSize (out textW, out textH); layout.Width = -1; layout.Ellipsize = EllipsizeMode.None; layout.SetMarkup (""); if (layout.Attributes != null) { layout.Attributes.Dispose (); layout.Attributes = null; } string rightText = win.DataProvider.GetRightSideDescription (item, item == SelectedItem); if (!string.IsNullOrEmpty (rightText)) { layout.SetMarkup (rightText); int w, h; layout.GetPixelSize (out w, out h); const int leftpadding = 8; const int rightpadding = 3; w += rightpadding; w = Math.Min (w, Allocation.Width - textXPos - textW - leftpadding); wi += w; typos = h < rowHeight ? ypos + (rowHeight - h) / 2 : ypos; if (scalef <= 1.0) typos -= 1; // 1px up on non HiDPI context.MoveTo (Allocation.Width - w, typos); layout.Width = (int)(w * Pango.Scale.PangoScale); layout.Ellipsize = EllipsizeMode.End; Pango.CairoHelper.ShowLayout (context, layout); layout.Width = -1; layout.Ellipsize = EllipsizeMode.None; } if (Math.Min (maxListWidth, wi + xpos + iconWidth + 2) > listWidth) { WidthRequest = listWidth = Math.Min (maxListWidth, wi + xpos + iconWidth + 2 + iconTextSpacing); win.ResetSizes (); } else { //workaround for the vscrollbar display - the calculated width needs to be the width ofthe render region. if (Allocation.Width < listWidth) { if (listWidth - Allocation.Width < 30) { WidthRequest = listWidth + listWidth - Allocation.Width; win.ResetSizes (); } } } return true; }); return false; } }
protected override bool OnExposeEvent (Gdk.EventExpose args) { Gdk.Window window = args.Window; var alloc = Allocation; int width = alloc.Width; int height = alloc.Height; int lineWidth = width - margin * 2; int xpos = margin + padding; int yPos = margin; if (PreviewCompletionString) { layout.SetText ( string.IsNullOrEmpty (CompletionString) ? MonoDevelop.Core.GettextCatalog.GetString ("Select template") : CompletionString ); int wi, he; layout.GetPixelSize (out wi, out he); window.DrawRectangle (this.Style.BaseGC (StateType.Insensitive), true, margin, yPos, lineWidth, he + padding); window.DrawLayout ( string.IsNullOrEmpty (CompletionString) ? this.Style.TextGC (StateType.Insensitive) : this.Style.TextGC (StateType.Normal), xpos, yPos, layout ); yPos += rowHeight; } //when there are no matches, display a message to indicate that the completion list is still handling input if (filteredItems.Count == 0) { Gdk.GC gc = new Gdk.GC (window); gc.RgbFgColor = new Gdk.Color (0xff, 0xbc, 0xc1); window.DrawRectangle (gc, true, 0, yPos, width, height - yPos); layout.SetText (win.DataProvider.ItemCount == 0 ? NoSuggestionsMsg : NoMatchesMsg); int lWidth, lHeight; layout.GetPixelSize (out lWidth, out lHeight); gc.RgbFgColor = new Gdk.Color (0, 0, 0); window.DrawLayout (gc, (width - lWidth) / 2, yPos + (height - lHeight - yPos) / 2, layout); gc.Dispose (); return true; } var textGCInsensitive = this.Style.TextGC (StateType.Insensitive); var textGCNormal = this.Style.TextGC (StateType.Normal); var fgGCNormal = this.Style.ForegroundGC (StateType.Normal); var matcher = CompletionMatcher.CreateCompletionMatcher (CompletionString); var highlightColor = HighlightColor; Iterate (true, ref yPos, delegate (Category category, int ypos) { if (ypos >= height - margin) return; // window.DrawRectangle (this.Style.BackgroundGC (StateType.Insensitive), true, 0, yPos, width, rowHeight); int x = 2; if (!string.IsNullOrEmpty (category.CompletionCategory.Icon)) { var icon = ImageService.GetPixbuf (category.CompletionCategory.Icon, IconSize.Menu); window.DrawPixbuf (fgGCNormal, icon, 0, 0, margin, ypos, icon.Width, icon.Height, Gdk.RgbDither.None, 0, 0); x = icon.Width + 4; } layout.SetMarkup ("<span weight='bold'>" + category.CompletionCategory.DisplayText + "</span>"); window.DrawLayout (textGCInsensitive, x, ypos, layout); layout.SetMarkup (""); }, delegate (Category curCategory, int item, int itemidx, int ypos) { if (ypos >= height - margin) return false; if (InCategoryMode && curCategory != null && curCategory.CompletionCategory != null) { xpos = margin + padding + 8; } else { xpos = margin + padding; } string markup = win.DataProvider.HasMarkup (item) ? (win.DataProvider.GetMarkup (item) ?? "<null>") : GLib.Markup.EscapeText (win.DataProvider.GetText (item) ?? "<null>"); string description = win.DataProvider.GetDescription (item); if (string.IsNullOrEmpty (description)) { layout.SetMarkup (markup); } else { if (item == SelectedItem) { layout.SetMarkup (markup + " " + description ); } else { layout.SetMarkup (markup + " <span foreground=\"darkgray\">" + description + "</span>"); } } int mw, mh; layout.GetPixelSize (out mw, out mh); if (mw > listWidth) { WidthRequest = listWidth = mw; win.WidthRequest = win.Allocation.Width + mw - width; win.QueueResize (); } string text = win.DataProvider.GetText (item); if ((!SelectionEnabled || item != SelectedItem) && !string.IsNullOrEmpty (text)) { int[] matchIndices = matcher.GetMatch (text); if (matchIndices != null) { Pango.AttrList attrList = layout.Attributes ?? new Pango.AttrList (); for (int newSelection = 0; newSelection < matchIndices.Length; newSelection++) { int idx = matchIndices[newSelection]; Pango.AttrForeground fg = new Pango.AttrForeground (highlightColor.Red, highlightColor.Green, highlightColor.Blue); fg.StartIndex = (uint)idx; fg.EndIndex = (uint)(idx + 1); attrList.Insert (fg); } layout.Attributes = attrList; } } Gdk.Pixbuf icon = win.DataProvider.GetIcon (item); int iconHeight, iconWidth; if (icon != null) { iconWidth = icon.Width; iconHeight = icon.Height; } else if (!Gtk.Icon.SizeLookup (Gtk.IconSize.Menu, out iconWidth, out iconHeight)) { iconHeight = iconWidth = 24; } int wi, he, typos, iypos; layout.GetPixelSize (out wi, out he); typos = he < rowHeight ? ypos + (rowHeight - he) / 2 : ypos; iypos = iconHeight < rowHeight ? ypos + (rowHeight - iconHeight) / 2 : ypos; if (item == SelectedItem) { if (SelectionEnabled) { window.DrawRectangle (this.Style.BaseGC (StateType.Selected), true, margin, ypos, lineWidth, he + padding); window.DrawLayout (this.Style.TextGC (StateType.Selected), xpos + iconWidth + 2, typos, layout); } else { window.DrawRectangle (this.Style.DarkGC (StateType.Prelight), false, margin, ypos, lineWidth - 1, he + padding - 1); window.DrawLayout (textGCNormal, xpos + iconWidth + 2, typos, layout); } } else window.DrawLayout (textGCNormal, xpos + iconWidth + 2, typos, layout); if (icon != null) window.DrawPixbuf (fgGCNormal, icon, 0, 0, xpos, iypos, iconWidth, iconHeight, Gdk.RgbDither.None, 0, 0); layout.SetMarkup (""); if (layout.Attributes != null) { layout.Attributes.Dispose (); layout.Attributes = null; } return true; }); /* int n = 0; while (ypos < winHeight - margin && (page + n) < filteredItems.Count) { bool hasMarkup = win.DataProvider.HasMarkup (filteredItems[page + n]); if (hasMarkup) { layout.SetMarkup (win.DataProvider.GetMarkup (filteredItems[page + n]) ?? "<null>"); } else { layout.SetText (win.DataProvider.GetText (filteredItems[page + n]) ?? "<null>"); } string text = win.DataProvider.GetText (filteredItems[page + n]); if ((!SelectionEnabled || page + n != selection) && !string.IsNullOrEmpty (text)) { int[] matchIndices = Match (CompletionString, text); if (matchIndices != null) { Pango.AttrList attrList = layout.Attributes ?? new Pango.AttrList (); for (int newSelection = 0; newSelection < matchIndices.Length; newSelection++) { int idx = matchIndices[newSelection]; Pango.AttrForeground fg = new Pango.AttrForeground (0, 0, ushort.MaxValue); fg.StartIndex = (uint)idx; fg.EndIndex = (uint)(idx + 1); attrList.Insert (fg); } layout.Attributes = attrList; } } Gdk.Pixbuf icon = win.DataProvider.GetIcon (filteredItems[page + n]); int iconHeight, iconWidth; if (icon != null) { iconWidth = icon.Width; iconHeight = icon.Height; } else if (!Gtk.Icon.SizeLookup (Gtk.IconSize.Menu, out iconWidth, out iconHeight)) { iconHeight = iconWidth = 24; } int wi, he, typos, iypos; layout.GetPixelSize (out wi, out he); typos = he < rowHeight ? ypos + (rowHeight - he) / 2 : ypos; iypos = iconHeight < rowHeight ? ypos + (rowHeight - iconHeight) / 2 : ypos; if (page + n == selection) { if (SelectionEnabled) { window.DrawRectangle (this.Style.BaseGC (StateType.Selected), true, margin, ypos, lineWidth, he + padding); window.DrawLayout (this.Style.TextGC (StateType.Selected), xpos + iconWidth + 2, typos, layout); } else { window.DrawRectangle (this.Style.DarkGC (StateType.Prelight), false, margin, ypos, lineWidth - 1, he + padding - 1); window.DrawLayout (this.Style.TextGC (StateType.Normal), xpos + iconWidth + 2, typos, layout); } } else window.DrawLayout (this.Style.TextGC (StateType.Normal), xpos + iconWidth + 2, typos, layout); if (icon != null) window.DrawPixbuf (this.Style.ForegroundGC (StateType.Normal), icon, 0, 0, xpos, iypos, iconWidth, iconHeight, Gdk.RgbDither.None, 0, 0); ypos += rowHeight; n++; if (hasMarkup) layout.SetMarkup (string.Empty); if (layout.Attributes != null) { layout.Attributes.Dispose (); layout.Attributes = null; } } */ return true; }
protected override bool OnExposeEvent (Gdk.EventExpose args) { using (var context = Gdk.CairoHelper.Create (args.Window)) { context.LineWidth = 1; var alloc = Allocation; int width = alloc.Width; int height = alloc.Height; context.Rectangle (args.Area.X, args.Area.Y, args.Area.Width, args.Area.Height); context.SetSourceColor (backgroundColor); context.Fill (); int xpos = iconTextSpacing; int yPos = (int)-vadj.Value; //when there are no matches, display a message to indicate that the completion list is still handling input if (filteredItems.Count == 0) { context.Rectangle (0, yPos, width, height - yPos); context.SetSourceColor (backgroundColor); context.Stroke (); noMatchLayout.SetText (win.DataProvider.ItemCount == 0 ? NoSuggestionsMsg : NoMatchesMsg); int lWidth, lHeight; noMatchLayout.GetPixelSize (out lWidth, out lHeight); context.SetSourceColor (textColor); context.MoveTo ((width - lWidth) / 2, yPos + (height - lHeight - yPos) / 2 - lHeight); PangoCairoHelper.ShowLayout (context, noMatchLayout); return false; } var matcher = CompletionMatcher.CreateCompletionMatcher (CompletionString); Iterate (true, ref yPos, delegate (Category category, int ypos) { if (ypos >= height) return; if (ypos < -rowHeight) return; // window.DrawRectangle (this.Style.BackgroundGC (StateType.Insensitive), true, 0, yPos, width, rowHeight); int x = 2; if (category.CompletionCategory != null && !string.IsNullOrEmpty (category.CompletionCategory.Icon)) { var icon = ImageService.GetPixbuf (category.CompletionCategory.Icon, IconSize.Menu); Gdk.CairoHelper.SetSourcePixbuf (context, icon, 0, ypos); context.Paint (); x = icon.Width + 4; } context.Rectangle (0, ypos, Allocation.Width, rowHeight); context.SetSourceColor (backgroundColor); context.Fill (); // layout.SetMarkup ("<span weight='bold' foreground='#AAAAAA'>" + (category.CompletionCategory != null ? category.CompletionCategory.DisplayText : "Uncategorized") + "</span>"); // window.DrawLayout (textGCInsensitive, x - 1, ypos + 1 + (rowHeight - py) / 2, layout); // layout.SetMarkup ("<span weight='bold'>" + (category.CompletionCategory != null ? category.CompletionCategory.DisplayText : "Uncategorized") + "</span>"); categoryLayout.SetMarkup ((category.CompletionCategory != null ? category.CompletionCategory.DisplayText : "Uncategorized")); int px, py; categoryLayout.GetPixelSize (out px, out py); context.MoveTo (x, ypos + (rowHeight - py) / 2); context.SetSourceColor (textColor); PangoCairoHelper.ShowLayout (context, categoryLayout); }, delegate (Category curCategory, int item, int itemidx, int ypos) { if (ypos >= height) return false; if (ypos < -rowHeight) return true; const int categoryModeItemIndenting = 0; if (InCategoryMode && curCategory != null && curCategory.CompletionCategory != null) { xpos = iconTextSpacing + categoryModeItemIndenting; } else { xpos = iconTextSpacing; } string markup = win.DataProvider.HasMarkup (item) ? (win.DataProvider.GetMarkup (item) ?? "<null>") : GLib.Markup.EscapeText (win.DataProvider.GetText (item) ?? "<null>"); string description = win.DataProvider.GetDescription (item, item == SelectedItem); if (string.IsNullOrEmpty (description)) { layout.SetMarkup (markup); } else { layout.SetMarkup (markup + " " + description); } string text = win.DataProvider.GetText (item); if (!string.IsNullOrEmpty (text)) { int[] matchIndices = matcher.GetMatch (text); if (matchIndices != null) { Pango.AttrList attrList = layout.Attributes ?? new Pango.AttrList (); for (int newSelection = 0; newSelection < matchIndices.Length; newSelection++) { int idx = matchIndices [newSelection]; var fg = new AttrForeground ((ushort)(highlightColor.R * ushort.MaxValue), (ushort)(highlightColor.G * ushort.MaxValue), (ushort)(highlightColor.B * ushort.MaxValue)); fg.StartIndex = (uint)idx; fg.EndIndex = (uint)(idx + 1); attrList.Insert (fg); } layout.Attributes = attrList; } } Gdk.Pixbuf icon = win.DataProvider.GetIcon (item); int iconHeight, iconWidth; if (icon != null) { iconWidth = icon.Width; iconHeight = icon.Height; } else if (!Gtk.Icon.SizeLookup (Gtk.IconSize.Menu, out iconWidth, out iconHeight)) { iconHeight = iconWidth = 24; } int wi, he, typos, iypos; layout.GetPixelSize (out wi, out he); typos = he < rowHeight ? ypos + (rowHeight - he) / 2 : ypos; iypos = iconHeight < rowHeight ? ypos + (rowHeight - iconHeight) / 2 : ypos; if (item == SelectedItem) { context.Rectangle (0, ypos, Allocation.Width, rowHeight / 2); context.SetSourceColor (SelectionEnabled ? selectedItemColor.Foreground : selectedItemInactiveColor.Background); context.Fill (); context.Rectangle (0, ypos + rowHeight / 2, Allocation.Width, rowHeight / 2); context.SetSourceColor (SelectionEnabled ? selectedItemColor.Background : selectedItemInactiveColor.Background); context.Fill (); context.Rectangle (0.5, ypos + 0.5, Allocation.Width - 1, rowHeight - 1); if (!SelectionEnabled) context.SetDash (new double[] {4, 4}, 0); context.SetSourceColor (SelectionEnabled ? selectionBorderColor : selectionBorderInactiveColor); context.Stroke (); } if (icon != null) { Gdk.CairoHelper.SetSourcePixbuf (context, icon, xpos, iypos); context.Paint (); xpos += iconTextSpacing; } context.SetSourceColor (textColor); context.MoveTo (xpos + iconWidth + 2, typos); PangoCairoHelper.ShowLayout (context, layout); layout.SetMarkup (""); if (layout.Attributes != null) { layout.Attributes.Dispose (); layout.Attributes = null; } string rightText = win.DataProvider.GetRightSideDescription (item, item == SelectedItem); if (!string.IsNullOrEmpty (rightText)) { layout.SetMarkup (rightText); int w, h; layout.GetPixelSize (out w, out h); wi += w; typos = h < rowHeight ? ypos + (rowHeight - h) / 2 : ypos; context.MoveTo (Allocation.Width - w, typos); PangoCairoHelper.ShowLayout (context, layout); } if (wi + xpos + iconWidth + 2 > listWidth) { WidthRequest = listWidth = wi + xpos + iconWidth + 2 + iconTextSpacing; win.ResetSizes (); } else { //workaround for the vscrollbar display - the calculated width needs to be the width ofthe render region. if (Allocation.Width < listWidth) { if (listWidth - Allocation.Width < 30) { WidthRequest = listWidth + listWidth - Allocation.Width; win.ResetSizes (); } } } return true; }); return false; } }
protected override bool OnExposeEvent(Gdk.EventExpose args) { Gdk.Window window = args.Window; var alloc = Allocation; int width = alloc.Width; int height = alloc.Height; int lineWidth = width - margin * 2; int xpos = margin + padding; int yPos = margin; if (PreviewCompletionString) { layout.SetText(string.IsNullOrEmpty(CompletionString) ? MonoDevelop.Core.GettextCatalog.GetString("Select template") : CompletionString); int wi, he; layout.GetPixelSize(out wi, out he); window.DrawRectangle(this.Style.BaseGC(StateType.Insensitive), true, margin, yPos, lineWidth, he + padding); window.DrawLayout(string.IsNullOrEmpty(CompletionString) ? this.Style.TextGC(StateType.Insensitive) : this.Style.TextGC(StateType.Normal), xpos, yPos, layout); yPos += rowHeight; } //when there are no matches, display a message to indicate that the completion list is still handling input if (filteredItems.Count == 0) { Gdk.GC gc = new Gdk.GC(window); gc.RgbFgColor = new Gdk.Color(0xff, 0xbc, 0xc1); window.DrawRectangle(gc, true, 0, yPos, width, height - yPos); gc.Dispose(); layout.SetText(win.DataProvider.ItemCount == 0? NoSuggestionsMsg : NoMatchesMsg); int lWidth, lHeight; layout.GetPixelSize(out lWidth, out lHeight); window.DrawLayout(this.Style.TextGC(StateType.Normal), (width - lWidth) / 2, yPos + (height - lHeight - yPos) / 2, layout); return(true); } var textGCInsensitive = this.Style.TextGC(StateType.Insensitive); var textGCNormal = this.Style.TextGC(StateType.Normal); var fgGCNormal = this.Style.ForegroundGC(StateType.Normal); Iterate(true, ref yPos, delegate(Category category, int ypos) { if (ypos >= height - margin) { return; } // window.DrawRectangle (this.Style.BackgroundGC (StateType.Insensitive), true, 0, yPos, width, rowHeight); Gdk.Pixbuf icon = ImageService.GetPixbuf(category.CompletionCategory.Icon, IconSize.Menu); window.DrawPixbuf(fgGCNormal, icon, 0, 0, margin, ypos, icon.Width, icon.Height, Gdk.RgbDither.None, 0, 0); layout.SetMarkup("<span weight='bold'>" + category.CompletionCategory.DisplayText + "</span>"); window.DrawLayout(textGCInsensitive, icon.Width + 4, ypos, layout); layout.SetMarkup(""); }, delegate(Category curCategory, int item, int ypos) { if (ypos >= height - margin) { return(false); } int itemIndex = filteredItems[item]; if (InCategoryMode && curCategory != null && curCategory.CompletionCategory != null) { xpos = margin + padding + 8; } else { xpos = margin + padding; } string markup = win.DataProvider.HasMarkup(itemIndex) ? (win.DataProvider.GetMarkup(itemIndex) ?? "<null>") : GLib.Markup.EscapeText(win.DataProvider.GetText(itemIndex) ?? "<null>"); string description = win.DataProvider.GetDescription(itemIndex); if (string.IsNullOrEmpty(description)) { layout.SetMarkup(markup); } else { if (item == selection) { layout.SetMarkup(markup + " " + description); } else { layout.SetMarkup(markup + " <span foreground=\"darkgray\">" + description + "</span>"); } } int mw, mh; layout.GetPixelSize(out mw, out mh); if (mw > listWidth) { WidthRequest = listWidth = mw; win.WidthRequest = win.Allocation.Width + mw - width; win.QueueResize(); } string text = win.DataProvider.GetText(itemIndex); if ((!SelectionEnabled || item != selection) && !string.IsNullOrEmpty(text)) { int[] matchIndices = Match(CompletionString, text); if (matchIndices != null) { Pango.AttrList attrList = layout.Attributes ?? new Pango.AttrList(); for (int newSelection = 0; newSelection < matchIndices.Length; newSelection++) { int idx = matchIndices[newSelection]; Pango.AttrForeground fg = new Pango.AttrForeground(0, 0, ushort.MaxValue); fg.StartIndex = (uint)idx; fg.EndIndex = (uint)(idx + 1); attrList.Insert(fg); } layout.Attributes = attrList; } } Gdk.Pixbuf icon = win.DataProvider.GetIcon(itemIndex); int iconHeight, iconWidth; if (icon != null) { iconWidth = icon.Width; iconHeight = icon.Height; } else if (!Gtk.Icon.SizeLookup(Gtk.IconSize.Menu, out iconWidth, out iconHeight)) { iconHeight = iconWidth = 24; } int wi, he, typos, iypos; layout.GetPixelSize(out wi, out he); typos = he < rowHeight ? ypos + (rowHeight - he) / 2 : ypos; iypos = iconHeight < rowHeight ? ypos + (rowHeight - iconHeight) / 2 : ypos; if (item == selection) { if (SelectionEnabled) { window.DrawRectangle(this.Style.BaseGC(StateType.Selected), true, margin, ypos, lineWidth, he + padding); window.DrawLayout(this.Style.TextGC(StateType.Selected), xpos + iconWidth + 2, typos, layout); } else { window.DrawRectangle(this.Style.DarkGC(StateType.Prelight), false, margin, ypos, lineWidth - 1, he + padding - 1); window.DrawLayout(textGCNormal, xpos + iconWidth + 2, typos, layout); } } else { window.DrawLayout(textGCNormal, xpos + iconWidth + 2, typos, layout); } if (icon != null) { window.DrawPixbuf(fgGCNormal, icon, 0, 0, xpos, iypos, iconWidth, iconHeight, Gdk.RgbDither.None, 0, 0); } layout.SetMarkup(""); if (layout.Attributes != null) { layout.Attributes.Dispose(); layout.Attributes = null; } return(true); }); /* * int n = 0; * while (ypos < winHeight - margin && (page + n) < filteredItems.Count) { * * bool hasMarkup = win.DataProvider.HasMarkup (filteredItems[page + n]); * if (hasMarkup) { * layout.SetMarkup (win.DataProvider.GetMarkup (filteredItems[page + n]) ?? "<null>"); * } else { * layout.SetText (win.DataProvider.GetText (filteredItems[page + n]) ?? "<null>"); * } * string text = win.DataProvider.GetText (filteredItems[page + n]); * if ((!SelectionEnabled || page + n != selection) && !string.IsNullOrEmpty (text)) { * int[] matchIndices = Match (CompletionString, text); * if (matchIndices != null) { * Pango.AttrList attrList = layout.Attributes ?? new Pango.AttrList (); * for (int newSelection = 0; newSelection < matchIndices.Length; newSelection++) { * int idx = matchIndices[newSelection]; * Pango.AttrForeground fg = new Pango.AttrForeground (0, 0, ushort.MaxValue); * fg.StartIndex = (uint)idx; * fg.EndIndex = (uint)(idx + 1); * attrList.Insert (fg); * } * layout.Attributes = attrList; * } * } * * Gdk.Pixbuf icon = win.DataProvider.GetIcon (filteredItems[page + n]); * int iconHeight, iconWidth; * if (icon != null) { * iconWidth = icon.Width; * iconHeight = icon.Height; * } else if (!Gtk.Icon.SizeLookup (Gtk.IconSize.Menu, out iconWidth, out iconHeight)) { * iconHeight = iconWidth = 24; * } * * int wi, he, typos, iypos; * layout.GetPixelSize (out wi, out he); * typos = he < rowHeight ? ypos + (rowHeight - he) / 2 : ypos; * iypos = iconHeight < rowHeight ? ypos + (rowHeight - iconHeight) / 2 : ypos; * if (page + n == selection) { * if (SelectionEnabled) { * window.DrawRectangle (this.Style.BaseGC (StateType.Selected), true, margin, ypos, lineWidth, he + padding); * window.DrawLayout (this.Style.TextGC (StateType.Selected), xpos + iconWidth + 2, typos, layout); * } else { * window.DrawRectangle (this.Style.DarkGC (StateType.Prelight), false, margin, ypos, lineWidth - 1, he + padding - 1); * window.DrawLayout (this.Style.TextGC (StateType.Normal), xpos + iconWidth + 2, typos, layout); * } * } else * window.DrawLayout (this.Style.TextGC (StateType.Normal), xpos + iconWidth + 2, typos, layout); * if (icon != null) * window.DrawPixbuf (this.Style.ForegroundGC (StateType.Normal), icon, 0, 0, xpos, iypos, iconWidth, iconHeight, Gdk.RgbDither.None, 0, 0); * ypos += rowHeight; * n++; * if (hasMarkup) * layout.SetMarkup (string.Empty); * if (layout.Attributes != null) { * layout.Attributes.Dispose (); * layout.Attributes = null; * } * } */ return(true); }
void InsertSeeAttrs(uint start, uint end) { if (attrs == null) attrs = new AttrList (); Pango.Attribute attr = new AttrUnderline (Underline.Single); attr.StartIndex = start; attr.EndIndex = end; attrs.Insert (attr); attr = new AttrForeground (0, 0, 65535); attr.StartIndex = start; attr.EndIndex = end; attrs.Insert (attr); }
void InsertPRefAttrs(uint start, uint end) { if (attrs == null) attrs = new AttrList (); Pango.Attribute attr = new AttrStyle (Style.Italic); attr.StartIndex = start; attr.EndIndex = end; attrs.Insert (attr); attr = new AttrForeground (32000, 32000, 32000); attr.StartIndex = start; attr.EndIndex = end; attrs.Insert (attr); }