Browse Source

Merge branch 'master' of github.com:icsharpcode/SharpDevelop

pull/1/head
mrward 15 years ago
parent
commit
2cc2dcffaf
  1. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin
  2. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
  3. 30
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/AnchorSnippetElementProvider.cs
  4. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs
  5. 3
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/DefaultSnippetElementProvider.cs
  6. 23
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs
  7. 16
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml
  8. 100
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs
  9. 21
      src/AddIns/Misc/SharpRefactoring/Project/Src/InsertCtorSnippetRefactoring.cs
  10. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetCaretElement.cs

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin

@ -175,5 +175,6 @@
<Path name = "/SharpDevelop/ViewContent/AvalonEdit/SnippetElementProviders"> <Path name = "/SharpDevelop/ViewContent/AvalonEdit/SnippetElementProviders">
<Class id="default" class="ICSharpCode.AvalonEdit.AddIn.Snippets.DefaultSnippetElementProvider" /> <Class id="default" class="ICSharpCode.AvalonEdit.AddIn.Snippets.DefaultSnippetElementProvider" />
<Class id="anchor" class="ICSharpCode.AvalonEdit.AddIn.Snippets.AnchorSnippetElementProvider" />
</Path> </Path>
</AddIn> </AddIn>

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj

@ -134,6 +134,7 @@
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Src\PrintPreviewViewContent.cs" /> <Compile Include="Src\PrintPreviewViewContent.cs" />
<Compile Include="Src\Snippets\AnchorSnippetElementProvider.cs" />
<Compile Include="Src\Snippets\CodeSnippet.cs" /> <Compile Include="Src\Snippets\CodeSnippet.cs" />
<Compile Include="Src\Snippets\CodeSnippetCompletionWindow.cs" /> <Compile Include="Src\Snippets\CodeSnippetCompletionWindow.cs" />
<Compile Include="Src\Snippets\CodeSnippetGroup.cs" /> <Compile Include="Src\Snippets\CodeSnippetGroup.cs" />

30
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/AnchorSnippetElementProvider.cs

@ -0,0 +1,30 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.AvalonEdit.Snippets;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
namespace ICSharpCode.AvalonEdit.AddIn.Snippets
{
public class AnchorSnippetElementProvider : ISnippetElementProvider
{
public SnippetElement GetElement(SnippetInfo snippetInfo)
{
int typeSeparator = snippetInfo.Tag.IndexOf(':');
if (typeSeparator > 0) {
string type = snippetInfo.Tag.Substring(0, typeSeparator);
string name = snippetInfo.Tag.Substring(typeSeparator + 1);
if ("anchor".Equals(type, StringComparison.OrdinalIgnoreCase))
return new SnippetAnchorElement(name);
}
return null;
}
}
}

10
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs

