Browse Source

dynamic help: uses default entries (s. revision 489), uses the Project language to limit the help results

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@491 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Mathias Simmack 20 years ago
parent
commit
af29d284b8
  1. 519
      src/AddIns/Misc/HtmlHelp2/Project/src/BaseControls/DynamicHelpPad.cs
  2. 2
      src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Service.cs

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

@ -27,11 +27,9 @@ namespace HtmlHelp2 @@ -27,11 +27,9 @@ namespace HtmlHelp2
using HtmlHelp2.Environment;
using HtmlHelp2.ResourcesHelperClass;
using MSHelpServices;
// TODO: detect the active language (CSharp, VB#, ...) to limit the results
// TODO: if there are no DH results, implement Keyword search (index)
// TODO: insert some default entries (Homepage, Wiki, Community, ...)
public class ShowDynamicHelpMenuCommand : AbstractMenuCommand
@ -46,10 +44,10 @@ namespace HtmlHelp2 @@ -46,10 +44,10 @@ namespace HtmlHelp2
public class HtmlHelp2DynamicHelpPad : AbstractPadContent
{
protected HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser;
private int internalIndex = 0;
private StringCollection dynamicHelpTerms = new StringCollection();
private string debugPreElement = String.Empty;
private bool enableDebugInfo = false;
private StringCollection dynamicHelpTerms = new StringCollection();
private string debugPreElement = String.Empty;
private bool enableDebugInfo = true;
private Dictionary<string, string>languages = new Dictionary<string, string>();
public override Control Control
{
@ -73,6 +71,11 @@ namespace HtmlHelp2 @@ -73,6 +71,11 @@ namespace HtmlHelp2
PropertyPad.SelectedObjectChanged += new EventHandler(this.FormsDesignerSelectedObjectChanged);
PropertyPad.SelectedGridItemChanged += new SelectedGridItemChangedEventHandler(this.FormsDesignerSelectedGridItemChanged);
ProjectService.SolutionClosed += new EventHandler(this.SolutionClosed);
// I needed to patch SharpDevelop's current project language because
// the .NET Framework SDK documents use other names
languages.Add("C#", "CSharp");
languages.Add("VBNet", "VB");
}
#region WebBrowser Scripting
@ -80,15 +83,29 @@ namespace HtmlHelp2 @@ -80,15 +83,29 @@ namespace HtmlHelp2
{
if(this.dynamicHelpTerms.Count == 0) return;
this.RemoveAllChildren();
this.debugPreElement = String.Empty;
this.debugPreElement = String.Empty;
string tempLanguage = String.Empty;
if(languages.ContainsKey(expectedLanguage))
{
if(!languages.TryGetValue(expectedLanguage, out tempLanguage))
{
tempLanguage = String.Empty;
}
}
Cursor.Current = Cursors.WaitCursor;
foreach(string currentHelpTerm in dynamicHelpTerms)
{
this.CallDynamicHelp(currentHelpTerm, expectedLanguage, false);
this.CallDynamicHelp(currentHelpTerm, tempLanguage, false);
}
dynamicHelpBrowser.BuildDefaultHelpEntries();
Cursor.Current = Cursors.Default;
if(this.enableDebugInfo) this.CreateDebugPre();
this.debugPreElement += String.Format("<br>Current project language: {0}",
(tempLanguage==String.Empty)?expectedLanguage:tempLanguage);
if(this.enableDebugInfo) dynamicHelpBrowser.CreateDebugPre(this.debugPreElement);
}
private bool CallDynamicHelp(string searchTerm, string expectedLanguage, bool keywordSearch)
@ -114,201 +131,29 @@ namespace HtmlHelp2 @@ -114,201 +131,29 @@ namespace HtmlHelp2
List<IHxTopic> newTopics = this.SortTopics(topics);
foreach(IHxTopic topic in newTopics)
{
this.BuildNewChild(topic.Location,
topic.get_Title(HxTopicGetTitleType.HxTopicGetTOCTitle,
HxTopicGetTitleDefVal.HxTopicGetTitleFileName),
topic.URL);
}
}
return result;
}
private void RemoveAllChildren()
{
this.internalIndex = 0;
dynamicHelpBrowser.RemoveAllChildren();
}
private void BuildNewChild(string sectionName, string topicName, string topicUrl)
{
try
{
HtmlElementCollection children = dynamicHelpBrowser.Document.Body.GetElementsByTagName("span");
if(children.Count > 0)
{
foreach(HtmlElement elem in children)
if(expectedLanguage == String.Empty || topic.HasAttribute("DevLang", expectedLanguage))
{
if(elem.GetAttribute("className") == "section")
{
HtmlElement sectionBlock = elem.FirstChild.NextSibling;
HtmlElement contentSpan = sectionBlock.NextSibling.NextSibling;
if(sectionBlock.TagName == "B" && sectionBlock.InnerText == sectionName &&
contentSpan.TagName == "SPAN" && contentSpan.GetAttribute("className") == "content")
{
if(!this.DoesLinkExist(contentSpan, topicName, topicUrl))
{
contentSpan.AppendChild(this.CreateNewLink(topicUrl, topicName));
contentSpan.AppendChild(this.CreateABreak());
}
return;
}
}
this.BuildNewChild(topic.Location,
topic.get_Title(HxTopicGetTitleType.HxTopicGetTOCTitle,
HxTopicGetTitleDefVal.HxTopicGetTitleFileName),
topic.URL);
}
dynamicHelpBrowser.InsertHtmlElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
}
HtmlElement linkContent = null;
HtmlElement htmlSection = this.CreateNewSection(sectionName, out linkContent);
dynamicHelpBrowser.InsertHtmlElement(HtmlElementInsertionOrientation.BeforeEnd, htmlSection);
linkContent.AppendChild(this.CreateNewLink(topicUrl, topicName));
linkContent.AppendChild(this.CreateABreak());
this.internalIndex++;
}
catch(Exception ex)
{
LoggingService.Error("Help 2.0: cannot build node for dynamic help; " + ex.ToString());
}
return result;
}
private HtmlElement CreateNewSection(string sectionName, out HtmlElement linkNode)
{
HtmlElement span = null;
linkNode = null;
try
{
span = dynamicHelpBrowser.CreateHtmlElement("span");
span.SetAttribute("className", "section");
HtmlElement img = dynamicHelpBrowser.CreateHtmlElement("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.CreateHtmlElement("b");
b.InnerText = sectionName;
b.Style = "cursor:pointer";
b.Id = this.internalIndex.ToString();
b.Click += new HtmlElementEventHandler(this.OnSectionClick);
span.AppendChild(b);
span.AppendChild(this.CreateABreak());
HtmlElement content = dynamicHelpBrowser.CreateHtmlElement("span");
content.Id = String.Format("content_{0}", this.internalIndex.ToString());
content.SetAttribute("className", "content");
span.AppendChild(content);
linkNode = content;
}
catch {}
return span;
}
private HtmlElement CreateNewLink(string topicUrl, string topicName)
{
HtmlElement span = null;
try
{
span = dynamicHelpBrowser.CreateHtmlElement("a");
span.InnerText = topicName;
span.SetAttribute("src", topicUrl);
span.SetAttribute("className", "link");
span.SetAttribute("title", topicName);
span.Click += new HtmlElementEventHandler(OnLinkClick);
span.MouseOver += new HtmlElementEventHandler(OnMouseOver);
span.MouseLeave += new HtmlElementEventHandler(OnMouseOut);
}
catch {}
return span;
}
private HtmlElement CreateABreak()
private void BuildNewChild(string sectionName, string topicName, string topicUrl)
{
HtmlElement br = null;
try
{
br = dynamicHelpBrowser.CreateHtmlElement("br");
}
catch {}
return br;
dynamicHelpBrowser.BuildNewChild(sectionName, topicName, topicUrl);
}
private bool DoesLinkExist(HtmlElement parentNode, string topicName, string topicUrl)
private void RemoveAllChildren()
{
try
{
HtmlElementCollection allLinks = parentNode.GetElementsByTagName("a");
if(allLinks.Count > 0)
{
foreach(HtmlElement link in allLinks)
{
if(String.Compare(topicName, link.InnerText) == 0 &&
String.Compare(topicUrl, link.GetAttribute("src")) == 0)
{
return true;
}
}
}
}
catch { }
return false;
dynamicHelpBrowser.RemoveAllChildren();
}
#endregion
private void OnMouseOver(object sender, HtmlElementEventArgs e)
{
try
{
StatusBarService.SetMessage(((HtmlElement)sender).GetAttribute("src"));
}
catch {}
}
private void OnMouseOut(object sender, HtmlElementEventArgs e)
{
StatusBarService.SetMessage("");
}
private void OnSectionClick(object sender, HtmlElementEventArgs e)
{
try
{
string sectionId = ((HtmlElement)sender).Id;
object[] objArray = new object[1];
objArray[0] = (object)sectionId;
dynamicHelpBrowser.Document.InvokeScript("ExpandCollapse", objArray);
}
catch(Exception ex)
{
LoggingService.Error("Help 2.0: cannot run script; " + ex.ToString());
}
}
private void OnLinkClick(object sender, HtmlElementEventArgs e)
{
try
{
string url = ((HtmlElement)sender).GetAttribute("src");
if(url != null && url != String.Empty) ShowHelpBrowser.OpenHelpView(url);
}
catch {}
}
#region Taken from DefinitionView.cs
private void UpdateTick(object sender, ParserUpdateStepEventArgs e)
{
@ -344,7 +189,9 @@ namespace HtmlHelp2 @@ -344,7 +189,9 @@ namespace HtmlHelp2
this.AddToStringCollection(0, types.ResolvedClass.FullyQualifiedName);
}
WorkbenchSingleton.SafeThreadAsyncCall(this, "BuildDynamicHelpList", "");
WorkbenchSingleton.SafeThreadAsyncCall(this,
"BuildDynamicHelpList",
ProjectService.CurrentProject.Language);
}
private ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)
@ -397,28 +244,9 @@ namespace HtmlHelp2 @@ -397,28 +244,9 @@ namespace HtmlHelp2
}
this.AddToStringCollection(myObject.FullName);
WorkbenchSingleton.SafeThreadAsyncCall(this, "BuildDynamicHelpList", "");
}
#endregion
#region DebugInfo
private void CreateDebugPre()
{
if(this.debugPreElement == String.Empty) return;
try
{
dynamicHelpBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
dynamicHelpBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
HtmlElement pre = dynamicHelpBrowser.CreateHtmlElement("pre");
pre.InnerHtml = "--- Dynamic Help Debug ---<br>" + this.debugPreElement;
dynamicHelpBrowser.InsertHtmlElement(HtmlElementInsertionOrientation.BeforeEnd, pre);
}
catch {}
WorkbenchSingleton.SafeThreadAsyncCall(this,
"BuildDynamicHelpList",
ProjectService.CurrentProject.Language);
}
#endregion
@ -495,34 +323,13 @@ namespace HtmlHelp2 @@ -495,34 +323,13 @@ namespace HtmlHelp2
{
WebBrowser axWebBrowser = new WebBrowser();
ToolStrip dynamicHelpToolbar = new ToolStrip();
int internalIndex = 0;
string[] toolbarButtons = new string[] {
"${res:AddIns.HtmlHelp2.Contents}",
"${res:AddIns.HtmlHelp2.Index}",
"${res:AddIns.HtmlHelp2.Search}"
};
public HtmlDocument Document
{
get { return axWebBrowser.Document; }
}
public void RemoveAllChildren()
{
axWebBrowser.Document.Body.InnerHtml = "";
}
public HtmlElement CreateHtmlElement(string elementName)
{
HtmlElement newElement = axWebBrowser.Document.CreateElement(elementName);
return newElement;
}
public void InsertHtmlElement(HtmlElementInsertionOrientation insertWhere, HtmlElement insertWhat)
{
axWebBrowser.Document.Body.InsertAdjacentElement(insertWhere, insertWhat);
}
public void RedrawContent()
{
for(int i = 0; i < toolbarButtons.Length; i++)
@ -610,6 +417,242 @@ namespace HtmlHelp2 @@ -610,6 +417,242 @@ namespace HtmlHelp2
private void NamespaceReloaded(object sender, EventArgs e)
{
this.LoadDynamicHelpPage();
this.RemoveAllChildren();
this.BuildDefaultHelpEntries();
}
#endregion
#region WebBrowser Scripting
public void BuildNewChild(string sectionName, string topicName, string topicUrl)
{
try
{
HtmlElementCollection children = axWebBrowser.Document.Body.GetElementsByTagName("span");
if(children.Count > 0)
{
foreach(HtmlElement elem in children)
{
if(elem.GetAttribute("className") == "section")
{
HtmlElement sectionBlock = elem.FirstChild.NextSibling;
HtmlElement contentSpan = sectionBlock.NextSibling.NextSibling;
if(sectionBlock.TagName == "B" && sectionBlock.InnerText == sectionName &&
contentSpan.TagName == "SPAN" && contentSpan.GetAttribute("className") == "content")
{
if(!this.DoesLinkExist(contentSpan, topicName, topicUrl))
{
contentSpan.AppendChild(this.CreateNewLink(topicUrl, topicName));
contentSpan.AppendChild(this.CreateABreak());
}
return;
}
}
}
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
}
HtmlElement linkContent = null;
HtmlElement htmlSection = this.CreateNewSection(sectionName, out linkContent);
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
htmlSection);
linkContent.AppendChild(this.CreateNewLink(topicUrl, topicName));
linkContent.AppendChild(this.CreateABreak());
this.internalIndex++;
}
catch(Exception ex)
{
LoggingService.Error("Help 2.0: cannot build node for dynamic help; " + ex.ToString());
}
}
private HtmlElement CreateNewSection(string sectionName, out HtmlElement linkNode)
{
HtmlElement span = null;
linkNode = null;
try
{
span = axWebBrowser.Document.CreateElement("span");
span.SetAttribute("className", "section");
HtmlElement img = axWebBrowser.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 = axWebBrowser.Document.CreateElement("b");
b.InnerText = sectionName;
b.Style = "cursor:pointer";
b.Id = this.internalIndex.ToString();
b.Click += new HtmlElementEventHandler(this.OnSectionClick);
span.AppendChild(b);
span.AppendChild(this.CreateABreak());
HtmlElement content = axWebBrowser.Document.CreateElement("span");
content.Id = String.Format("content_{0}", this.internalIndex.ToString());
content.SetAttribute("className", "content");
span.AppendChild(content);
linkNode = content;
}
catch {}
return span;
}
private HtmlElement CreateNewLink(string topicUrl, string topicName)
{
HtmlElement span = null;
try
{
span = axWebBrowser.Document.CreateElement("a");
span.InnerText = topicName;
span.SetAttribute("src", topicUrl);
span.SetAttribute("className", "link");
span.SetAttribute("title", topicName);
span.Click += new HtmlElementEventHandler(OnLinkClick);
span.MouseOver += new HtmlElementEventHandler(OnMouseOver);
span.MouseLeave += new HtmlElementEventHandler(OnMouseOut);
}
catch {}
return span;
}
private HtmlElement CreateABreak()
{
HtmlElement br = null;
try
{
br = axWebBrowser.Document.CreateElement("br");
}
catch {}
return br;
}
private bool DoesLinkExist(HtmlElement parentNode, string topicName, string topicUrl)
{
try
{
HtmlElementCollection allLinks = parentNode.GetElementsByTagName("a");
if(allLinks.Count > 0)
{
foreach(HtmlElement link in allLinks)
{
if(String.Compare(topicName, link.InnerText) == 0 &&
String.Compare(topicUrl, link.GetAttribute("src")) == 0)
{
return true;
}
}
}
}
catch { }
return false;
}
private void OnMouseOver(object sender, HtmlElementEventArgs e)
{
try
{
StatusBarService.SetMessage(((HtmlElement)sender).GetAttribute("src"));
}
catch {}
}
private void OnMouseOut(object sender, HtmlElementEventArgs e)
{
StatusBarService.SetMessage("");
}
private void OnSectionClick(object sender, HtmlElementEventArgs e)
{
try
{
string sectionId = ((HtmlElement)sender).Id;
object[] objArray = new object[1];
objArray[0] = (object)sectionId;
axWebBrowser.Document.InvokeScript("ExpandCollapse", objArray);
}
catch(Exception ex)
{
LoggingService.Error("Help 2.0: cannot run script; " + ex.ToString());
}
}
private void OnLinkClick(object sender, HtmlElementEventArgs e)
{
try
{
string url = ((HtmlElement)sender).GetAttribute("src");
if(url != null && url != String.Empty) ShowHelpBrowser.OpenHelpView(url);
}
catch {}
}
public void RemoveAllChildren()
{
axWebBrowser.Document.Body.InnerHtml = "";
this.internalIndex = 0;
}
public void BuildDefaultHelpEntries()
{
try
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(String.Format("{0}\\DynamicHelpDefaultEntries.xml",
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)));
XmlNodeList sectionNodes = xmldoc.SelectNodes("/defaultentries/section[@name]");
foreach(XmlNode sectionNode in sectionNodes)
{
XmlNodeList urlNodes = sectionNode.SelectNodes("url[@name and text()!=\"\"]");
foreach(XmlNode urlNode in urlNodes)
{
string sectionName = sectionNode.Attributes.GetNamedItem("name").InnerText;
string url = urlNode.InnerText;
string id = urlNode.Attributes.GetNamedItem("name").InnerText;
this.BuildNewChild(sectionName, id, url);
}
}
}
catch { /* I don't care about the results */ }
}
#endregion
#region DebugInfo
public void CreateDebugPre(string debugInformation)
{
if(debugInformation == String.Empty) return;
try
{
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
HtmlElement pre = axWebBrowser.Document.CreateElement("pre");
pre.InnerHtml = "--- Dynamic Help Debug ---<br>" + debugInformation;
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
pre);
}
catch {}
}
#endregion
}

2
src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Service.cs

@ -284,6 +284,7 @@ namespace HtmlHelp2.Environment @@ -284,6 +284,7 @@ namespace HtmlHelp2.Environment
try
{
topics = ((IHxIndex)dynamicHelp).GetTopicsFromString(searchTerm, 0);
LoggingService.Info("Help 2.0: Dynamic Help successfully called");
}
catch
{
@ -302,6 +303,7 @@ namespace HtmlHelp2.Environment @@ -302,6 +303,7 @@ namespace HtmlHelp2.Environment
try
{
topics = GetIndex(currentSelectedFilterQuery).GetTopicsFromString(searchTerm, 0);
LoggingService.Info("Help 2.0: Keyword search successfully called");
}
catch
{

Loading…
Cancel
Save