Browse Source

Added first version of symbol rename dialog.

pull/45/merge
Andreas Weizel 12 years ago
parent
commit
7756278934
  1. 6
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  2. 51
      src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs
  3. 25
      src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs
  4. 83
      src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml
  5. 94
      src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml.cs

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

@ -202,6 +202,10 @@
<Compile Include="Src\Editor\Commands\InsertGuidCommand.cs" /> <Compile Include="Src\Editor\Commands\InsertGuidCommand.cs" />
<Compile Include="Src\Editor\Commands\PasteAsCommands.cs" /> <Compile Include="Src\Editor\Commands\PasteAsCommands.cs" />
<Compile Include="Src\Editor\Commands\ShowColorDialog.cs" /> <Compile Include="Src\Editor\Commands\ShowColorDialog.cs" />
<Compile Include="Src\Editor\Dialogs\RenameSymbolDialog.xaml.cs">
<DependentUpon>RenameSymbolDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Editor\IFormattingStrategy.cs" /> <Compile Include="Src\Editor\IFormattingStrategy.cs" />
<Compile Include="Editor\Search\ISearchResult.cs" /> <Compile Include="Editor\Search\ISearchResult.cs" />
<Compile Include="Editor\Search\ISearchResultFactory.cs" /> <Compile Include="Editor\Search\ISearchResultFactory.cs" />
@ -806,11 +810,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Designer" /> <Folder Include="Designer" />
<Folder Include="Src\Editor\Dialogs" />
<Folder Include="Templates" /> <Folder Include="Templates" />
<Folder Include="Project\Configuration" /> <Folder Include="Project\Configuration" />
<Folder Include="Workbench\DisplayBinding" /> <Folder Include="Workbench\DisplayBinding" />
<Page Include="Editor\Bookmarks\BookmarkPadContent.xaml" /> <Page Include="Editor\Bookmarks\BookmarkPadContent.xaml" />
<Page Include="Src\Editor\CodeCompletion\CodeCompletionPanelXaml.xaml" /> <Page Include="Src\Editor\CodeCompletion\CodeCompletionPanelXaml.xaml" />
<Page Include="Src\Editor\Dialogs\RenameSymbolDialog.xaml" />
<Page Include="Src\Gui\Components\FontSelector.xaml" /> <Page Include="Src\Gui\Components\FontSelector.xaml" />
<Page Include="Src\Gui\Components\StringListEditorDialog.xaml" /> <Page Include="Src\Gui\Components\StringListEditorDialog.xaml" />
<Page Include="Src\Gui\Components\StringListEditorXaml.xaml" /> <Page Include="Src\Gui\Components\StringListEditorXaml.xaml" />

51
src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs

@ -4,6 +4,7 @@
using System; using System;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.SharpDevelop.Editor.Dialogs;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Refactoring; using ICSharpCode.SharpDevelop.Refactoring;
@ -35,38 +36,44 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
public override void Run(ResolveResult symbol) public override void Run(ResolveResult symbol)
{ {
var entity = GetEntity(symbol); var entity = GetEntity(symbol);
if (entity != null) {
string title = "${res:SharpDevelop.Refactoring.Rename}"; RenameSymbolDialog renameDialog = new RenameSymbolDialog(CheckName)
string text = title; // TODO add proper text {
if (entity != null) { Owner = SD.Workbench.MainWindow,
switch (entity.SymbolKind) { OldSymbolName = entity.Name,
case ICSharpCode.NRefactory.TypeSystem.SymbolKind.TypeDefinition: NewSymbolName = entity.Name
text = "${res:SharpDevelop.Refactoring.RenameClassText}"; };
break; if ((bool) renameDialog.ShowDialog()) {
default:
text = "${res:SharpDevelop.Refactoring.RenameMemberText}";
break;
}
string newName = SD.MessageService.ShowInputBox(title, text, entity.Name);
if (newName != entity.Name) {
if (!CheckName(newName)) {
SD.MessageService.ShowError("The symbol cannot be renamed because its new name is invalid!");
return;
}
using (IProgressMonitor progressMonitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.Rename}")) using (IProgressMonitor progressMonitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.Rename}"))
FindReferenceService.RenameSymbol(entity, newName, progressMonitor) FindReferenceService.RenameSymbol(entity, renameDialog.NewSymbolName, progressMonitor)
.ObserveOnUIThread() .ObserveOnUIThread()
.Subscribe(error => SD.MessageService.ShowError(error.Message), ex => SD.MessageService.ShowException(ex), () => {}); .Subscribe(error => SD.MessageService.ShowError(error.Message), ex => SD.MessageService.ShowException(ex), () => {});
} }
} }
} }
bool CheckName(string name) bool CheckName(string name)
{ {
// TODO implement for current language! // TODO implement for current language!
return !string.IsNullOrWhiteSpace(name); if (string.IsNullOrEmpty(name))
return false;
for (int i = 0; i < name.Length; i++) {
char thisChar = name[i];
if (!Char.IsLetter(thisChar)
&& !Char.IsDigit(thisChar)
&& (thisChar != '_'))
return false;
}
return true;
}
public override bool CanExecute(ResolveResult symbol)
{
if (symbol == null)
return false;
return !symbol.GetDefinitionRegion().IsEmpty;
} }
} }
} }

25
src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Windows.Input;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.Semantics;
@ -21,17 +22,31 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
/// ///
/// If the owner isn't one of the types above, the command operates on the caret position in the current editor. /// If the owner isn't one of the types above, the command operates on the caret position in the current editor.
/// </summary> /// </summary>
public abstract class ResolveResultMenuCommand : AbstractMenuCommand public abstract class ResolveResultMenuCommand : ICommand
{ {
public abstract void Run(ResolveResult symbol); public virtual event EventHandler CanExecuteChanged { add {} remove {} }
public override void Run() public bool CanExecute(object parameter)
{
ITextEditor editor = SD.GetActiveViewContentService<ITextEditor>();
ResolveResult resolveResult = GetResolveResult(editor, parameter);
return CanExecute(resolveResult);
}
public void Execute(object parameter)
{ {
ITextEditor editor = SD.GetActiveViewContentService<ITextEditor>(); ITextEditor editor = SD.GetActiveViewContentService<ITextEditor>();
ResolveResult resolveResult = GetResolveResult(editor, Owner); ResolveResult resolveResult = GetResolveResult(editor, parameter);
Run(resolveResult); Run(resolveResult);
} }
public abstract void Run(ResolveResult symbol);
public virtual bool CanExecute(ResolveResult symbol)
{
return true;
}
public static ResolveResult GetResolveResult(object owner) public static ResolveResult GetResolveResult(object owner)
{ {
return GetResolveResult(null, owner); return GetResolveResult(null, owner);

83
src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="ICSharpCode.SharpDevelop.Editor.Dialogs.RenameSymbolDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sd="http://icsharpcode.net/sharpdevelop/core"
Title="{sd:Localize SharpDevelop.Refactoring.Rename}"
WindowStyle="ToolWindow"
Style="{x:Static sd:GlobalStyles.DialogWindowStyle}"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
Width="527.6"
SizeToContent="Height">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibility" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Text="{sd:Localize SharpDevelop.Refactoring.RenameMemberText}"
Grid.Row="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Margin="10,5" />
<TextBox
Name="symbolNameTextBox"
Grid.Row="1"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Margin="10,5"
Text="{Binding Path=NewSymbolName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Grid.ColumnSpan="3" />
<TextBlock
Name="invalidSymbolWarningTextBlock"
Grid.Row="2"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Margin="10,5"
Text="{sd:Localize SharpDevelop.Refactoring.InvalidName}"
Visibility="{Binding Path=IsError, Converter={StaticResource BoolToVisibility}}"
Foreground="Red" />
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
Content="{sd:Localize Global.RenameButtonText}"
Name="okButton"
Click="okButton_Click"
IsDefault="True"
IsEnabled="{Binding IsValidSymbolName}"
Height="23"
Width="75"
HorizontalAlignment="Right"
Margin="0,5,10,5"
Grid.Column="1" />
<Button
Content="{sd:Localize Global.CancelButtonText}"
Name="cancelButton"
IsCancel="True"
HorizontalAlignment="Right"
Margin="0,5,10,5"
Width="75"
Height="23"
Grid.Column="2" />
</Grid>
</Grid>
</Window>

94
src/Main/Base/Project/Src/Editor/Dialogs/RenameSymbolDialog.xaml.cs

@ -0,0 +1,94 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
namespace ICSharpCode.SharpDevelop.Editor.Dialogs
{
/// <summary>
/// Interaction logic for RenameSymbolDialog.xaml
/// </summary>
public partial class RenameSymbolDialog : Window
{
public static readonly DependencyProperty NewSymbolNameProperty =
DependencyProperty.Register("NewSymbolName", typeof(string), typeof(RenameSymbolDialog),
new FrameworkPropertyMetadata());
public static readonly DependencyProperty IsValidSymbolNameProperty =
DependencyProperty.Register("IsValidSymbolName", typeof(bool), typeof(RenameSymbolDialog),
new FrameworkPropertyMetadata());
public static readonly DependencyProperty IsErrorProperty =
DependencyProperty.Register("IsError", typeof(bool), typeof(RenameSymbolDialog),
new FrameworkPropertyMetadata());
Predicate<string> symbolNameValidationPredicate = n => true; // Just to always have one
public RenameSymbolDialog(Predicate<string> symbolNameValidator)
{
InitializeComponent();
this.DataContext = this;
if (symbolNameValidator != null) {
symbolNameValidationPredicate = symbolNameValidator;
}
// Set focus into TextBox
this.symbolNameTextBox.Focus();
}
public string OldSymbolName
{
get;
set;
}
public string NewSymbolName
{
get { return (string)GetValue(NewSymbolNameProperty); }
set { SetValue(NewSymbolNameProperty, value); }
}
public bool IsValidSymbolName
{
get { return (bool)GetValue(IsValidSymbolNameProperty); }
set { SetValue(IsValidSymbolNameProperty, value); }
}
public bool IsError
{
get { return (bool)GetValue(IsErrorProperty); }
set { SetValue(IsErrorProperty, value); }
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property.Name == "NewSymbolName")
ValidateSymbolName();
}
void okButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
void ValidateSymbolName()
{
// Execute defined validator on input
bool isValidSymbolName = symbolNameValidationPredicate(NewSymbolName);
// Update error states
IsValidSymbolName = isValidSymbolName && (OldSymbolName != NewSymbolName);
IsError = !isValidSymbolName;
}
}
}
Loading…
Cancel
Save