📄 dynamichelppad.cs
字号:
public void RedrawContent()
{
for (int i = 0; i < toolbarButtons.Length; i++)
{
dynamicHelpToolbar.Items[i].ToolTipText = StringParser.Parse(toolbarButtons[i]);
}
}
public HtmlHelp2DynamicHelpBrowserControl()
{
this.InitializeComponents();
}
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;
axWebBrowser.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(this.OnDocumentCompleted);
Controls.Add(dynamicHelpToolbar);
dynamicHelpToolbar.Dock = DockStyle.Top;
dynamicHelpToolbar.AllowItemReorder = false;
dynamicHelpToolbar.ShowItemToolTips = false;
dynamicHelpToolbar.GripStyle = ToolStripGripStyle.Hidden;
dynamicHelpToolbar.Enabled = HtmlHelp2Environment.IsReady;
for (int i = 0; i < toolbarButtons.Length; i++)
{
ToolStripButton button = new ToolStripButton();
button.Text = StringParser.Parse(toolbarButtons[i]);
button.ImageIndex = i;
button.Click += new EventHandler(this.ToolStripButtonClicked);
dynamicHelpToolbar.Items.Add(button);
}
dynamicHelpToolbar.ImageList = new ImageList();
dynamicHelpToolbar.ImageList.ColorDepth = ColorDepth.Depth32Bit;
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"));
if (HtmlHelp2Environment.IsReady)
{
HtmlHelp2Environment.NamespaceReloaded += new EventHandler(this.NamespaceReloaded);
}
}
public void LoadDynamicHelpPage()
{
if (!HtmlHelp2Environment.IsReady) return;
string url = String.Format("res://{0}/context", Assembly.GetExecutingAssembly().Location);
axWebBrowser.Navigate(url);
}
private void OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.RemoveAllChildren();
this.BuildANothing();
}
private void ToolStripButtonClicked(object sender, EventArgs e)
{
ToolStripItem item = (ToolStripItem)sender;
PadDescriptor pad = null;
switch (item.ImageIndex)
{
case 0:
pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2TocPad));
break;
case 1:
pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexPad));
break;
case 2:
pad = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2SearchPad));
break;
}
if(pad != null) pad.BringPadToFront();
}
#region Help 2.0 Environment Events
private void NamespaceReloaded(object sender, EventArgs e)
{
this.LoadDynamicHelpPage();
}
#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))
{
HtmlElement newLink = this.CreateNewLink(topicUrl, topicName);
HtmlElement br = this.CreateABreak();
if (newLink != null)
{
contentSpan.AppendChild(newLink);
if (br != null) contentSpan.AppendChild(br);
}
}
return;
}
}
}
try
{
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
this.CreateABreak());
}
catch {}
}
HtmlElement linkContent = null;
HtmlElement htmlSection = this.CreateNewSection(sectionName, out linkContent);
if (htmlSection != null)
{
axWebBrowser.Document.Body.InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeEnd,
htmlSection);
HtmlElement newLink = this.CreateNewLink(topicUrl, topicName);
HtmlElement br = this.CreateABreak();
if (newLink != null) linkContent.AppendChild(newLink);
if (br != null) linkContent.AppendChild(br);
this.internalIndex++;
}
}
catch (Exception ex)
{
LoggingService.Error("Help 2.0: " + ex.ToString());
}
}
private HtmlElement CreateNewSection(string sectionName, out HtmlElement linkNode)
{
HtmlElement span = axWebBrowser.Document.CreateElement("SPAN");
span.SetAttribute("className", "section");
span.InnerHtml = String.Format(
"<img style=\"width:16px;height:16px;margin-right:5px\" id=\"image_{0}\" src=\"open\">" +
"<b style=\"cursor:auto;\" id=\"{0}\" onclick=\"ExpandCollapse({0})\">{1}</b><br>",
this.internalIndex, sectionName);
linkNode = axWebBrowser.Document.CreateElement("SPAN");
linkNode.SetAttribute("className", "content");
linkNode.Id = String.Format("content_{0}", this.internalIndex);
span.AppendChild(linkNode);
return span;
}
private HtmlElement CreateNewLink(string topicUrl, string topicName)
{
HtmlElement 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);
return span;
}
private HtmlElement CreateABreak()
{
HtmlElement br = axWebBrowser.Document.CreateElement("BR");
return br;
}
public void BuildANothing()
{
try
{
HtmlElement nothing = axWebBrowser.Document.CreateElement("B");
nothing.InnerText = StringParser.Parse("${res:AddIns.HtmlHelp2.NoDataIsAvailableForDynamicHelp}");
nothing.SetAttribute("title", nothing.InnerText);
axWebBrowser.Document.Body.InnerHtml = "";
axWebBrowser.Document.Body.AppendChild(nothing);
}
catch(Exception ex)
{
LoggingService.Error(ex.Message);
}
}
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 OnLinkClick(object sender, HtmlElementEventArgs e)
{
try
{
string url = ((HtmlElement)sender).GetAttribute("src");
if(url != null && url.Length > 0) ShowHelpBrowser.OpenHelpView(url);
}
catch {}
}
public void RemoveAllChildren()
{
try
{
this.internalIndex = 0;
axWebBrowser.Document.Body.InnerHtml = "";
}
catch (Exception ex)
{
LoggingService.Error("Help 2.0: error while removing HTML children; " + ex.ToString());
}
}
#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
}
#region TypeHandling by Robert_G
public static class TypeHandling
{
public static IEnumerable<Type> FindDeclaringType(Type type, string memberName)
{
MemberInfo[] memberInfos = type.GetMember(memberName);
List<Type> declaringTypes = new List<Type>();
foreach (MemberInfo memberInfo in memberInfos)
{
if (!declaringTypes.Contains(memberInfo.DeclaringType))
declaringTypes.Add(memberInfo.DeclaringType);
}
foreach (Type declaringType in declaringTypes)
{
yield return declaringType;
}
// QUOTE:
// "Aber das ist wohl eher ein no-Brainer... ;-)"
// (Robert)
}
}
#endregion
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -