📄 quickclassbrowserpanel.cs
字号:
// created on 07.03.2004 at 19:12
using System;
using System.Threading;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using SharpDevelop.Internal.Parser;
using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.Services;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public class QuickClassBrowserPanel : System.Windows.Forms.UserControl
{
private System.Windows.Forms.ComboBox classComboBox;
private System.Windows.Forms.ComboBox membersComboBox;
ICompilationUnit currentCompilationUnit;
SharpDevelopTextAreaControl textAreaControl;
bool autoselect = true;
class ComboBoxItem : System.IComparable
{
object item;
string text;
int iconIndex;
static AmbienceService ambienceService = (AmbienceService)ServiceManager.Services.GetService(typeof(AmbienceService));
public int IconIndex {
get {
return iconIndex;
}
}
public object Item {
get {
return item;
}
}
public int Line {
get {
if (item is IClass) {
return ((IClass)item).Region.BeginLine - 1;
}
// also exception on delegate invoke
try {
return (item as IMember).Region.BeginLine - 1;
}
catch {
return 0;
}
}
}
public int Column {
get {
if (item is IClass) {
return ((IClass)item).Region.BeginColumn - 1;
}
// causes exception when delegate is selected in class windows - Invoke is visible in methods and when selected causes exception
try {
return (item as IMember).Region.BeginColumn - 1;
}
catch {
return 0;
}
}
}
public int EndLine {
get {
if (item is IClass) {
return ((IClass)item).Region.EndLine - 1;
}
return (item as IMember).Region.EndLine - 1;
}
}
public ComboBoxItem(object item, string text, int iconIndex)
{
this.item = item;
this.text = text;
this.iconIndex = iconIndex;
}
public bool IsInside(int lineNumber)
{
if (item is IClass) {
return ((IClass)item).Region.BeginLine - 1 <= lineNumber &&
((IClass)item).Region.EndLine - 1 >= lineNumber;
}
IMember member = item as IMember;
if (member == null) {
return false;
}
bool isInside = member.Region.BeginLine - 1 <= lineNumber;
if (member is IMethod) {
if (((IMethod)member).BodyRegion.EndLine >= 0) {
isInside &= lineNumber <= ((IMethod)member).BodyRegion.EndLine - 1;
} else {
return member.Region.BeginLine - 1 == lineNumber;
}
} else if (member is IProperty) {
isInside &= lineNumber <= ((IProperty)member).BodyRegion.EndLine - 1;
} else if (member is IIndexer) {
isInside &= lineNumber <= ((IIndexer)member).BodyRegion.EndLine - 1;
} else {
isInside &= lineNumber <= member.Region.EndLine - 1;
}
return isInside;
}
public int CompareItemTo(object obj)
{
ComboBoxItem boxItem = (ComboBoxItem)obj;
if (boxItem.Item is IComparable) {
return ((IComparable)boxItem.Item).CompareTo(item);
}
if (boxItem.text != text || boxItem.Line != Line || boxItem.EndLine != EndLine || boxItem.iconIndex != iconIndex) {
return 1;
}
return 0;
}
public override string ToString()
{
IAmbience ambience = ambienceService.CurrentAmbience;
ambience.ConversionFlags = ConversionFlags.ShowParameterNames;
if (item is IMethod) {
return ambience.Convert((IMethod)item);
}
if (item is IProperty) {
return ambience.Convert((IProperty)item);
}
if (item is IIndexer) {
return ambience.Convert((IIndexer)item);
}
if (item is IField) {
return ambience.Convert((IField)item);
}
if (item is IProperty) {
return ambience.Convert((IProperty)item);
}
if (item is IEvent) {
return ambience.Convert((IEvent)item);
}
return text;
}
#region System.IComparable interface implementation
public int CompareTo(object obj)
{
return ToString().CompareTo(obj.ToString());
}
#endregion
}
public QuickClassBrowserPanel(SharpDevelopTextAreaControl textAreaControl)
{
InitializeComponent();
base.Dock = DockStyle.Top;
this.textAreaControl = textAreaControl;
this.textAreaControl.ActiveTextAreaControl.Caret.PositionChanged += new EventHandler(CaretPositionChanged);
}
protected override void Dispose(bool disposing)
{
if (disposing) {
this.textAreaControl.ActiveTextAreaControl.Caret.PositionChanged -= new EventHandler(CaretPositionChanged);
}
base.Dispose(disposing);
}
void CaretPositionChanged(object sender, EventArgs e)
{
// ignore simple movements
if (e != EventArgs.Empty) {
return;
}
try {
IParserService parserService = (IParserService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IParserService));
IParseInformation parseInfo = parserService.GetParseInformation(textAreaControl.FileName);
if (parseInfo != null) {
if (currentCompilationUnit != (ICompilationUnit)parseInfo.MostRecentCompilationUnit) {
currentCompilationUnit = (ICompilationUnit)parseInfo.MostRecentCompilationUnit;
if (currentCompilationUnit != null) {
FillClassComboBox(true);
FillMembersComboBox();
}
}
UpdateClassComboBox();
UpdateMembersComboBox();
}
} catch (Exception) {}
}
bool membersComboBoxSelectedMember = false;
void UpdateMembersComboBox()
{
autoselect = false;
try {
if (currentCompilationUnit != null) {
for (int i = 0; i < membersComboBox.Items.Count; ++i) {
if (((ComboBoxItem)membersComboBox.Items[i]).IsInside(textAreaControl.ActiveTextAreaControl.Caret.Line)) {
if (membersComboBox.SelectedIndex != i) {
membersComboBox.SelectedIndex = i;
}
if (!membersComboBoxSelectedMember) {
membersComboBox.Refresh();
}
membersComboBoxSelectedMember = true;
return;
}
}
}
if (membersComboBoxSelectedMember) {
membersComboBox.Refresh();
membersComboBoxSelectedMember = false;
}
} finally {
autoselect = true;
}
}
bool classComboBoxSelectedMember = false;
void UpdateClassComboBox()
{
// Still needed ?
if (currentCompilationUnit == null) {
IParserService parserService = (IParserService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IParserService));
if (parserService != null) {
currentCompilationUnit = (ICompilationUnit)parserService.GetParseInformation(Path.GetFullPath(textAreaControl.FileName)).MostRecentCompilationUnit;
}
}
autoselect = false;
try {
if (currentCompilationUnit != null) {
//// Alex: when changing between files in different compilation units whole process must be restarted
//// happens usually when files are opened from different project(s)
if (classComboBox.Items == null || classComboBox.Items.Count == 0) {
FillClassComboBox(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -