You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							191 lines
						
					
					
						
							4.5 KiB
						
					
					
				
			
		
		
	
	
							191 lines
						
					
					
						
							4.5 KiB
						
					
					
				using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Linq; | 
						|
using System.Text; | 
						|
using System.Windows; | 
						|
using System.Windows.Controls; | 
						|
using System.Windows.Data; | 
						|
using System.Windows.Documents; | 
						|
using System.Windows.Input; | 
						|
using System.Windows.Media; | 
						|
using System.Windows.Media.Imaging; | 
						|
using System.Windows.Shapes; | 
						|
using ICSharpCode.XamlDesigner.Configuration; | 
						|
using System.ComponentModel; | 
						|
using Microsoft.Win32; | 
						|
using AvalonDock; | 
						|
using System.IO; | 
						|
using System.Collections.Specialized; | 
						|
using ICSharpCode.WpfDesign.Designer; | 
						|
 | 
						|
namespace ICSharpCode.XamlDesigner | 
						|
{ | 
						|
	public partial class MainWindow | 
						|
	{ | 
						|
		public MainWindow() | 
						|
		{ | 
						|
			Instance = this; | 
						|
			DataContext = Shell.Instance; | 
						|
			RenameCommands(); | 
						|
			BasicMetadata.Register(); | 
						|
 | 
						|
			InitializeComponent(); | 
						|
 | 
						|
			Shell.Instance.PropertyGrid = uxPropertyGridView.PropertyGrid; | 
						|
			AvalonDockWorkaround(); | 
						|
			RouteDesignSurfaceCommands(); | 
						|
 | 
						|
			this.AddCommandHandler(RefreshCommand, Shell.Instance.Refresh, Shell.Instance.CanRefresh); | 
						|
 | 
						|
			LoadSettings(); | 
						|
			ProcessPaths(App.Args); | 
						|
			 | 
						|
			ApplicationCommands.New.Execute(null, this); | 
						|
		} | 
						|
 | 
						|
		public static MainWindow Instance; | 
						|
 | 
						|
		OpenFileDialog openFileDialog; | 
						|
		SaveFileDialog saveFileDialog; | 
						|
 | 
						|
		protected override void OnDragEnter(DragEventArgs e) | 
						|
		{ | 
						|
			ProcessDrag(e); | 
						|
		} | 
						|
 | 
						|
		protected override void OnDragOver(DragEventArgs e) | 
						|
		{ | 
						|
			ProcessDrag(e); | 
						|
		} | 
						|
 | 
						|
		protected override void OnDrop(DragEventArgs e) | 
						|
		{ | 
						|
			ProcessPaths(e.Data.Paths()); | 
						|
		} | 
						|
 | 
						|
		protected override void OnClosing(CancelEventArgs e) | 
						|
		{ | 
						|
			if (Shell.Instance.PrepareExit()) { | 
						|
				SaveSettings(); | 
						|
			} | 
						|
			else { | 
						|
				e.Cancel = true; | 
						|
			} | 
						|
			base.OnClosing(e); | 
						|
		} | 
						|
 | 
						|
		void RecentFiles_Click(object sender, RoutedEventArgs e) | 
						|
		{ | 
						|
			var path = (string)(e.OriginalSource as MenuItem).Header; | 
						|
			Shell.Instance.Open(path); | 
						|
		} | 
						|
 | 
						|
		void ProcessDrag(DragEventArgs e) | 
						|
		{ | 
						|
			e.Effects = DragDropEffects.None; | 
						|
			e.Handled = true; | 
						|
 | 
						|
			foreach (var path in e.Data.Paths()) { | 
						|
				if (path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || | 
						|
				    path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) { | 
						|
					e.Effects = DragDropEffects.Copy; | 
						|
					break; | 
						|
				} | 
						|
				else if (path.EndsWith(".xaml", StringComparison.InvariantCultureIgnoreCase)) { | 
						|
					e.Effects = DragDropEffects.Copy; | 
						|
					break; | 
						|
				} | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		void ProcessPaths(IEnumerable<string> paths) | 
						|
		{ | 
						|
			foreach (var path in paths) { | 
						|
				if (path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || | 
						|
				    path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) { | 
						|
					Toolbox.Instance.AddAssembly(path); | 
						|
				} | 
						|
				else if (path.EndsWith(".xaml", StringComparison.InvariantCultureIgnoreCase)) { | 
						|
					Shell.Instance.Open(path); | 
						|
				} | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		public string AskOpenFileName() | 
						|
		{ | 
						|
			if (openFileDialog == null) { | 
						|
				openFileDialog = new OpenFileDialog(); | 
						|
				openFileDialog.Filter = "Xaml Documents (*.xaml)|*.xaml"; | 
						|
			} | 
						|
			if ((bool)openFileDialog.ShowDialog()) { | 
						|
				return openFileDialog.FileName; | 
						|
			} | 
						|
			return null; | 
						|
		} | 
						|
 | 
						|
		public string AskSaveFileName(string initName) | 
						|
		{ | 
						|
			if (saveFileDialog == null) { | 
						|
				saveFileDialog = new SaveFileDialog(); | 
						|
				saveFileDialog.Filter = "Xaml Documents (*.xaml)|*.xaml"; | 
						|
			} | 
						|
			saveFileDialog.FileName = initName; | 
						|
			if ((bool)saveFileDialog.ShowDialog()) { | 
						|
				return saveFileDialog.FileName; | 
						|
			} | 
						|
			return null; | 
						|
		} | 
						|
 | 
						|
		void LoadSettings() | 
						|
		{ | 
						|
			WindowState = Settings.Default.MainWindowState; | 
						|
 | 
						|
			Rect r = Settings.Default.MainWindowRect; | 
						|
			if (r != new Rect()) { | 
						|
				Left = r.Left; | 
						|
				Top = r.Top; | 
						|
				Width = r.Width; | 
						|
				Height = r.Height; | 
						|
			} | 
						|
 | 
						|
			uxDockingManager.Loaded += delegate { | 
						|
				if (Settings.Default.AvalonDockLayout != null) { | 
						|
					uxDockingManager.RestoreLayout(Settings.Default.AvalonDockLayout.ToStream()); | 
						|
				} | 
						|
			}; | 
						|
		} | 
						|
 | 
						|
		void SaveSettings() | 
						|
		{ | 
						|
			Settings.Default.MainWindowState = WindowState; | 
						|
			if (WindowState == WindowState.Normal) { | 
						|
				Settings.Default.MainWindowRect = new Rect(Left, Top, Width, Height); | 
						|
			} | 
						|
 | 
						|
			var writer = new StringWriter(); | 
						|
			uxDockingManager.SaveLayout(writer); | 
						|
			Settings.Default.AvalonDockLayout = writer.ToString(); | 
						|
 | 
						|
			Shell.Instance.SaveSettings(); | 
						|
		} | 
						|
 | 
						|
		#region AvalonDockWorkaround | 
						|
 | 
						|
		void AvalonDockWorkaround() | 
						|
		{ | 
						|
			uxDocumentPane.Items.KeepSyncronizedWith(Shell.Instance.Documents, d => CreateContentFor(d)); | 
						|
		} | 
						|
 | 
						|
		DocumentContent CreateContentFor(Document doc) | 
						|
		{ | 
						|
			var content = new DocumentContent() { | 
						|
				DataContext = doc, | 
						|
				Content = new DocumentView(doc) | 
						|
			}; | 
						|
			content.SetBinding(DocumentContent.TitleProperty, "Title"); | 
						|
			return content; | 
						|
		} | 
						|
 | 
						|
		#endregion | 
						|
	} | 
						|
}
 | 
						|
 |