Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorVsevolod Kukol <sevoku@xamarin.com>2015-12-18 12:50:08 +0300
committerVsevolod Kukol <sevoku@xamarin.com>2015-12-18 12:50:08 +0300
commitef8d04c02a27e3764b62100d096508dd8161f9b7 (patch)
treec6ea5094d809d6f109f0b1934b45d3ebf4854db8 /main
parent6bc0ba573753df90d0c0397244a8d96df0ee92ae (diff)
[Ide] Clickable popover pager arrows
(fixes bug #7508)
Diffstat (limited to 'main')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs32
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs50
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs14
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs54
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs20
5 files changed, 138 insertions, 32 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs
index 5070c95ea6..87b61d689f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs
@@ -62,6 +62,7 @@ namespace MonoDevelop.Components
AppPaintable = true;
TypeHint = WindowTypeHint.Tooltip;
CheckScreenColormap ();
+ AddEvents ((int)EventMask.ButtonReleaseMask);
alignment = new Alignment (0, 0, 1f, 1f);
alignment.Show ();
@@ -198,6 +199,8 @@ namespace MonoDevelop.Components
set;
}
+ protected PopupPosition CurrentPosition { get { return position; }}
+
public virtual void RepositionWindow (Gdk.Rectangle? newCaret = null)
{
if (parent == null)
@@ -460,6 +463,35 @@ namespace MonoDevelop.Components
return rect;
}
}
+
+ public event EventHandler PagerLeftClicked;
+ public event EventHandler PagerRightClicked;
+
+ protected virtual void OnPagerLeftClicked ()
+ {
+ if (PagerLeftClicked != null)
+ PagerLeftClicked (this, null);
+ }
+
+ protected virtual void OnPagerRightClicked ()
+ {
+ if (PagerRightClicked != null)
+ PagerRightClicked (this, null);
+ }
+
+ protected override bool OnButtonReleaseEvent (EventButton evnt)
+ {
+ if (evnt.Button != 1 || !Theme.DrawPager)
+ return base.OnButtonPressEvent (evnt);
+
+ var retval = false;
+ if (retval = Theme.HitTestPagerLeftArrow (PangoContext, BorderAllocation, new Point ((int)evnt.X, (int)evnt.Y)))
+ OnPagerLeftClicked ();
+ else if (retval = Theme.HitTestPagerRightArrow (PangoContext, BorderAllocation, new Point ((int)evnt.X, (int)evnt.Y)))
+ OnPagerRightClicked ();
+
+ return retval;
+ }
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs
index 5000908d81..c08e8f4734 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs
@@ -64,6 +64,7 @@ namespace MonoDevelop.Components
bool pagerVertical;
bool showArrow;
PopupPosition targetPosition;
+ static readonly int pagerArrowPadding = 4;
public event EventHandler RedrawNeeded;
@@ -365,33 +366,60 @@ namespace MonoDevelop.Components
CairoExtensions.RoundedRectangle (context, region.X, region.Y, region.Width, region.Height, CornerRadius);
context.Clip ();
- Pango.Layout layout = SetupPagerText (context, pangoContext);
- int textWidth, textHeight;
- layout.GetPixelSize (out textWidth, out textHeight);
-
- int width = textWidth + Styles.PopoverWindow.PagerTriangleSize * 2 + 20;
- int height = Styles.PopoverWindow.PagerHeight;
+ Pango.Layout layout = SetupPagerText (pangoContext);
+ var boundingBox = GetPagerBounds (layout, region);
- Gdk.Rectangle boundingBox = new Gdk.Rectangle (region.X + region.Width - width, 0, width, height);
RenderPagerBackground (context, boundingBox);
- int arrowPadding = 4;
- Gdk.Rectangle arrowRect = new Gdk.Rectangle (boundingBox.X + arrowPadding,
+ Gdk.Rectangle arrowRect = new Gdk.Rectangle (boundingBox.X + pagerArrowPadding,
boundingBox.Y + (boundingBox.Height - Styles.PopoverWindow.PagerTriangleSize) / 2,
Styles.PopoverWindow.PagerTriangleSize,
Styles.PopoverWindow.PagerTriangleSize);
RenderPagerArrow (context, arrowRect, PagerVertical ? ArrowType.Up : ArrowType.Left);
- arrowRect.X = boundingBox.X + boundingBox.Width - (arrowPadding + Styles.PopoverWindow.PagerTriangleSize);
+ arrowRect.X = boundingBox.X + boundingBox.Width - (pagerArrowPadding + Styles.PopoverWindow.PagerTriangleSize);
RenderPagerArrow (context, arrowRect, PagerVertical ? ArrowType.Down : ArrowType.Right);
RenderPagerText (context, layout, boundingBox);
}
+ Gdk.Rectangle GetPagerBounds (Pango.Layout layout, Gdk.Rectangle region)
+ {
+ int textWidth, textHeight;
+ layout.GetPixelSize (out textWidth, out textHeight);
+
+ int width = textWidth + Styles.PopoverWindow.PagerTriangleSize * 2 + 20;
+ int height = Styles.PopoverWindow.PagerHeight;
+
+ return new Gdk.Rectangle (region.X + region.Width - width, 0, width, height);
+ }
+
+ public bool HitTestPagerLeftArrow (Pango.Context pangoContext, Gdk.Rectangle region, Gdk.Point hitPoint)
+ {
+ Pango.Layout layout = SetupPagerText (pangoContext);
+ var boundingBox = GetPagerBounds (layout, region);
+ Gdk.Rectangle arrowActiveRect = new Gdk.Rectangle (boundingBox.X,
+ boundingBox.Y,
+ Styles.PopoverWindow.PagerTriangleSize + (pagerArrowPadding * 2),
+ boundingBox.Height);
+ return arrowActiveRect.Contains (hitPoint);
+ }
+
+ public bool HitTestPagerRightArrow (Pango.Context pangoContext, Gdk.Rectangle region, Gdk.Point hitPoint)
+ {
+ Pango.Layout layout = SetupPagerText (pangoContext);
+ var boundingBox = GetPagerBounds (layout, region);
+ Gdk.Rectangle arrowActiveRect = new Gdk.Rectangle (boundingBox.X + boundingBox.Width - (pagerArrowPadding * 2 + Styles.PopoverWindow.PagerTriangleSize),
+ boundingBox.Y,
+ Styles.PopoverWindow.PagerTriangleSize + (pagerArrowPadding * 2),
+ boundingBox.Height);
+ return arrowActiveRect.Contains (hitPoint);
+ }
+
/// <summary>
/// Sets the Pango.Layout for pager text as it will be rendered. This will be used to perform sizing on the rest of the pager.
/// </summary>
- protected virtual Pango.Layout SetupPagerText (Cairo.Context context, Pango.Context pangoContext)
+ protected virtual Pango.Layout SetupPagerText (Pango.Context pangoContext)
{
Pango.Layout pl = new Pango.Layout (pangoContext);
pl.SetText (string.Format ("{0} of {1}", CurrentPage + 1, NumPages));
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs
index c6e37b361a..7ecf55c38a 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs
@@ -235,6 +235,20 @@ namespace MonoDevelop.Ide.CodeCompletion
lastParam = -2;
ResetTooltipInformation ();
}
+
+ protected override void OnPagerLeftClicked ()
+ {
+ if (Ext != null && Widget != null)
+ ParameterInformationWindowManager.OverloadUp (Ext, Widget);
+ base.OnPagerRightClicked ();
+ }
+
+ protected override void OnPagerRightClicked ()
+ {
+ if (Ext != null && Widget != null)
+ ParameterInformationWindowManager.OverloadDown (Ext, Widget);
+ base.OnPagerRightClicked ();
+ }
public void HideParameterInfo ()
{
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs
index 0a3fdadabc..22cbeff405 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs
@@ -66,28 +66,10 @@ namespace MonoDevelop.Ide.CodeCompletion
if (methods.Count == 0)
return false;
- MethodData cmd = methods [methods.Count - 1];
-
if (descriptor.SpecialKey == SpecialKey.Down) {
- if (cmd.MethodProvider.Count <= 1)
- return false;
- if (cmd.CurrentOverload < cmd.MethodProvider.Count - 1)
- cmd.CurrentOverload ++;
- else
- cmd.CurrentOverload = 0;
- window.ChangeOverload ();
- UpdateWindow (ext, widget);
- return true;
+ return OverloadDown (ext, widget);
} else if (descriptor.SpecialKey == SpecialKey.Up) {
- if (cmd.MethodProvider.Count <= 1)
- return false;
- if (cmd.CurrentOverload > 0)
- cmd.CurrentOverload --;
- else
- cmd.CurrentOverload = cmd.MethodProvider.Count - 1;
- window.ChangeOverload ();
- UpdateWindow (ext, widget);
- return true;
+ return OverloadUp (ext, widget);
}
else if (descriptor.SpecialKey == SpecialKey.Escape) {
HideWindow (ext, widget);
@@ -95,6 +77,38 @@ namespace MonoDevelop.Ide.CodeCompletion
}
return false;
}
+
+ internal static bool OverloadDown (CompletionTextEditorExtension ext, ICompletionWidget widget)
+ {
+ if (methods.Count == 0)
+ return false;
+ MethodData cmd = methods [methods.Count - 1];
+ if (cmd.MethodProvider.Count <= 1)
+ return false;
+ if (cmd.CurrentOverload < cmd.MethodProvider.Count - 1)
+ cmd.CurrentOverload ++;
+ else
+ cmd.CurrentOverload = 0;
+ window.ChangeOverload ();
+ UpdateWindow (ext, widget);
+ return true;
+ }
+
+ internal static bool OverloadUp (CompletionTextEditorExtension ext, ICompletionWidget widget)
+ {
+ if (methods.Count == 0)
+ return false;
+ MethodData cmd = methods [methods.Count - 1];
+ if (cmd.MethodProvider.Count <= 1)
+ return false;
+ if (cmd.CurrentOverload > 0)
+ cmd.CurrentOverload --;
+ else
+ cmd.CurrentOverload = cmd.MethodProvider.Count - 1;
+ window.ChangeOverload ();
+ UpdateWindow (ext, widget);
+ return true;
+ }
internal static void PostProcessKeyEvent (CompletionTextEditorExtension ext, ICompletionWidget widget, KeyDescriptor descriptor)
{
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs
index 90b024c42c..14bda68a54 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs
@@ -153,7 +153,13 @@ namespace MonoDevelop.Ide.CodeCompletion
descriptionBox.ShowAll ();
}
Theme.CurrentPage = current_overload;
- QueueResize ();
+ // if the target is not on the left or top side, we may loose the arrow alignment on our target
+ // and must reposition
+ if (!CurrentPosition.HasFlag (PopupPosition.Left) &&
+ !CurrentPosition.HasFlag (PopupPosition.Top))
+ RepositionWindow ();
+ else
+ QueueResize ();
}
}
@@ -303,6 +309,18 @@ namespace MonoDevelop.Ide.CodeCompletion
});
}
+ protected override void OnPagerLeftClicked ()
+ {
+ OverloadLeft ();
+ base.OnPagerLeftClicked ();
+ }
+
+ protected override void OnPagerRightClicked ()
+ {
+ OverloadRight ();
+ base.OnPagerRightClicked ();
+ }
+
void HandleSkinChanged (object sender, EventArgs e)
{
SetDefaultScheme ();