mirror of
https://gitee.com/csharpui/CPF.git
synced 2025-04-05 08:37:19 +08:00
1377 lines
58 KiB
C#
1377 lines
58 KiB
C#
![]() |
using System;
|
|||
|
using CPF;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Threading;
|
|||
|
using System.IO;
|
|||
|
using CPF.Threading;
|
|||
|
using System.Collections.Concurrent;
|
|||
|
using CPF.Drawing;
|
|||
|
using CPF.Input;
|
|||
|
using System.Linq;
|
|||
|
using CPF.Controls;
|
|||
|
using CPF.Platform;
|
|||
|
using CPF.Mac.Foundation;
|
|||
|
using CPF.Mac.AppKit;
|
|||
|
using CPF.Mac.CoreGraphics;
|
|||
|
using CPF.Mac.ObjCRuntime;
|
|||
|
using System.Diagnostics;
|
|||
|
|
|||
|
namespace CPF.Mac
|
|||
|
{
|
|||
|
//[Register("WindowImpl", true)]
|
|||
|
public class WindowImpl : NSWindow, IWindowImpl, NotMonoMac
|
|||
|
{
|
|||
|
internal NSView view;
|
|||
|
public WindowImpl() : base(new CGRect(0, 0, 10, 10), (NSWindowStyle.Closable | NSWindowStyle.Miniaturizable), NSBackingStore.Nonretained, false)
|
|||
|
{
|
|||
|
AppDelegate.windows.Add(this);
|
|||
|
MinSize = new CGSize(1, 1);
|
|||
|
ContentMinSize = new CGSize(1, 1);
|
|||
|
if (Application.GetDrawingFactory().UseGPU)
|
|||
|
{
|
|||
|
view = new OpenGLView(Frame, this);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
view = new InnerView(Frame, this);
|
|||
|
}
|
|||
|
|
|||
|
ContentView = view;
|
|||
|
IsOpaque = false;
|
|||
|
BackgroundColor = NSColor.Clear;
|
|||
|
AcceptsMouseMovedEvents = true;
|
|||
|
HasShadow = false;
|
|||
|
ReleasedWhenClosed = true;
|
|||
|
|
|||
|
//RegisterForDraggedTypes(new string[] { NSPasteboard.NSFilenamesType, "*.jpg", "*.jpeg" });
|
|||
|
//ShouldDragDocumentWithEvent = (NSWindow window, NSEvent theEvent, CGPoint dragImageLocation, NSPasteboard withPasteboard) =>
|
|||
|
//{
|
|||
|
// return true;
|
|||
|
//};
|
|||
|
//DocumentEdited = true;
|
|||
|
//WillReturnFieldEditor = (NSWindow sender, NSObject client) =>
|
|||
|
//{
|
|||
|
// return FieldEditor(false,client);
|
|||
|
//};
|
|||
|
|
|||
|
//WillUseFullScreenPresentationOptions = (s, e) =>
|
|||
|
//{
|
|||
|
// //return e;
|
|||
|
// return NSApplicationPresentationOptions.AutoHideToolbar| NSApplicationPresentationOptions.FullScreen| NSApplicationPresentationOptions.AutoHideMenuBar;
|
|||
|
//};
|
|||
|
//this.WindowShouldClose = delegate
|
|||
|
// {
|
|||
|
// return !Closing();
|
|||
|
// };
|
|||
|
this.DidMiniaturize += (s, e) =>
|
|||
|
{
|
|||
|
//最小化
|
|||
|
windowState = WindowState.Minimized;
|
|||
|
if (WindowStateChanged != null)
|
|||
|
{
|
|||
|
WindowStateChanged();
|
|||
|
}
|
|||
|
};
|
|||
|
this.DidDeminiaturize += (s, e) =>
|
|||
|
{
|
|||
|
if (windowState == WindowState.Minimized)
|
|||
|
{
|
|||
|
windowState = WindowState.Normal;
|
|||
|
}
|
|||
|
//取消最小化
|
|||
|
if (WindowStateChanged != null)
|
|||
|
{
|
|||
|
WindowStateChanged();
|
|||
|
}
|
|||
|
};
|
|||
|
WillClose += WindowImpl_WillClose;
|
|||
|
DidMoved += WindowImpl_DidMoved;
|
|||
|
//scaling = (float)BackingScaleFactor;
|
|||
|
}
|
|||
|
public override void PerformClose(NSObject sender)
|
|||
|
{
|
|||
|
base.PerformClose(sender);
|
|||
|
}
|
|||
|
internal NSEvent LeftMouseDown;
|
|||
|
bool isMouseEnter;
|
|||
|
public override void SendEvent(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.SendEvent(theEvent);
|
|||
|
if (!enable)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
MouseButton mouseButton;
|
|||
|
switch (theEvent.Type)
|
|||
|
{
|
|||
|
case NSEventType.MouseMoved:
|
|||
|
var isme = view.HitTest(theEvent.LocationInWindow) != null;
|
|||
|
if (isme != isMouseEnter)
|
|||
|
{
|
|||
|
if (!isme)
|
|||
|
{
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseLeave);
|
|||
|
NSCursor.ArrowCursor.Set();
|
|||
|
}
|
|||
|
isMouseEnter = isme;
|
|||
|
}
|
|||
|
|
|||
|
if (isMouseEnter || root.InputManager.MouseDevice.Captured != null)
|
|||
|
{
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
if (!root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove))
|
|||
|
{
|
|||
|
if (root.Children.FirstOrDefault(a => a.IsMouseOver) == null)
|
|||
|
{
|
|||
|
SetCursor(root.Cursor);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case NSEventType.LeftMouseDown:
|
|||
|
LeftMouseDown = theEvent;
|
|||
|
modifiers |= InputModifiers.LeftMouseButton;
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseDown);
|
|||
|
LeftMouseDown = null;
|
|||
|
//this.DisableCursorRects();
|
|||
|
break;
|
|||
|
case NSEventType.LeftMouseUp:
|
|||
|
//this.EnableCursorRects();
|
|||
|
modifiers ^= InputModifiers.LeftMouseButton;
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseUp);
|
|||
|
break;
|
|||
|
case NSEventType.LeftMouseDragged:
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
break;
|
|||
|
case NSEventType.RightMouseDown:
|
|||
|
modifiers |= InputModifiers.RightMouseButton;
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseDown);
|
|||
|
break;
|
|||
|
case NSEventType.RightMouseUp:
|
|||
|
modifiers ^= InputModifiers.RightMouseButton;
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseUp);
|
|||
|
break;
|
|||
|
case NSEventType.RightMouseDragged:
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
break;
|
|||
|
case NSEventType.OtherMouseDown:
|
|||
|
modifiers |= InputModifiers.MiddleMouseButton;
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseDown);
|
|||
|
break;
|
|||
|
case NSEventType.OtherMouseUp:
|
|||
|
modifiers ^= InputModifiers.MiddleMouseButton;
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseUp);
|
|||
|
break;
|
|||
|
case NSEventType.OtherMouseDragged:
|
|||
|
mouseButton = Mouse(theEvent);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
break;
|
|||
|
//case NSEventType.KeyDown:
|
|||
|
|
|||
|
// break;
|
|||
|
//case NSEventType.KeyUp:
|
|||
|
|
|||
|
// break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void TouchesBeganWithEvent(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.TouchesBeganWithEvent(theEvent);
|
|||
|
Console.WriteLine("TouchesBeganWithEvent");
|
|||
|
}
|
|||
|
public override void TouchesEndedWithEvent(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.TouchesEndedWithEvent(theEvent);
|
|||
|
Console.WriteLine("TouchesEndedWithEvent");
|
|||
|
}
|
|||
|
public override void TouchesCancelledWithEvent(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.TouchesCancelledWithEvent(theEvent);
|
|||
|
Console.WriteLine("TouchesCancelledWithEvent");
|
|||
|
}
|
|||
|
|
|||
|
CGPoint oldPoint;
|
|||
|
private void WindowImpl_DidMoved(object sender, EventArgs e)
|
|||
|
{
|
|||
|
UpdateCursor();
|
|||
|
if (PositionChanged != null)
|
|||
|
{
|
|||
|
var h = this.Screen.Bounds.Height;
|
|||
|
var point = new PixelPoint((int)Frame.X, (int)(h - Frame.Height - Frame.Y));
|
|||
|
oldPoint = Frame.Location;
|
|||
|
PositionChanged(point);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void WindowImpl_WillClose(object sender, EventArgs e)
|
|||
|
{
|
|||
|
Console.WriteLine("WillClose");
|
|||
|
if (isMainVisible)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Closed != null)
|
|||
|
{
|
|||
|
Closed();
|
|||
|
}
|
|||
|
//if (parent != null)
|
|||
|
//{
|
|||
|
// //parent.IsEnabled = true;
|
|||
|
// (parent.ViewImpl as WindowImpl).enable = false;
|
|||
|
//}
|
|||
|
//parent = null;
|
|||
|
if (root is Window)
|
|||
|
{
|
|||
|
if ((root as Window).IsMain)
|
|||
|
{
|
|||
|
var app = MacPlatform.Application;
|
|||
|
app.Terminate(app);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//public override bool AcceptsMouseMovedEvents { get => true; set => base.AcceptsMouseMovedEvents = value; }
|
|||
|
public override bool CanBecomeKeyWindow => CanActivate;
|
|||
|
public override bool AcceptsFirstResponder()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
public override bool CanBecomeMainWindow => true;
|
|||
|
bool validDpi;
|
|||
|
public void InvalidateDpi()
|
|||
|
{
|
|||
|
validDpi = false;
|
|||
|
}
|
|||
|
//double dpi;
|
|||
|
//internal double DPIY
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// if (!validDpi)
|
|||
|
// {
|
|||
|
// using (var str = new NSString("NSDeviceResolution"))
|
|||
|
// {
|
|||
|
// var screen = base.Screen;
|
|||
|
// if (screen == null)
|
|||
|
// {
|
|||
|
// screen = NSScreen.MainScreen;
|
|||
|
// }
|
|||
|
// var v = screen.DeviceDescription.ObjectForKey(str) as NSValue;
|
|||
|
// scaling = (float)BackingScaleFactor;
|
|||
|
// dpi = v.SizeValue.Height;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// return dpi;
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
CGRect lastFrame;
|
|||
|
bool validFrame = true;
|
|||
|
internal CPF.Controls.View root;
|
|||
|
//float scaling = 1;
|
|||
|
internal WindowState windowState = WindowState.Normal;
|
|||
|
public Func<bool> Closing { get; set; }
|
|||
|
public Action Closed { get; set; }
|
|||
|
|
|||
|
public override void Close()
|
|||
|
{
|
|||
|
isMainVisible = false;
|
|||
|
if (Closing != null)
|
|||
|
{
|
|||
|
if (!Closing.Invoke())
|
|||
|
{
|
|||
|
base.Close();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
base.Close();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public WindowState WindowState
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return windowState;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
switch (value)
|
|||
|
{
|
|||
|
case WindowState.Normal:
|
|||
|
if (IsMiniaturized)
|
|||
|
{
|
|||
|
Deminiaturize(this);
|
|||
|
lastFrame = Frame;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//if ((root as Window).IsFullScreen)
|
|||
|
//{
|
|||
|
// (root as Window).IsFullScreen = false;
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
if (windowState == WindowState.FullScreen)
|
|||
|
{
|
|||
|
IsZoomed = false;
|
|||
|
ToggleFullScreen(this);
|
|||
|
CollectionBehavior = NSWindowCollectionBehavior.Default;
|
|||
|
}
|
|||
|
windowState = WindowState.Normal;
|
|||
|
if (WindowStateChanged != null)
|
|||
|
{
|
|||
|
WindowStateChanged();
|
|||
|
}
|
|||
|
if (!validFrame)
|
|||
|
{
|
|||
|
var screen = Screen;
|
|||
|
lastFrame = new CGRect(screen.WorkingArea.X + (screen.WorkingArea.Width * 0.05), screen.WorkingArea.Y + (screen.WorkingArea.Height * 0.05), screen.WorkingArea.Width * 0.9, screen.WorkingArea.Height * 0.9);
|
|||
|
}
|
|||
|
SetFrame(lastFrame, true);
|
|||
|
Position = new PixelPoint((int)lastFrame.X, (int)lastFrame.Y);
|
|||
|
//}
|
|||
|
}
|
|||
|
validFrame = true;
|
|||
|
//Zoom(this);
|
|||
|
break;
|
|||
|
case WindowState.Minimized:
|
|||
|
//if ((root as Window).IsFullScreen)
|
|||
|
//{
|
|||
|
// setFullScreem = true;
|
|||
|
// (root as Window).IsFullScreen = false;
|
|||
|
// setFullScreem = false;
|
|||
|
//}
|
|||
|
Miniaturize(this);
|
|||
|
break;
|
|||
|
case WindowState.Maximized:
|
|||
|
if (IsMiniaturized)
|
|||
|
{
|
|||
|
Deminiaturize(this);
|
|||
|
}
|
|||
|
//PerformZoom(this);有窗体边框才行
|
|||
|
lastFrame = Frame;
|
|||
|
windowState = WindowState.Maximized;
|
|||
|
if (WindowStateChanged != null)
|
|||
|
{
|
|||
|
WindowStateChanged();
|
|||
|
}
|
|||
|
Position = new PixelPoint();
|
|||
|
if (base.Screen != null)
|
|||
|
{
|
|||
|
validFrame = true;
|
|||
|
SetFrame(base.Screen.VisibleFrame, true);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
validFrame = false;
|
|||
|
SetFrame(NSScreen.MainScreen.VisibleFrame, true);
|
|||
|
}
|
|||
|
break;
|
|||
|
case WindowState.FullScreen:
|
|||
|
if (windowState != WindowState.Minimized)
|
|||
|
{
|
|||
|
validFrame = base.Screen != null;
|
|||
|
lastFrame = Frame;
|
|||
|
}
|
|||
|
windowState = WindowState.FullScreen;
|
|||
|
if (WindowStateChanged != null)
|
|||
|
{
|
|||
|
WindowStateChanged();
|
|||
|
}
|
|||
|
CollectionBehavior = NSWindowCollectionBehavior.FullScreenPrimary;
|
|||
|
//base.StyleMask = NSWindowStyle.FullScreenWindow;
|
|||
|
ToggleFullScreen(this);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//public override void SetFrame(CGRect frameRect, bool display)
|
|||
|
//{
|
|||
|
// base.SetFrame(frameRect, display);
|
|||
|
// var w = WindowState.Normal;
|
|||
|
// if (IsMiniaturized)
|
|||
|
// {
|
|||
|
// w = WindowState.Minimized;
|
|||
|
// }
|
|||
|
// else if (IsZoomed)
|
|||
|
// {
|
|||
|
// w = WindowState.Maximized;
|
|||
|
// }
|
|||
|
// if (w != windowState)
|
|||
|
// {
|
|||
|
// windowState = w;
|
|||
|
// if (WindowStateChanged != null)
|
|||
|
// {
|
|||
|
// WindowStateChanged();
|
|||
|
// }
|
|||
|
// }
|
|||
|
// if (Resized != null)
|
|||
|
// {
|
|||
|
// Resized(new Size((float)frameRect.Width, (float)frameRect.Height));
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
public Action WindowStateChanged { get; set; }
|
|||
|
|
|||
|
public new Screen Screen { get { return MacPlatform.GetScreen(base.Screen); } }
|
|||
|
|
|||
|
public bool CanResize { get; set; }
|
|||
|
public bool IsMain { get; set; }
|
|||
|
|
|||
|
public float RenderScaling { get { return (float)BackingScaleFactor * Application.BaseScale; } }
|
|||
|
|
|||
|
public Action ScalingChanged { get; set; }
|
|||
|
public Action<Size> Resized { get; set; }
|
|||
|
public Action<PixelPoint> PositionChanged { get; set; }
|
|||
|
public Action Activated { get; set; }
|
|||
|
public Action Deactivated { get; set; }
|
|||
|
public bool CanActivate { get; set; } = true;
|
|||
|
|
|||
|
public void SetIMEEnable(bool value)
|
|||
|
{
|
|||
|
if (value)
|
|||
|
{
|
|||
|
this.view.InputContext.Activate();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//view.InputContext.Deactivate();
|
|||
|
this.view.InputContext.SelectedKeyboardInputSource = "com.apple.keylayout.ABC";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public float LayoutScaling => Application.BaseScale;
|
|||
|
|
|||
|
public PixelPoint Position
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
var sc = Screen;
|
|||
|
var h = sc.Bounds.Height;
|
|||
|
var s = root.ActualSize;
|
|||
|
var f = Frame;
|
|||
|
return new PixelPoint((int)f.X, (int)(h - (s.Height * LayoutScaling + f.Y)));
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
var sc = Screen;
|
|||
|
var h = sc.Bounds.Height;
|
|||
|
var s = root.ActualSize;
|
|||
|
this.SetFrame(new CGRect(value.X, h - (s.Height * LayoutScaling + value.Y), s.Width * LayoutScaling, s.Height * LayoutScaling), root.Visibility == Visibility.Visible);
|
|||
|
if (oldPoint != Frame.Location)
|
|||
|
{
|
|||
|
WindowImpl_DidMoved(null, null);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Activate()
|
|||
|
{
|
|||
|
if (CanActivate)
|
|||
|
{
|
|||
|
MakeKeyAndOrderFront(this);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OrderFront(this);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void ResignKeyWindow()
|
|||
|
{
|
|||
|
base.ResignKeyWindow();
|
|||
|
if (Deactivated != null)
|
|||
|
{
|
|||
|
Deactivated();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void BecomeKeyWindow()
|
|||
|
{
|
|||
|
base.BecomeKeyWindow();
|
|||
|
if (Activated != null)
|
|||
|
{
|
|||
|
Activated();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Capture()
|
|||
|
{
|
|||
|
//throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
//bool dragMove;
|
|||
|
//CGPoint dragPos;
|
|||
|
//public void DragMove()
|
|||
|
//{
|
|||
|
// //MovableByWindowBackground = true;
|
|||
|
// dragMove = true;
|
|||
|
// dragPos = NSEvent.CurrentMouseLocation;
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
public void Invalidate(in Rect rect)
|
|||
|
{
|
|||
|
var r = new Rect(rect.X * LayoutScaling, rect.Y * LayoutScaling, rect.Width * LayoutScaling, rect.Height * LayoutScaling);
|
|||
|
view.SetNeedsDisplayInRect(new CGRect(r.X - 1, view.Bounds.Height - r.Height - r.Y - 1, r.Width + 2, r.Height + 2));
|
|||
|
}
|
|||
|
|
|||
|
public Point PointToScreen(Point point)
|
|||
|
{
|
|||
|
var p = ConvertBaseToScreen(new CGPoint(point.X * LayoutScaling, view.Bounds.Height - point.Y * LayoutScaling));
|
|||
|
var pp = new Point((float)p.X, Screen.Bounds.Height - (float)p.Y);
|
|||
|
//System.Diagnostics.Debug.WriteLine(pp);
|
|||
|
return pp;
|
|||
|
}
|
|||
|
|
|||
|
public void ReleaseCapture()
|
|||
|
{
|
|||
|
//throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
NSCursor cursor;
|
|||
|
public void SetCursor(Cursor cursor)
|
|||
|
{
|
|||
|
var cu = cursor.PlatformCursor as NSCursor;
|
|||
|
if (cu != this.cursor)
|
|||
|
{
|
|||
|
this.cursor = cu;
|
|||
|
UpdateCursor();
|
|||
|
}
|
|||
|
//Debug.WriteLine(cu);
|
|||
|
}
|
|||
|
|
|||
|
internal void UpdateCursor()
|
|||
|
{
|
|||
|
if (cursor != null)
|
|||
|
{
|
|||
|
//view.ResetCursorRects();
|
|||
|
//view.AddCursorRect(Frame, cursor);
|
|||
|
cursor.Set();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void SetIcon(Image image)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
internal Point imePoint;
|
|||
|
public void SetIMEPosition(Point point)
|
|||
|
{
|
|||
|
imePoint = point;
|
|||
|
}
|
|||
|
|
|||
|
public void SetRoot(CPF.Controls.View view)
|
|||
|
{
|
|||
|
root = view;
|
|||
|
root.LayoutUpdated += Root_LayoutUpdated;
|
|||
|
}
|
|||
|
// bool isFirst = true;
|
|||
|
private void Root_LayoutUpdated(object sender, RoutedEventArgs e)
|
|||
|
{
|
|||
|
var b = this.Frame;
|
|||
|
var s = root.ActualSize;
|
|||
|
var l = root.ActualOffset;
|
|||
|
var src = root.Screen;
|
|||
|
var scaling = LayoutScaling;
|
|||
|
var h = src.Bounds.Height;
|
|||
|
if ((int)b.Width != (int)(s.Width * scaling) || (int)b.Height != (int)(s.Height * scaling) || (int)b.X != (int)(l.X * scaling) || (int)b.Y != (int)((h - (s.Height + l.Y) * scaling - src.WorkingArea.Y)))
|
|||
|
{
|
|||
|
//Bounds = new Rect(l.X * scaling, l.Y * scaling, s.Width, s.Height);
|
|||
|
this.SetFrame(new CGRect(l.X * scaling + src.WorkingArea.X, h - (s.Height + l.Y) * scaling - src.WorkingArea.Y, s.Width * scaling, s.Height * scaling), root.Visibility == Visibility.Visible);
|
|||
|
//Console.WriteLine(l + "," + s + " " + Frame + " " + src.WorkingArea);
|
|||
|
if (oldPoint != Frame.Location)
|
|||
|
{
|
|||
|
WindowImpl_DidMoved(null, null);
|
|||
|
}
|
|||
|
}
|
|||
|
//Debug.WriteLine("Root_LayoutUpdated" + s);
|
|||
|
}
|
|||
|
|
|||
|
public void SetTitle(string text)
|
|||
|
{
|
|||
|
base.Title = text;
|
|||
|
// base.TitleVisibility = NSWindowTitleVisibility.Visible;
|
|||
|
}
|
|||
|
|
|||
|
internal bool isMainVisible;
|
|||
|
public void SetVisible(bool visible)
|
|||
|
{
|
|||
|
if (visible)
|
|||
|
{
|
|||
|
isMainVisible = false;
|
|||
|
if (CanActivate)
|
|||
|
{
|
|||
|
MakeKeyAndOrderFront(this);
|
|||
|
//var window = new NSWindow(new CGRect(0, 0, 200, 200), NSWindowStyle.Borderless, NSBackingStore.Buffered, false);
|
|||
|
//window.ContentView = new GLView(window.Frame, new NSOpenGLPixelFormat());
|
|||
|
//window.MakeKeyAndOrderFront(window);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OrderFront(this);
|
|||
|
}
|
|||
|
root.LayoutManager.ExecuteLayoutPass();
|
|||
|
root.Visibility = Visibility.Visible;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OrderOut(this);
|
|||
|
isMainVisible = IsMain;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//Window parent;
|
|||
|
public void ShowDialog(Window window)
|
|||
|
{
|
|||
|
//if (window.ViewImpl != this)
|
|||
|
//{
|
|||
|
// //window.IsEnabled = false;
|
|||
|
// (window.ViewImpl as WindowImpl).enable = false;
|
|||
|
// parent = window;
|
|||
|
//}
|
|||
|
//ReleasedWhenClosed = true;
|
|||
|
this.Level = NSWindowLevel.ModalPanel;
|
|||
|
SetVisible(true);
|
|||
|
}
|
|||
|
|
|||
|
public void ShowInTaskbar(bool value)
|
|||
|
{
|
|||
|
//TitleVisibility = value ? NSWindowTitleVisibility.Visible : NSWindowTitleVisibility.Hidden;
|
|||
|
}
|
|||
|
|
|||
|
public void TopMost(bool value)
|
|||
|
{
|
|||
|
Level = value ? NSWindowLevel.Floating : NSWindowLevel.Normal;
|
|||
|
}
|
|||
|
|
|||
|
//public override void MouseUp(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// //dragMove = false;
|
|||
|
// //rs = RS.none;
|
|||
|
// base.MouseUp(theEvent);
|
|||
|
// //view.mouseDownCanMoveWindow = false;
|
|||
|
// modifiers ^= InputModifiers.LeftMouseButton;
|
|||
|
// //System.Diagnostics.Debug.WriteLine("MouseUp");
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseUp);
|
|||
|
//}
|
|||
|
|
|||
|
InputModifiers modifiers = InputModifiers.None;
|
|||
|
MouseButton Mouse(NSEvent theEvent)
|
|||
|
{
|
|||
|
SetModifier();
|
|||
|
MouseButton mouseButton = MouseButton.Left;
|
|||
|
switch (theEvent.Type)
|
|||
|
{
|
|||
|
case NSEventType.LeftMouseDown:
|
|||
|
case NSEventType.LeftMouseUp:
|
|||
|
mouseButton = MouseButton.Left;
|
|||
|
break;
|
|||
|
case NSEventType.RightMouseDown:
|
|||
|
case NSEventType.RightMouseUp:
|
|||
|
mouseButton = MouseButton.Right;
|
|||
|
break;
|
|||
|
case NSEventType.MouseMoved:
|
|||
|
break;
|
|||
|
case NSEventType.LeftMouseDragged:
|
|||
|
break;
|
|||
|
case NSEventType.RightMouseDragged:
|
|||
|
break;
|
|||
|
case NSEventType.MouseEntered:
|
|||
|
break;
|
|||
|
case NSEventType.MouseExited:
|
|||
|
break;
|
|||
|
case NSEventType.KeyDown:
|
|||
|
break;
|
|||
|
case NSEventType.KeyUp:
|
|||
|
break;
|
|||
|
case NSEventType.FlagsChanged:
|
|||
|
break;
|
|||
|
case NSEventType.AppKitDefined:
|
|||
|
break;
|
|||
|
case NSEventType.SystemDefined:
|
|||
|
break;
|
|||
|
case NSEventType.ApplicationDefined:
|
|||
|
break;
|
|||
|
case NSEventType.Periodic:
|
|||
|
break;
|
|||
|
case NSEventType.CursorUpdate:
|
|||
|
break;
|
|||
|
case NSEventType.ScrollWheel:
|
|||
|
break;
|
|||
|
case NSEventType.TabletPoint:
|
|||
|
break;
|
|||
|
case NSEventType.TabletProximity:
|
|||
|
break;
|
|||
|
case NSEventType.OtherMouseDown:
|
|||
|
case NSEventType.OtherMouseUp:
|
|||
|
mouseButton = MouseButton.Middle;
|
|||
|
break;
|
|||
|
case NSEventType.OtherMouseDragged:
|
|||
|
break;
|
|||
|
case NSEventType.Gesture:
|
|||
|
break;
|
|||
|
case NSEventType.Magnify:
|
|||
|
break;
|
|||
|
case NSEventType.Swipe:
|
|||
|
break;
|
|||
|
case NSEventType.Rotate:
|
|||
|
break;
|
|||
|
case NSEventType.BeginGesture:
|
|||
|
break;
|
|||
|
case NSEventType.EndGesture:
|
|||
|
break;
|
|||
|
case NSEventType.SmartMagnify:
|
|||
|
break;
|
|||
|
case NSEventType.QuickLook:
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return mouseButton;
|
|||
|
}
|
|||
|
|
|||
|
internal void SetModifier()
|
|||
|
{
|
|||
|
var m = NSEvent.CurrentModifierFlags;
|
|||
|
if (modifiers.HasFlag(InputModifiers.Shift))
|
|||
|
{
|
|||
|
modifiers ^= InputModifiers.Shift;
|
|||
|
}
|
|||
|
if (modifiers.HasFlag(InputModifiers.Alt))
|
|||
|
{
|
|||
|
modifiers ^= InputModifiers.Alt;
|
|||
|
}
|
|||
|
if (modifiers.HasFlag(InputModifiers.Control))
|
|||
|
{
|
|||
|
modifiers ^= InputModifiers.Control;
|
|||
|
}
|
|||
|
if (modifiers.HasFlag(InputModifiers.Windows))
|
|||
|
{
|
|||
|
modifiers ^= InputModifiers.Windows;
|
|||
|
}
|
|||
|
|
|||
|
switch (m)
|
|||
|
{
|
|||
|
case NSEventModifierMask.AlphaShiftKeyMask:
|
|||
|
break;
|
|||
|
case NSEventModifierMask.ShiftKeyMask:
|
|||
|
modifiers |= InputModifiers.Shift;
|
|||
|
break;
|
|||
|
case NSEventModifierMask.ControlKeyMask:
|
|||
|
modifiers |= InputModifiers.Control;
|
|||
|
break;
|
|||
|
case NSEventModifierMask.AlternateKeyMask:
|
|||
|
modifiers |= InputModifiers.Alt;
|
|||
|
break;
|
|||
|
case NSEventModifierMask.CommandKeyMask:
|
|||
|
modifiers |= InputModifiers.Windows;
|
|||
|
break;
|
|||
|
case NSEventModifierMask.NumericPadKeyMask:
|
|||
|
break;
|
|||
|
case NSEventModifierMask.HelpKeyMask:
|
|||
|
break;
|
|||
|
case NSEventModifierMask.FunctionKeyMask:
|
|||
|
break;
|
|||
|
case NSEventModifierMask.DeviceIndependentModifierFlagsMask:
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
root.InputManager.KeyboardDevice.Modifiers = modifiers;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//public override void MouseDown(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.MouseDown(theEvent);
|
|||
|
// modifiers |= InputModifiers.LeftMouseButton;
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// //Debug.WriteLine(modifiers);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseDown);
|
|||
|
//}
|
|||
|
|
|||
|
//public override void MouseDragged(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.MouseDragged(theEvent);
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
//}
|
|||
|
//public override void RightMouseDown(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.RightMouseDown(theEvent);
|
|||
|
// modifiers |= InputModifiers.RightMouseButton;
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseDown);
|
|||
|
|
|||
|
//}
|
|||
|
//public override void RightMouseUp(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.RightMouseUp(theEvent);
|
|||
|
// modifiers ^= InputModifiers.RightMouseButton;
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseUp);
|
|||
|
|
|||
|
//}
|
|||
|
//public override void RightMouseDragged(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.RightMouseDragged(theEvent);
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
//}
|
|||
|
//public override void OtherMouseDown(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.OtherMouseDown(theEvent);
|
|||
|
// modifiers |= InputModifiers.MiddleMouseButton;
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseDown);
|
|||
|
|
|||
|
//}
|
|||
|
//public override void OtherMouseUp(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.OtherMouseUp(theEvent);
|
|||
|
// modifiers ^= InputModifiers.MiddleMouseButton;
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseButtonEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice, mouseButton), root.LayoutManager.VisibleUIElements, EventType.MouseUp);
|
|||
|
//}
|
|||
|
//public override void OtherMouseDragged(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.OtherMouseDragged(theEvent);
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
//}
|
|||
|
|
|||
|
//public override void MouseMoved(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// base.MouseMoved(theEvent);
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// //System.Diagnostics.Debug.WriteLine(modifiers);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseMove);
|
|||
|
// if (root.Children.FirstOrDefault(a => a.IsMouseOver) == null)
|
|||
|
// {
|
|||
|
// (root.Cursor.PlatformCursor as NSCursor).Set();
|
|||
|
// }
|
|||
|
//}
|
|||
|
//bool isMouseEnter;
|
|||
|
//public override void MouseExited(NSEvent theEvent)
|
|||
|
//{
|
|||
|
// //isMouseEnter = false;
|
|||
|
// base.MouseExited(theEvent);
|
|||
|
// var mouseButton = Mouse(theEvent);
|
|||
|
// root.InputManager.MouseDevice.ProcessEvent(new MouseEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y), 0, root.InputManager.MouseDevice), root.LayoutManager.VisibleUIElements, EventType.MouseLeave);
|
|||
|
//}
|
|||
|
public override void MouseEntered(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.MouseEntered(theEvent);
|
|||
|
//isMouseEnter = true;
|
|||
|
}
|
|||
|
public override void ScrollWheel(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.ScrollWheel(theEvent);
|
|||
|
if (!enable)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
var mouseButton = Mouse(theEvent);
|
|||
|
//Debug.WriteLine(theEvent.ScrollingDeltaY);
|
|||
|
root.InputManager.MouseDevice.ProcessEvent(new MouseWheelEventArgs(root, modifiers.HasFlag(InputModifiers.LeftMouseButton), modifiers.HasFlag(InputModifiers.RightMouseButton), modifiers.HasFlag(InputModifiers.MiddleMouseButton), new Point((float)theEvent.LocationInWindow.X, (float)view.Bounds.Height - (float)theEvent.LocationInWindow.Y) / LayoutScaling, root.InputManager.MouseDevice, new Vector((float)(100 * theEvent.DeltaX), (float)(100 * theEvent.DeltaY))), root.LayoutManager.VisibleUIElements, EventType.MouseWheel);
|
|||
|
}
|
|||
|
|
|||
|
public override void KeyDown(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.KeyDown(theEvent);
|
|||
|
//root.LayoutManager.ExecuteLayoutPass();
|
|||
|
//if (!string.IsNullOrEmpty(theEvent.Characters))
|
|||
|
//{
|
|||
|
// root.InputManager.KeyboardDevice.ProcessEvent(new TextInputEventArgs(root, root.InputManager.KeyboardDevice, theEvent.Characters), KeyEventType.TextInput);
|
|||
|
//}
|
|||
|
////System.Diagnostics.Debug.WriteLine(theEvent.Characters);
|
|||
|
//Keys k;
|
|||
|
//s_KeyMap.TryGetValue(theEvent.KeyCode, out k);
|
|||
|
//SetModifier();
|
|||
|
//root.InputManager.KeyboardDevice.ProcessEvent(new KeyEventArgs(root, k, root.InputManager.KeyboardDevice.Modifiers, root.InputManager.KeyboardDevice), KeyEventType.KeyDown);
|
|||
|
}
|
|||
|
|
|||
|
public override void KeyUp(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.KeyUp(theEvent);
|
|||
|
//Debug.WriteLine(theEvent.Characters);
|
|||
|
if (!enable)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
Keys k;
|
|||
|
Key.s_KeyMap.TryGetValue(theEvent.KeyCode, out k);
|
|||
|
//Console.WriteLine(k + " " + theEvent.KeyCode);
|
|||
|
SetModifier();
|
|||
|
var plat = Application.GetRuntimePlatform() as MacPlatform;
|
|||
|
plat.CurrentKeyEvent = theEvent;
|
|||
|
root.InputManager.KeyboardDevice.ProcessEvent(new KeyEventArgs(root, k, theEvent.KeyCode, root.InputManager.KeyboardDevice.Modifiers, root.InputManager.KeyboardDevice), KeyEventType.KeyUp);
|
|||
|
|
|||
|
plat.CurrentKeyEvent = null;
|
|||
|
}
|
|||
|
public override bool PerformKeyEquivalent(NSEvent theEvent)
|
|||
|
{
|
|||
|
if (!enable)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
Keys k;
|
|||
|
Key.s_KeyMap.TryGetValue(theEvent.KeyCode, out k);
|
|||
|
if (k == Keys.Back)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
//Console.WriteLine(k + " " + theEvent.Characters);
|
|||
|
//Console.WriteLine((int)theEvent.CharactersIgnoringModifiers[0] + " " + (int)theEvent.Characters[0]);
|
|||
|
//Console.WriteLine(root.InputManager.KeyboardDevice.FocusedElement.ToString() + theEvent.KeyCode);
|
|||
|
SetModifier();
|
|||
|
var plat = Application.GetRuntimePlatform() as MacPlatform;
|
|||
|
plat.CurrentKeyEvent = theEvent;
|
|||
|
root.InputManager.KeyboardDevice.ProcessEvent(new KeyEventArgs(root, k, theEvent.KeyCode, root.InputManager.KeyboardDevice.Modifiers, root.InputManager.KeyboardDevice), KeyEventType.KeyDown);
|
|||
|
plat.CurrentKeyEvent = null;
|
|||
|
//if (!string.IsNullOrEmpty(theEvent.Characters))
|
|||
|
//{
|
|||
|
// if (!MacPlatform.keyValuePairs.ContainsKey(new KeyGesture(k, root.InputManager.KeyboardDevice.Modifiers)))
|
|||
|
// {
|
|||
|
// var uc = char.GetUnicodeCategory(theEvent.Characters[0]);
|
|||
|
// if (uc != System.Globalization.UnicodeCategory.Control && uc != System.Globalization.UnicodeCategory.PrivateUse)
|
|||
|
// {
|
|||
|
// root.InputManager.KeyboardDevice.ProcessEvent(new TextInputEventArgs(root, root.InputManager.KeyboardDevice, theEvent.Characters), KeyEventType.TextInput);
|
|||
|
// }
|
|||
|
// }
|
|||
|
//}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
protected override void Dispose(bool disposing)
|
|||
|
{
|
|||
|
AppDelegate.windows.Remove(this);
|
|||
|
base.Dispose(disposing);
|
|||
|
}
|
|||
|
|
|||
|
public Point PointToClient(Point point)
|
|||
|
{
|
|||
|
var p = base.ConvertScreenToBase(new CGPoint(point.X, Screen.Bounds.Height - point.Y));
|
|||
|
return new Point((float)p.X, (float)view.Bounds.Height - (float)p.Y) / LayoutScaling;
|
|||
|
}
|
|||
|
|
|||
|
//bool setFullScreem;
|
|||
|
//public void SetFullscreen(bool fullscreen)
|
|||
|
//{
|
|||
|
// if (fullscreen)
|
|||
|
// {
|
|||
|
// if (windowState != WindowState.Minimized)
|
|||
|
// {
|
|||
|
// lastFrame = Frame;
|
|||
|
// }
|
|||
|
// if (!setFullScreem)
|
|||
|
// {
|
|||
|
// windowState = WindowState.Maximized;
|
|||
|
// if (WindowStateChanged != null)
|
|||
|
// {
|
|||
|
// WindowStateChanged();
|
|||
|
// }
|
|||
|
// }
|
|||
|
// CollectionBehavior = NSWindowCollectionBehavior.FullScreenPrimary;
|
|||
|
// //base.StyleMask = NSWindowStyle.FullScreenWindow;
|
|||
|
// ToggleFullScreen(this);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// if (!setFullScreem)
|
|||
|
// {
|
|||
|
// windowState = WindowState.Normal;
|
|||
|
// if (WindowStateChanged != null)
|
|||
|
// {
|
|||
|
// WindowStateChanged();
|
|||
|
// }
|
|||
|
// }
|
|||
|
// IsZoomed = false;
|
|||
|
// ToggleFullScreen(this);
|
|||
|
// CollectionBehavior = NSWindowCollectionBehavior.Default;
|
|||
|
// Position = new PixelPoint((int)lastFrame.X, (int)lastFrame.Y);
|
|||
|
// SetFrame(lastFrame, true);
|
|||
|
// }
|
|||
|
//}
|
|||
|
bool enable = true;
|
|||
|
public void SetEnable(bool enable)
|
|||
|
{
|
|||
|
this.enable = enable;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//[Register("NSTextInputClient", false)]
|
|||
|
class InnerView : NSView, NotMonoMac, NSTextInputClient
|
|||
|
{
|
|||
|
public InnerView(CGRect rect, WindowImpl window) : base(rect)
|
|||
|
{
|
|||
|
|
|||
|
//AddSubview(new NSText(new CGRect(10, 10, 100, 100)) {BackgroundColor=NSColor.FromCGColor(new CGColor(0,0,0,0)), TextColor= NSColor.FromCGColor(new CGColor(0, 0, 0, 0)), CanDrawConcurrently=false });
|
|||
|
this.window = window;
|
|||
|
RegisterForDraggedTypes(new string[] { NSPasteboard.NSPictType, NSPasteboard.NSStringType, NSPasteboard.NSFilenamesType, NSPasteboard.NSHtmlType });
|
|||
|
}
|
|||
|
|
|||
|
public override void MouseMoved(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.MouseMoved(theEvent);
|
|||
|
|
|||
|
// Debug.WriteLine("MouseMoved" + window);
|
|||
|
}
|
|||
|
|
|||
|
public override void MouseDown(NSEvent theEvent)
|
|||
|
{
|
|||
|
InputContext.HandleEvent(theEvent);
|
|||
|
}
|
|||
|
|
|||
|
public override void KeyDown(NSEvent theEvent)
|
|||
|
{
|
|||
|
base.KeyDown(theEvent);
|
|||
|
//Keys k;
|
|||
|
//Key.s_KeyMap.TryGetValue(theEvent.KeyCode, out k);
|
|||
|
//if (k == Keys.Back || k == Keys.Tab || k == Keys.Enter)
|
|||
|
//{
|
|||
|
// return;
|
|||
|
//}
|
|||
|
var r = InputContext.HandleEvent(theEvent);
|
|||
|
//Debug.WriteLine(r);
|
|||
|
}
|
|||
|
|
|||
|
public override void MouseDragged(NSEvent theEvent)
|
|||
|
{
|
|||
|
InputContext.HandleEvent(theEvent);
|
|||
|
}
|
|||
|
public override void MouseUp(NSEvent theEvent)
|
|||
|
{
|
|||
|
InputContext.HandleEvent(theEvent);
|
|||
|
}
|
|||
|
WindowImpl window;
|
|||
|
//long bounds;
|
|||
|
//NSTrackingArea bounds;
|
|||
|
//public override void ViewDidMoveToWindow()
|
|||
|
//{
|
|||
|
// base.ViewDidMoveToWindow();
|
|||
|
// bounds = new NSTrackingArea(Bounds, NSTrackingAreaOptions.MouseMoved | NSTrackingAreaOptions.MouseEnteredAndExited | NSTrackingAreaOptions.ActiveInKeyWindow, this, new NSDictionary(""));
|
|||
|
// AddTrackingArea(bounds);
|
|||
|
//}
|
|||
|
|
|||
|
//public override void UpdateTrackingAreas()
|
|||
|
//{
|
|||
|
// base.UpdateTrackingAreas();
|
|||
|
// RemoveTrackingArea(bounds);
|
|||
|
// bounds = new NSTrackingArea(Bounds, NSTrackingAreaOptions.MouseMoved | NSTrackingAreaOptions.MouseEnteredAndExited | NSTrackingAreaOptions.ActiveInKeyWindow, this, new NSDictionary(""));
|
|||
|
// AddTrackingArea(bounds);
|
|||
|
|
|||
|
//}
|
|||
|
public override void SetFrameSize(CGSize newSize)
|
|||
|
{
|
|||
|
base.SetFrameSize(newSize);
|
|||
|
//var w = WindowState.Normal;
|
|||
|
//if (window.IsMiniaturized)
|
|||
|
//{
|
|||
|
// w = WindowState.Minimized;
|
|||
|
//}
|
|||
|
//else if (window.IsZoomed)
|
|||
|
//{
|
|||
|
// w = WindowState.Maximized;
|
|||
|
//}
|
|||
|
//if (w != window.windowState)
|
|||
|
//{
|
|||
|
// window.windowState = w;
|
|||
|
// if (window.WindowStateChanged != null)
|
|||
|
// {
|
|||
|
// window.WindowStateChanged();
|
|||
|
// }
|
|||
|
//}
|
|||
|
window.UpdateCursor();
|
|||
|
if (window.Resized != null)
|
|||
|
{
|
|||
|
window.Resized(new Size((float)newSize.Width, (float)newSize.Height) / window.LayoutScaling);
|
|||
|
//Console.WriteLine(newSize);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB();
|
|||
|
Size oldSize;
|
|||
|
Bitmap bitmap;
|
|||
|
public override void DrawRect(CGRect dirtyRect)
|
|||
|
{
|
|||
|
if (window.root.IsDisposed)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
var scaling = (float)window.BackingScaleFactor;
|
|||
|
window.root.LayoutManager.ExecuteLayoutPass();
|
|||
|
var size = new Size((float)Bounds.Width, (float)Bounds.Height) * scaling;
|
|||
|
if (bitmap == null || oldSize != size)
|
|||
|
{
|
|||
|
oldSize = size;
|
|||
|
if (bitmap != null)
|
|||
|
{
|
|||
|
bitmap.Dispose();
|
|||
|
}
|
|||
|
if (oldSize.Width <= 0 || oldSize.Height <= 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
bitmap = new Bitmap((int)oldSize.Width, (int)oldSize.Height);
|
|||
|
}
|
|||
|
var context = NSGraphicsContext.CurrentContext.GraphicsPort;
|
|||
|
|
|||
|
using (var dc = DrawingContext.FromBitmap(bitmap))
|
|||
|
{
|
|||
|
//dc.Clear(Color.Transparent);
|
|||
|
//var m = dc.Transform;
|
|||
|
//m.ScalePrepend(window.RenderScaling, window.RenderScaling);
|
|||
|
//dc.Transform = m;
|
|||
|
if (window.root.LayoutManager.VisibleUIElements != null)
|
|||
|
{
|
|||
|
var b = new Rect((float)dirtyRect.X * scaling, ((float)Bounds.Height - (float)dirtyRect.Height - (float)dirtyRect.Y) * scaling, (float)dirtyRect.Width * scaling, (float)dirtyRect.Height * scaling);
|
|||
|
//Console.WriteLine(b);
|
|||
|
window.root.RenderView(dc, b);
|
|||
|
}
|
|||
|
}
|
|||
|
using (var lk = bitmap.Lock())
|
|||
|
{
|
|||
|
using (CGBitmapContext bitmapContext = new CGBitmapContext(lk.DataPointer, (int)(bitmap.Width), (int)(bitmap.Height), 8, (int)(bitmap.Width * 4), colorSpace, CGImageAlphaInfo.PremultipliedLast))
|
|||
|
{
|
|||
|
using (CGImage img = bitmapContext.ToImage())
|
|||
|
{
|
|||
|
context.DrawImage(new CGRect(0, 0, bitmap.Width / scaling, bitmap.Height / scaling), img);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
public override bool CanBecomeKeyView
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override bool AcceptsFirstResponder()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public override bool BecomeFirstResponder()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
public override bool ResignFirstResponder()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
protected override void Dispose(bool disposing)
|
|||
|
{
|
|||
|
base.Dispose(disposing);
|
|||
|
if (bitmap != null)
|
|||
|
{
|
|||
|
bitmap.Dispose();
|
|||
|
bitmap = null;
|
|||
|
}
|
|||
|
}
|
|||
|
public static NSDragOperation ConvertDropEffect(DragDropEffects operation)
|
|||
|
{
|
|||
|
NSDragOperation result = NSDragOperation.None;
|
|||
|
if (operation.HasFlag(DragDropEffects.Copy))
|
|||
|
result |= NSDragOperation.Copy;
|
|||
|
if (operation.HasFlag(DragDropEffects.Move))
|
|||
|
result |= NSDragOperation.Move;
|
|||
|
if (operation.HasFlag(DragDropEffects.Link))
|
|||
|
result |= NSDragOperation.Link;
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
public static DragDropEffects ConvertDropEffect(NSDragOperation effect)
|
|||
|
{
|
|||
|
DragDropEffects result = DragDropEffects.None;
|
|||
|
if (effect.HasFlag(NSDragOperation.Copy))
|
|||
|
result |= DragDropEffects.Copy;
|
|||
|
if (effect.HasFlag(NSDragOperation.Move))
|
|||
|
result |= DragDropEffects.Move;
|
|||
|
if (effect.HasFlag(NSDragOperation.Link))
|
|||
|
result |= DragDropEffects.Link;
|
|||
|
return result;
|
|||
|
}
|
|||
|
private Point GetDragLocation(CGPoint dragPoint)
|
|||
|
{
|
|||
|
return new Point((float)dragPoint.X, (float)(Frame.Height - dragPoint.Y));
|
|||
|
}
|
|||
|
IDataObject _currentDrag;
|
|||
|
public override NSDragOperation DraggingEntered(NSDraggingInfo sender)
|
|||
|
{
|
|||
|
_currentDrag = new DataObject(sender.DraggingPasteboard);
|
|||
|
//_currentDrag.Get(DataFormat.FileNames);
|
|||
|
var effect = window.root.InputManager.DragDropDevice.DragEnter(new DragEventArgs(_currentDrag, GetDragLocation(sender.DraggingLocation), window.root) { DragEffects = ConvertDropEffect(sender.DraggingSourceOperationMask) }, window.root.LayoutManager.VisibleUIElements);
|
|||
|
return ConvertDropEffect(effect);
|
|||
|
}
|
|||
|
public override NSDragOperation DraggingUpdated(NSDraggingInfo sender)
|
|||
|
{
|
|||
|
_currentDrag = new DataObject(sender.DraggingPasteboard);
|
|||
|
var effect = window.root.InputManager.DragDropDevice.DragOver(new DragEventArgs(_currentDrag, GetDragLocation(sender.DraggingLocation), window.root) { DragEffects = ConvertDropEffect(sender.DraggingSourceOperationMask) }, window.root.LayoutManager.VisibleUIElements);
|
|||
|
return ConvertDropEffect(effect);
|
|||
|
}
|
|||
|
public override void DraggingExited(NSDraggingInfo sender)
|
|||
|
{
|
|||
|
window.root.InputManager.DragDropDevice.DragLeave(window.root.LayoutManager.VisibleUIElements);
|
|||
|
_currentDrag = null;
|
|||
|
}
|
|||
|
|
|||
|
public override bool PerformDragOperation(NSDraggingInfo sender)
|
|||
|
{
|
|||
|
//Debug.WriteLine("PerformDragOperation");
|
|||
|
window.root.InputManager.DragDropDevice.Drop(new DragEventArgs(_currentDrag, GetDragLocation(sender.DraggingLocation), window.root) { DragEffects = ConvertDropEffect(sender.DraggingSourceOperationMask) }, window.root.LayoutManager.VisibleUIElements);
|
|||
|
return true;
|
|||
|
//return base.PerformDragOperation(sender);
|
|||
|
}
|
|||
|
|
|||
|
[Export("doCommandBySelector:")]
|
|||
|
public virtual void DoCommandBySelector(Selector selector)
|
|||
|
{
|
|||
|
//Debug.WriteLine(selector.Name);
|
|||
|
if (selector.Name == "deleteBackward:")
|
|||
|
{
|
|||
|
window.SetModifier();
|
|||
|
window.root.InputManager.KeyboardDevice.ProcessEvent(new KeyEventArgs(window.root, Keys.Back, Key.kVK_Delete, window.root.InputManager.KeyboardDevice.Modifiers, window.root.InputManager.KeyboardDevice), KeyEventType.KeyDown);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
[Export("baselineDeltaForCharacterAtIndex:")]
|
|||
|
public virtual float GetBaselineDelta(uint charIndex)
|
|||
|
{
|
|||
|
throw new You_Should_Not_Call_base_In_This_Method();
|
|||
|
}
|
|||
|
|
|||
|
[Export("characterIndexForPoint:")]
|
|||
|
public virtual uint GetCharacterIndex(CGPoint point)
|
|||
|
{
|
|||
|
//throw new You_Should_Not_Call_base_In_This_Method();
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
[Export("firstRectForCharacterRange:actualRange:")]
|
|||
|
public virtual CGRect GetFirstRect(NSRange characterRange, out NSRange actualRange)
|
|||
|
{
|
|||
|
actualRange = new NSRange(0, 0);
|
|||
|
return new CGRect(window.Frame.X + window.imePoint.X, window.Frame.Y + (window.Frame.Height - window.imePoint.Y - 15), 1, 10);
|
|||
|
}
|
|||
|
|
|||
|
[Export("fractionOfDistanceThroughGlyphForPoint:")]
|
|||
|
public virtual float GetFractionOfDistanceThroughGlyph(CGPoint point)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
[Export("insertText:replacementRange:")]
|
|||
|
public virtual void InsertText(NSObject text, NSRange replacementRange)
|
|||
|
{
|
|||
|
//throw new You_Should_Not_Call_base_In_This_Method();
|
|||
|
//Console.WriteLine("输入法输出:" + text);
|
|||
|
window.root.InputManager.KeyboardDevice.ProcessEvent(new TextInputEventArgs(window.root, window.root.InputManager.KeyboardDevice, text.ToString()), KeyEventType.TextInput);
|
|||
|
InputContext.InvalidateCharacterCoordinates();
|
|||
|
}
|
|||
|
|
|||
|
[Export("setMarkedText:selectedRange:replacementRange:")]
|
|||
|
public virtual void SetMarkedText(NSObject text, NSRange selectedRange, NSRange replacementRange)
|
|||
|
{
|
|||
|
InputContext.InvalidateCharacterCoordinates();
|
|||
|
}
|
|||
|
|
|||
|
[Export("unmarkText")]
|
|||
|
public virtual void UnmarkText()
|
|||
|
{
|
|||
|
InputContext.DiscardMarkedText();
|
|||
|
}
|
|||
|
|
|||
|
[Export("attributedSubstringForProposedRange:actualRange:")]
|
|||
|
public NSAttributedString GetAttributedSubstring(NSRange proposedRange, out NSRange actualRange)
|
|||
|
{
|
|||
|
actualRange = new NSRange(0, 0);
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
public virtual bool HasMarkedText
|
|||
|
{
|
|||
|
[Export("hasMarkedText")]
|
|||
|
get
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual NSRange MarkedRange
|
|||
|
{
|
|||
|
[Export("markedRange")]
|
|||
|
get
|
|||
|
{
|
|||
|
return new NSRange(0, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual NSRange SelectedRange
|
|||
|
{
|
|||
|
[Export("selectedRange")]
|
|||
|
get
|
|||
|
{
|
|||
|
return new NSRange(0, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual NSString[] ValidAttributesForMarkedText
|
|||
|
{
|
|||
|
[Export("validAttributesForMarkedText")]
|
|||
|
get
|
|||
|
{
|
|||
|
return new NSString[] { NSAttributedString.MarkedClauseSegmentAttributeName, NSAttributedString.GlyphInfo, };
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public virtual NSWindowLevel WindowLevel
|
|||
|
{
|
|||
|
[Export("windowLevel")]
|
|||
|
get
|
|||
|
{
|
|||
|
return window.Level;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//[Export("attributedString")]
|
|||
|
//public NSAttributedString AttributedString => null;
|
|||
|
}
|
|||
|
|
|||
|
public class PopImpl : WindowImpl, IPopupImpl
|
|||
|
{
|
|||
|
public PopImpl()
|
|||
|
{
|
|||
|
this.Level = NSWindowLevel.PopUpMenu;
|
|||
|
}
|
|||
|
|
|||
|
//public override bool CanBecomeKeyWindow => CanActivate;
|
|||
|
}
|
|||
|
}
|