Browse Source

Add definition view pad.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@104 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
90c13fc553
  1. 6
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs
  3. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/Indentation.cs
  4. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  5. 6
      src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs
  6. 32
      src/Main/Base/Project/Src/Dom/FilePosition.cs
  7. 6
      src/Main/Base/Project/Src/Gui/AbstractPadContent.cs
  8. 102
      src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs
  9. 32
      src/Main/Base/Project/Src/Services/ParserService/ParseInformationEventHandler.cs
  10. 91
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
  11. 1
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs

6
AddIns/ICSharpCode.SharpDevelop.addin

@ -101,6 +101,12 @@
title = "Bookmarks" title = "Bookmarks"
icon = "PadIcons.Bookmarks" icon = "PadIcons.Bookmarks"
class = "Bookmark.BookmarkPad"/> class = "Bookmark.BookmarkPad"/>
<Pad id = "DefinitionView"
category = "Tools"
title = "Definition View"
icon = "PadIcons.Bookmarks"
class = "ICSharpCode.SharpDevelop.Gui.DefinitionViewPad"/>
</Path> </Path>
<Path name = "/SharpDevelop/Workbench/Combine/FileFilter"> <Path name = "/SharpDevelop/Workbench/Combine/FileFilter">

1
src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs

@ -46,6 +46,7 @@ namespace CSharpBinding.FormattingStrategy
IndentationSettings set = new IndentationSettings(); IndentationSettings set = new IndentationSettings();
set.IndentString = Tab.GetIndentationString(textArea.Document); set.IndentString = Tab.GetIndentationString(textArea.Document);
set.LeaveEmptyLines = false;
IndentationReformatter r = new IndentationReformatter(); IndentationReformatter r = new IndentationReformatter();
r.Reformat(acc, set); r.Reformat(acc, set);

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/Indentation.cs

@ -7,6 +7,8 @@ namespace CSharpBinding.FormattingStrategy
public class IndentationSettings public class IndentationSettings
{ {
public string IndentString = "\t"; public string IndentString = "\t";
/// <summary>Leave empty lines empty.</summary>
public bool LeaveEmptyLines = true;
} }
public class IndentationReformatter public class IndentationReformatter
@ -86,7 +88,7 @@ namespace CSharpBinding.FormattingStrategy
public void Step(IDocumentAccessor doc, IndentationSettings set) public void Step(IDocumentAccessor doc, IndentationSettings set)
{ {
string line = doc.Text; string line = doc.Text;
if (line.Length == 0) return; // leave empty lines empty if (set.LeaveEmptyLines && line.Length == 0) return; // leave empty lines empty
line = line.TrimStart(); line = line.TrimStart();
StringBuilder indent = new StringBuilder(); StringBuilder indent = new StringBuilder();

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -642,6 +642,7 @@
<Compile Include="Src\Dom\FilePosition.cs" /> <Compile Include="Src\Dom\FilePosition.cs" />
<Compile Include="Src\Project\MSBuildEngine.cs" /> <Compile Include="Src\Project\MSBuildEngine.cs" />
<Compile Include="Src\TextEditor\Gui\Editor\CodeCompletionBinding.cs" /> <Compile Include="Src\TextEditor\Gui\Editor\CodeCompletionBinding.cs" />
<Compile Include="Src\Gui\Pads\DefinitionViewPad.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj"> <ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj">

6
src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs

@ -349,12 +349,6 @@ namespace ICSharpCode.SharpDevelop.Commands
{ {
PadDescriptor padDescriptor; PadDescriptor padDescriptor;
bool IsPadVisible {
get {
return WorkbenchSingleton.Workbench.WorkbenchLayout.IsVisible(padDescriptor);
}
}
public MyMenuItem(PadDescriptor padDescriptor) : base(null, null) public MyMenuItem(PadDescriptor padDescriptor) : base(null, null)
{ {
this.padDescriptor = padDescriptor; this.padDescriptor = padDescriptor;

32
src/Main/Base/Project/Src/Dom/FilePosition.cs

@ -37,5 +37,37 @@ namespace ICSharpCode.SharpDevelop.Dom
return position; return position;
} }
} }
public override string ToString()
{
return String.Format("{0} : (line {1}, col {2})",
filename,
Line,
Column);
}
public int Line {
get {
return position.X;
}
}
public int Column {
get {
return position.X;
}
}
public override bool Equals(object obj)
{
FilePosition b = obj as FilePosition;
if (b == null) return false;
return this.Filename == b.Filename && this.Position == b.Position;
}
public override int GetHashCode()
{
return filename.GetHashCode() ^ position.GetHashCode();
}
} }
} }

6
src/Main/Base/Project/Src/Gui/AbstractPadContent.cs

@ -26,5 +26,11 @@ namespace ICSharpCode.SharpDevelop.Gui
public virtual void Dispose() public virtual void Dispose()
{ {
} }
public bool IsVisible {
get {
return Control.Visible && Control.Width > 0;
}
}
} }
} }

102
src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs

@ -0,0 +1,102 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version value="$version"/>
// </file>
using System;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TextEditor;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
namespace ICSharpCode.SharpDevelop.Gui
{
/// <summary>
/// Description of the pad content
/// </summary>
public class DefinitionViewPad : AbstractPadContent
{
TextEditorControl ctl;
/// <summary>
/// The <see cref="System.Windows.Forms.Control"/> representing the pad
/// </summary>
public override Control Control {
get {
return ctl;
}
}
/// <summary>
/// Creates a new DefinitionViewPad object
/// </summary>
public DefinitionViewPad()
{
ctl = new TextEditorControl();
ctl.Document.ReadOnly = true;
ctl.TextEditorProperties = new SharpDevelopTextEditorProperties();
ParserService.ParserUpdateStepFinished += UpdateTick;
}
void UpdateTick(object sender, ParserUpdateStepEventArgs e)
{
if (!this.IsVisible) return;
ResolveResult res = ResolveAtCaret(e);
if (res == null) return;
FilePosition pos = res.GetDefinitionPosition();
if (pos == null) return;
ctl.Invoke(new OpenFileDelegate(OpenFile), pos);
}
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;
if (ctl.FileName != e.FileName) return null;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(e.FileName);
if (expressionFinder == null) return null;
Caret caret = ctl.ActiveTextAreaControl.Caret;
string expr = expressionFinder.FindFullExpression(e.Content, caret.Offset);
if (expr == null) return null;
return ParserService.Resolve(expr, caret.Line, caret.Column, e.FileName, e.Content);
}
delegate void OpenFileDelegate(FilePosition pos);
FilePosition oldPosition;
void OpenFile(FilePosition pos)
{
if (pos.Equals(oldPosition)) return;
oldPosition = pos;
if (pos.Filename != ctl.FileName)
ctl.LoadFile(pos.Filename);
ctl.ActiveTextAreaControl.ScrollTo(int.MaxValue); // scroll completely down
ctl.ActiveTextAreaControl.Caret.Line = pos.Line - 1;
ctl.ActiveTextAreaControl.ScrollToCaret(); // scroll up to search position
}
/// <summary>
/// Refreshes the pad
/// </summary>
public override void RedrawContent()
{
// Refresh the whole pad control here, renew all resource strings whatever.
}
/// <summary>
/// Cleans up all used resources
/// </summary>
public override void Dispose()
{
ParserService.ParserUpdateStepFinished -= UpdateTick;
ctl.Dispose();
}
}
}

32
src/Main/Base/Project/Src/Services/ParserService/ParseInformationEventHandler.cs

@ -51,4 +51,36 @@ namespace ICSharpCode.Core
this.compilationUnit = compilationUnit; this.compilationUnit = compilationUnit;
} }
} }
public delegate void ParserUpdateStepEventHandler(object sender, ParserUpdateStepEventArgs e);
public class ParserUpdateStepEventArgs : EventArgs
{
string fileName;
string content;
bool updated;
public ParserUpdateStepEventArgs(string fileName, string content, bool updated)
{
this.fileName = fileName;
this.content = content;
this.updated = updated;
}
public string FileName {
get {
return fileName;
}
}
public string Content {
get {
return content;
}
}
public bool Updated {
get {
return updated;
}
}
}
} }

91
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -110,43 +110,7 @@ namespace ICSharpCode.Core
{ {
while (!doneParserThread) { while (!doneParserThread) {
try { try {
if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null && WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent != null) { ParserUpdateStep();
IEditable editable = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as IEditable;
if (editable != null) {
string fileName = null;
IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent;
IParseableContent parseableContent = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as IParseableContent;
//ivoko: Pls, do not throw text = parseableContent.ParseableText away. I NEED it.
string text = null;
if (parseableContent != null) {
fileName = parseableContent.ParseableContentName;
text = parseableContent.ParseableText;
} else {
fileName = viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName;
}
if (!(fileName == null || fileName.Length == 0)) {
ParseInformation parseInformation = null;
bool updated = false;
if (text == null) {
text = editable.Text;
}
int hash = text.Length;
if (!lastUpdateSize.ContainsKey(fileName) || (int)lastUpdateSize[fileName] != hash) {
parseInformation = ParseFile(fileName, text, !viewContent.IsUntitled, true);
lastUpdateSize[fileName] = hash;
updated = true;
}
if (updated) {
if (parseInformation != null && editable is IParseInformationListener) {
((IParseInformationListener)editable).ParseInformationUpdated(parseInformation);
}
}
}
}
}
} catch (Exception e) { } catch (Exception e) {
ICSharpCode.Core.MessageService.ShowError(e); ICSharpCode.Core.MessageService.ShowError(e);
} }
@ -154,7 +118,58 @@ namespace ICSharpCode.Core
} }
} }
static void ParserUpdateStep()
{
if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null && WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent != null) {
IEditable editable = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as IEditable;
if (editable != null) {
string fileName = null;
IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent;
IParseableContent parseableContent = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as IParseableContent;
//ivoko: Pls, do not throw text = parseableContent.ParseableText away. I NEED it.
string text = null;
if (parseableContent != null) {
fileName = parseableContent.ParseableContentName;
text = parseableContent.ParseableText;
} else {
fileName = viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName;
}
if (!(fileName == null || fileName.Length == 0)) {
ParseInformation parseInformation = null;
bool updated = false;
if (text == null) {
text = editable.Text;
if (text == null) return;
}
int hash = text.Length;
if (!lastUpdateSize.ContainsKey(fileName) || (int)lastUpdateSize[fileName] != hash) {
parseInformation = ParseFile(fileName, text, !viewContent.IsUntitled, true);
lastUpdateSize[fileName] = hash;
updated = true;
}
if (updated) {
if (parseInformation != null && editable is IParseInformationListener) {
((IParseInformationListener)editable).ParseInformationUpdated(parseInformation);
}
}
OnParserUpdateStepFinished(new ParserUpdateStepEventArgs(fileName, text, updated));
}
}
}
}
public static event ParserUpdateStepEventHandler ParserUpdateStepFinished;
static void OnParserUpdateStepFinished(ParserUpdateStepEventArgs e)
{
if (ParserUpdateStepFinished != null) {
ParserUpdateStepFinished(typeof(ParserService), e);
}
}
public static ParseInformation ParseFile(string fileName) public static ParseInformation ParseFile(string fileName)
{ {
return ParseFile(fileName, null); return ParseFile(fileName, null);

1
src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs

@ -122,6 +122,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
public string Text { public string Text {
get { get {
if (textAreaControl.IsDisposed) return null;
if (textAreaControl.InvokeRequired) if (textAreaControl.InvokeRequired)
return (string)textAreaControl.Invoke(new GetTextDelegate(GetText)); return (string)textAreaControl.Invoke(new GetTextDelegate(GetText));
else else

Loading…
Cancel
Save