aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs
blob: 421c35c5a5e45bcbc935910d9dc88071defce97d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;

namespace Tango.Scripting.Editors.Utils
{
	/// <summary>
	/// Wrapper around Win32 functions.
	/// </summary>
	static class Win32
	{
		/// <summary>
		/// Gets the caret blink time.
		/// </summary>
		public static TimeSpan CaretBlinkTime {
			get { return TimeSpan.FromMilliseconds(SafeNativeMethods.GetCaretBlinkTime()); }
		}
		
		/// <summary>
		/// Creates an invisible Win32 caret for the specified Visual with the specified size (coordinates local to the owner visual).
		/// </summary>
		public static bool CreateCaret(Visual owner, Size size)
		{
			if (owner == null)
				throw new ArgumentNullException("owner");
			HwndSource source = PresentationSource.FromVisual(owner) as HwndSource;
			if (source != null) {
				Vector r = owner.PointToScreen(new Point(size.Width, size.Height)) - owner.PointToScreen(new Point(0, 0));
				return SafeNativeMethods.CreateCaret(source.Handle, IntPtr.Zero, (int)Math.Ceiling(r.X), (int)Math.Ceiling(r.Y));
			} else {
				return false;
			}
		}
		
		/// <summary>
		/// Sets the position of the caret previously created using <see cref="CreateCaret"/>. position is relative to the owner visual.
		/// </summary>
		public static bool SetCaretPosition(Visual owner, Point position)
		{
			if (owner == null)
				throw new ArgumentNullException("owner");
			HwndSource source = PresentationSource.FromVisual(owner) as HwndSource;
			if (source != null) {
				Point pointOnRootVisual = owner.TransformToAncestor(source.RootVisual).Transform(position);
				Point pointOnHwnd = pointOnRootVisual.TransformToDevice(source.RootVisual);
				return SafeNativeMethods.SetCaretPos((int)pointOnHwnd.X, (int)pointOnHwnd.Y);
			} else {
				return false;
			}
		}
		
		/// <summary>
		/// Destroys the caret previously created using <see cref="CreateCaret"/>.
		/// </summary>
		public static bool DestroyCaret()
		{
			return SafeNativeMethods.DestroyCaret();
		}
		
		[SuppressUnmanagedCodeSecurity]
		static class SafeNativeMethods
		{
			[DllImport("user32.dll")]
			public static extern int GetCaretBlinkTime();
			
			[DllImport("user32.dll")]
			[return: MarshalAs(UnmanagedType.Bool)]
			public static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);
			
			[DllImport("user32.dll")]
			[return: MarshalAs(UnmanagedType.Bool)]
			public static extern bool SetCaretPos(int x, int y);
			
			[DllImport("user32.dll")]
			[return: MarshalAs(UnmanagedType.Bool)]
			public static extern bool DestroyCaret();
		}
	}
}
pan class="w"> exceptionTrapper.Initialize(this); exceptionTrapper.ApplicationCrashed += ExceptionTrapper_ApplicationCrashed; //Apply Caching if (settings.CachingMode != ObservablesContextInMemoryCachingMode.None) { LogManager.Log("EF Caching is enabled."); LogManager.Log($"EF Caching mode is: {settings.CachingMode}."); LogManager.Log($"EF Caching timeout: {settings.MaximumCacheTime.ToString()}"); try { ObservablesContext.EnableInMemoryCache(settings.MaximumCacheTime, settings.CachingMode); } catch (Exception ex) { LogManager.Log(ex, "Error while trying to activate EF caching."); } } else { LogManager.Log("EF Caching is disabled"); } } #region Global Exception Trapping /// <summary> /// Handles the ApplicationCrashed event of the ExceptionTrapper. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="ApplicationCrashedEventArgs"/> instance containing the event data.</param> private void ExceptionTrapper_ApplicationCrashed(object sender, ApplicationCrashedEventArgs e) { try { try { if (Application.Current == null) { new Application { ShutdownMode = ShutdownMode.OnExplicitShutdown }; } } catch { } try { var eventLogger = TangoIOC.Default.GetInstance<IEventLogger>(); if (eventLogger != null) { eventLogger.Log(e.Exception, "Application Crashed!"); } } catch { } Application.Current.Dispatcher.Invoke(() => { WorkItem bug = null; TeamFoundationServiceExtendedClient tfsClient = null; INotificationProvider notification = null; try { tfsClient = TangoIOC.Default.GetInstance<TeamFoundationServiceExtendedClient>(); notification = TangoIOC.Default.GetInstance<INotificationProvider>(); if (tfsClient != null && tfsClient.IsInitialized) { bug = tfsClient.CreateBug(); } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } ExceptionWindow exWin = new ExceptionWindow(e.Exception, bug != null); exWin.ShowDialog(); switch (exWin.Resolution) { case ExceptionResolutions.Ignore: e.TryRecover = true; break; case ExceptionResolutions.Restart: e.TryRecover = false; LogManager.Log("User selection was to restart the application. Restarting..."); Process.Start(Application.ResourceAssembly.Location); Environment.Exit(0); break; case ExceptionResolutions.Shutdown: e.TryRecover = false; LogManager.Log("User selection was to shutdown the application. Restarting..."); Environment.Exit(0); break; case ExceptionResolutions.Report: e.TryRecover = true; LogManager.Log("User selection was to report the issue."); if (bug != null) { notification.ShowModalDialog<ReportIssueViewVM, ReportIssueView>(new ReportIssueViewVM(tfsClient.Project, bug), async (vm) => { using (notification.PushTaskItem("Uploading bug report...")) { try { tfsClient.FinalizeBug(vm.WorkItem); await tfsClient.UploadWorkItem(vm.WorkItem); } catch (Exception ex) { notification.ShowError("An error occurred while trying to create the issue." + Environment.NewLine + ex.Message); } } }, null); } break; } }); } catch (Exception ex) { LogManager.Log(ex, "Error in global exception trapper!"); MessageBox.Show(ex.ToStringSafe()); } } #endregion } }