1- namespace Rubberduck . Settings
1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using Rubberduck . Common . Hotkeys ;
5+
6+ namespace Rubberduck . Settings
27{
38 public interface IHotkeySettings
49 {
@@ -7,23 +12,84 @@ public interface IHotkeySettings
712
813 public class HotkeySettings : IHotkeySettings
914 {
10- public HotkeySetting [ ] Settings { get ; set ; }
15+ private static readonly HotkeySetting [ ] Defaults =
16+ {
17+ new HotkeySetting { Name = RubberduckHotkey . ParseAll . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "`" } ,
18+ new HotkeySetting { Name = RubberduckHotkey . IndentProcedure . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "P" } ,
19+ new HotkeySetting { Name = RubberduckHotkey . IndentModule . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "M" } ,
20+ new HotkeySetting { Name = RubberduckHotkey . CodeExplorer . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "R" } ,
21+ new HotkeySetting { Name = RubberduckHotkey . FindSymbol . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "T" } ,
22+ new HotkeySetting { Name = RubberduckHotkey . InspectionResults . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "I" } ,
23+ new HotkeySetting { Name = RubberduckHotkey . TestExplorer . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "T" } ,
24+ new HotkeySetting { Name = RubberduckHotkey . RefactorMoveCloserToUsage . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "C" } ,
25+ new HotkeySetting { Name = RubberduckHotkey . RefactorRename . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "R" } ,
26+ new HotkeySetting { Name = RubberduckHotkey . RefactorExtractMethod . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "M" }
27+ } ;
28+
29+ private HashSet < HotkeySetting > _settings ;
1130
1231 public HotkeySettings ( )
1332 {
14- Settings = new [ ]
33+ Settings = Defaults . ToArray ( ) ;
34+ }
35+
36+ public HotkeySetting [ ] Settings
37+ {
38+ get { return _settings . ToArray ( ) ; }
39+ set
40+ {
41+ if ( value == null || value . Length == 0 )
42+ {
43+ _settings = new HashSet < HotkeySetting > ( Defaults ) ;
44+ return ;
45+ }
46+ _settings = new HashSet < HotkeySetting > ( ) ;
47+ var incoming = value . ToList ( ) ;
48+ //Make sure settings are valid to keep trash out of the config file.
49+ RubberduckHotkey assigned ;
50+ incoming . RemoveAll ( h => ! Enum . TryParse ( h . Name , out assigned ) || ! IsValid ( h ) ) ;
51+
52+ //Only take the first setting if multiple definitions are found.
53+ foreach ( var setting in incoming . GroupBy ( s => s . Name ) . Select ( hotkey => hotkey . First ( ) ) )
54+ {
55+ //Only allow one hotkey to be enabled with the same key combination.
56+ setting . IsEnabled &= ! IsDuplicate ( setting ) ;
57+ _settings . Add ( setting ) ;
58+ }
59+
60+ //Merge any hotkeys that weren't found in the input.
61+ foreach ( var setting in Defaults . Where ( setting => _settings . FirstOrDefault ( s => s . Name . Equals ( setting . Name ) ) == null ) )
62+ {
63+ setting . IsEnabled &= ! IsDuplicate ( setting ) ;
64+ _settings . Add ( setting ) ;
65+ }
66+ }
67+ }
68+
69+ private bool IsDuplicate ( HotkeySetting candidate )
70+ {
71+ return _settings . FirstOrDefault (
72+ s =>
73+ s . Key1 == candidate . Key1 &&
74+ s . Key2 == candidate . Key2 &&
75+ s . HasAltModifier == candidate . HasAltModifier &&
76+ s . HasCtrlModifier == candidate . HasCtrlModifier &&
77+ s . HasShiftModifier == candidate . HasShiftModifier ) != null ;
78+ }
79+
80+ private static bool IsValid ( HotkeySetting candidate )
81+ {
82+ //This feels a bit sleazy...
83+ try
84+ {
85+ // ReSharper disable once UnusedVariable
86+ var test = new Hotkey ( new IntPtr ( ) , candidate . ToString ( ) , null ) ;
87+ return true ;
88+ }
89+ catch
1590 {
16- new HotkeySetting { Name = RubberduckHotkey . ParseAll . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "`" } ,
17- new HotkeySetting { Name = RubberduckHotkey . IndentProcedure . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "P" } ,
18- new HotkeySetting { Name = RubberduckHotkey . IndentModule . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "M" } ,
19- new HotkeySetting { Name = RubberduckHotkey . CodeExplorer . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "R" } ,
20- new HotkeySetting { Name = RubberduckHotkey . FindSymbol . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , Key1 = "T" } ,
21- new HotkeySetting { Name = RubberduckHotkey . InspectionResults . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "I" } ,
22- new HotkeySetting { Name = RubberduckHotkey . TestExplorer . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "T" } ,
23- new HotkeySetting { Name = RubberduckHotkey . RefactorMoveCloserToUsage . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "C" } ,
24- new HotkeySetting { Name = RubberduckHotkey . RefactorRename . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "R" } ,
25- new HotkeySetting { Name = RubberduckHotkey . RefactorExtractMethod . ToString ( ) , IsEnabled = true , HasCtrlModifier = true , HasShiftModifier = true , Key1 = "M" }
26- } ;
91+ return false ;
92+ }
2793 }
2894 }
2995}
0 commit comments