Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@134 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
12 changed files with 321 additions and 195 deletions
@ -0,0 +1,101 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
|
||||||
|
// <version value="$version"/>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Text; |
||||||
|
using System.ComponentModel; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
using System.Windows.Forms; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.BrowserDisplayBinding |
||||||
|
{ |
||||||
|
public delegate void NewWindowExtendedEventHandler(object sender, NewWindowExtendedEventArgs e); |
||||||
|
|
||||||
|
public class NewWindowExtendedEventArgs : CancelEventArgs |
||||||
|
{ |
||||||
|
Uri url; |
||||||
|
|
||||||
|
public Uri Url { |
||||||
|
get { |
||||||
|
return url; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public NewWindowExtendedEventArgs(Uri url) |
||||||
|
{ |
||||||
|
this.url = url; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Microsoft didn't include the URL being surfed to in the NewWindow event args,
|
||||||
|
/// but here is the workaround:
|
||||||
|
/// </summary>
|
||||||
|
public class ExtendedWebBrowser : WebBrowser |
||||||
|
{ |
||||||
|
class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2 |
||||||
|
{ |
||||||
|
private ExtendedWebBrowser browser; |
||||||
|
|
||||||
|
public WebBrowserExtendedEvents(ExtendedWebBrowser browser) |
||||||
|
{ |
||||||
|
this.browser = browser; |
||||||
|
} |
||||||
|
|
||||||
|
public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref string urlContext, ref string url) |
||||||
|
{ |
||||||
|
NewWindowExtendedEventArgs e = new NewWindowExtendedEventArgs(new Uri(url)); |
||||||
|
browser.OnNewWindowExtended(e); |
||||||
|
cancel = e.Cancel; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
[ComImport()] |
||||||
|
[Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")] |
||||||
|
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] |
||||||
|
[TypeLibType(TypeLibTypeFlags.FHidden)] |
||||||
|
interface DWebBrowserEvents2 |
||||||
|
{ |
||||||
|
[DispId(273)] |
||||||
|
void NewWindow3([InAttribute(), MarshalAs(UnmanagedType.IDispatch)] object pDisp, |
||||||
|
[InAttribute(), OutAttribute()] ref bool cancel, |
||||||
|
[InAttribute()] ref object flags, |
||||||
|
[InAttribute(), MarshalAs(UnmanagedType.BStr)] ref string urlContext, |
||||||
|
[InAttribute(), MarshalAs(UnmanagedType.BStr)] ref string url); |
||||||
|
} |
||||||
|
|
||||||
|
public event NewWindowExtendedEventHandler NewWindowExtended; |
||||||
|
|
||||||
|
private AxHost.ConnectionPointCookie cookie; |
||||||
|
private WebBrowserExtendedEvents wevents; |
||||||
|
|
||||||
|
protected override void CreateSink() |
||||||
|
{ |
||||||
|
base.CreateSink(); |
||||||
|
wevents = new WebBrowserExtendedEvents(this); |
||||||
|
cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, wevents, typeof(DWebBrowserEvents2)); |
||||||
|
} |
||||||
|
|
||||||
|
protected override void DetachSink() |
||||||
|
{ |
||||||
|
if (cookie != null) { |
||||||
|
cookie.Disconnect(); |
||||||
|
cookie = null; |
||||||
|
} |
||||||
|
base.DetachSink(); |
||||||
|
} |
||||||
|
|
||||||
|
protected virtual void OnNewWindowExtended(NewWindowExtendedEventArgs e) |
||||||
|
{ |
||||||
|
if (NewWindowExtended != null) { |
||||||
|
NewWindowExtended(this, e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,59 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
|
||||||
|
// <version value="$version"/>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections; |
||||||
|
using System.Drawing; |
||||||
|
using System.Windows.Forms; |
||||||
|
using ICSharpCode.Core; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.BrowserDisplayBinding |
||||||
|
{ |
||||||
|
public interface ISchemeExtension |
||||||
|
{ |
||||||
|
void InterceptNavigate(HtmlViewPane pane, WebBrowserNavigatingEventArgs e); |
||||||
|
} |
||||||
|
|
||||||
|
public class SchemeExtensionDescriptor |
||||||
|
{ |
||||||
|
string schemeName; |
||||||
|
|
||||||
|
public string SchemeName { |
||||||
|
get { |
||||||
|
return schemeName; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Codon codon; |
||||||
|
|
||||||
|
public SchemeExtensionDescriptor(Codon codon) |
||||||
|
{ |
||||||
|
this.codon = codon; |
||||||
|
schemeName = codon.Properties["scheme"]; |
||||||
|
if (schemeName == null || schemeName.Length == 0) |
||||||
|
schemeName = codon.Id; |
||||||
|
} |
||||||
|
|
||||||
|
ISchemeExtension ext; |
||||||
|
|
||||||
|
public void InterceptNavigate(HtmlViewPane pane, WebBrowserNavigatingEventArgs e) |
||||||
|
{ |
||||||
|
if (ext == null) { |
||||||
|
ext = (ISchemeExtension)codon.AddIn.CreateObject(codon.Properties["class"]); |
||||||
|
} |
||||||
|
ext.InterceptNavigate(pane, e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class SchemeExtensionErbauer : IErbauer |
||||||
|
{ |
||||||
|
public object BuildItem(object caller, Codon codon, ArrayList subItems) |
||||||
|
{ |
||||||
|
return new SchemeExtensionDescriptor(codon); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue