diff --git a/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs b/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs
index 819d460609..edfd389c91 100644
--- a/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs
+++ b/src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs
@@ -12,43 +12,32 @@ namespace HtmlHelp2
using System.Windows.Forms;
using System.Reflection;
using System.IO;
- using ICSharpCode.Core.AddIns;
- using ICSharpCode.Core.AddIns.Codons;
+ using System.Xml;
+ using ICSharpCode.Core;
+ using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
- using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.BrowserDisplayBinding;
- using ICSharpCode.SharpDevelop.Services;
+ using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
+ using ICSharpCode.SharpDevelop.Dom;
+ using ICSharpCode.TextEditor;
using HtmlHelp2Service;
- using HtmlHelp2Browser;
using MSHelpServices;
- using mshtml;
- /*
- * Note: The dynamic help is disabled at the moment. Technically it's
- * possible. You can patch the default editor, trying to integrate the
- * dynamic help. :o) But if you are doing so, don't forget to use the
- * second version of "HtmlHelp2.addin", located in the "DynamicHelpResources"
- * folder.
- *
- * Mathias.
- */
-
public class ShowDynamicHelpMenuCommand : AbstractMenuCommand
{
public override void Run()
{
- HtmlHelp2DynamicHelpPad dynamicHelp = (HtmlHelp2DynamicHelpPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2DynamicHelpPad));
+ PadDescriptor dynamicHelp = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2DynamicHelpPad));
if(dynamicHelp != null) dynamicHelp.BringPadToFront();
}
}
-
public class HtmlHelp2DynamicHelpPad : AbstractPadContent
{
protected HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser;
- HtmlHelp2Environment h2env = null;
- int internalIndex = 0;
+ private int internalIndex = 0;
+ private string lastDynamicHelpWord = String.Empty;
public override Control Control
{
@@ -71,25 +60,26 @@ namespace HtmlHelp2
dynamicHelpBrowser.RedrawContent();
}
- public HtmlHelp2DynamicHelpPad() : base("${res:AddIns.HtmlHelp2.DynamicHelp}", "HtmlHelp2.16x16.DynamicHelp")
+ public HtmlHelp2DynamicHelpPad()
{
- h2env = (HtmlHelp2Environment)ServiceManager.Services.GetService(typeof(HtmlHelp2Environment));
dynamicHelpBrowser = new HtmlHelp2DynamicHelpBrowserControl();
+ ParserService.ParserUpdateStepFinished += UpdateTick;
}
#region WebBrowser Scripting
public void BuildDynamicHelpList(string dynamicHelpString, string expectedLanguage)
{
- if(h2env == null || !h2env.Help2EnvironmentIsReady || h2env.DynamicHelpIsBusy) {
+ if(!HtmlHelp2Environment.IsReady || HtmlHelp2Environment.DynamicHelpIsBusy) {
return;
}
- this.BringPadToFront();
+ if(String.Compare(dynamicHelpString, this.lastDynamicHelpWord) == 0) return;
+
try {
this.RemoveAllChildren();
Cursor.Current = Cursors.WaitCursor;
- IHxTopicList topics = h2env.GetMatchingTopicsForDynamicHelp(dynamicHelpString);
+ IHxTopicList topics = HtmlHelp2Environment.GetMatchingTopicsForDynamicHelp(dynamicHelpString);
Cursor.Current = Cursors.Default;
if(topics.Count > 0) {
@@ -103,6 +93,8 @@ namespace HtmlHelp2
}
}
}
+
+ this.lastDynamicHelpWord = dynamicHelpString;
}
catch {
}
@@ -111,7 +103,7 @@ namespace HtmlHelp2
private void RemoveAllChildren()
{
try {
- dynamicHelpBrowser.Document.body.innerHTML = "";
+ dynamicHelpBrowser.Document.Body.InnerHtml = "";
this.internalIndex = 0;
}
catch {
@@ -120,201 +112,277 @@ namespace HtmlHelp2
private void BuildNewChild(string sectionName, string topicName, string topicUrl)
{
- mshtml.IHTMLElementCollection children = (mshtml.IHTMLElementCollection)((mshtml.IHTMLElement2)dynamicHelpBrowser.Document.body).getElementsByTagName("span");
- for(int i = 0; i < children.length; i++) {
- mshtml.IHTMLElement span = (mshtml.IHTMLElement)children.item(i,0);
-
- if((string)span.getAttribute("className", 0) == "section") {
- try {
- mshtml.IHTMLElementCollection spanChildren = (mshtml.IHTMLElementCollection)span.children;
- mshtml.IHTMLElement firstChild = (mshtml.IHTMLElement)spanChildren.item(1,0);
- mshtml.IHTMLElement spanChild = (mshtml.IHTMLElement)spanChildren.item(3,0);
-
- if(firstChild.tagName == "B" && firstChild.innerText == sectionName) {
- if(spanChild.tagName == "SPAN" && (string)spanChild.getAttribute("className", 0) == "content") {
- spanChild.insertAdjacentHTML("beforeEnd",
- String.Format("{1}
",
- topicUrl, topicName)
- );
-
- return;
+ try {
+ HtmlElementCollection children = dynamicHelpBrowser.Document.Body.GetElementsByTagName("span");
+
+ if(children.Count > 0) {
+ foreach(HtmlElement elem in children) {
+ if(elem.GetAttribute("className") == "section") {
+ try {
+ HtmlElement sectionBlock = elem.FirstChild.NextSibling;
+ HtmlElement contentSpan = sectionBlock.NextSibling.NextSibling;
+
+ if(sectionBlock.TagName == "B" && sectionBlock.InnerText == sectionName &&
+ contentSpan.TagName == "SPAN" && contentSpan.GetAttribute("className") == "content")
+ {
+ contentSpan.AppendChild(this.CreateNewLink(topicUrl, topicName));
+ contentSpan.AppendChild(this.CreateABreak());
+
+ return;
+ }
+ }
+ catch {
}
}
}
- finally {
- }
+
+ dynamicHelpBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
+ this.CreateABreak());
}
+
+ HtmlElement linkContent = null;
+ HtmlElement htmlSection = this.CreateNewSection(sectionName, out linkContent);
+ dynamicHelpBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd, htmlSection);
+ linkContent.AppendChild(this.CreateNewLink(topicUrl, topicName));
+ linkContent.AppendChild(this.CreateABreak());
+
+ this.internalIndex++;
+ }
+ catch {
}
+ }
+
+ private HtmlElement CreateNewSection(string sectionName, out HtmlElement linkNode)
+ {
+ HtmlElement span = null;
+ linkNode = null;
try {
- if(children.length > 0) {
- dynamicHelpBrowser.Document.body.insertAdjacentHTML("beforeEnd", "
");
- }
+ span = dynamicHelpBrowser.Document.CreateElement("span");
+ span.SetAttribute("className", "section");
+
+ HtmlElement img = dynamicHelpBrowser.Document.CreateElement("img");
+ img.Style = "width:16px;height:16px;margin-right:5px";
+ img.Id = String.Format("image_{0}", this.internalIndex.ToString());
+ img.SetAttribute("src", "OpenBook.png");
+ span.AppendChild(img);
+
+ HtmlElement b = dynamicHelpBrowser.Document.CreateElement("b");
+ b.InnerText = sectionName;
+ b.Style = "cursor:pointer";
+ b.SetAttribute("title", this.internalIndex.ToString());
+ b.Click += new HtmlElementEventHandler(this.OnSectionClick);
+ span.AppendChild(b);
+
+ span.AppendChild(this.CreateABreak());
+
+ HtmlElement content = dynamicHelpBrowser.Document.CreateElement("span");
+ content.Id = String.Format("content_{0}", this.internalIndex.ToString());
+ content.SetAttribute("className", "content");
+ span.AppendChild(content);
+
+ linkNode = content;
+ }
+ catch {
+ }
- dynamicHelpBrowser.Document.body.insertAdjacentHTML("beforeEnd",
- String.Format("
" +
- "{1}
" +
- "" +
- "{3}
",
- this.internalIndex.ToString(), sectionName, topicUrl, topicName)
- );
+ return span;
+ }
- this.internalIndex++;
+ private HtmlElement CreateNewLink(string topicUrl, string topicName)
+ {
+ HtmlElement span = null;
+
+ try {
+ span = dynamicHelpBrowser.Document.CreateElement("span");
+ span.InnerText = topicName;
+ span.SetAttribute("className", "link");
+ span.SetAttribute("title", topicUrl);
+ span.MouseOver += new HtmlElementEventHandler(OnMouseOver);
+ span.MouseLeave += new HtmlElementEventHandler(OnMouseOut);
+ span.Click += new HtmlElementEventHandler(OnLinkClick);
}
- finally {
+ catch {
}
+
+ return span;
+ }
+
+ private HtmlElement CreateABreak()
+ {
+ HtmlElement br = dynamicHelpBrowser.Document.CreateElement("br");
+ return br;
}
#endregion
- }
+ private void OnMouseOver(object sender, HtmlElementEventArgs e)
+ {
+ try {
+ StatusBarService.SetMessage(((HtmlElement)sender).GetAttribute("title"));
+ }
+ catch {
+ }
+ }
+
+ private void OnMouseOut(object sender, HtmlElementEventArgs e)
+ {
+ StatusBarService.SetMessage("");
+ }
+
+ private void OnSectionClick(object sender, HtmlElementEventArgs e)
+ {
+ try {
+ string sectionId = ((HtmlElement)sender).GetAttribute("title");
+ object[] objArray = new object[1];
+ objArray[0] = (object)sectionId;
+ dynamicHelpBrowser.Document.InvokeScript("ExpandCollapse", objArray);
+ }
+ catch {
+ }
+ }
+
+ private void OnLinkClick(object sender, HtmlElementEventArgs e)
+ {
+ try {
+ string url = ((HtmlElement)sender).GetAttribute("title");
+ if(url != null && url != String.Empty) ShowHelpBrowser.OpenHelpView(url);
+ }
+ catch {
+ }
+ }
+
+ #region Taken from DefinitionView.cs
+ private void UpdateTick(object sender, ParserUpdateStepEventArgs e)
+ {
+// if (!this.IsVisible) return;
+
+ try {
+ ResolveResult res = ResolveAtCaret(e);
+ if (res == null || res.ResolvedType == null) return;
+ WorkbenchSingleton.SafeThreadAsyncCall(this,
+ "BuildDynamicHelpList",
+ res.ResolvedType.FullyQualifiedName,
+ "");
+ // thanks again to Daniel and Robert
+ }
+ catch {
+ }
+ }
+
+ private ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)
+ {
+ IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
+ if (window == null) return null;
+ ITextEditorControlProvider provider = window.ActiveViewContent as ITextEditorControlProvider;
+ if (provider == null) return null;
+ TextEditorControl ctl = provider.TextEditorControl;
+
+ // e might be null when this is a manually triggered update
+ string fileName = (e == null) ? ctl.FileName : e.FileName;
+ if (ctl.FileName != fileName) return null;
+ IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);
+ if (expressionFinder == null) return null;
+ Caret caret = ctl.ActiveTextAreaControl.Caret;
+ string content = (e == null) ? ctl.Text : e.Content;
+ ExpressionResult expr = expressionFinder.FindFullExpression(content, caret.Offset);
+ if (expr.Expression == null) return null;
+
+ return ParserService.Resolve(expr, caret.Line, caret.Column, fileName, content);
+ }
+ #endregion
+ }
public class HtmlHelp2DynamicHelpBrowserControl : UserControl
{
- AxWebBrowser axWebBrowser = null;
- ToolBar dynamicHelpToolbar = new ToolBar();
- mshtml.HTMLDocument doc = null;
- string[] toolbarButtons = new string[] {
+ ExtendedWebBrowser axWebBrowser = new ExtendedWebBrowser();
+ ToolStrip dynamicHelpToolbar = new ToolStrip();
+ string[] toolbarButtons = new string[] {
"${res:AddIns.HtmlHelp2.Contents}",
"${res:AddIns.HtmlHelp2.Index}",
"${res:AddIns.HtmlHelp2.Search}"
};
- public mshtml.HTMLDocument Document
+ public HtmlDocument Document
{
get {
- return doc;
- }
- }
-
- protected override void Dispose(bool disposing)
- {
- if (doc != null) {
- mshtml.HTMLDocumentEvents2_Event docEvents = (mshtml.HTMLDocumentEvents2_Event)doc;
- docEvents.oncontextmenu -= new HTMLDocumentEvents2_oncontextmenuEventHandler(DocumentEventsOnContextMenu);
- int c = Marshal.ReleaseComObject(doc);
- doc = null;
+ return axWebBrowser.Document;
}
- base.Dispose(disposing);
- if (disposing) axWebBrowser.Dispose();
}
public void RedrawContent()
{
- StringParserService sps = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
for(int i = 0; i < toolbarButtons.Length; i++) {
- dynamicHelpToolbar.Buttons[i].ToolTipText = sps.Parse(toolbarButtons[i]);
+ dynamicHelpToolbar.Items[i].ToolTipText = StringParser.Parse(toolbarButtons[i]);
}
}
public HtmlHelp2DynamicHelpBrowserControl()
{
- HtmlHelp2Environment h2env = (HtmlHelp2Environment)ServiceManager.Services.GetService(typeof(HtmlHelp2Environment));
- bool Help2EnvIsReady = (h2env != null && h2env.Help2EnvironmentIsReady);
-
- Dock = DockStyle.Fill;
- Size = new Size(500, 500);
-
- axWebBrowser = new AxWebBrowser();
- axWebBrowser.BeginInit();
- axWebBrowser.Dock = DockStyle.Fill;
- axWebBrowser.Enabled = Help2EnvIsReady;
- axWebBrowser.HandleCreated += new EventHandler(this.CreatedWebBrowserHandle);
- axWebBrowser.NewWindow2 += new DWebBrowserEvents2_NewWindow2EventHandler(this.NewBrowserWindow);
- axWebBrowser.StatusTextChange += new DWebBrowserEvents2_StatusTextChangeEventHandler(this.StatusBarChanged);
- axWebBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.DocumentComplete);
- axWebBrowser.EndInit();
+ this.InitializeComponents();
+ this.LoadDynamicHelpPage();
+ }
+
+ private void InitializeComponents()
+ {
+ Dock = DockStyle.Fill;
+ Size = new Size(500, 500);
+
Controls.Add(axWebBrowser);
+ axWebBrowser.Dock = DockStyle.Fill;
+ axWebBrowser.WebBrowserShortcutsEnabled = false;
+ axWebBrowser.IsWebBrowserContextMenuEnabled = false;
+ axWebBrowser.AllowWebBrowserDrop = false;
Controls.Add(dynamicHelpToolbar);
- dynamicHelpToolbar.Dock = DockStyle.Top;
- dynamicHelpToolbar.Appearance = ToolBarAppearance.Flat;
- dynamicHelpToolbar.Divider = false;
- dynamicHelpToolbar.ButtonClick += new ToolBarButtonClickEventHandler(ToolBarButtonClicked);
-
- StringParserService sps = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
+ dynamicHelpToolbar.Dock = DockStyle.Top;
+ dynamicHelpToolbar.AllowItemReorder = false;
for(int i = 0; i < toolbarButtons.Length; i++) {
- ToolBarButton button = new ToolBarButton();
- button.ToolTipText = sps.Parse(toolbarButtons[i]);
- button.ImageIndex = i;
- dynamicHelpToolbar.Buttons.Add(button);
+ ToolStripButton button = new ToolStripButton();
+ button.ToolTipText = StringParser.Parse(toolbarButtons[i]);
+ button.ImageIndex = i;
+ button.Click += new EventHandler(this.ToolStripButtonClicked);
+
+ dynamicHelpToolbar.Items.Add(button);
}
- dynamicHelpToolbar.ImageList = new ImageList();
+ dynamicHelpToolbar.ImageList = new ImageList();
dynamicHelpToolbar.ImageList.ColorDepth = ColorDepth.Depth32Bit;
- dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetImage("HtmlHelp2.16x16.Toc"));
- dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetImage("HtmlHelp2.16x16.Index"));
- dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetImage("HtmlHelp2.16x16.Search"));
+ dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetBitmap("HtmlHelp2.16x16.Toc.png"));
+ dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetBitmap("HtmlHelp2.16x16.Index.png"));
+ dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetBitmap("HtmlHelp2.16x16.Search.png"));
}
- private void CreatedWebBrowserHandle(object sender, EventArgs evArgs)
+ private void LoadDynamicHelpPage()
{
- object arg = System.Reflection.Missing.Value;
try {
- string url = "about:blank";
+ string url = String.Format("{0}\\context.html",
+ Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
- if(File.Exists(String.Format("{0}\\context.html",Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)))) {
- url = String.Format("file://{0}\\context.html",Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
- }
- axWebBrowser.Navigate(url, ref arg, ref arg, ref arg, ref arg);
- } catch {
- }
- }
-
- private void NewBrowserWindow(object sender, DWebBrowserEvents2_NewWindow2Event e)
- {
- HtmlHelp2BrowserPane help2Browser = ShowHelpBrowser.GetActiveHelp2BrowserView();
- help2Browser.WorkbenchWindow.SelectWindow();
- AxWebBrowser newBrowser = (AxWebBrowser)((HtmlHelp2BrowserControl)help2Browser.Control).AxWebBrowser;
- e.ppDisp = newBrowser.Application;
- newBrowser.RegisterAsBrowser = true;
- }
-
- private void DocumentComplete(object sender, DWebBrowserEvents2_DocumentCompleteEvent e)
- {
- try {
- mshtml.HTMLDocumentEvents2_Event docEvents;
- if (doc != null) {
- docEvents = (mshtml.HTMLDocumentEvents2_Event)doc;
- docEvents.oncontextmenu -= new HTMLDocumentEvents2_oncontextmenuEventHandler(DocumentEventsOnContextMenu);
- Marshal.ReleaseComObject(doc);
- }
- doc = (mshtml.HTMLDocument)axWebBrowser.Document;
- docEvents = (mshtml.HTMLDocumentEvents2_Event)doc;
- docEvents.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(DocumentEventsOnContextMenu);
+ if(!File.Exists(url)) url = "about:blank";
+ axWebBrowser.Navigate(url);
}
catch {
}
}
- private void StatusBarChanged(object sender, DWebBrowserEvents2_StatusTextChangeEvent e)
+ private void ToolStripButtonClicked(object sender, EventArgs e)
{
- IStatusBarService statusBarService = (IStatusBarService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IStatusBarService));
- statusBarService.SetMessage(e.text);
- }
-
- private bool DocumentEventsOnContextMenu(IHTMLEventObj e)
- {
- e.cancelBubble = true;
- e.returnValue = false;
- return false;
- }
-
- private void ToolBarButtonClicked(object sender, ToolBarButtonClickEventArgs e)
- {
- switch(dynamicHelpToolbar.Buttons.IndexOf(e.Button)) {
+ ToolStripItem item = (ToolStripItem)sender;
+ PadDescriptor pad = null;
+
+ switch(item.ImageIndex) {
case 0:
- HtmlHelp2TocPad toc = (HtmlHelp2TocPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2TocPad));
- if(toc != null) toc.BringPadToFront();
+ pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2TocPad));
break;
case 1:
- HtmlHelp2IndexPad index = (HtmlHelp2IndexPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexPad));
- if(index != null) index.BringPadToFront();
+ pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexPad));
break;
case 2:
- HtmlHelp2SearchPad search = (HtmlHelp2SearchPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2SearchPad));
- if(search != null) search.BringPadToFront();
+ pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2SearchPad));
break;
}
+
+ if(pad != null) pad.BringPadToFront();
}
}
}