void ShowTooltip (TextSegment segment, Rectangle hintRectangle)
{
if (previewWindow != null && previewWindow.Segment == segment)
return;
CancelCodeSegmentTooltip ();
HideCodeSegmentPreviewWindow ();
if (segment.IsInvalid || segment.Length == 0)
return;
codeSegmentTooltipTimeoutId = GLib.Timeout.Add (650, delegate {
previewWindow = new CodeSegmentPreviewWindow (textEditor, false, segment);
if (previewWindow.IsEmptyText) {
previewWindow.Destroy ();
previewWindow = null;
codeSegmentTooltipTimeoutId = 0;
return false;
}
if (textEditor == null || textEditor.GdkWindow == null) {
codeSegmentTooltipTimeoutId = 0;
return false;
}
int ox = 0, oy = 0;
textEditor.GdkWindow.GetOrigin (out ox, out oy);
ox += textEditor.Allocation.X;
oy += textEditor.Allocation.Y;
int x = hintRectangle.Right;
int y = hintRectangle.Bottom;
previewWindow.CalculateSize ();
var req = previewWindow.SizeRequest ();
int w = req.Width;
int h = req.Height;
var geometry = this.textEditor.Screen.GetUsableMonitorGeometry (this.textEditor.Screen.GetMonitorAtPoint (ox + x, oy + y));
if (x + ox + w > geometry.X + geometry.Width)
x = hintRectangle.Left - w;
if (y + oy + h > geometry.Y + geometry.Height)
y = hintRectangle.Top - h;
int destX = System.Math.Max (0, ox + x);
int destY = System.Math.Max (0, oy + y);
previewWindow.Move (destX, destY);
previewWindow.ShowAll ();
codeSegmentTooltipTimeoutId = 0;
return false;
});
}