@ -157,16 +157,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets
} }
} }
int typeSeparator = val.IndexOf(':');
if (typeSeparator > 0) {
string type = val.Substring(0, typeSeparator);
string name = val.Substring(typeSeparator + 1);
switch (type.ToLowerInvariant()) {
case "anchor":
return new SnippetAnchorElement(name);
}
}
foreach (ISnippetElementProvider provider in SnippetManager.Instance.SnippetElementProviders) { foreach (ISnippetElementProvider provider in SnippetManager.Instance.SnippetElementProviders) {
SnippetElement element = provider.GetElement(new SnippetInfo(val, snippetText, offset)); SnippetElement element = provider.GetElement(new SnippetInfo(val, snippetText, offset));
if (element != null) if (element != null)

3
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/DefaultSnippetElementProvider.cs

@ -10,9 +10,6 @@ using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
namespace ICSharpCode.AvalonEdit.AddIn.Snippets namespace ICSharpCode.AvalonEdit.AddIn.Snippets
{ {
/// <summary>
/// Description of DefaultSnippetElementProvider.
/// </summary>
public class DefaultSnippetElementProvider : ISnippetElementProvider public class DefaultSnippetElementProvider : ISnippetElementProvider
{ {
public SnippetElement GetElement(SnippetInfo snippetInfo) public SnippetElement GetElement(SnippetInfo snippetInfo)

23
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs

@ -9,9 +9,10 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Snippets; using ICSharpCode.AvalonEdit.Snippets;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
@ -24,6 +25,7 @@ namespace SharpRefactoring.Gui
public abstract class AbstractInlineRefactorDialog : GroupBox, IOptionBindingContainer, IActiveElement public abstract class AbstractInlineRefactorDialog : GroupBox, IOptionBindingContainer, IActiveElement
{ {
protected ITextAnchor anchor; protected ITextAnchor anchor;
protected ITextAnchor insertionEndAnchor;
protected ITextEditor editor; protected ITextEditor editor;
ClassFinder classFinderContext; ClassFinder classFinderContext;
@ -33,15 +35,20 @@ namespace SharpRefactoring.Gui
protected AbstractInlineRefactorDialog(InsertionContext context, ITextEditor editor, ITextAnchor anchor) protected AbstractInlineRefactorDialog(InsertionContext context, ITextEditor editor, ITextAnchor anchor)
{ {
this.anchor = anchor; this.anchor = insertionEndAnchor = anchor;
this.editor = editor; this.editor = editor;
this.context = context; this.context = context;
this.classFinderContext = new ClassFinder(ParserService.ParseCurrentViewContent(), editor.Document.Text, editor.Caret.Offset); this.classFinderContext = new ClassFinder(ParserService.ParseCurrentViewContent(), editor.Document.Text, anchor.Offset);
this.Background = SystemColors.ControlBrush; this.Background = SystemColors.ControlBrush;
} }
protected virtual void FocusFirstElement()
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(delegate { this.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); }));
}
protected abstract string GenerateCode(LanguageProperties language, IClass currentClass); protected abstract string GenerateCode(LanguageProperties language, IClass currentClass);
protected void OKButtonClick(object sender, RoutedEventArgs e) protected void OKButtonClick(object sender, RoutedEventArgs e)
@ -55,7 +62,7 @@ namespace SharpRefactoring.Gui
if (parseInfo != null) { if (parseInfo != null) {
LanguageProperties language = parseInfo.CompilationUnit.Language; LanguageProperties language = parseInfo.CompilationUnit.Language;
IClass current = parseInfo.CompilationUnit.GetInnermostClass(editor.Caret.Line, editor.Caret.Column); IClass current = parseInfo.CompilationUnit.GetInnermostClass(anchor.Line, anchor.Column);
// Generate code could modify the document. // Generate code could modify the document.
// So read anchor.Offset after code generation. // So read anchor.Offset after code generation.
@ -96,6 +103,12 @@ namespace SharpRefactoring.Gui
void IActiveElement.OnInsertionCompleted() void IActiveElement.OnInsertionCompleted()
{ {
OnInsertionCompleted();
}
protected virtual void OnInsertionCompleted()
{
FocusFirstElement();
} }
void IActiveElement.Deactivate(SnippetEventArgs e) void IActiveElement.Deactivate(SnippetEventArgs e)
@ -103,6 +116,8 @@ namespace SharpRefactoring.Gui
if (e.Reason == DeactivateReason.ReturnPressed) if (e.Reason == DeactivateReason.ReturnPressed)
OKButtonClick(null, null); OKButtonClick(null, null);
context.TextArea.Caret.Offset = insertionEndAnchor.Offset;
Deactivate(); Deactivate();
} }

16
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml

@ -9,17 +9,11 @@
<gui:IntToBoolConverter x:Key="intToBoolConverter" /> <gui:IntToBoolConverter x:Key="intToBoolConverter" />
<Style TargetType="Button" BasedOn="{x:Static sd:GlobalStyles.ButtonStyle}"/> <Style TargetType="Button" BasedOn="{x:Static sd:GlobalStyles.ButtonStyle}"/>
</gui:AbstractInlineRefactorDialog.Resources> </gui:AbstractInlineRefactorDialog.Resources>
<DockPanel Cursor="Arrow"> <StackPanel Cursor="Arrow">
<TextBlock DockPanel.Dock="Top" Margin="3" <TextBlock DockPanel.Dock="Top" Margin="3"
Text="{sd:Localize AddIns.SharpRefactoring.InsertCtor.Description}" Text="{sd:Localize AddIns.SharpRefactoring.InsertCtor.Description}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<DockPanel DockPanel.Dock="Bottom" LastChildFill="False"> <ListView x:Name="varList" MaxHeight="300">
<Button DockPanel.Dock="Left" Content="{sd:Localize Global.OKButtonText}" Margin="3" Click="OKButtonClick" />
<Button DockPanel.Dock="Left" Content="{sd:Localize Global.CancelButtonText}" Margin="3" Click="CancelButtonClick" />
<Button DockPanel.Dock="Right" Content="Down" Margin="3" IsEnabled="{Binding SelectedIndex, ElementName=varList, Converter={StaticResource intToBoolConverter}}" Click="DownClick" />
<Button DockPanel.Dock="Right" Content="Up" Margin="3" IsEnabled="{Binding SelectedIndex, ElementName=varList, Converter={StaticResource intToBoolConverter}}" Click="UpClick" />
</DockPanel>
<ListView x:Name="varList">
<ListView.View> <ListView.View>
<GridView> <GridView>
<GridViewColumn Header="{sd:Localize AddIns.SharpRefactoring.InsertCtor.VariableLabel}"> <GridViewColumn Header="{sd:Localize AddIns.SharpRefactoring.InsertCtor.VariableLabel}">
@ -46,5 +40,11 @@
</GridView> </GridView>
</ListView.View> </ListView.View>
</ListView> </ListView>
<DockPanel LastChildFill="False">
<Button DockPanel.Dock="Left" Content="{sd:Localize Global.OKButtonText}" Margin="3" Click="OKButtonClick" />
<Button DockPanel.Dock="Left" Content="{sd:Localize Global.CancelButtonText}" Margin="3" Click="CancelButtonClick" />
<Button DockPanel.Dock="Right" Content="Down" Margin="3" IsEnabled="{Binding SelectedIndex, ElementName=varList, Converter={StaticResource intToBoolConverter}}" Click="DownClick" />
<Button DockPanel.Dock="Right" Content="Up" Margin="3" IsEnabled="{Binding SelectedIndex, ElementName=varList, Converter={StaticResource intToBoolConverter}}" Click="UpClick" />
</DockPanel> </DockPanel>
</StackPanel>
</gui:AbstractInlineRefactorDialog> </gui:AbstractInlineRefactorDialog>

100
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs

@ -11,7 +11,10 @@ using System.ComponentModel;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Windows.Controls;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Snippets; using ICSharpCode.AvalonEdit.Snippets;
using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.Ast;
@ -26,41 +29,26 @@ namespace SharpRefactoring.Gui
/// </summary> /// </summary>
public partial class InsertCtorDialog : AbstractInlineRefactorDialog public partial class InsertCtorDialog : AbstractInlineRefactorDialog
{ {
protected IList<CtorParamWrapper> paramList; IList<CtorParamWrapper> parameterList;
public InsertCtorDialog(InsertionContext context, ITextEditor editor, ITextAnchor anchor, IClass current) public InsertCtorDialog(InsertionContext context, ITextEditor editor, ITextAnchor anchor, IClass current, IList<CtorParamWrapper> possibleParameters)
: base(context, editor, anchor) : base(context, editor, anchor)
{ {
InitializeComponent(); InitializeComponent();
this.varList.ItemsSource = paramList = CreateCtorParams(current.Fields, current.Properties) this.varList.ItemsSource = parameterList = possibleParameters;
// "Add check for null" is checked for every item by default
//Select(w => { if(w.IsNullable) w.AddCheckForNull = true; return w; }).
.ToList();
}
IEnumerable<CtorParamWrapper> CreateCtorParams(IEnumerable<IField> fields, IEnumerable<IProperty> properties)
{
int i = 0;
foreach (var f in fields) { if (!parameterList.Any())
yield return new CtorParamWrapper(f) { Index = i, IsSelected = !f.IsReadonly }; Visibility = System.Windows.Visibility.Collapsed;
i++;
}
foreach (var p in properties.Where(prop => prop.CanSet && !prop.IsIndexer)) {
yield return new CtorParamWrapper(p) { Index = i, IsSelected = !p.IsReadonly };
i++;
}
} }
protected override string GenerateCode(LanguageProperties language, IClass currentClass) protected override string GenerateCode(LanguageProperties language, IClass currentClass)
{ {
var line = editor.Document.GetLineForOffset(editor.Caret.Offset); var line = editor.Document.GetLineForOffset(anchor.Offset);
string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, line.Offset) + "\t"; string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, line.Offset);
var filtered = paramList.Where(p => p.IsSelected).OrderBy(p => p.Index).ToList(); var filtered = parameterList.Where(p => p.IsSelected).OrderBy(p => p.Index).ToList();
BlockStatement block = new BlockStatement(); BlockStatement block = new BlockStatement();
@ -103,13 +91,11 @@ namespace SharpRefactoring.Gui
foreach (CtorParamWrapper w in filtered) foreach (CtorParamWrapper w in filtered)
block.AddChild(new ExpressionStatement(new AssignmentExpression(new MemberReferenceExpression(new ThisReferenceExpression(), w.MemberName), AssignmentOperatorType.Assign, new IdentifierExpression(w.ParameterName)))); block.AddChild(new ExpressionStatement(new AssignmentExpression(new MemberReferenceExpression(new ThisReferenceExpression(), w.MemberName), AssignmentOperatorType.Assign, new IdentifierExpression(w.ParameterName))));
AnchorElement parameterList = context.ActiveElements AnchorElement parameterListElement = context.ActiveElements
.FirstOrDefault( .OfType<AnchorElement>()
item => item is AnchorElement && .FirstOrDefault(item => item.Name.Equals("parameterList", StringComparison.OrdinalIgnoreCase));
(item as AnchorElement).Name.Equals("parameterList", StringComparison.OrdinalIgnoreCase)
) as AnchorElement;
if (parameterList != null) { if (parameterListElement != null) {
StringBuilder pList = new StringBuilder(); StringBuilder pList = new StringBuilder();
var parameters = filtered var parameters = filtered
@ -122,7 +108,7 @@ namespace SharpRefactoring.Gui
pList.Append(language.CodeGenerator.GenerateCode(parameters[i], "")); pList.Append(language.CodeGenerator.GenerateCode(parameters[i], ""));
} }
parameterList.Text = pList.ToString(); parameterListElement.Text = pList.ToString();
} }
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
@ -141,13 +127,13 @@ namespace SharpRefactoring.Gui
if (selection <= 0) if (selection <= 0)
return; return;
var curItem = paramList.First(p => p.Index == selection); var curItem = parameterList.First(p => p.Index == selection);
var exchangeItem = paramList.First(p => p.Index == selection - 1); var exchangeItem = parameterList.First(p => p.Index == selection - 1);
curItem.Index = selection - 1; curItem.Index = selection - 1;
exchangeItem.Index = selection; exchangeItem.Index = selection;
varList.ItemsSource = paramList.OrderBy(p => p.Index); varList.ItemsSource = parameterList.OrderBy(p => p.Index);
varList.SelectedIndex = selection - 1; varList.SelectedIndex = selection - 1;
} }
@ -155,18 +141,58 @@ namespace SharpRefactoring.Gui
{ {
int selection = varList.SelectedIndex; int selection = varList.SelectedIndex;
if (selection < 0 || selection >= paramList.Count - 1) if (selection < 0 || selection >= parameterList.Count - 1)
return; return;
var curItem = paramList.First(p => p.Index == selection); var curItem = parameterList.First(p => p.Index == selection);
var exchangeItem = paramList.First(p => p.Index == selection + 1); var exchangeItem = parameterList.First(p => p.Index == selection + 1);
curItem.Index = selection + 1; curItem.Index = selection + 1;
exchangeItem.Index = selection; exchangeItem.Index = selection;
varList.ItemsSource = paramList.OrderBy(p => p.Index); varList.ItemsSource = parameterList.OrderBy(p => p.Index);
varList.SelectedIndex = selection + 1; varList.SelectedIndex = selection + 1;
} }
protected override void FocusFirstElement()
{
Dispatcher.BeginInvoke((Action)TryFocusAndSelectItem, DispatcherPriority.Background);
}
void TryFocusAndSelectItem()
{
if (!parameterList.Any())
return;
object ctorParamWrapper = varList.Items.GetItemAt(0);
if (ctorParamWrapper != null) {
ListBoxItem item = (ListBoxItem)varList.ItemContainerGenerator.ContainerFromItem(ctorParamWrapper);
item.Focus();
varList.ScrollIntoView(item);
varList.SelectedItem = item;
Keyboard.Focus(item);
}
}
protected override void OnInsertionCompleted()
{
base.OnInsertionCompleted();
Dispatcher.BeginInvoke(
DispatcherPriority.Background,
(Action)(
() => {
if (!parameterList.Any())
context.Deactivate(null);
else {
insertionEndAnchor = editor.Document.CreateAnchor(anchor.Offset);
insertionEndAnchor.MovementType = AnchorMovementType.AfterInsertion;
}
}
)
);
}
} }
[ValueConversion(typeof(int), typeof(bool))] [ValueConversion(typeof(int), typeof(bool))]

21
src/AddIns/Misc/SharpRefactoring/Project/Src/InsertCtorSnippetRefactoring.cs

@ -6,6 +6,8 @@
// </file> // </file>
using System; using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.AvalonEdit.Snippets; using ICSharpCode.AvalonEdit.Snippets;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -55,14 +57,31 @@ namespace SharpRefactoring
if (current == null) if (current == null)
return null; return null;
List<CtorParamWrapper> parameters = CreateCtorParams(current).ToList();
ITextAnchor anchor = textEditor.Document.CreateAnchor(context.InsertionPosition); ITextAnchor anchor = textEditor.Document.CreateAnchor(context.InsertionPosition);
anchor.MovementType = AnchorMovementType.BeforeInsertion; anchor.MovementType = AnchorMovementType.BeforeInsertion;
InsertCtorDialog dialog = new InsertCtorDialog(context, textEditor, anchor, current); InsertCtorDialog dialog = new InsertCtorDialog(context, textEditor, anchor, current, parameters);
dialog.Element = uiService.CreateInlineUIElement(anchor, dialog); dialog.Element = uiService.CreateInlineUIElement(anchor, dialog);
return dialog; return dialog;
} }
IEnumerable<CtorParamWrapper> CreateCtorParams(IClass sourceClass)
{
int i = 0;
foreach (var f in sourceClass.Fields) {
yield return new CtorParamWrapper(f) { Index = i, IsSelected = !f.IsReadonly };
i++;
}
foreach (var p in sourceClass.Properties.Where(prop => prop.CanSet && !prop.IsIndexer)) {
yield return new CtorParamWrapper(p) { Index = i, IsSelected = !p.IsReadonly };
i++;
}
}
} }
} }

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetCaretElement.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.Snippets
SetCaret(context); SetCaret(context);
} }
internal static void SetCaret(InsertionContext context) public static void SetCaret(InsertionContext context)
{ {
TextAnchor pos = context.Document.CreateAnchor(context.InsertionPosition); TextAnchor pos = context.Document.CreateAnchor(context.InsertionPosition);
pos.SurviveDeletion = true; pos.SurviveDeletion = true;

Loading…
Cancel
Save