diff --git a/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceModel.cs b/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceModel.cs index 31751df7c4..1d8994f7a7 100644 --- a/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceModel.cs +++ b/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceModel.cs @@ -54,7 +54,7 @@ public ExtractInterfaceModel(RubberduckParserState state, QualifiedSelection sel && MemberTypes.Contains(item.DeclarationType)) .OrderBy(o => o.Selection.StartLine) .ThenBy(t => t.Selection.StartColumn) - .Select(d => new InterfaceMember(d, declarations)) + .Select(d => new InterfaceMember(d)) .ToList(); } } diff --git a/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenter.cs b/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenter.cs index c9438a955e..346499a887 100644 --- a/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenter.cs +++ b/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenter.cs @@ -1,5 +1,7 @@ using System.Linq; using System.Windows.Forms; +using Rubberduck.UI.Refactorings; +using Rubberduck.UI.Refactorings.ExtractInterface; namespace Rubberduck.Refactorings.ExtractInterface { @@ -10,10 +12,10 @@ public interface IExtractInterfacePresenter public class ExtractInterfacePresenter : IExtractInterfacePresenter { - private readonly IExtractInterfaceDialog _view; + private readonly IRefactoringDialog _view; private readonly ExtractInterfaceModel _model; - public ExtractInterfacePresenter(IExtractInterfaceDialog view, ExtractInterfaceModel model) + public ExtractInterfacePresenter(IRefactoringDialog view, ExtractInterfaceModel model) { _view = view; _model = model; @@ -26,18 +28,18 @@ public ExtractInterfaceModel Show() return null; } - _view.ComponentNames = - _model.TargetDeclaration.Project.VBComponents.Select(c => c.Name).ToList(); - _view.InterfaceName = _model.InterfaceName; - _view.Members = _model.Members; + _view.ViewModel.ComponentNames = _model.TargetDeclaration.Project.VBComponents.Select(c => c.Name).ToList(); + _view.ViewModel.InterfaceName = _model.InterfaceName; + _view.ViewModel.Members = _model.Members.ToList(); - if (_view.ShowDialog() != DialogResult.OK) + _view.ShowDialog(); + if (_view.DialogResult != DialogResult.OK) { return null; } - _model.InterfaceName = _view.InterfaceName; - _model.Members = _view.Members; + _model.InterfaceName = _view.ViewModel.InterfaceName; + _model.Members = _view.ViewModel.Members; return _model; } } diff --git a/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenterFactory.cs b/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenterFactory.cs index d17b9c947a..bbb319e677 100644 --- a/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenterFactory.cs +++ b/RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfacePresenterFactory.cs @@ -1,5 +1,7 @@ using System.Linq; using Rubberduck.Parsing.VBA; +using Rubberduck.UI.Refactorings; +using Rubberduck.UI.Refactorings.ExtractInterface; using Rubberduck.VBEditor.SafeComWrappers.Abstract; namespace Rubberduck.Refactorings.ExtractInterface @@ -7,10 +9,10 @@ namespace Rubberduck.Refactorings.ExtractInterface public class ExtractInterfacePresenterFactory : IRefactoringPresenterFactory { private readonly IVBE _vbe; - private readonly IExtractInterfaceDialog _view; + private readonly IRefactoringDialog _view; private readonly RubberduckParserState _state; - public ExtractInterfacePresenterFactory(IVBE vbe, RubberduckParserState state, IExtractInterfaceDialog view) + public ExtractInterfacePresenterFactory(IVBE vbe, RubberduckParserState state, IRefactoringDialog view) { _vbe = vbe; _view = view; diff --git a/RetailCoder.VBE/Refactorings/ExtractInterface/IExtractInterfaceDialog.cs b/RetailCoder.VBE/Refactorings/ExtractInterface/IExtractInterfaceDialog.cs deleted file mode 100644 index dcfd58cd34..0000000000 --- a/RetailCoder.VBE/Refactorings/ExtractInterface/IExtractInterfaceDialog.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; -using Rubberduck.UI; - -namespace Rubberduck.Refactorings.ExtractInterface -{ - public interface IExtractInterfaceDialog : IDialogView - { - string InterfaceName { get; set; } - IEnumerable Members { get; set; } - List ComponentNames { get; set; } - } -} diff --git a/RetailCoder.VBE/Refactorings/ExtractInterface/InterfaceMember.cs b/RetailCoder.VBE/Refactorings/ExtractInterface/InterfaceMember.cs index 5527f6edd8..59ce72d64d 100644 --- a/RetailCoder.VBE/Refactorings/ExtractInterface/InterfaceMember.cs +++ b/RetailCoder.VBE/Refactorings/ExtractInterface/InterfaceMember.cs @@ -3,6 +3,7 @@ using System.Linq; using Rubberduck.Parsing.Grammar; using Rubberduck.Parsing.Symbols; +using Rubberduck.UI; namespace Rubberduck.Refactorings.ExtractInterface { @@ -18,15 +19,26 @@ public override string ToString() } } - public class InterfaceMember + public class InterfaceMember : ViewModelBase { - private Declaration Member { get; set; } - private IEnumerable MemberParams { get; set; } - private string Type { get; set; } + private Declaration Member { get; } + private IEnumerable MemberParams { get; } + private string Type { get; } private string MemberType { get; set; } - public bool IsSelected { get; set; } + private bool _isSelected; + public bool IsSelected + { + get { return _isSelected; } + set + { + _isSelected = value; + OnPropertyChanged(); + } + } + + public string Identifier { get; } public string FullMemberSignature { @@ -39,9 +51,10 @@ public string FullMemberSignature } } - public InterfaceMember(Declaration member, IEnumerable declarations) + public InterfaceMember(Declaration member) { Member = member; + Identifier = member.IdentifierName; Type = member.AsTypeName; GetMethodType(); @@ -109,13 +122,7 @@ private void GetMethodType() } } - public string Body - { - get - { - return "Public " + FullMemberSignature + Environment.NewLine + - "End " + MemberType.Split(' ').First() + Environment.NewLine; - } - } + public string Body => "Public " + FullMemberSignature + Environment.NewLine + + "End " + MemberType.Split(' ').First() + Environment.NewLine; } } diff --git a/RetailCoder.VBE/Rubberduck.csproj b/RetailCoder.VBE/Rubberduck.csproj index ab9ec3a3be..6f62156b06 100644 --- a/RetailCoder.VBE/Rubberduck.csproj +++ b/RetailCoder.VBE/Rubberduck.csproj @@ -481,6 +481,10 @@ EncapsulateFieldView.xaml + + ExtractInterfaceView.xaml + + @@ -589,7 +593,6 @@ - @@ -768,10 +771,10 @@ EncapsulateFieldDialog.cs - + Form - + ExtractInterfaceDialog.cs @@ -1111,7 +1114,7 @@ EncapsulateFieldDialog.cs - + ExtractInterfaceDialog.cs @@ -1498,6 +1501,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + MSBuild:Compile Designer diff --git a/RetailCoder.VBE/Rubberduck.csproj.DotSettings b/RetailCoder.VBE/Rubberduck.csproj.DotSettings index 73e96563f9..9d43df2230 100644 --- a/RetailCoder.VBE/Rubberduck.csproj.DotSettings +++ b/RetailCoder.VBE/Rubberduck.csproj.DotSettings @@ -1,2 +1,3 @@  - CSharp60 \ No newline at end of file + CSharp60 + True \ No newline at end of file diff --git a/RetailCoder.VBE/UI/Command/Refactorings/RefactorExtractInterfaceCommand.cs b/RetailCoder.VBE/UI/Command/Refactorings/RefactorExtractInterfaceCommand.cs index ab486bac6b..088a91563d 100644 --- a/RetailCoder.VBE/UI/Command/Refactorings/RefactorExtractInterfaceCommand.cs +++ b/RetailCoder.VBE/UI/Command/Refactorings/RefactorExtractInterfaceCommand.cs @@ -5,6 +5,7 @@ using Rubberduck.Parsing.VBA; using Rubberduck.Refactorings.ExtractInterface; using Rubberduck.UI.Refactorings; +using Rubberduck.UI.Refactorings.ExtractInterface; using Rubberduck.VBEditor.SafeComWrappers.Abstract; namespace Rubberduck.UI.Command.Refactorings @@ -58,7 +59,7 @@ protected override void ExecuteImpl(object parameter) return; } - using (var view = new ExtractInterfaceDialog()) + using (var view = new ExtractInterfaceDialog(new ExtractInterfaceViewModel())) { var factory = new ExtractInterfacePresenterFactory(Vbe, _state, view); var refactoring = new ExtractInterfaceRefactoring(Vbe, _state, _messageBox, factory); diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.Designer.cs b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.Designer.cs new file mode 100644 index 0000000000..e5dd06db73 --- /dev/null +++ b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.Designer.cs @@ -0,0 +1,68 @@ +namespace Rubberduck.UI.Refactorings.ExtractInterface +{ + partial class ExtractInterfaceDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExtractInterfaceDialog)); + this.elementHost1 = new System.Windows.Forms.Integration.ElementHost(); + this.ExtractInterfaceViewElement = new Rubberduck.UI.Refactorings.ExtractInterface.ExtractInterfaceView(); + this.SuspendLayout(); + // + // elementHost1 + // + this.elementHost1.Dock = System.Windows.Forms.DockStyle.Fill; + this.elementHost1.Location = new System.Drawing.Point(0, 0); + this.elementHost1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); + this.elementHost1.Name = "elementHost1"; + this.elementHost1.Size = new System.Drawing.Size(667, 513); + this.elementHost1.TabIndex = 1; + this.elementHost1.Text = "elementHost1"; + this.elementHost1.Child = this.ExtractInterfaceViewElement; + // + // ExtractInterfaceDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(459, 339); + this.Controls.Add(this.elementHost1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "ExtractInterfaceDialog"; + this.ShowInTaskbar = false; + this.Text = "Rubberduck - Extract Interface"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Integration.ElementHost elementHost1; + private ExtractInterfaceView ExtractInterfaceViewElement; + } +} diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.cs b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.cs new file mode 100644 index 0000000000..31dde7171a --- /dev/null +++ b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.cs @@ -0,0 +1,28 @@ +using System.Windows.Forms; + +namespace Rubberduck.UI.Refactorings.ExtractInterface +{ + public partial class ExtractInterfaceDialog : Form, IRefactoringDialog + { + public ExtractInterfaceViewModel ViewModel { get; } + + private ExtractInterfaceDialog() + { + InitializeComponent(); + Text = RubberduckUI.ExtractInterface_Caption; + } + + public ExtractInterfaceDialog(ExtractInterfaceViewModel vm) : this() + { + ViewModel = vm; + ExtractInterfaceViewElement.DataContext = vm; + vm.OnWindowClosed += ViewModel_OnWindowClosed; + } + + void ViewModel_OnWindowClosed(object sender, DialogResult result) + { + DialogResult = result; + Close(); + } + } +} diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.resx b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.resx similarity index 100% rename from RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.resx rename to RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceDialog.resx diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml new file mode 100644 index 0000000000..096d88fecd --- /dev/null +++ b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml.cs b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml.cs new file mode 100644 index 0000000000..f86b9f0c69 --- /dev/null +++ b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Rubberduck.UI.Refactorings.ExtractInterface +{ + /// + /// Interaction logic for ExtractInterfaceView.xaml + /// + public partial class ExtractInterfaceView : UserControl + { + public ExtractInterfaceView() + { + InitializeComponent(); + } + } +} diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceViewModel.cs b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceViewModel.cs new file mode 100644 index 0000000000..a1f793ce2e --- /dev/null +++ b/RetailCoder.VBE/UI/Refactorings/ExtractInterface/ExtractInterfaceViewModel.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using NLog; +using Rubberduck.Parsing.Grammar; +using Rubberduck.Refactorings.ExtractInterface; +using Rubberduck.UI.Command; + +namespace Rubberduck.UI.Refactorings.ExtractInterface +{ + public class ExtractInterfaceViewModel : ViewModelBase + { + public ExtractInterfaceViewModel() + { + OkButtonCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => DialogOk()); + CancelButtonCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => DialogCancel()); + SelectAllCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => ToggleSelection(true)); + DeselectAllCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => ToggleSelection(false)); + } + + private List _members; + public List Members + { + get { return _members; } + set + { + _members = value; + OnPropertyChanged(); + } + } + + public List ComponentNames { get; set; } + + private string _interfaceName; + public string InterfaceName + { + get { return _interfaceName; } + set + { + _interfaceName = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(IsValidInterfaceName)); + } + } + + public bool IsValidInterfaceName + { + get + { + var tokenValues = typeof(Tokens).GetFields().Select(item => item.GetValue(null)).Cast().Select(item => item); + + return !ComponentNames.Contains(InterfaceName) + && InterfaceName.Length > 1 + && char.IsLetter(InterfaceName.FirstOrDefault()) + && !tokenValues.Contains(InterfaceName, StringComparer.InvariantCultureIgnoreCase) + && !InterfaceName.Any(c => !char.IsLetterOrDigit(c) && c != '_'); + } + } + + public event EventHandler OnWindowClosed; + private void DialogCancel() => OnWindowClosed?.Invoke(this, DialogResult.Cancel); + private void DialogOk() => OnWindowClosed?.Invoke(this, DialogResult.OK); + + private void ToggleSelection(bool value) + { + foreach (var item in Members) + { + item.IsSelected = value; + } + } + + public CommandBase OkButtonCommand { get; } + public CommandBase CancelButtonCommand { get; } + public CommandBase SelectAllCommand { get; } + public CommandBase DeselectAllCommand { get; } + } +} diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.Designer.cs b/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.Designer.cs deleted file mode 100644 index d3b4e7b2b1..0000000000 --- a/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.Designer.cs +++ /dev/null @@ -1,251 +0,0 @@ -namespace Rubberduck.UI.Refactorings -{ - partial class ExtractInterfaceDialog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExtractInterfaceDialog)); - this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); - this.CancelDialogButton = new System.Windows.Forms.Button(); - this.OkButton = new System.Windows.Forms.Button(); - this.InvalidNameValidationIcon = new System.Windows.Forms.PictureBox(); - this.InterfaceNameBox = new System.Windows.Forms.TextBox(); - this.NameLabel = new System.Windows.Forms.Label(); - this.TitleLabel = new System.Windows.Forms.Label(); - this.InstructionsLabel = new System.Windows.Forms.Label(); - this.DescriptionPanel = new System.Windows.Forms.Panel(); - this.MembersGroupBox = new System.Windows.Forms.GroupBox(); - this.InterfaceMembersGridView = new System.Windows.Forms.DataGridView(); - this.DeselectAllButton = new System.Windows.Forms.Button(); - this.SelectAllButton = new System.Windows.Forms.Button(); - this.flowLayoutPanel2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.InvalidNameValidationIcon)).BeginInit(); - this.DescriptionPanel.SuspendLayout(); - this.MembersGroupBox.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.InterfaceMembersGridView)).BeginInit(); - this.SuspendLayout(); - // - // flowLayoutPanel2 - // - this.flowLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlDark; - this.flowLayoutPanel2.Controls.Add(this.CancelDialogButton); - this.flowLayoutPanel2.Controls.Add(this.OkButton); - this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom; - this.flowLayoutPanel2.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; - this.flowLayoutPanel2.Location = new System.Drawing.Point(0, 296); - this.flowLayoutPanel2.Name = "flowLayoutPanel2"; - this.flowLayoutPanel2.Padding = new System.Windows.Forms.Padding(8, 8, 0, 8); - this.flowLayoutPanel2.Size = new System.Drawing.Size(459, 43); - this.flowLayoutPanel2.TabIndex = 28; - // - // CancelDialogButton - // - this.CancelDialogButton.BackColor = System.Drawing.SystemColors.ButtonFace; - this.CancelDialogButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelDialogButton.Location = new System.Drawing.Point(373, 11); - this.CancelDialogButton.Name = "CancelDialogButton"; - this.CancelDialogButton.Size = new System.Drawing.Size(75, 23); - this.CancelDialogButton.TabIndex = 5; - this.CancelDialogButton.Text = "Cancel"; - this.CancelDialogButton.UseVisualStyleBackColor = false; - // - // OkButton - // - this.OkButton.BackColor = System.Drawing.SystemColors.ButtonFace; - this.OkButton.DialogResult = System.Windows.Forms.DialogResult.OK; - this.OkButton.Location = new System.Drawing.Point(292, 11); - this.OkButton.Name = "OkButton"; - this.OkButton.Size = new System.Drawing.Size(75, 23); - this.OkButton.TabIndex = 4; - this.OkButton.Text = "Ok"; - this.OkButton.UseVisualStyleBackColor = false; - // - // InvalidNameValidationIcon - // - this.InvalidNameValidationIcon.Image = global::Rubberduck.Properties.Resources.cross_circle; - this.InvalidNameValidationIcon.Location = new System.Drawing.Point(412, 83); - this.InvalidNameValidationIcon.Name = "InvalidNameValidationIcon"; - this.InvalidNameValidationIcon.Size = new System.Drawing.Size(16, 16); - this.InvalidNameValidationIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.InvalidNameValidationIcon.TabIndex = 32; - this.InvalidNameValidationIcon.TabStop = false; - // - // InterfaceNameBox - // - this.InterfaceNameBox.Location = new System.Drawing.Point(12, 91); - this.InterfaceNameBox.Name = "InterfaceNameBox"; - this.InterfaceNameBox.Size = new System.Drawing.Size(437, 20); - this.InterfaceNameBox.TabIndex = 0; - // - // NameLabel - // - this.NameLabel.AutoSize = true; - this.NameLabel.Location = new System.Drawing.Point(10, 74); - this.NameLabel.Name = "NameLabel"; - this.NameLabel.Size = new System.Drawing.Size(38, 13); - this.NameLabel.TabIndex = 29; - this.NameLabel.Text = "Name:"; - // - // TitleLabel - // - this.TitleLabel.AutoSize = true; - this.TitleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold); - this.TitleLabel.Location = new System.Drawing.Point(15, 9); - this.TitleLabel.Name = "TitleLabel"; - this.TitleLabel.Padding = new System.Windows.Forms.Padding(2); - this.TitleLabel.Size = new System.Drawing.Size(115, 19); - this.TitleLabel.TabIndex = 2; - this.TitleLabel.Text = "Extract Interface"; - // - // InstructionsLabel - // - this.InstructionsLabel.Location = new System.Drawing.Point(15, 24); - this.InstructionsLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.InstructionsLabel.Name = "InstructionsLabel"; - this.InstructionsLabel.Padding = new System.Windows.Forms.Padding(3); - this.InstructionsLabel.Size = new System.Drawing.Size(412, 28); - this.InstructionsLabel.TabIndex = 3; - this.InstructionsLabel.Text = "Please specify interface name and members."; - // - // DescriptionPanel - // - this.DescriptionPanel.BackColor = System.Drawing.Color.White; - this.DescriptionPanel.Controls.Add(this.TitleLabel); - this.DescriptionPanel.Controls.Add(this.InstructionsLabel); - this.DescriptionPanel.Dock = System.Windows.Forms.DockStyle.Top; - this.DescriptionPanel.Location = new System.Drawing.Point(0, 0); - this.DescriptionPanel.Name = "DescriptionPanel"; - this.DescriptionPanel.Size = new System.Drawing.Size(459, 68); - this.DescriptionPanel.TabIndex = 33; - // - // MembersGroupBox - // - this.MembersGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.MembersGroupBox.Controls.Add(this.InterfaceMembersGridView); - this.MembersGroupBox.Controls.Add(this.DeselectAllButton); - this.MembersGroupBox.Controls.Add(this.SelectAllButton); - this.MembersGroupBox.Location = new System.Drawing.Point(12, 115); - this.MembersGroupBox.Margin = new System.Windows.Forms.Padding(2); - this.MembersGroupBox.Name = "MembersGroupBox"; - this.MembersGroupBox.Padding = new System.Windows.Forms.Padding(2); - this.MembersGroupBox.Size = new System.Drawing.Size(436, 174); - this.MembersGroupBox.TabIndex = 1; - this.MembersGroupBox.TabStop = false; - this.MembersGroupBox.Text = "Members"; - // - // InterfaceMembersGridView - // - this.InterfaceMembersGridView.AllowUserToAddRows = false; - this.InterfaceMembersGridView.AllowUserToDeleteRows = false; - this.InterfaceMembersGridView.AllowUserToResizeColumns = false; - this.InterfaceMembersGridView.AllowUserToResizeRows = false; - this.InterfaceMembersGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.InterfaceMembersGridView.ColumnHeadersVisible = false; - this.InterfaceMembersGridView.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; - this.InterfaceMembersGridView.Location = new System.Drawing.Point(5, 21); - this.InterfaceMembersGridView.Margin = new System.Windows.Forms.Padding(2); - this.InterfaceMembersGridView.MultiSelect = false; - this.InterfaceMembersGridView.Name = "InterfaceMembersGridView"; - this.InterfaceMembersGridView.RowHeadersVisible = false; - this.InterfaceMembersGridView.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; - this.InterfaceMembersGridView.RowTemplate.Height = 24; - this.InterfaceMembersGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.InterfaceMembersGridView.ShowEditingIcon = false; - this.InterfaceMembersGridView.Size = new System.Drawing.Size(320, 141); - this.InterfaceMembersGridView.TabIndex = 1; - // - // DeselectAllButton - // - this.DeselectAllButton.Location = new System.Drawing.Point(331, 52); - this.DeselectAllButton.Margin = new System.Windows.Forms.Padding(2); - this.DeselectAllButton.Name = "DeselectAllButton"; - this.DeselectAllButton.Size = new System.Drawing.Size(100, 26); - this.DeselectAllButton.TabIndex = 3; - this.DeselectAllButton.Text = "Deselect All"; - this.DeselectAllButton.UseVisualStyleBackColor = true; - // - // SelectAllButton - // - this.SelectAllButton.Location = new System.Drawing.Point(331, 21); - this.SelectAllButton.Margin = new System.Windows.Forms.Padding(2); - this.SelectAllButton.Name = "SelectAllButton"; - this.SelectAllButton.Size = new System.Drawing.Size(100, 26); - this.SelectAllButton.TabIndex = 2; - this.SelectAllButton.Text = "Select All"; - this.SelectAllButton.UseVisualStyleBackColor = true; - // - // ExtractInterfaceDialog - // - this.AcceptButton = this.OkButton; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.CancelDialogButton; - this.ClientSize = new System.Drawing.Size(459, 339); - this.Controls.Add(this.MembersGroupBox); - this.Controls.Add(this.DescriptionPanel); - this.Controls.Add(this.InvalidNameValidationIcon); - this.Controls.Add(this.InterfaceNameBox); - this.Controls.Add(this.NameLabel); - this.Controls.Add(this.flowLayoutPanel2); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Margin = new System.Windows.Forms.Padding(2); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ExtractInterfaceDialog"; - this.ShowInTaskbar = false; - this.Text = "Rubberduck - Extract Interface"; - this.flowLayoutPanel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.InvalidNameValidationIcon)).EndInit(); - this.DescriptionPanel.ResumeLayout(false); - this.DescriptionPanel.PerformLayout(); - this.MembersGroupBox.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.InterfaceMembersGridView)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; - private System.Windows.Forms.Button CancelDialogButton; - private System.Windows.Forms.Button OkButton; - private System.Windows.Forms.PictureBox InvalidNameValidationIcon; - private System.Windows.Forms.TextBox InterfaceNameBox; - private System.Windows.Forms.Label NameLabel; - private System.Windows.Forms.Label TitleLabel; - private System.Windows.Forms.Label InstructionsLabel; - private System.Windows.Forms.Panel DescriptionPanel; - private System.Windows.Forms.GroupBox MembersGroupBox; - private System.Windows.Forms.Button DeselectAllButton; - private System.Windows.Forms.Button SelectAllButton; - private System.Windows.Forms.DataGridView InterfaceMembersGridView; - } -} diff --git a/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.cs b/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.cs deleted file mode 100644 index 24dace9af6..0000000000 --- a/RetailCoder.VBE/UI/Refactorings/ExtractInterfaceDialog.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; -using Rubberduck.Parsing.Grammar; -using Rubberduck.Refactorings.ExtractInterface; - -namespace Rubberduck.UI.Refactorings -{ - public partial class ExtractInterfaceDialog : Form, IExtractInterfaceDialog - { - public string InterfaceName - { - get { return InterfaceNameBox.Text; } - set { InterfaceNameBox.Text = value; } - } - - private IEnumerable _members; - public IEnumerable Members - { - get { return _members; } - set - { - _members = value; - InitializeParameterGrid(); - } - } - - public List ComponentNames { get; set; } - - public ExtractInterfaceDialog() - { - InitializeComponent(); - Localize(); - - InterfaceNameBox.TextChanged += InterfaceNameBox_TextChanged; - InterfaceMembersGridView.CellValueChanged += InterfaceMembersGridView_CellValueChanged; - SelectAllButton.Click += SelectAllButton_Click; - DeselectAllButton.Click += DeselectAllButton_Click; - } - - private void Localize() - { - Text = RubberduckUI.ExtractInterface_Caption; - OkButton.Text = RubberduckUI.OK; - CancelDialogButton.Text = RubberduckUI.CancelButtonText; - - NameLabel.Text = RubberduckUI.NameLabelText; - TitleLabel.Text = RubberduckUI.ExtractInterface_TitleLabel; - InstructionsLabel.Text = RubberduckUI.ExtractInterface_InstructionLabel; - DeselectAllButton.Text = RubberduckUI.DeselectAll_Button; - SelectAllButton.Text = RubberduckUI.SelectAll_Button; - MembersGroupBox.Text = RubberduckUI.ExtractInterface_MembersGroupBox; - } - - private void InterfaceNameBox_TextChanged(object sender, EventArgs e) - { - ValidateNewName(); - } - - private void InterfaceMembersGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) - { - _members.ElementAt(e.RowIndex).IsSelected = - (bool) InterfaceMembersGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; - } - - private void SelectAllButton_Click(object sender, EventArgs e) - { - ToggleSelection(true); - } - - private void DeselectAllButton_Click(object sender, EventArgs e) - { - ToggleSelection(false); - } - - private void InitializeParameterGrid() - { - InterfaceMembersGridView.AutoGenerateColumns = false; - InterfaceMembersGridView.Columns.Clear(); - InterfaceMembersGridView.DataSource = Members; - InterfaceMembersGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.Lavender; - InterfaceMembersGridView.MultiSelect = false; - - var isSelected = new DataGridViewCheckBoxColumn - { - AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, - Name = "IsSelected", - DataPropertyName = "IsSelected", - HeaderText = string.Empty, - ReadOnly = false - }; - - var signature = new DataGridViewTextBoxColumn - { - AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, - Name = "Members", - DataPropertyName = "FullMemberSignature", - ReadOnly = true - }; - - InterfaceMembersGridView.Columns.AddRange(isSelected, signature); - } - - private void ToggleSelection(bool state) - { - foreach (var row in InterfaceMembersGridView.Rows.Cast()) - { - row.Cells["IsSelected"].Value = state; - } - } - - private void ValidateNewName() - { - var tokenValues = typeof(Tokens).GetFields().Select(item => item.GetValue(null)).Cast().Select(item => item); - - OkButton.Enabled = !ComponentNames.Contains(InterfaceName) - && InterfaceName.Length > 1 - && char.IsLetter(InterfaceName.FirstOrDefault()) - && !tokenValues.Contains(InterfaceName, StringComparer.InvariantCultureIgnoreCase) - && !InterfaceName.Any(c => !char.IsLetterOrDigit(c) && c != '_'); - - InvalidNameValidationIcon.Visible = !OkButton.Enabled; - } - } -} diff --git a/RubberduckTests/Refactoring/ExtractInterfaceTests.cs b/RubberduckTests/Refactoring/ExtractInterfaceTests.cs index 4f294033a0..f0f99b5f11 100644 --- a/RubberduckTests/Refactoring/ExtractInterfaceTests.cs +++ b/RubberduckTests/Refactoring/ExtractInterfaceTests.cs @@ -5,6 +5,8 @@ using Rubberduck.Parsing.Symbols; using Rubberduck.Refactorings; using Rubberduck.Refactorings.ExtractInterface; +using Rubberduck.UI.Refactorings; +using Rubberduck.UI.Refactorings.ExtractInterface; using Rubberduck.VBEditor; using Rubberduck.VBEditor.SafeComWrappers; using Rubberduck.VBEditor.SafeComWrappers.Abstract; @@ -407,8 +409,9 @@ public void Presenter_Reject_ReturnsNull() var model = new ExtractInterfaceModel(state, qualifiedSelection); model.Members.ElementAt(0).IsSelected = true; - var view = new Mock(); - view.Setup(v => v.ShowDialog()).Returns(DialogResult.Cancel); + var view = new Mock>(); + view.Setup(v => v.ViewModel).Returns(new ExtractInterfaceViewModel()); + view.Setup(v => v.DialogResult).Returns(DialogResult.Cancel); var factory = new ExtractInterfacePresenterFactory(vbe.Object, state, view.Object); @@ -434,40 +437,13 @@ public void Presenter_NullTarget_ReturnsNull() var model = new ExtractInterfaceModel(state, qualifiedSelection); - var view = new Mock(); + var view = new Mock>(); + view.SetupGet(v => v.ViewModel).Returns(new ExtractInterfaceViewModel()); var presenter = new ExtractInterfacePresenter(view.Object, model); Assert.AreEqual(null, presenter.Show()); } - [TestMethod] - public void Presenter_Accept_ReturnsUpdatedModel() - { - //Input - const string inputCode = -@"Public Sub Foo(ByVal arg1 As Integer, ByVal arg2 As String) -End Sub"; - var selection = new Selection(1, 15, 1, 15); - - IVBComponent component; - var vbe = MockVbeBuilder.BuildFromSingleModule(inputCode, ComponentType.ClassModule, out component, selection); - var state = MockParser.CreateAndParse(vbe.Object); - - var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection); - - var model = new ExtractInterfaceModel(state, qualifiedSelection); - model.Members.ElementAt(0).IsSelected = true; - - var view = new Mock(); - view.Setup(v => v.ShowDialog()).Returns(DialogResult.OK); - view.Setup(v => v.InterfaceName).Returns("Class1"); - - var factory = new ExtractInterfacePresenterFactory(vbe.Object, state, view.Object); - var presenter = factory.Create(); - - Assert.AreEqual("Class1", presenter.Show().InterfaceName); - } - [TestMethod] public void Factory_NoMembersInTarget_ReturnsNull() {