#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

311 lines
9.6 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mathias Simmack" email="mathias@simmack.de"/>
// <version>$Revision$</version>
// </file>
namespace HtmlHelp2
{
using System;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using AxMSHelpControls;
using MSHelpControls;
using MSHelpServices;
using HtmlHelp2.Environment;
using HtmlHelp2.ControlsValidation;
public class ShowIndexMenuCommand : AbstractMenuCommand
{
public override void Run()
{
PadDescriptor index = WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexPad));
if (index != null) index.BringPadToFront();
}
}
public class HtmlHelp2IndexPad : AbstractPadContent
{
protected MsHelp2IndexControl help2IndexControl;
public override Control Control
{
get { return help2IndexControl; }
}
public override void Dispose()
{
help2IndexControl.Dispose();
}
public override void RedrawContent()
{
help2IndexControl.RedrawContent();
}
public HtmlHelp2IndexPad()
{
help2IndexControl = new MsHelp2IndexControl();
if (help2IndexControl.IsEnabled) help2IndexControl.LoadIndex();
}
}
public class MsHelp2IndexControl : UserControl
{
AxHxIndexCtrl indexControl = null;
ComboBox filterCombobox = new ComboBox();
ComboBox searchTerm = new ComboBox();
Label label1 = new Label();
Label label2 = new Label();
bool itemClicked = false;
bool controlIsEnabled = false;
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing && indexControl != null) { indexControl.Dispose(); }
}
public bool IsEnabled
{
get { return this.controlIsEnabled; }
}
public void RedrawContent()
{
label1.Text = StringParser.Parse("${res:AddIns.HtmlHelp2.FilteredBy}");
label2.Text = StringParser.Parse("${res:AddIns.HtmlHelp2.LookFor}");
}
public MsHelp2IndexControl()
{
this.controlIsEnabled = (HtmlHelp2Environment.IsReady &&
Help2ControlsValidation.IsIndexControlRegistered);
if (this.controlIsEnabled)
{
try
{
indexControl = new AxHxIndexCtrl();
indexControl.BeginInit();
indexControl.Dock = DockStyle.Fill;
indexControl.ItemClick += new AxMSHelpControls.IHxIndexViewEvents_ItemClickEventHandler(this.IndexItemClicked);
indexControl.EndInit();
Controls.Add(indexControl);
indexControl.CreateControl();
indexControl.BorderStyle = HxBorderStyle.HxBorderStyle_FixedSingle;
indexControl.FontSource = HxFontSourceConstant.HxFontExternal;
HtmlHelp2Environment.FilterQueryChanged += new EventHandler(FilterQueryChanged);
HtmlHelp2Environment.NamespaceReloaded += new EventHandler(NamespaceReloaded);
}
catch (Exception ex)
{
LoggingService.Error("Help 2.0: Index control failed; " + ex.ToString());
this.FakeHelpControl();
}
}
else
{
this.FakeHelpControl();
}
// Filter Combobox
Panel panel1 = new Panel();
Controls.Add(panel1);
panel1.Dock = DockStyle.Top;
panel1.Height = filterCombobox.Height + 7;
panel1.Controls.Add(filterCombobox);
filterCombobox.Dock = DockStyle.Top;
filterCombobox.DropDownStyle = ComboBoxStyle.DropDownList;
filterCombobox.Sorted = true;
filterCombobox.Enabled = this.controlIsEnabled;
filterCombobox.SelectedIndexChanged += new EventHandler(FilterChanged);
// Filter label
Controls.Add(label1);
label1.Text = StringParser.Parse("${res:AddIns.HtmlHelp2.FilteredBy}");
label1.Dock = DockStyle.Top;
label1.TextAlign = ContentAlignment.MiddleLeft;
label1.Enabled = this.controlIsEnabled;
// SearchTerm Combobox
Panel panel2 = new Panel();
Controls.Add(panel2);
panel2.Dock = DockStyle.Top;
panel2.Height = searchTerm.Height + 7;
panel2.Controls.Add(searchTerm);
searchTerm.Dock = DockStyle.Top;
searchTerm.Enabled = this.controlIsEnabled;
searchTerm.TextChanged += new EventHandler(SearchTextChanged);
searchTerm.KeyPress += new KeyPressEventHandler(KeyPressed);
// SearchTerm Label
Controls.Add(label2);
label2.Text = StringParser.Parse("${res:AddIns.HtmlHelp2.LookFor}");
label2.Dock = DockStyle.Top;
label2.TextAlign = ContentAlignment.MiddleLeft;
label2.Enabled = this.controlIsEnabled;
}
private void FakeHelpControl()
{
if (indexControl != null) indexControl.Dispose();
indexControl = null;
Controls.Clear();
Panel nohelpPanel = new Panel();
Controls.Add(nohelpPanel);
nohelpPanel.Dock = DockStyle.Fill;
nohelpPanel.BorderStyle = BorderStyle.Fixed3D;
}
public void LoadIndex()
{
if (!this.controlIsEnabled) return;
try
{
searchTerm.Text = "";
searchTerm.Items.Clear();
indexControl.IndexData = HtmlHelp2Environment.GetIndex(HtmlHelp2Environment.CurrentFilterQuery);
filterCombobox.SelectedIndexChanged -= new EventHandler(FilterChanged);
HtmlHelp2Environment.BuildFilterList(filterCombobox);
filterCombobox.SelectedIndexChanged += new EventHandler(FilterChanged);
}
catch
{
LoggingService.Error("Help 2.0: cannot connect to IHxIndex interface (Index)");
indexControl.Enabled = false;
indexControl.BackColor = SystemColors.ButtonFace;
filterCombobox.Enabled = false;
searchTerm.Enabled = false;
}
}
private void FilterChanged(object sender, EventArgs e)
{
string selectedString = filterCombobox.SelectedItem.ToString();
if (selectedString != "")
{
Cursor.Current = Cursors.WaitCursor;
indexControl.IndexData = HtmlHelp2Environment.GetIndex(HtmlHelp2Environment.FindFilterQuery(selectedString));
Cursor.Current = Cursors.Default;
}
}
#region Help 2.0 Environment Events
private void FilterQueryChanged(object sender, EventArgs e)
{
Application.DoEvents();
string currentFilterName = filterCombobox.SelectedItem.ToString();
if (String.Compare(currentFilterName, HtmlHelp2Environment.CurrentFilterName) != 0)
{
filterCombobox.SelectedIndexChanged -= new EventHandler(FilterChanged);
filterCombobox.SelectedIndex = filterCombobox.Items.IndexOf(HtmlHelp2Environment.CurrentFilterName);
indexControl.IndexData = HtmlHelp2Environment.GetIndex(HtmlHelp2Environment.CurrentFilterQuery);
filterCombobox.SelectedIndexChanged += new EventHandler(FilterChanged);
}
}
private void NamespaceReloaded(object sender, EventArgs e)
{
this.LoadIndex();
}
#endregion
private void SearchTextChanged(object sender, EventArgs e)
{
if (!itemClicked && searchTerm.Text != "")
{
indexControl.Selection = indexControl.IndexData.GetSlotFromString(searchTerm.Text);
}
}
private void KeyPressed(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13)
{
int indexSlot = indexControl.IndexData.GetSlotFromString(searchTerm.Text);
string indexTerm = indexControl.IndexData.GetFullStringFromSlot(indexSlot, ",");
searchTerm.Items.Insert(0,indexTerm);
searchTerm.SelectedIndex = 0;
if (searchTerm.Items.Count > 10) searchTerm.Items.RemoveAt(10);
this.ShowSelectedItemEntry(indexTerm, indexSlot);
}
}
private void IndexItemClicked(object sender, IHxIndexViewEvents_ItemClickEvent e)
{
string indexTerm = indexControl.IndexData.GetFullStringFromSlot(e.iItem, ",");
int indexSlot = e.iItem;
itemClicked = true;
searchTerm.Items.Insert(0,indexTerm);
searchTerm.SelectedIndex = 0;
itemClicked = false;
this.ShowSelectedItemEntry(indexTerm, indexSlot);
}
private void ShowSelectedItemEntry(string indexTerm, int indexSlot)
{
PadDescriptor indexResults =
WorkbenchSingleton.Workbench.GetPad(typeof(HtmlHelp2IndexResultsPad));
if (indexResults == null) return;
try
{
IHxTopicList matchingTopics = indexControl.IndexData.GetTopicsFromSlot(indexSlot);
try
{
((HtmlHelp2IndexResultsPad)indexResults.PadContent).CleanUp();
((HtmlHelp2IndexResultsPad)indexResults.PadContent).IndexResultsListView.BeginUpdate();
foreach (IHxTopic topic in matchingTopics)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = topic.get_Title(HxTopicGetTitleType.HxTopicGetRLTitle,
HxTopicGetTitleDefVal.HxTopicGetTitleFileName);
lvi.Tag = topic;
lvi.SubItems.Add(topic.Location);
((HtmlHelp2IndexResultsPad)indexResults.PadContent).IndexResultsListView.Items.Add(lvi);
}
}
finally
{
((HtmlHelp2IndexResultsPad)indexResults.PadContent).IndexResultsListView.EndUpdate();
((HtmlHelp2IndexResultsPad)indexResults.PadContent).SortLV(0);
((HtmlHelp2IndexResultsPad)indexResults.PadContent).SetStatusMessage(indexTerm);
}
switch (matchingTopics.Count)
{
case 0:
break;
case 1:
IHxTopic topic = (IHxTopic)matchingTopics.ItemAt(1);
if(topic != null) ShowHelpBrowser.OpenHelpView(topic);
break;
default:
indexResults.BringPadToFront();
break;
}
}
catch (Exception ex)
{
LoggingService.Error("Help 2.0: cannot get matching index entries; " + ex.ToString());
}
}
}
}