⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlviewpane.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
//     <version>$Revision: 1460 $</version>
// </file>

using System;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Printing;

using ICSharpCode.SharpDevelop.Internal.Undo;

using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;

namespace ICSharpCode.SharpDevelop.BrowserDisplayBinding
{
	public class BrowserPane : AbstractViewContent
	{
		HtmlViewPane htmlViewPane;
		
		public HtmlViewPane HtmlViewPane {
			get {
				return htmlViewPane;
			}
		}
		
		public override Control Control {
			get {
				return htmlViewPane;
			}
		}
		
		public override bool IsDirty {
			get {
				return false;
			}
			set {
			}
		}
		
		public override bool IsViewOnly {
			get {
				return true;
			}
		}
		
		protected BrowserPane(bool showNavigation)
		{
			htmlViewPane = new HtmlViewPane(showNavigation);
			htmlViewPane.WebBrowser.DocumentTitleChanged += new EventHandler(TitleChange);
			htmlViewPane.Closed += PaneClosed;
			TitleChange(null, null);
		}
		
		public BrowserPane(Uri uri) : this(true)
		{
			htmlViewPane.Navigate(uri);
		}
		
		public BrowserPane() : this(true)
		{
		}
		
		public override void Dispose()
		{
			base.Dispose();
			htmlViewPane.Dispose();
		}
		
		public override void Load(string url)
		{
			htmlViewPane.Navigate(url);
		}
		
		public override void Save(string url)
		{
			Load(url);
		}
		
		public Uri Url {
			get {
				return htmlViewPane.Url;
			}
		}
		
		void PaneClosed(object sender, EventArgs e)
		{
			WorkbenchWindow.CloseWindow(true);
		}
		
		void TitleChange(object sender, EventArgs e)
		{
			string title = htmlViewPane.WebBrowser.DocumentTitle;
			if (title != null)
				title = title.Trim();
			if (title == null || title.Length == 0)
				TitleName = ResourceService.GetString("ICSharpCode.SharpDevelop.BrowserDisplayBinding.Browser");
			else
				TitleName = title;
		}
	}
	
	public class HtmlViewPane : UserControl
	{
		ExtendedWebBrowser webBrowser = null;
		
		ToolStrip toolStrip;
		
//		string lastUrl     = null;
		
		public ExtendedWebBrowser WebBrowser {
			get {
				return webBrowser;
			}
		}
		
		public event EventHandler Closed;
		
		/// <summary>
		/// Closes the ViewContent that contains this HtmlViewPane.
		/// </summary>
		public void Close()
		{
			if (Closed != null) {
				Closed(this, EventArgs.Empty);
			}
		}
		
		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);
			if (disposing) {
				webBrowser.Dispose();
			}
		}
		
		public HtmlViewPane(bool showNavigation)
		{
			Dock = DockStyle.Fill;
			Size = new Size(500, 500);
			
			webBrowser = new ExtendedWebBrowser();
			webBrowser.Dock = DockStyle.Fill;
			webBrowser.Navigating += WebBrowserNavigating;
			webBrowser.NewWindowExtended += NewWindow;
			webBrowser.Navigated  += WebBrowserNavigated;
			webBrowser.StatusTextChanged += WebBrowserStatusTextChanged;
			webBrowser.DocumentCompleted += WebBrowserDocumentCompleted;
			Controls.Add(webBrowser);
			
			if (showNavigation) {
				toolStrip = ToolbarService.CreateToolStrip(this, "/SharpDevelop/ViewContent/Browser/Toolbar");
				toolStrip.GripStyle = ToolStripGripStyle.Hidden;
				Controls.Add(toolStrip);
			}
		}
		
		void NewWindow(object sender, NewWindowExtendedEventArgs e)
		{
			e.Cancel = true;
			WorkbenchSingleton.Workbench.ShowView(new BrowserPane(e.Url));
		}
		
		void WebBrowserStatusTextChanged(object sender, EventArgs e)
		{
			IWorkbenchWindow workbench = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
			if (workbench == null) return;
			BrowserPane browser = workbench.ActiveViewContent as BrowserPane;
			if (browser == null) return;
			if (browser.HtmlViewPane == this) {
				StatusBarService.SetMessage(webBrowser.StatusText);
			}
		}
		
		static ArrayList descriptors;
		
		public static ISchemeExtension GetScheme(string name)
		{
			if (descriptors == null) {
				descriptors = AddInTree.BuildItems("/SharpDevelop/Views/Browser/SchemeExtensions", null, false);
			}
			foreach (SchemeExtensionDescriptor descriptor in descriptors) {
				if (string.Equals(name, descriptor.SchemeName, StringComparison.OrdinalIgnoreCase)) {
					return descriptor.Extension;
				}
			}
			return null;
		}
		
		void WebBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
		{
			try {
				ISchemeExtension extension = GetScheme(e.Url.Scheme);
				if (extension != null) {
					extension.InterceptNavigate(this, e);
					if (e.TargetFrameName.Length == 0) {
						if (e.Cancel == true) {
							dummyUrl = e.Url.ToString();
						} else if (e.Url.ToString() != "about:blank") {
							dummyUrl = null;
						}
					}
				}
			} catch (Exception ex) {
				MessageService.ShowError(ex);
			}
		}
		
		void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
		{
			try {
				if (dummyUrl != null && e.Url.ToString() == "about:blank") {
					e = new WebBrowserDocumentCompletedEventArgs(new Uri(dummyUrl));
				}
				ISchemeExtension extension = GetScheme(e.Url.Scheme);
				if (extension != null) {
					extension.DocumentCompleted(this, e);
				}
			} catch (Exception ex) {
				MessageService.ShowError(ex);
			}
		}
		
		public void Navigate(string url)
		{
			webBrowser.Navigate(new Uri(url));
		}
		
		public void Navigate(Uri url)
		{
			webBrowser.Navigate(url);
		}
		
		public const string DefaultHomepage = "http://www.icsharpcode.net/";
		public const string DefaultSearchUrl = "http://www.google.com/";
		
		public void GoHome()
		{
			ISchemeExtension extension = GetScheme(Url.Scheme);
			if (extension != null) {
				extension.GoHome(this);
			} else {
				Navigate(DefaultHomepage);
			}
		}
		
		public void GoSearch()
		{
			ISchemeExtension extension = GetScheme(Url.Scheme);
			if (extension != null) {
				extension.GoSearch(this);
			} else {
				Navigate(DefaultSearchUrl);
			}
		}
		
		Control urlBox;
		
		public void SetUrlComboBox(ComboBox comboBox)
		{
			SetUrlBox(comboBox);
			comboBox.DropDownStyle = ComboBoxStyle.DropDown;
			comboBox.Items.Clear();
			comboBox.Items.AddRange(PropertyService.Get("Browser.URLBoxHistory", new string[0]));
			comboBox.AutoCompleteMode      = AutoCompleteMode.Suggest;
			comboBox.AutoCompleteSource    = AutoCompleteSource.HistoryList;
		}
		
		public void SetUrlBox(Control urlBox)
		{
			this.urlBox = urlBox;
			urlBox.KeyUp += UrlBoxKeyUp;
		}
		
		void UrlBoxKeyUp(object sender, KeyEventArgs e)
		{
			Control ctl = (Control)sender;
			if (e.KeyData == Keys.Return) {
				e.Handled = true;
				UrlBoxNavigate(ctl);
			}
		}
		
		void UrlBoxNavigate(Control ctl)
		{
			string text = ctl.Text.Trim();
			if (text.IndexOf(':') < 0) {
				text = "http://" + text;
			}
			Navigate(text);
			ComboBox comboBox = ctl as ComboBox;
			if (comboBox != null) {
				comboBox.Items.Remove(text);
				comboBox.Items.Insert(0, text);
				// Add to URLBoxHistory:
				string[] history = PropertyService.Get("Browser.URLBoxHistory", new string[0]);
				int pos = Array.IndexOf(history, text);
				if (pos < 0 && history.Length >= 20) {
					pos = history.Length - 1; // remove last entry and insert new at the beginning
				}
				if (pos < 0) {
					// insert new item
					string[] newHistory = new string[history.Length + 1];
					history.CopyTo(newHistory, 1);
					history = newHistory;
				} else {
					for (int i = pos; i > 0; i--) {
						history[i] = history[i - 1];
					}
				}
				history[0] = text;
				PropertyService.Set("Browser.URLBoxHistory", history);
			}
		}
		
		string dummyUrl;
		
		public Uri Url {
			get {
				if (webBrowser.Url == null)
					return new Uri("about:blank");
				if (dummyUrl != null && webBrowser.Url.ToString() == "about:blank") {
					return new Uri(dummyUrl);
				} else {
					return webBrowser.Url;
				}
			}
		}
		
		void WebBrowserNavigated(object sender, WebBrowserNavigatedEventArgs e)
		{
			// do not use e.Url (frames!)
			string url = webBrowser.Url.ToString();
			if (dummyUrl != null && url == "about:blank") {
				urlBox.Text = dummyUrl;
			} else {
				urlBox.Text = url;
			}
			// Update toolbar:
			foreach (object o in toolStrip.Items) {
				IStatusUpdate up = o as IStatusUpdate;
				if (up != null)
					up.UpdateStatus();
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -