Browse Source

dynamic help changed and ready to use

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@456 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Mathias Simmack 20 years ago
parent
commit
faaf94408d
  1. 390
      src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs

390
src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs

@ -12,43 +12,32 @@ namespace HtmlHelp2
using System.Windows.Forms; using System.Windows.Forms;
using System.Reflection; using System.Reflection;
using System.IO; using System.IO;
using ICSharpCode.Core.AddIns; using System.Xml;
using ICSharpCode.Core.AddIns.Codons; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.BrowserDisplayBinding; using ICSharpCode.SharpDevelop.BrowserDisplayBinding;
using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TextEditor;
using HtmlHelp2Service; using HtmlHelp2Service;
using HtmlHelp2Browser;
using MSHelpServices; 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 class ShowDynamicHelpMenuCommand : AbstractMenuCommand
{ {
public override void Run() public override void Run()
{ {
HtmlHelp2DynamicHelpPad dynamicHelp = (HtmlHelp2DynamicHelpPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2DynamicHelpPad)); PadDescriptor dynamicHelp = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2DynamicHelpPad));
if(dynamicHelp != null) dynamicHelp.BringPadToFront(); if(dynamicHelp != null) dynamicHelp.BringPadToFront();
} }
} }
public class HtmlHelp2DynamicHelpPad : AbstractPadContent public class HtmlHelp2DynamicHelpPad : AbstractPadContent
{ {
protected HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser; protected HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser;
HtmlHelp2Environment h2env = null; private int internalIndex = 0;
int internalIndex = 0; private string lastDynamicHelpWord = String.Empty;
public override Control Control public override Control Control
{ {
@ -71,25 +60,26 @@ namespace HtmlHelp2
dynamicHelpBrowser.RedrawContent(); dynamicHelpBrowser.RedrawContent();
} }
public HtmlHelp2DynamicHelpPad() : base("${res:AddIns.HtmlHelp2.DynamicHelp}", "HtmlHelp2.16x16.DynamicHelp") public HtmlHelp2DynamicHelpPad()
{ {
h2env = (HtmlHelp2Environment)ServiceManager.Services.GetService(typeof(HtmlHelp2Environment));
dynamicHelpBrowser = new HtmlHelp2DynamicHelpBrowserControl(); dynamicHelpBrowser = new HtmlHelp2DynamicHelpBrowserControl();
ParserService.ParserUpdateStepFinished += UpdateTick;
} }
#region WebBrowser Scripting #region WebBrowser Scripting
public void BuildDynamicHelpList(string dynamicHelpString, string expectedLanguage) public void BuildDynamicHelpList(string dynamicHelpString, string expectedLanguage)
{ {
if(h2env == null || !h2env.Help2EnvironmentIsReady || h2env.DynamicHelpIsBusy) { if(!HtmlHelp2Environment.IsReady || HtmlHelp2Environment.DynamicHelpIsBusy) {
return; return;
} }
this.BringPadToFront(); if(String.Compare(dynamicHelpString, this.lastDynamicHelpWord) == 0) return;
try { try {
this.RemoveAllChildren(); this.RemoveAllChildren();
Cursor.Current = Cursors.WaitCursor; Cursor.Current = Cursors.WaitCursor;
IHxTopicList topics = h2env.GetMatchingTopicsForDynamicHelp(dynamicHelpString); IHxTopicList topics = HtmlHelp2Environment.GetMatchingTopicsForDynamicHelp(dynamicHelpString);
Cursor.Current = Cursors.Default; Cursor.Current = Cursors.Default;
if(topics.Count > 0) { if(topics.Count > 0) {
@ -103,6 +93,8 @@ namespace HtmlHelp2
} }
} }
} }
this.lastDynamicHelpWord = dynamicHelpString;
} }
catch { catch {
} }
@ -111,7 +103,7 @@ namespace HtmlHelp2
private void RemoveAllChildren() private void RemoveAllChildren()
{ {
try { try {
dynamicHelpBrowser.Document.body.innerHTML = ""; dynamicHelpBrowser.Document.Body.InnerHtml = "";
this.internalIndex = 0; this.internalIndex = 0;
} }
catch { catch {
@ -120,201 +112,277 @@ namespace HtmlHelp2
private void BuildNewChild(string sectionName, string topicName, string topicUrl) private void BuildNewChild(string sectionName, string topicName, string topicUrl)
{ {
mshtml.IHTMLElementCollection children = (mshtml.IHTMLElementCollection)((mshtml.IHTMLElement2)dynamicHelpBrowser.Document.body).getElementsByTagName("span"); try {
for(int i = 0; i < children.length; i++) { HtmlElementCollection children = dynamicHelpBrowser.Document.Body.GetElementsByTagName("span");
mshtml.IHTMLElement span = (mshtml.IHTMLElement)children.item(i,0);
if(children.Count > 0) {
if((string)span.getAttribute("className", 0) == "section") { foreach(HtmlElement elem in children) {
try { if(elem.GetAttribute("className") == "section") {
mshtml.IHTMLElementCollection spanChildren = (mshtml.IHTMLElementCollection)span.children; try {
mshtml.IHTMLElement firstChild = (mshtml.IHTMLElement)spanChildren.item(1,0); HtmlElement sectionBlock = elem.FirstChild.NextSibling;
mshtml.IHTMLElement spanChild = (mshtml.IHTMLElement)spanChildren.item(3,0); HtmlElement contentSpan = sectionBlock.NextSibling.NextSibling;
if(firstChild.tagName == "B" && firstChild.innerText == sectionName) { if(sectionBlock.TagName == "B" && sectionBlock.InnerText == sectionName &&
if(spanChild.tagName == "SPAN" && (string)spanChild.getAttribute("className", 0) == "content") { contentSpan.TagName == "SPAN" && contentSpan.GetAttribute("className") == "content")
spanChild.insertAdjacentHTML("beforeEnd", {
String.Format("<span class=\"link\" onmouseover=\"window.status='{0}'\" onmouseout=\"window.status=''\" onclick=\"Click('{0}');\">{1}</span><br>", contentSpan.AppendChild(this.CreateNewLink(topicUrl, topicName));
topicUrl, topicName) contentSpan.AppendChild(this.CreateABreak());
);
return;
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 { try {
if(children.length > 0) { span = dynamicHelpBrowser.Document.CreateElement("span");
dynamicHelpBrowser.Document.body.insertAdjacentHTML("beforeEnd", "<br>"); 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", return span;
String.Format("<span class=\"section\"><img id=\"image_{0}\" src=\"OpenBook.png\" style=\"width:16px;height:16px;margin-right:5px;\">" + }
"<b style=\"cursor:pointer\" onclick=\"ExpandCollapse({0})\">{1}</b><br>" +
"<span class=\"content\" id=\"content_{0}\">" +
"<span class=\"link\" onmouseover=\"window.status='{2}'\" onmouseout=\"window.status=''\" onclick=\"Click('{2}');\">{3}</span><br></span></span>",
this.internalIndex.ToString(), sectionName, topicUrl, topicName)
);
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 #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 public class HtmlHelp2DynamicHelpBrowserControl : UserControl
{ {
AxWebBrowser axWebBrowser = null; ExtendedWebBrowser axWebBrowser = new ExtendedWebBrowser();
ToolBar dynamicHelpToolbar = new ToolBar(); ToolStrip dynamicHelpToolbar = new ToolStrip();
mshtml.HTMLDocument doc = null; string[] toolbarButtons = new string[] {
string[] toolbarButtons = new string[] {
"${res:AddIns.HtmlHelp2.Contents}", "${res:AddIns.HtmlHelp2.Contents}",
"${res:AddIns.HtmlHelp2.Index}", "${res:AddIns.HtmlHelp2.Index}",
"${res:AddIns.HtmlHelp2.Search}" "${res:AddIns.HtmlHelp2.Search}"
}; };
public mshtml.HTMLDocument Document public HtmlDocument Document
{ {
get { get {
return doc; return axWebBrowser.Document;
}
}
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;
} }
base.Dispose(disposing);
if (disposing) axWebBrowser.Dispose();
} }
public void RedrawContent() public void RedrawContent()
{ {
StringParserService sps = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
for(int i = 0; i < toolbarButtons.Length; i++) { 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() public HtmlHelp2DynamicHelpBrowserControl()
{ {
HtmlHelp2Environment h2env = (HtmlHelp2Environment)ServiceManager.Services.GetService(typeof(HtmlHelp2Environment)); this.InitializeComponents();
bool Help2EnvIsReady = (h2env != null && h2env.Help2EnvironmentIsReady); this.LoadDynamicHelpPage();
}
Dock = DockStyle.Fill;
Size = new Size(500, 500); private void InitializeComponents()
{
axWebBrowser = new AxWebBrowser(); Dock = DockStyle.Fill;
axWebBrowser.BeginInit(); Size = new Size(500, 500);
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();
Controls.Add(axWebBrowser); Controls.Add(axWebBrowser);
axWebBrowser.Dock = DockStyle.Fill;
axWebBrowser.WebBrowserShortcutsEnabled = false;
axWebBrowser.IsWebBrowserContextMenuEnabled = false;
axWebBrowser.AllowWebBrowserDrop = false;
Controls.Add(dynamicHelpToolbar); Controls.Add(dynamicHelpToolbar);
dynamicHelpToolbar.Dock = DockStyle.Top; dynamicHelpToolbar.Dock = DockStyle.Top;
dynamicHelpToolbar.Appearance = ToolBarAppearance.Flat; dynamicHelpToolbar.AllowItemReorder = false;
dynamicHelpToolbar.Divider = false;
dynamicHelpToolbar.ButtonClick += new ToolBarButtonClickEventHandler(ToolBarButtonClicked);
StringParserService sps = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
for(int i = 0; i < toolbarButtons.Length; i++) { for(int i = 0; i < toolbarButtons.Length; i++) {
ToolBarButton button = new ToolBarButton(); ToolStripButton button = new ToolStripButton();
button.ToolTipText = sps.Parse(toolbarButtons[i]); button.ToolTipText = StringParser.Parse(toolbarButtons[i]);
button.ImageIndex = i; button.ImageIndex = i;
dynamicHelpToolbar.Buttons.Add(button); 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.ColorDepth = ColorDepth.Depth32Bit;
dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetImage("HtmlHelp2.16x16.Toc")); dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetBitmap("HtmlHelp2.16x16.Toc.png"));
dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetImage("HtmlHelp2.16x16.Index")); dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetBitmap("HtmlHelp2.16x16.Index.png"));
dynamicHelpToolbar.ImageList.Images.Add(ResourcesHelper.GetImage("HtmlHelp2.16x16.Search")); 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 { 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)))) { if(!File.Exists(url)) url = "about:blank";
url = String.Format("file://{0}\\context.html",Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); axWebBrowser.Navigate(url);
}
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);
} }
catch { 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)); ToolStripItem item = (ToolStripItem)sender;
statusBarService.SetMessage(e.text); PadDescriptor pad = null;
}
switch(item.ImageIndex) {
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)) {
case 0: case 0:
HtmlHelp2TocPad toc = (HtmlHelp2TocPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2TocPad)); pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2TocPad));
if(toc != null) toc.BringPadToFront();
break; break;
case 1: case 1:
HtmlHelp2IndexPad index = (HtmlHelp2IndexPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexPad)); pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexPad));
if(index != null) index.BringPadToFront();
break; break;
case 2: case 2:
HtmlHelp2SearchPad search = (HtmlHelp2SearchPad)WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2SearchPad)); pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2SearchPad));
if(search != null) search.BringPadToFront();
break; break;
} }
if(pad != null) pad.BringPadToFront();
} }
} }
} }

Loading…
Cancel
Save