2019-08-23 11:56:54 -07:00
using System ;
2020-04-29 06:40:03 -07:00
using System.Collections ;
2019-08-23 11:56:54 -07:00
using System.Text ;
using System.Diagnostics ;
using Beefy.gfx ;
using Beefy.sys ;
using System.IO ;
#if MONOTOUCH
using MonoTouch ;
#endif
#if STUDIO_CLIENT
using Beefy.ipc ;
#endif
namespace Beefy
{
public class BFWindowBase
{
public enum Flags
{
Border = 0x000001 ,
ThickFrame = 0x000002 ,
Resizable = 0x000004 ,
SysMenu = 0x000008 ,
Caption = 0x000010 ,
Minimize = 0x000020 ,
Maximize = 0x000040 ,
ClientSized = 0x000080 ,
QuitOnClose = 0x000100 ,
VSync = 0x000200 ,
PopupPosition = 0x000400 ,
DestAlpha = 0x000800 ,
AlphaMask = 0x001000 ,
Child = 0x002000 ,
TopMost = 0x004000 ,
ToolWindow = 0x008000 ,
NoActivate = 0x01 ' 0000 ,
NoMouseActivate = 0x02 ' 0000 ,
Menu = 0x04 ' 0000 ,
Modal = 0x08 ' 0000 ,
ScaleContent = 0x10 ' 0000 ,
UseParentMenu = 0x20 ' 0000 ,
CaptureMediaKeys = 0x40 ' 0000 ,
Fullscreen = 0x80 ' 0000 ,
2019-09-27 13:01:03 -07:00
FakeFocus = 0x0100 ' 0000 ,
ShowMinimized = 0x0200 ' 0000 ,
ShowMaximized = 0x0400 ' 0000 ,
2020-05-11 10:31:12 -07:00
AllowFullscreen = 0x0800 ' 0000 ,
2019-08-23 11:56:54 -07:00
} ;
2019-12-25 16:38:17 -08:00
[AllowDuplicates]
2019-08-23 11:56:54 -07:00
public enum HitTestResult
{
NotHandled = - 3 ,
Border = 18 ,
Bottom = 15 ,
BottomLeft = 16 ,
BottomRight = 17 ,
Caption = 2 ,
Client = 1 ,
Close = 20 ,
Error = - 2 ,
GrowBox = 4 ,
Help = 21 ,
HScroll = 6 ,
Left = 10 ,
Menu = 5 ,
MaxButton = 9 ,
MinButton = 8 ,
NoWhere = 0 ,
Reduce = 8 ,
Right = 11 ,
Size = 4 ,
SysMenu = 3 ,
Top = 12 ,
TopLeft = 13 ,
TopRight = 14 ,
Transparent = - 1 ,
VScroll = 7 ,
Zoom = 9
}
public SysMenu mSysMenu ~ delete _ ;
public Dictionary < int , SysMenu > mSysMenuMap = new Dictionary < int , SysMenu > ( ) ~ delete _ ;
public DrawLayer mDefaultDrawLayer ~ delete _ ;
public virtual void Draw ( Graphics g )
{
}
public virtual void PreDraw ( Graphics g )
{
g . PushDrawLayer ( mDefaultDrawLayer ) ;
}
public virtual void PostDraw ( Graphics g )
{
g . PopDrawLayer ( ) ;
}
}
#if ! STUDIO_CLIENT
public class BFWindow : BFWindowBase , INativeWindow
{
2019-09-27 13:01:03 -07:00
public enum ShowKind
{
Normal ,
Minimized ,
Maximized
}
2019-08-23 11:56:54 -07:00
delegate void NativeMovedDelegate ( void * window ) ;
delegate int32 NativeCloseQueryDelegate ( void * window ) ;
delegate void NativeClosedDelegate ( void * window ) ;
delegate void NativeGotFocusDelegate ( void * window ) ;
delegate void NativeLostFocusDelegate ( void * window ) ;
delegate void NativeKeyCharDelegate ( void * window , char32 theChar ) ;
delegate bool NativeKeyDownDelegate ( void * window , int32 keyCode , int32 isRepeat ) ;
delegate void NativeKeyUpDelegate ( void * window , int32 keyCode ) ;
delegate int32 NativeHitTestDelegate ( void * window , int32 x , int32 y ) ;
delegate void NativeMouseMoveDelegate ( void * window , int32 x , int32 y ) ;
delegate void NativeMouseProxyMoveDelegate ( void * window , int32 x , int32 y ) ;
delegate void NativeMouseDownDelegate ( void * window , int32 x , int32 y , int32 btn , int32 btnCount ) ;
delegate void NativeMouseUpDelegate ( void * window , int32 x , int32 y , int32 btn ) ;
2020-05-25 00:10:35 -07:00
delegate void NativeMouseWheelDelegate ( void * window , int32 x , int32 y , float delta ) ;
2019-08-23 11:56:54 -07:00
delegate void NativeMouseLeaveDelegate ( void * window ) ;
delegate void NativeMenuItemSelectedDelegate ( void * window , void * menu ) ;
public void * mNativeWindow ;
public bool mNativeWindowClosed ;
static int32 sId ;
protected int32 mId = + + sId ;
public String mName ~ delete _ ;
public String mTitle ~ delete _ ;
public int32 mX ;
public int32 mY ;
public int32 mWindowWidth ;
public int32 mWindowHeight ;
2019-09-27 13:01:03 -07:00
public int32 mNormX ;
public int32 mNormY ;
public int32 mNormWidth ;
public int32 mNormHeight ;
public ShowKind mShowKind ;
2019-08-23 11:56:54 -07:00
public int32 mClientX ;
public int32 mClientY ;
public int32 mClientWidth ;
public int32 mClientHeight ;
public float mAlpha = 1.0f ;
public Flags mWindowFlags ;
public bool mVisible = true ;
private bool mMouseVisible ;
public bool mHasFocus = false ;
public bool mHasClosed ;
public bool mIsDirty = true ;
public BFWindow mParent ;
public List < BFWindow > mChildWindows = new List < BFWindow > ( ) ~ delete _ ;
static protected Dictionary < int , BFWindow > sWindowDictionary = new Dictionary < int , BFWindow > ( ) ~ delete _ ;
static NativeMovedDelegate sNativeMovedDelegate ~ delete _ ;
static NativeCloseQueryDelegate sNativeCloseQueryDelegate ~ delete _ ;
static NativeClosedDelegate sNativeClosedDelegate ~ delete _ ;
static NativeGotFocusDelegate sNativeGotFocusDelegate ~ delete _ ;
static NativeLostFocusDelegate sNativeLostFocusDelegate ~ delete _ ;
static NativeKeyCharDelegate sNativeKeyCharDelegate ~ delete _ ;
static NativeKeyDownDelegate sNativeKeyDownDelegate ~ delete _ ;
static NativeKeyUpDelegate sNativeKeyUpDelegate ~ delete _ ;
static NativeHitTestDelegate sNativeHitTestDelegate ~ delete _ ;
static NativeMouseMoveDelegate sNativeMouseMoveDelegate ~ delete _ ;
static NativeMouseProxyMoveDelegate sNativeMouseProxyMoveDelegate ~ delete _ ;
static NativeMouseDownDelegate sNativeMouseDownDelegate ~ delete _ ;
static NativeMouseUpDelegate sNativeMouseUpDelegate ~ delete _ ;
static NativeMouseWheelDelegate sNativeMouseWheelDelegate ~ delete _ ;
static NativeMouseLeaveDelegate sNativeMouseLeaveDelegate ~ delete _ ;
static NativeMenuItemSelectedDelegate sNativeMenuItemSelectedDelegate ~ delete _ ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void * BFApp_CreateWindow ( void * parent , char8 * title , int32 x , int32 y , int32 width , int32 height , int32 windowFlags ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void * BFWindow_GetNativeUnderlying ( void * window ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetCallbacks ( void * window , void * movedDelegate , void * closeQueryDelegate , void * closedDelegate ,
void * gotFocusDelegate , void * lostFocusDelegate ,
void * keyCharDelegate , void * keyDownDelegate , void * keyUpDelegate , void * hitTestDelegate ,
void * mouseMoveDelegate , void * mouseProxyMoveDelegate , void * mouseDownDelegate , void * mouseUpDelegate , void * mouseWheelDelegate , void * mouseLeaveDelegate ,
void * menuItemSelectedDelegate ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetTitle ( void * window , char8 * title ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetMinimumSize ( void * window , int32 minWidth , int32 minHeight , bool clientSized ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_GetPosition ( void * window , out int32 x , out int32 y , out int32 width , out int32 height , out int32 clientX , out int32 clientY , out int32 clientWidth , out int32 clientHeight ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-09-27 13:01:03 -07:00
static extern void BFWindow_GetPlacement ( void * window , out int32 normX , out int32 normY , out int32 normWidth , out int32 normHeight , out int32 showKind ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-09-27 13:01:03 -07:00
static extern void BFWindow_Resize ( void * window , int32 x , int32 y , int32 width , int32 height , int showKind ) ;
2019-08-23 11:56:54 -07:00
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_Close ( void * window , int32 force ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetForeground ( void * window ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_LostFocus ( void * window , void * newFocus ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetNonExclusiveMouseCapture ( void * window ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetClientPosition ( void * window , int32 x , int32 y ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetAlpha ( void * window , float alpha , uint32 destAlphaSrcMask , int32 mouseVisible ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_SetMouseVisible ( void * window , bool mouseVisible ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void BFWindow_CaptureMouse ( void * window ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern bool BFWindow_IsMouseCaptured ( void * window ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void * BFWindow_AddMenuItem ( void * window , void * parent , int32 insertIdx , char8 * text , char8 * hotKey , void * bitmap , int32 enabled , int32 checkState , int32 radioCheck ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void * BFWindow_ModifyMenuItem ( void * window , void * item , char8 * text , char8 * hotKey , void * bitmap , int32 enabled , int32 checkState , int32 radioCheck ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-08-23 11:56:54 -07:00
static extern void * BFWindow_DeleteMenuItem ( void * window , void * item ) ;
2020-05-25 20:46:28 +08:00
[CallingConvention(.Stdcall), CLink]
2019-09-16 09:32:02 -07:00
static extern int BFWindow_GetDPI ( void * window ) ;
2019-08-23 11:56:54 -07:00
public static BFWindow GetBFWindow ( void * window )
{
return sWindowDictionary [ ( int ) window ] ;
}
#if MONOTOUCH
[MonoPInvokeCallback(typeof(NativeMovedDelegate))]
static void Static_NativeMovedDelegate ( void * window ) { GetBFWindow ( window ) . Moved ( ) ; }
[MonoPInvokeCallback(typeof(NativeClosedDelegate))]
static void Static_NativeClosedDelegate ( void * window ) { GetBFWindow ( window ) . Closed ( ) ; }
[MonoPInvokeCallback(typeof(NativeCloseQueryDelegate))]
static int Static_NativeCloseQueryDelegate ( void * window ) { return GetBFWindow ( window ) . CloseQuery ( ) ; }
[MonoPInvokeCallback(typeof(NativeGotFocusDelegate))]
static void Static_NativeGotFocusDelegate ( void * window ) { GetBFWindow ( window ) . GotFocus ( ) ; }
[MonoPInvokeCallback(typeof(NativeLostFocusDelegate))]
static void Static_NativeLostFocusDelegate ( void * window ) { GetBFWindow ( window ) . LostFocus ( ) ; }
[MonoPInvokeCallback(typeof(NativeKeyCharDelegate))]
static void Static_NativeKeyCharDelegate ( void * window , char8 c ) { GetBFWindow ( window ) . KeyChar ( c ) ; }
[MonoPInvokeCallback(typeof(NativeKeyDownDelegate))]
static bool Static_NativeKeyDownDelegate ( void * window , int key , int isRepeat ) { return GetBFWindow ( window ) . KeyDown ( key , isRepeat ) ; }
[MonoPInvokeCallback(typeof(NativeKeyUpDelegate))]
static void Static_NativeKeyUpDelegate ( void * window , int key ) { GetBFWindow ( window ) . KeyUp ( key ) ; }
[MonoPInvokeCallback(typeof(NativeMouseMoveDelegate))]
static void Static_NativeMouseMoveDelegate ( void * window , int mouseX , int mouseY ) { GetBFWindow ( window ) . MouseMove ( mouseX , mouseY ) ; }
[MonoPInvokeCallback(typeof(NativeMouseProxyMoveDelegate))]
static void Static_NativeMouseProxyMoveDelegate ( void * window , int mouseX , int mouseY ) { GetBFWindow ( window ) . MouseProxyMove ( mouseX , mouseY ) ; }
[MonoPInvokeCallback(typeof(NativeMouseDownDelegate))]
static void Static_NativeMouseDownDelegate ( void * window , int mouseX , int mouseY , int btnNum , int btnCount ) { GetBFWindow ( window ) . MouseDown ( mouseX , mouseY , btnNum , btnCount ) ; }
[MonoPInvokeCallback(typeof(NativeMouseUpDelegate))]
static void Static_NativeMouseUpDelegate ( void * window , int mouseX , int mouseY , int btnNum ) { GetBFWindow ( window ) . MouseUp ( mouseX , mouseY , btnNum ) ; }
[MonoPInvokeCallback(typeof(NativeMouseWheelDelegate))]
static void Static_NativeMouseWheelDelegate ( void * window , int mouseX , int mouseY , int delta ) { GetBFWindow ( window ) . MouseWheel ( mouseX , mouseY , delta ) ; }
[MonoPInvokeCallback(typeof(NativeMouseLeaveDelegate))]
static void Static_NativeMouseLeaveDelegate ( void * window ) { GetBFWindow ( window ) . MouseLeave ( ) ; }
[MonoPInvokeCallback(typeof(NativeMenuItemSelectedDelegate))]
static void Static_NativeMenuItemSelectedDelegate ( void * window , void * item ) { GetBFWindow ( window ) . NativeMenuItemSelected ( item ) ; }
#else
static void Static_NativeMovedDelegate ( void * window ) { GetBFWindow ( window ) . Moved ( ) ; }
static void Static_NativeClosedDelegate ( void * window ) { GetBFWindow ( window ) . Closed ( ) ; }
static int32 Static_NativeCloseQueryDelegate ( void * window ) { return GetBFWindow ( window ) . CloseQuery ( ) ; }
static void Static_NativeGotFocusDelegate ( void * window ) { GetBFWindow ( window ) . GotFocus ( ) ; }
static void Static_NativeLostFocusDelegate ( void * window ) { GetBFWindow ( window ) . LostFocus ( null ) ; }
static void Static_NativeKeyCharDelegate ( void * window , char32 c ) { GetBFWindow ( window ) . KeyChar ( c ) ; }
static bool Static_NativeKeyDownDelegate ( void * window , int32 key , int32 isRepeat ) { return GetBFWindow ( window ) . KeyDown ( key , isRepeat ) ; }
static void Static_NativeKeyUpDelegate ( void * window , int32 key ) { GetBFWindow ( window ) . KeyUp ( key ) ; }
static int32 Static_NativeHitTestDelegate ( void * window , int32 x , int32 y ) { return ( int32 ) GetBFWindow ( window ) . HitTest ( x , y ) ; }
static void Static_NativeMouseMoveDelegate ( void * window , int32 mouseX , int32 mouseY ) { GetBFWindow ( window ) . MouseMove ( mouseX , mouseY ) ; }
static void Static_NativeMouseProxyMoveDelegate ( void * window , int32 mouseX , int32 mouseY ) { GetBFWindow ( window ) . MouseProxyMove ( mouseX , mouseY ) ; }
static void Static_NativeMouseDownDelegate ( void * window , int32 mouseX , int32 mouseY , int32 btnNum , int32 btnCount ) { GetBFWindow ( window ) . MouseDown ( mouseX , mouseY , btnNum , btnCount ) ; }
static void Static_NativeMouseUpDelegate ( void * window , int32 mouseX , int32 mouseY , int32 btnNum ) { GetBFWindow ( window ) . MouseUp ( mouseX , mouseY , btnNum ) ; }
2020-05-25 00:10:35 -07:00
static void Static_NativeMouseWheelDelegate ( void * window , int32 mouseX , int32 mouseY , float delta ) { GetBFWindow ( window ) . MouseWheel ( mouseX , mouseY , delta ) ; }
2019-08-23 11:56:54 -07:00
static void Static_NativeMouseLeaveDelegate ( void * window ) { GetBFWindow ( window ) . MouseLeave ( ) ; }
static void Static_NativeMenuItemSelectedDelegate ( void * window , void * item ) { GetBFWindow ( window ) . NativeMenuItemSelected ( item ) ; }
#endif
public this ( )
{
}
public this ( BFWindow parent , String title , int x , int y , int width , int height , BFWindow . Flags windowFlags )
{
Init ( parent , title , x , y , width , height , windowFlags ) ;
}
public ~ this ( )
{
bool worked = sWindowDictionary . Remove ( ( int ) mNativeWindow ) ;
Debug . Assert ( worked ) ;
}
void Init ( BFWindow parent , String title , int x , int y , int width , int height , BFWindow . Flags windowFlags )
{
mTitle = new String ( title ) ;
mParent = parent ;
if ( mParent ! = null )
mParent . mChildWindows . Add ( this ) ;
var useFlags = windowFlags ;
/ * if ( useFlags . HasFlag ( . FakeFocus ) )
{
useFlags | = . NoActivate ;
useFlags | = . NoMouseActivate ;
} * /
mNativeWindow = BFApp_CreateWindow ( ( parent ! = null ) ? ( parent . mNativeWindow ) : null , title , ( int32 ) x , ( int32 ) y , ( int32 ) width , ( int32 ) height , ( int32 ) useFlags ) ;
sWindowDictionary [ ( int ) mNativeWindow ] = this ;
if ( sNativeMovedDelegate = = null )
{
sNativeMovedDelegate = new = > Static_NativeMovedDelegate ;
sNativeClosedDelegate = new = > Static_NativeClosedDelegate ;
sNativeCloseQueryDelegate = new = > Static_NativeCloseQueryDelegate ;
sNativeGotFocusDelegate = new = > Static_NativeGotFocusDelegate ;
sNativeLostFocusDelegate = new = > Static_NativeLostFocusDelegate ;
sNativeKeyCharDelegate = new = > Static_NativeKeyCharDelegate ;
sNativeKeyDownDelegate = new = > Static_NativeKeyDownDelegate ;
sNativeKeyUpDelegate = new = > Static_NativeKeyUpDelegate ;
sNativeHitTestDelegate = new = > Static_NativeHitTestDelegate ;
sNativeMouseMoveDelegate = new = > Static_NativeMouseMoveDelegate ;
sNativeMouseProxyMoveDelegate = new = > Static_NativeMouseProxyMoveDelegate ;
sNativeMouseDownDelegate = new = > Static_NativeMouseDownDelegate ;
sNativeMouseUpDelegate = new = > Static_NativeMouseUpDelegate ;
sNativeMouseWheelDelegate = new = > Static_NativeMouseWheelDelegate ;
sNativeMouseLeaveDelegate = new = > Static_NativeMouseLeaveDelegate ;
sNativeMenuItemSelectedDelegate = new = > Static_NativeMenuItemSelectedDelegate ;
}
BFWindow_SetCallbacks ( mNativeWindow , sNativeMovedDelegate . GetFuncPtr ( ) , sNativeCloseQueryDelegate . GetFuncPtr ( ) , sNativeClosedDelegate . GetFuncPtr ( ) , sNativeGotFocusDelegate . GetFuncPtr ( ) , sNativeLostFocusDelegate . GetFuncPtr ( ) ,
sNativeKeyCharDelegate . GetFuncPtr ( ) , sNativeKeyDownDelegate . GetFuncPtr ( ) , sNativeKeyUpDelegate . GetFuncPtr ( ) , sNativeHitTestDelegate . GetFuncPtr ( ) ,
sNativeMouseMoveDelegate . GetFuncPtr ( ) , sNativeMouseProxyMoveDelegate . GetFuncPtr ( ) , sNativeMouseDownDelegate . GetFuncPtr ( ) , sNativeMouseUpDelegate . GetFuncPtr ( ) , sNativeMouseWheelDelegate . GetFuncPtr ( ) , sNativeMouseLeaveDelegate . GetFuncPtr ( ) ,
sNativeMenuItemSelectedDelegate . GetFuncPtr ( ) ) ;
BFApp . sApp . mWindows . Add ( this ) ;
mDefaultDrawLayer = new DrawLayer ( this ) ;
if ( windowFlags . HasFlag ( Flags . Menu ) )
{
mSysMenu = new SysMenu ( ) ;
mSysMenu . mWindow = this ;
}
mWindowFlags = windowFlags ;
if ( ( parent ! = null ) & & ( ! mWindowFlags . HasFlag ( Flags . NoActivate ) ) )
parent . LostFocus ( this ) ;
if ( ( parent ! = null ) & & ( mWindowFlags . HasFlag ( Flags . Modal ) ) )
parent . PreModalChild ( ) ;
if ( ( mWindowFlags . HasFlag ( . FakeFocus ) ) & & ( ! mWindowFlags . HasFlag ( . NoActivate ) ) )
GotFocus ( ) ;
BFApp . sApp . RehupMouse ( ) ;
}
public void SetTitle ( String title )
{
mTitle . Set ( title ) ;
BFWindow_SetTitle ( mNativeWindow , mTitle ) ;
}
public int Handle
{
get
{
return ( int ) BFWindow_GetNativeUnderlying ( mNativeWindow ) ;
}
}
#if BF_PLATFORM_WINDOWS
public Windows . HWnd HWND
{
get
{
return ( . ) ( int ) BFWindow_GetNativeUnderlying ( mNativeWindow ) ;
}
}
#endif
public void PreModalChild ( )
{
//MouseLeave();
}
public virtual void Dispose ( )
{
Close ( true ) ;
}
public virtual int32 CloseQuery ( )
{
return 1 ;
}
public virtual void Close ( bool force = false )
{
// This doesn't play properly with CloseQuery. We may do a force close in CloseQuery, but that fails
// if we do this following logic:
/ * if ( mNativeWindowClosed )
return ;
mNativeWindowClosed = true ; * /
while ( mChildWindows . Count > 0 )
mChildWindows [ mChildWindows . Count - 1 ] . Close ( force ) ;
//for (var childWindow in mChildWindows)
//childWindow.Close(force);
//mChildWindows[mChildWindows.Count - 1].Close(force);
if ( mNativeWindow ! = null )
{
BFWindow_Close ( mNativeWindow , force ? 1 : 0 ) ;
}
else
{
Closed ( ) ;
}
}
2019-09-27 13:01:03 -07:00
public virtual void Resize ( int x , int y , int width , int height , ShowKind showKind = . Normal )
2019-08-23 11:56:54 -07:00
{
Debug . Assert ( mNativeWindow ! = null ) ;
2019-09-27 13:01:03 -07:00
BFWindow_Resize ( mNativeWindow , ( int32 ) x , ( int32 ) y , ( int32 ) width , ( int32 ) height , ( int32 ) showKind ) ;
2019-08-23 11:56:54 -07:00
}
public void SetForeground ( )
{
BFWindow_SetForeground ( mNativeWindow ) ;
GotFocus ( ) ;
}
public void SetNonExclusiveMouseCapture ( )
{
// Does checking of mouse coords against all window even when this window has mouse capture,
// helps some dragging scenarios. Gets turned off automatically on mouse up.
BFWindow_SetNonExclusiveMouseCapture ( mNativeWindow ) ;
}
2020-03-02 06:24:21 -08:00
public bool HasParent ( BFWindow widgetWindow )
{
var checkParent = mParent ;
while ( checkParent ! = null )
{
if ( checkParent = = widgetWindow )
return true ;
checkParent = checkParent . mParent ;
}
return false ;
}
2019-08-23 11:56:54 -07:00
public virtual void Closed ( )
{
if ( mHasClosed )
return ;
mHasClosed = true ;
bool hadFocus = mHasFocus ;
BFApp . sApp . mWindows . Remove ( this ) ;
if ( mWindowFlags . HasFlag ( Flags . QuitOnClose ) )
BFApp . sApp . Stop ( ) ;
if ( mParent ! = null )
{
mParent . mChildWindows . Remove ( this ) ;
if ( ( hadFocus ) & & ( mWindowFlags . HasFlag ( Flags . Modal ) ) )
mParent . GotFocus ( ) ;
}
DeleteAndNullify ! ( mDefaultDrawLayer ) ;
BFApp . sApp . DeferDelete ( this ) ;
}
public void SetMinimumSize ( int32 minWidth , int32 minHeight , bool clientSized = false )
{
BFWindow_SetMinimumSize ( mNativeWindow , minWidth , minHeight , clientSized ) ;
}
2019-12-21 05:48:44 -08:00
public virtual void RehupSize ( )
{
BFWindow_GetPosition ( mNativeWindow , out mX , out mY , out mWindowWidth , out mWindowHeight , out mClientX , out mClientY , out mClientWidth , out mClientHeight ) ;
2019-09-27 13:01:03 -07:00
int32 showKind = 0 ;
BFWindow_GetPlacement ( mNativeWindow , out mNormX , out mNormY , out mNormWidth , out mNormHeight , out showKind ) ;
mShowKind = ( . ) showKind ;
2019-08-23 11:56:54 -07:00
mIsDirty = true ;
2019-12-21 05:48:44 -08:00
}
public virtual void Moved ( )
{
RehupSize ( ) ;
2019-08-23 11:56:54 -07:00
}
public virtual void SetClientPosition ( float x , float y )
{
mClientX = ( int32 ) x ;
mClientY = ( int32 ) y ;
BFWindow_SetClientPosition ( mNativeWindow , ( int32 ) x , ( int32 ) y ) ;
}
public virtual void SetAlpha ( float alpha , uint32 destAlphaSrcMask , bool mouseVisible )
{
mAlpha = alpha ;
BFWindow_SetAlpha ( mNativeWindow , alpha , destAlphaSrcMask , mouseVisible ? 1 : 0 ) ;
}
public virtual void SetMouseVisible ( bool mouseVisible )
{
mMouseVisible = mouseVisible ;
BFWindow_SetMouseVisible ( mNativeWindow , mouseVisible ) ;
}
public virtual void CaptureMouse ( )
{
BFWindow_CaptureMouse ( mNativeWindow ) ;
}
public bool IsMouseCaptured ( )
{
return BFWindow_IsMouseCaptured ( mNativeWindow ) ;
}
public virtual void * AddMenuItem ( void * parent , int insertIdx , String text , String hotKey , void * bitmap , bool enabled , int checkState , bool radioCheck )
{
return BFWindow_AddMenuItem ( mNativeWindow , parent , ( int32 ) insertIdx , text , hotKey , bitmap , enabled ? 1 : 0 , ( int32 ) checkState , radioCheck ? 1 : 0 ) ;
}
public virtual void ModifyMenuItem ( void * item , String text , String hotKey , void * bitmap , bool enabled , int checkState , bool radioCheck )
{
BFWindow_ModifyMenuItem ( mNativeWindow , item , text , hotKey , bitmap , enabled ? 1 : 0 , ( int32 ) checkState , radioCheck ? 1 : 0 ) ;
}
public virtual void DeleteMenuItem ( void * menuItem )
{
BFWindow_DeleteMenuItem ( mNativeWindow , menuItem ) ;
}
public virtual void MenuItemSelected ( SysMenu sysMenu )
{
sysMenu . Selected ( ) ;
}
public virtual void NativeMenuItemSelected ( void * menu )
{
SysMenu aSysMenu = mSysMenuMap [ ( int ) menu ] ;
MenuItemSelected ( aSysMenu ) ;
}
public virtual SysBitmap LoadSysBitmap ( String path )
{
return null ;
}
public virtual void GotFocus ( )
{
if ( mHasFocus )
return ;
mHasFocus = true ;
//Console.WriteLine("GotFocus {0}", mTitle);
}
public virtual void LostFocus ( BFWindow newFocus )
{
if ( ! mHasFocus )
return ;
mHasFocus = false ;
if ( mNativeWindow ! = null )
BFWindow_LostFocus ( mNativeWindow , ( newFocus ! = null ) ? newFocus . mNativeWindow : null ) ;
//TODO: REMOVE
//Debug.WriteLine("LostFocus {0}", mTitle);
}
2019-09-16 09:32:02 -07:00
public virtual int GetDPI ( )
{
return BFWindow_GetDPI ( mNativeWindow ) ;
}
2019-08-23 11:56:54 -07:00
public virtual void KeyChar ( char32 theChar )
{
}
public virtual bool KeyDown ( int32 keyCode , int32 isRepeat )
{
return false ;
}
public virtual void KeyUp ( int32 keyCode )
{
}
public virtual HitTestResult HitTest ( int32 x , int32 y )
{
return HitTestResult . NotHandled ;
}
public virtual void MouseMove ( int32 x , int32 y )
{
}
public virtual void MouseProxyMove ( int32 x , int32 y )
{
}
public virtual void MouseDown ( int32 x , int32 y , int32 btn , int32 btnCount )
{
}
public virtual void MouseUp ( int32 x , int32 y , int32 btn )
{
}
2020-05-25 00:10:35 -07:00
public virtual void MouseWheel ( int32 x , int32 y , float delta )
2019-08-23 11:56:54 -07:00
{
}
public virtual void MouseLeave ( )
{
}
public override void Draw ( Graphics g )
{
}
public virtual void Update ( )
{
}
}
#else
public class BFWindow : BFWindowBase , IStudioClientWindow
{
//IStudioWidgetWindow mProxy;
public int mClientWidth ;
public int mClientHeight ;
public int mClientX ;
public int mClientY ;
public float mAlpha = 1.0f ;
public bool mVisible = true ;
public Flags mWindowFlags ;
public IPCProxy < IStudioHostWindow > mRemoteWindow ;
public IPCEndpoint < IStudioClientWindow > mStudioClientWindow ;
public BFWindow ( BFWindow parent , string title , int x , int y , int width , int height , BFWindow . Flags windowFlags )
{
mStudioClientWindow = IPCEndpoint < IStudioClientWindow > . Create ( this ) ;
IStudioHost studioInstance = BFApp . sApp . mStudioHost . Proxy ;
IPCObjectId remoteWindowId = studioInstance . CreateWindow ( mStudioClientWindow . ObjId , 0 , title , x , y , width , height , ( int ) windowFlags ) ;
mRemoteWindow = IPCProxy < IStudioHostWindow > . Create ( remoteWindowId ) ;
mDefaultDrawLayer = new DrawLayer ( this ) ;
BFApp . sApp . mWindows . Add ( this ) ;
mClientX = 0 ;
mClientY = 0 ;
mClientWidth = width ;
mClientHeight = height ;
mWindowFlags = windowFlags ;
}
public void Dispose ( )
{
Close ( ) ;
}
public virtual int CloseQuery ( )
{
return 1 ;
}
public virtual void Close ( bool force = false )
{
//if (mNativeWindow != null)
//BFWindow_Close(mNativeWindow, force ? 1 : 0);
}
public virtual void Closed ( )
{
//mNativeWindow = null;
BFApp . sApp . mWindows . Remove ( this ) ;
}
public virtual void Moved ( )
{
//BFWindow_GetPosition(mNativeWindow, out mX, out mY, out mWindowWidth, out mWindowHeight, out mClientX, out mClientY, out mClientWidth, out mClientHeight);
}
public virtual void SetClientPosition ( float x , float y )
{
//BFWindow_SetClientPosition(mNativeWindow, (int)x, (int)y);
}
public virtual void SetAlpha ( float alpha , uint destAlphaSrcMask , bool mouseVisible )
{
//mAlpha = alpha;
//BFWindow_SetAlpha(mNativeWindow, alpha, destAlphaSrcMask, mouseVisible ? 1 : 0);
}
public virtual void * AddMenuItem ( void * parent , string text , string hotKey , void * bitmap , bool enabled , int checkState , bool radioCheck )
{
//return BFWindow_AddMenuItem(mNativeWindow, parent, text, hotKey, bitmap, enabled ? 1 : 0, checkState, radioCheck ? 1 : 0);
return null ;
}
public virtual void MenuItemSelected ( SysMenu sysMenu )
{
sysMenu . Selected ( ) ;
}
public virtual void NativeMenuItemSelected ( void * menu )
{
//SysMenu aSysMenu = mSysMenuMap[menu];
//MenuItemSelected(aSysMenu);
}
public virtual SysBitmap LoadSysBitmap ( string path )
{
return null ;
}
public virtual void GotFocus ( )
{
}
public virtual void LostFocus ( )
{
}
public virtual void KeyChar ( char32 theChar )
{
}
public virtual void KeyDown ( int keyCode , int isRepeat )
{
}
public virtual void KeyUp ( int keyCode )
{
}
public virtual void MouseMove ( int x , int y )
{
}
public virtual void MouseProxyMove ( int x , int y )
{
}
public virtual void MouseDown ( int x , int y , int btn , int btnCount )
{
}
public virtual void MouseUp ( int x , int y , int btn )
{
}
public virtual void MouseWheel ( int x , int y , int delta )
{
}
public virtual void MouseLeave ( )
{
}
public virtual void Update ( )
{
}
public override void PreDraw ( Graphics g )
{
base . PreDraw ( g ) ;
mRemoteWindow . Proxy . RemoteDrawingStarted ( ) ;
}
public override void PostDraw ( Graphics g )
{
base . PostDraw ( g ) ;
mRemoteWindow . Proxy . RemoteDrawingDone ( ) ;
}
public void SetIsVisible ( bool visible )
{
mVisible = visible ;
}
}
#endif
}