📄 dynamichelppad.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mathias Simmack" email="mathias@simmack.de"/>
// <version>$Revision: 987 $</version>
// </file>
namespace HtmlHelp2
{
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextEditor;
using HtmlHelp2.Environment;
using HtmlHelp2.ResourcesHelperClass;
using HtmlHelp2.SharpDevLanguageClass;
using MSHelpServices;
public class ShowDynamicHelpMenuCommand : AbstractMenuCommand
{
public override void Run()
{
PadDescriptor dynamicHelp = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2DynamicHelpPad));
if (dynamicHelp != null) dynamicHelp.BringPadToFront();
}
}
public class HtmlHelp2DynamicHelpPad : AbstractPadContent
{
protected HtmlHelp2DynamicHelpBrowserControl dynamicHelpBrowser;
private StringCollection dynamicHelpTerms = new StringCollection();
private Point lastPoint = Point.Empty;
private string debugPreElement = String.Empty;
private bool enableDebugInfo = false;
public override Control Control
{
get { return dynamicHelpBrowser; }
}
public override void RedrawContent()
{
dynamicHelpBrowser.RedrawContent();
}
public HtmlHelp2DynamicHelpPad()
{
dynamicHelpBrowser = new HtmlHelp2DynamicHelpBrowserControl();
dynamicHelpBrowser.LoadDynamicHelpPage();
// while (!dynamicHelpBrowser.BrowserIsReady) {}
// dynamicHelpBrowser.BuildANothing();
ParserService.ParserUpdateStepFinished += UpdateTick;
PropertyPad.SelectedObjectChanged += new EventHandler(this.FormsDesignerSelectedObjectChanged);
PropertyPad.SelectedGridItemChanged += new SelectedGridItemChangedEventHandler(this.FormsDesignerSelectedGridItemChanged);
ProjectService.SolutionClosed += new EventHandler(this.SolutionClosed);
}
#region Dynamic Help Calls
private void BuildDynamicHelpList()
{
if (this.dynamicHelpTerms.Count == 0) return;
dynamicHelpBrowser.RemoveAllChildren();
this.debugPreElement = String.Empty;
bool helpResults = false;
Cursor.Current = Cursors.WaitCursor;
foreach (string currentHelpTerm in this.dynamicHelpTerms)
{
if (!currentHelpTerm.StartsWith("!"))
{
helpResults = (this.CallDynamicHelp(currentHelpTerm, false) || helpResults);
}
}
foreach (string currentHelpTerm in this.dynamicHelpTerms)
{
if (currentHelpTerm.StartsWith("!"))
{
helpResults = (this.CallDynamicHelp(currentHelpTerm.Substring(1), true) || helpResults);
}
}
if (!helpResults)
{
dynamicHelpBrowser.BuildANothing();
}
Cursor.Current = Cursors.Default;
this.debugPreElement += String.Format("<br>Current project language: {0}",
SharpDevLanguage.GetPatchedLanguage());
if (this.enableDebugInfo) dynamicHelpBrowser.CreateDebugPre(this.debugPreElement);
}
private bool CallDynamicHelp(string searchTerm, bool keywordSearch)
{
if (!HtmlHelp2Environment.IsReady || HtmlHelp2Environment.DynamicHelpIsBusy) return false;
bool result = false;
IHxTopicList topics = null;
try
{
topics = HtmlHelp2Environment.GetMatchingTopicsForDynamicHelp(searchTerm);
result = (topics != null && topics.Count > 0);
this.debugPreElement += String.Format("{0} ({1}): {2} {3}<br>",
searchTerm, (keywordSearch)?"Kwd":"DH",
topics.Count.ToString(), (topics.Count == 1)?"topic":"topics");
}
catch {}
if (result)
{
List<IHxTopic> newTopics = this.SortTopics(topics);
foreach (IHxTopic topic in newTopics)
{
if ((keywordSearch)?SharpDevLanguage.CheckUniqueTopicLanguage(topic):SharpDevLanguage.CheckTopicLanguage(topic))
{
this.BuildNewChild(topic.Location,
topic.get_Title(HxTopicGetTitleType.HxTopicGetRLTitle,
HxTopicGetTitleDefVal.HxTopicGetTitleFileName),
topic.URL);
}
}
}
return result;
}
private void BuildNewChild(string sectionName, string topicName, string topicUrl)
{
dynamicHelpBrowser.BuildNewChild(sectionName, topicName, topicUrl);
}
#endregion
#region Taken from DefinitionView.cs
private void UpdateTick(object sender, ParserUpdateStepEventArgs e)
{
this.dynamicHelpTerms.Clear();
ResolveResult res = ResolveAtCaret(e);
if (res == null) return;
if (res != null && res.ResolvedType != null)
{
this.AddToStringCollection(res.ResolvedType.FullyQualifiedName);
}
MemberResolveResult member = res as MemberResolveResult;
NamespaceResolveResult nspace = res as NamespaceResolveResult;
MethodResolveResult method = res as MethodResolveResult;
TypeResolveResult types = res as TypeResolveResult;
if (member != null && member.ResolvedMember != null)
{
this.AddToStringCollection(0, member.ResolvedMember.FullyQualifiedName);
}
if (nspace != null)
{
this.AddToStringCollection(0, nspace.Name);
}
if (method != null && method.ContainingType != null)
{
this.AddToStringCollection(0, method.ContainingType.FullyQualifiedName);
}
if (types != null && types.ResolvedClass != null)
{
this.AddToStringCollection(0, types.ResolvedClass.FullyQualifiedName);
}
WorkbenchSingleton.SafeThreadAsyncCall(this, "BuildDynamicHelpList");
}
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;
// save the current position
if(this.lastPoint != null && this.lastPoint == caret.Position) return null;
this.lastPoint = caret.Position;
this.AddToStringCollection(String.Format("!{0}", expr.Expression));
return ParserService.Resolve(expr, caret.Line, caret.Column, fileName, content);
}
#endregion
#region Dynamic Help for Forms Designer
private void FormsDesignerSelectedObjectChanged(object sender, EventArgs e)
{
this.CallDynamicHelpForFormsDesigner(PropertyPad.Grid.SelectedObject,
PropertyPad.Grid.SelectedGridItem);
}
private void FormsDesignerSelectedGridItemChanged(object sender, SelectedGridItemChangedEventArgs e)
{
this.CallDynamicHelpForFormsDesigner(PropertyPad.Grid.SelectedObject,
e.NewSelection);
}
private void CallDynamicHelpForFormsDesigner(object selectedObject, GridItem selectedItem)
{
try
{
if (selectedObject == null) return;
this.dynamicHelpTerms.Clear();
Type myObject = selectedObject.GetType();
if (selectedItem != null)
{
foreach (Type type in TypeHandling.FindDeclaringType(myObject, selectedItem.Label))
{
this.AddToStringCollection(String.Format("{0}.{1}", type.FullName, selectedItem.Label));
}
}
this.AddToStringCollection(myObject.FullName);
WorkbenchSingleton.SafeThreadAsyncCall(this, "BuildDynamicHelpList");
}
catch {}
}
#endregion
private void SolutionClosed(object sender, EventArgs e)
{
dynamicHelpBrowser.RemoveAllChildren();
dynamicHelpBrowser.BuildANothing();
}
#region StringCollection & Sorting
private void AddToStringCollection(string searchTerm)
{
this.AddToStringCollection(-1, searchTerm);
}
private void AddToStringCollection(int insertWhere, string searchTerm)
{
if (this.dynamicHelpTerms.IndexOf(searchTerm) == -1)
{
if (insertWhere == -1)
this.dynamicHelpTerms.Add(searchTerm);
else
this.dynamicHelpTerms.Insert(insertWhere, searchTerm);
}
}
private List<IHxTopic> SortTopics(IHxTopicList topics)
{
List<IHxTopic> result = new List<IHxTopic>();
try
{
if (topics != null && topics.Count > 0)
{
foreach (IHxTopic topic in topics)
{
if (!result.Contains(topic)) result.Add(topic);
}
TopicComparer topicComparer = new TopicComparer();
result.Sort(topicComparer);
}
}
catch(Exception ex)
{
LoggingService.Error("Help 2.0: error while rebuild topics; " + ex.ToString());
}
return result;
}
class TopicComparer : IComparer<IHxTopic>
{
public int Compare(IHxTopic x, IHxTopic y)
{
int result = CompareType("kbSyntax", x, y);
if(result == 0) result = CompareType("kbHowTo", x, y);
if(result == 0) result = CompareType("kbOrient", x, y);
if(result == 0) result = CompareType("kbArticle", x, y);
return result;
}
private int CompareType(string topicType, IHxTopic x, IHxTopic y)
{
if(x.HasAttribute("TopicType", topicType) && !y.HasAttribute("TopicType", topicType))
return -1;
else if(y.HasAttribute("TopicType", topicType) && !x.HasAttribute("TopicType", topicType))
return 1;
else
return 0;
}
}
#endregion
}
public class HtmlHelp2DynamicHelpBrowserControl : UserControl
{
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}"
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -