diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index c58cf92359..266dea4525 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1303,20 +1303,20 @@ + class="ICSharpCode.SharpDevelop.Editor.Commands.PasteAsCommentCommand"/> + class="ICSharpCode.SharpDevelop.Editor.Commands.PasteAsStringCommand"/> + class = "ICSharpCode.SharpDevelop.Editor.Commands.ShowColorDialog"/> + class = "ICSharpCode.SharpDevelop.Editor.Commands.InsertGuidCommand"/> 0) { string newLineText = indent + currentLine.Text.Trim(); editor.Document.Replace(currentLine.Offset, currentLine.Length, newLineText); @@ -223,7 +223,7 @@ namespace VBNetBinding // check #Region statements if (Regex.IsMatch(textToReplace.Trim(), "^#Region", RegexOptions.IgnoreCase) && LookForEndRegion(editor)) { - string indentation = DocumentUtilitites.GetIndentation(editor.Document, lineAbove.Offset); + string indentation = DocumentUtilitites.GetWhitespaceAfter(editor.Document, lineAbove.Offset); textToReplace += indentation + "\r\n" + indentation + "#End Region"; editor.Document.Replace(currentLine.Offset, currentLine.Length, textToReplace); } @@ -231,7 +231,7 @@ namespace VBNetBinding foreach (VBStatement statement_ in statements) { VBStatement statement = statement_; // allow passing statement byref if (Regex.IsMatch(textToReplace.Trim(), statement.StartRegex, RegexOptions.IgnoreCase)) { - string indentation = DocumentUtilitites.GetIndentation(editor.Document, lineAbove.Offset); + string indentation = DocumentUtilitites.GetWhitespaceAfter(editor.Document, lineAbove.Offset); if (IsEndStatementNeeded(editor, ref statement, lineNr)) { editor.Document.Replace(currentLine.Offset, currentLine.Length, terminator + indentation + statement.EndStatement); } @@ -273,7 +273,7 @@ namespace VBNetBinding string lineAboveText = previousLine == null ? null : previousLine.Text; if (curLineText != null && curLineText.EndsWith("'''") && (lineAboveText == null || !lineAboveText.Trim().StartsWith("'''"))) { - string indentation = DocumentUtilitites.GetIndentation(editor.Document, currentLine.Offset); + string indentation = DocumentUtilitites.GetWhitespaceAfter(editor.Document, currentLine.Offset); object member = GetMemberAfter(editor, lineNr); if (member != null) { StringBuilder sb = new StringBuilder(); @@ -774,7 +774,7 @@ namespace VBNetBinding if (i < selBegin || i > selEnd) { indentation.PopOrDefault(); - indentation.Push(DocumentUtilitites.GetIndentation(editor.Document, curLine.Offset)); + indentation.Push(DocumentUtilitites.GetWhitespaceAfter(editor.Document, curLine.Offset)); } // change indentation before (indent this line) diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlFormattingStrategy.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlFormattingStrategy.cs index 7c259a5475..96bae7c079 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlFormattingStrategy.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlFormattingStrategy.cs @@ -163,7 +163,7 @@ namespace ICSharpCode.XmlEditor if (r.NodeType == XmlNodeType.Element) { tagStack.Push(currentIndentation); if (r.LineNumber < begin) - currentIndentation = DocumentUtilitites.GetIndentation(editor.Document, editor.Document.PositionToOffset(r.LineNumber, 1)); + currentIndentation = DocumentUtilitites.GetWhitespaceAfter(editor.Document, editor.Document.PositionToOffset(r.LineNumber, 1)); if (r.Name.Length < 16) attribIndent = currentIndentation + new string(' ', 2 + r.Name.Length); else diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 95aac929aa..d12737f93d 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -98,6 +98,9 @@ + + + @@ -598,7 +601,6 @@ Form - diff --git a/src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs b/src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs index 2a1c4def4b..090bfda998 100644 --- a/src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs +++ b/src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs @@ -143,6 +143,12 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit return avalonEditOptions.IndentationSize; } } + + public int VerticalRulerColumn { + get { + return 120; + } + } } public virtual string FileName { diff --git a/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs new file mode 100644 index 0000000000..8708a147cf --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/InsertGuidCommand.cs @@ -0,0 +1,34 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Gui; +using System; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + public class InsertGuidCommand : AbstractMenuCommand + { + public override void Run() + { + IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; + if (viewContent == null || !(viewContent is ITextEditorProvider)) { + return; + } + + ITextEditor textEditor = ((ITextEditorProvider)viewContent).TextEditor; + if (textEditor == null) { + return; + } + + string newGuid = Guid.NewGuid().ToString().ToUpperInvariant(); + + textEditor.SelectedText = newGuid; + textEditor.Select(textEditor.SelectionStart + textEditor.SelectionLength, 0); + } + } +} diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/PasteAsCommands.cs b/src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs similarity index 63% rename from src/Main/Base/Project/Src/TextEditor/Commands/PasteAsCommands.cs rename to src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs index 5e7aff8368..b9f19c8802 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/PasteAsCommands.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/PasteAsCommands.cs @@ -5,23 +5,21 @@ // $Revision$ // -using ICSharpCode.NRefactory.Ast; -using ICSharpCode.NRefactory.AstBuilder; +using ICSharpCode.SharpDevelop.Editor; using System; using System.IO; using System.Text; using ICSharpCode.Core; using ICSharpCode.Core.WinForms; +using ICSharpCode.NRefactory.Ast; +using ICSharpCode.NRefactory.AstBuilder; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom.Refactoring; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.TextEditor; -using ICSharpCode.TextEditor.Actions; -using ICSharpCode.TextEditor.Document; -namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands +namespace ICSharpCode.SharpDevelop.Editor.Commands { public abstract class PasteAsCommand : AbstractMenuCommand { @@ -32,32 +30,24 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands return; IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - if (viewContent == null || !(viewContent is ITextEditorControlProvider)) { + if (viewContent == null || !(viewContent is ITextEditorProvider)) { return; } - TextEditorControl textEditor = ((ITextEditorControlProvider)viewContent).TextEditorControl; + ITextEditor textEditor = ((ITextEditorProvider)viewContent).TextEditor; if (textEditor == null) { return; } - textEditor.BeginUpdate(); - textEditor.Document.UndoStack.StartUndoGroup(); - try { + using (textEditor.Document.OpenUndoGroup()) Run(textEditor, clipboardText); - } finally { - textEditor.Document.UndoStack.EndUndoGroup(); - textEditor.EndUpdate(); - } - textEditor.Refresh(); } - protected abstract void Run(TextEditorControl editor, string clipboardText); + protected abstract void Run(ITextEditor editor, string clipboardText); - protected string GetIndentation(ICSharpCode.TextEditor.Document.IDocument document, int line) + protected string GetIndentation(IDocument document, int line) { - string lineText = document.GetText(document.GetLineSegment(line)); - return lineText.Substring(0, lineText.Length - lineText.TrimStart().Length); + return DocumentUtilitites.GetWhitespaceAfter(document, document.GetLine(line).Offset); } } @@ -73,25 +63,25 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands /// public class PasteAsCommentCommand : PasteAsCommand { - protected override void Run(TextEditorControl editor, string clipboardText) + protected override void Run(ITextEditor editor, string clipboardText) { - TextArea textArea = editor.ActiveTextAreaControl.TextArea; - string indentation = GetIndentation(editor.Document, textArea.Caret.Line); + string indentation = GetIndentation(editor.Document, editor.Caret.Line); IAmbience ambience = AmbienceService.GetCurrentAmbience(); - int maxLineLength = textArea.TextEditorProperties.VerticalRulerRow - VisualIndentationLength(textArea, indentation); - StringBuilder insertedText = new StringBuilder(); + int maxLineLength = editor.Options.VerticalRulerColumn - VisualIndentationLength(editor, indentation); + StringWriter insertedText = new StringWriter(); + insertedText.NewLine = DocumentUtilitites.GetLineTerminator(editor.Document, editor.Caret.Line); using (StringReader reader = new StringReader(clipboardText)) { string line; while ((line = reader.ReadLine()) != null) { AppendTextLine(indentation, ambience, maxLineLength, insertedText, line); } } - var document = textArea.Document; - int insertionPos = document.GetLineSegment(textArea.Caret.Line).Offset + indentation.Length; + IDocument document = editor.Document; + int insertionPos = document.GetLine(editor.Caret.Line).Offset + indentation.Length; document.Insert(insertionPos, insertedText.ToString()); } - void AppendTextLine(string indentation, IAmbience ambience, int maxLineLength, StringBuilder insertedText, string line) + void AppendTextLine(string indentation, IAmbience ambience, int maxLineLength, StringWriter insertedText, string line) { const int minimumLineLength = 10; string commentedLine; @@ -104,15 +94,15 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands int pos = FindWrapPositionBefore(line, maxLineLength - commentingOverhead); if (pos < minimumLineLength) break; - insertedText.AppendLine(ambience.WrapComment(line.Substring(0, pos))); - insertedText.Append(indentation); + insertedText.WriteLine(ambience.WrapComment(line.Substring(0, pos))); + insertedText.Write(indentation); line = line.Substring(pos + 1); } else { break; } } - insertedText.AppendLine(commentedLine); - insertedText.Append(indentation); // indentation for next line + insertedText.WriteLine(commentedLine); + insertedText.Write(indentation); // indentation for next line } int FindWrapPositionBefore(string line, int pos) @@ -120,12 +110,12 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands return line.LastIndexOf(' ', pos); } - int VisualIndentationLength(TextArea textArea, string indentation) + int VisualIndentationLength(ITextEditor editor, string indentation) { int length = 0; foreach (char c in indentation) { if (c == '\t') - length += textArea.TextEditorProperties.TabIndent; + length += editor.Options.IndentationSize; else length += 1; } @@ -143,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands /// public class PasteAsStringCommand : PasteAsCommand { - protected override void Run(TextEditorControl editor, string clipboardText) + protected override void Run(ITextEditor editor, string clipboardText) { CodeGenerator codeGenerator = ParserService.CurrentProjectContent.Language.CodeGenerator; if (codeGenerator == null) @@ -166,9 +156,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands } if (expression == null) return; - TextArea textArea = editor.ActiveTextAreaControl.TextArea; - string indentation = GetIndentation(editor.Document, textArea.Caret.Line); - textArea.InsertString(codeGenerator.GenerateCode(expression, indentation).Trim()); + string indentation = GetIndentation(editor.Document, editor.Caret.Line); + editor.Document.Insert(editor.Caret.Offset, codeGenerator.GenerateCode(expression, indentation).Trim()); } } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs b/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs new file mode 100644 index 0000000000..fdd406e83d --- /dev/null +++ b/src/Main/Base/Project/Src/Editor/Commands/ShowColorDialog.cs @@ -0,0 +1,55 @@ +// +// +// +// +// $Revision$ +// + +using System; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using System.IO; +using System.Windows.Forms; + +namespace ICSharpCode.SharpDevelop.Editor.Commands +{ + public class ShowColorDialog : AbstractMenuCommand + { + public override void Run() + { + IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; + + if (viewContent == null || !(viewContent is ITextEditorProvider)) { + return; + } + ITextEditor textEditor = ((ITextEditorProvider)viewContent).TextEditor; + + using (SharpDevelopColorDialog cd = new SharpDevelopColorDialog()) { + if (cd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainWin32Window) == DialogResult.OK) { + string ext = Path.GetExtension(textEditor.FileName).ToLowerInvariant(); + string colorstr; + if (ext == ".cs" || ext == ".vb" || ext == ".boo") { + if (cd.Color.IsKnownColor) { + colorstr = "Color." + cd.Color.ToKnownColor().ToString(); + } else if (cd.Color.A < 255) { + colorstr = "Color.FromArgb(0x" + cd.Color.ToArgb().ToString("x") + ")"; + } else { + colorstr = string.Format("Color.FromArgb({0}, {1}, {2})", cd.Color.R, cd.Color.G, cd.Color.B); + } + } else { + if (cd.Color.IsKnownColor) { + colorstr = cd.Color.ToKnownColor().ToString(); + } else if (cd.Color.A < 255) { + colorstr = "#" + cd.Color.ToArgb().ToString("X"); + } else { + colorstr = string.Format("#{0:X2}{1:X2}{2:X2}", cd.Color.R, cd.Color.G, cd.Color.B); + } + } + + textEditor.SelectedText = colorstr; + textEditor.Select(textEditor.SelectionStart + textEditor.SelectionLength, 0); + } + } + } + } +} diff --git a/src/Main/Base/Project/Src/Editor/DocumentUtilitites.cs b/src/Main/Base/Project/Src/Editor/DocumentUtilitites.cs index f7a63faeed..efe6bafb50 100644 --- a/src/Main/Base/Project/Src/Editor/DocumentUtilitites.cs +++ b/src/Main/Base/Project/Src/Editor/DocumentUtilitites.cs @@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Editor /// The document. /// The offset where the indentation starts. /// The indentation text. - public static string GetIndentation(ITextBuffer textBuffer, int offset) + public static string GetWhitespaceAfter(ITextBuffer textBuffer, int offset) { ISegment segment = TextUtilities.GetWhitespaceAfter(GetTextSource(textBuffer), offset); return textBuffer.GetText(segment.Offset, segment.Length); diff --git a/src/Main/Base/Project/Src/Editor/IFormattingStrategy.cs b/src/Main/Base/Project/Src/Editor/IFormattingStrategy.cs index 6b7294ca13..8f080a4750 100644 --- a/src/Main/Base/Project/Src/Editor/IFormattingStrategy.cs +++ b/src/Main/Base/Project/Src/Editor/IFormattingStrategy.cs @@ -51,9 +51,9 @@ namespace ICSharpCode.SharpDevelop.Editor int lineNumber = line.LineNumber; if (lineNumber > 1) { IDocumentLine previousLine = document.GetLine(lineNumber - 1); - string indentation = DocumentUtilitites.GetIndentation(document, previousLine.Offset); + string indentation = DocumentUtilitites.GetWhitespaceAfter(document, previousLine.Offset); // copy indentation to line - string newIndentation = DocumentUtilitites.GetIndentation(document, line.Offset); + string newIndentation = DocumentUtilitites.GetWhitespaceAfter(document, line.Offset); document.Replace(line.Offset, newIndentation.Length, indentation); } } diff --git a/src/Main/Base/Project/Src/Editor/ITextEditor.cs b/src/Main/Base/Project/Src/Editor/ITextEditor.cs index ed9e3a1f69..6c7197c218 100644 --- a/src/Main/Base/Project/Src/Editor/ITextEditor.cs +++ b/src/Main/Base/Project/Src/Editor/ITextEditor.cs @@ -141,6 +141,13 @@ namespace ICSharpCode.SharpDevelop.Editor /// Gets the size of an indentation level. /// int IndentationSize { get; } + + /// + /// Gets the column of the vertical ruler (line that signifies the maximum line length + /// defined by the coding style) + /// This property returns a valid value even if the vertical ruler is set to be invisible. + /// + int VerticalRulerColumn { get; } } public interface ITextEditorCaret diff --git a/src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkManager.cs b/src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkManager.cs index b1a34fb8d8..6e551bac72 100644 --- a/src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkManager.cs +++ b/src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkManager.cs @@ -119,7 +119,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks } // no bookmark at that line: create a new bookmark int lineStartOffset = editor.Document.GetLine(line).Offset; - int column = 1 + DocumentUtilitites.GetIndentation(editor.Document, lineStartOffset).Length; + int column = 1 + DocumentUtilitites.GetWhitespaceAfter(editor.Document, lineStartOffset).Length; BookmarkManager.AddMark(bookmarkFactory(new Location(column, line))); } diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/ToolCommands.cs b/src/Main/Base/Project/Src/TextEditor/Commands/ToolCommands.cs index b834708eae..7a057f1de1 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/ToolCommands.cs +++ b/src/Main/Base/Project/Src/TextEditor/Commands/ToolCommands.cs @@ -21,49 +21,6 @@ using ICSharpCode.TextEditor.Document; namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands { - public class ShowColorDialog : AbstractMenuCommand - { - public override void Run() - { - IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - - if (viewContent == null || !(viewContent is ITextEditorControlProvider)) { - return; - } - TextEditorControl textarea = ((ITextEditorControlProvider)viewContent).TextEditorControl; - - using (SharpDevelopColorDialog cd = new SharpDevelopColorDialog()) { - if (cd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainWin32Window) == DialogResult.OK) { - string ext = Path.GetExtension(textarea.FileName).ToLowerInvariant(); - string colorstr; - if (ext == ".cs" || ext == ".vb" || ext == ".boo") { - if (cd.Color.IsKnownColor) { - colorstr = "Color." + cd.Color.ToKnownColor().ToString(); - } else if (cd.Color.A < 255) { - colorstr = "Color.FromArgb(0x" + cd.Color.ToArgb().ToString("x") + ")"; - } else { - colorstr = string.Format("Color.FromArgb({0}, {1}, {2})", cd.Color.R, cd.Color.G, cd.Color.B); - } - } else { - if (cd.Color.IsKnownColor) { - colorstr = cd.Color.ToKnownColor().ToString(); - } else if (cd.Color.A < 255) { - colorstr = "#" + cd.Color.ToArgb().ToString("X"); - } else { - colorstr = string.Format("#{0:X2}{1:X2}{2:X2}", cd.Color.R, cd.Color.G, cd.Color.B); - } - } - - textarea.Document.Insert(textarea.ActiveTextAreaControl.Caret.Offset, colorstr); - int lineNumber = textarea.Document.GetLineNumberForOffset(textarea.ActiveTextAreaControl.Caret.Offset); - textarea.ActiveTextAreaControl.Caret.Column += colorstr.Length; - textarea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, new TextLocation(0, lineNumber))); - textarea.Document.CommitUpdate(); - } - } - } - } - public class QuickDocumentation : AbstractMenuCommand { public override void Run() @@ -206,24 +163,4 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands } } } - - public class InsertGuidCommand : AbstractMenuCommand - { - public override void Run() - { - IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent; - if (viewContent == null || !(viewContent is ITextEditorControlProvider)) { - return; - } - - TextEditorControl textEditor = ((ITextEditorControlProvider)viewContent).TextEditorControl; - if (textEditor == null) { - return; - } - - string newGuid = Guid.NewGuid().ToString().ToUpperInvariant(); - - textEditor.ActiveTextAreaControl.TextArea.InsertString(newGuid); - } - } } diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs b/src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs index a665233532..33ecfa071f 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs @@ -113,6 +113,12 @@ namespace ICSharpCode.SharpDevelop return properties.IndentationSize; } } + + public int VerticalRulerColumn { + get { + return properties.VerticalRulerRow; + } + } } static ICSharpCode.NRefactory.Location ToLocation(TextLocation position)