Esempio n. 1
0
		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) ?? "&lt;null&gt;") : 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;
			}
		}
Esempio n. 2
0
		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) ?? "&lt;null&gt;") : 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]) ?? "&lt;null&gt;");
				} 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;
		}
Esempio n. 3
0
		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) ?? "&lt;null&gt;") : 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;
			}
		}
Esempio n. 4
0
        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) ?? "&lt;null&gt;") : 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]) ?? "&lt;null&gt;");
             *      } 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);
        }
Esempio n. 5
0
 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);
 }
Esempio n. 6
0
 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);
 }