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 @@ -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 @@ -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 @@ -103,6 +93,8 @@ namespace HtmlHelp2
}
}
}
this.lastDynamicHelpWord = dynamicHelpString;
}
catch {
}
@ -111,7 +103,7 @@ namespace HtmlHelp2 @@ -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 @@ -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("<span class=\"link\" onmouseover=\"window.status='{0}'\" onmouseout=\"window.status=''\" onclick=\"Click('{0}');\">{1}</span><br>",
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", "<br>");
}
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("<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)
);
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();
}
}
}

Loading…
Cancel
Save