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(); } } }