src/dotnet/JetBrains.PresentationAssistant/PresentationAssistantPopupWindowContext.cs (41 lines of code) (raw):
using JetBrains.Application;
using JetBrains.Application.Interop.NativeHook;
using JetBrains.Application.StdApplicationUI;
using JetBrains.Application.UI.Actions.ActionManager;
using JetBrains.Application.UI.PopupLayout;
using JetBrains.Application.UI.WindowManagement;
using JetBrains.Lifetimes;
using JetBrains.UI;
using JetBrains.UI.StdApplicationUI;
using JetBrains.UI.Utils;
using JetBrains.Util.Interop;
namespace JetBrains.ReSharper.Plugins.PresentationAssistant
{
[ShellComponent]
public class PresentationAssistantPopupWindowContext : PopupWindowContext
{
private static readonly PopupWindowMutex PopupWindowMutex = new PopupWindowMutex();
private readonly IWindowsHookManager windowsHookManager;
private readonly IMainWindow mainWindow;
public PresentationAssistantPopupWindowContext(Lifetime lifetime, IActionManager actionManager,
IMainWindow mainWindow, IWindowsHookManager windowsHookManager)
: base(lifetime, actionManager)
{
this.windowsHookManager = windowsHookManager;
this.mainWindow = mainWindow;
Mutex = PopupWindowMutex;
}
public PopupWindowMutex Mutex { get; private set; }
public override IPopupLayouter CreateLayouter(Lifetime lifetime)
{
var anchor = WindowAnchoringRect.AnchorToPrimaryMainWindowSafe(lifetime, mainWindow, windowsHookManager);
var dispositions = new[] {new Anchoring2D(Anchoring.MiddleWithin, Anchoring.FarWithin)};
// Padding is in pixels...
unsafe
{
var dpi = DpiResolutions.FromHWnd((void*) mainWindow.GetPrimaryWindow().Handle);
var padding = 75.0/DpiResolution.DeviceIndependent96DpiValue*dpi.DpiY;
return new DockingLayouter(lifetime, anchor, dispositions, (int)padding);
}
}
}
}