annotate ShortcutKeyFinder/MainForm.cs @ 0:209d9210c18f default tip

It works.
author Brad Greco <brad@bgreco.net>
date Sat, 25 Jun 2016 13:42:54 +1000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
1 using Microsoft.Win32;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
2 using System;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
3 using System.Collections.Generic;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
4 using System.ComponentModel;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
5 using System.Diagnostics;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
6 using System.Drawing;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
7 using System.Linq;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
8 using System.Security.Principal;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
9 using System.Windows.Forms;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
10
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
11 namespace ShortcutKeyFinder
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
12 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
13 /// <summary>Shortcut key manager main form</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
14 public partial class MainForm : Form
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
15 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
16 private const int _iconSize = 16;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
17 private const int _iconMargin = 4;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
18 private const string _registryKey = "Software\\ShortcutKeyManager", _showAllPreference = "ShowAllShortcuts";
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
19 private bool _suspendUpdates, _suspendUpdateButtons;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
20 private int _firstDisplayedRowIndex;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
21 private ShortcutKeyFinder _shortcutKeyFinder;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
22 private BindingSource _dataSource;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
23 private SolidBrush _textBrush;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
24 private StringFormat _cellFormat;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
25 private List<Shortcut> _oldSelection;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
26 private Hotkey _hotkey;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
27
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
28 /// <summary>List of shortcuts currently selected by the user</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
29 private List<Shortcut> SelectedShortcuts
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
30 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
31 get
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
32 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
33 List<Shortcut> shortcuts = new List<Shortcut>();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
34 foreach (DataGridViewRow row in ShortcutGrid.SelectedRows)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
35 if ((ShortcutGrid.DataSource as BindingSource).Count > row.Index)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
36 shortcuts.Add((Shortcut)row.DataBoundItem);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
37 return shortcuts;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
38 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
39 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
40
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
41 /// <summary>Data source for the shortcut grid</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
42 private BindingList<Shortcut> Shortcuts { get { return _shortcutKeyFinder != null ? _shortcutKeyFinder.Shortcuts : null; } }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
43
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
44 /// <summary>Constructor and form initialization</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
45 public MainForm()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
46 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
47 InitializeComponent();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
48 // Set up grid data source
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
49 _shortcutKeyFinder = new ShortcutKeyFinder();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
50 _dataSource = new BindingSource() { DataSource = _shortcutKeyFinder.Shortcuts };
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
51 // Cell format for custom painting of shortcut icons and names in the same cell
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
52 _cellFormat = new StringFormat(StringFormatFlags.NoWrap) { LineAlignment = StringAlignment.Center, Trimming = StringTrimming.EllipsisCharacter };
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
53
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
54 // Set up grid
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
55 ShortcutGrid.AutoGenerateColumns = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
56 HotkeyColumn.ReadOnly = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
57 ShortcutGrid.DataSource = _dataSource;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
58 ShortcutGrid.CellParsing += ShortcutGrid_CellParsing;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
59 _shortcutKeyFinder.Shortcuts.ListChanged += Shortcuts_ListChanged;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
60
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
61 // Set up UI
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
62 SetupElevateButton();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
63 LoadPreferences();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
64
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
65 // Reduce grid flicker
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
66 typeof(DataGridView).InvokeMember("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty, null, ShortcutGrid, new object[] { true });
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
67 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
68
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
69 /// <summary>Refreshes data when form receives focus</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
70 protected override void OnActivated(EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
71 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
72 base.OnActivated(e);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
73 if (!_suspendUpdates)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
74 FindShortcutWorker.RunWorkerAsync();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
75 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
76
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
77 /// <summary>Cancels the inline editor if the user leaves the program</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
78 protected override void OnDeactivate(EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
79 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
80 ShortcutGrid.CancelEdit();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
81 ShortcutGrid.EndEdit();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
82 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
83
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
84 /// <summary>Scans for shortcuts in the background</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
85 private void FindShortcutWorker_DoWork(object sender, DoWorkEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
86 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
87 // Disable list change events while scan is in progress
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
88 _dataSource.RaiseListChangedEvents = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
89 _shortcutKeyFinder.LoadShortcuts(IsAdministrator());
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
90 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
91
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
92 /// <summary>Updates the grid after the scan is complete</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
93 private void FindShortcutWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
94 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
95 _suspendUpdateButtons = true; // Prevent button flicker
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
96 // Save UI state
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
97 _firstDisplayedRowIndex = ShortcutGrid.FirstDisplayedScrollingRowIndex;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
98 _oldSelection = SelectedShortcuts.ToList();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
99
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
100 // Refresh the grid
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
101 _dataSource.RaiseListChangedEvents = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
102 _dataSource.ResetBindings(false);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
103 ShortcutGrid.ClearSelection();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
104
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
105 // Restore UI state
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
106 if (ShortcutGrid.Rows.Count > 0)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
107 ShortcutGrid.FirstDisplayedScrollingRowIndex = Math.Max(0, Math.Min(_firstDisplayedRowIndex, ShortcutGrid.Rows.Count - 1));
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
108 foreach (DataGridViewRow row in ShortcutGrid.Rows)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
109 row.Selected = _oldSelection.Contains((Shortcut)row.DataBoundItem);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
110 _suspendUpdateButtons = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
111 UpdateButtons();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
112
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
113 // Hide busy indicators that appear when the form is first launched
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
114 InitialProgressBar.Visible = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
115 ShortcutGrid.Visible = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
116 Cursor = Cursors.Default;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
117 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
118
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
119 /// <summary>Updates the UI when a shortcut's properties have changed</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
120 void Shortcuts_ListChanged(object sender, ListChangedEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
121 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
122 // Update the "Clear shortcut key" button since the selection's shortcut may have been set or unset
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
123 if (!_suspendUpdateButtons)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
124 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
125 if (this.InvokeRequired)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
126 this.Invoke(new Action(() => UpdateButtons()));
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
127 else
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
128 UpdateButtons();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
129 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
130 // Force repainting of changed rows so the background color gets updated
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
131 if (e.ListChangedType == ListChangedType.ItemChanged && e.NewIndex < ShortcutGrid.Rows.Count)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
132 ShortcutGrid.InvalidateRow(e.NewIndex);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
133 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
134
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
135 /// <summary>Enables or disables the buttons depending on the current selection</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
136 private void UpdateButtons()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
137 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
138 ClearButton.Enabled = ShortcutGrid.SelectedRows.Count > 0 && SelectedShortcuts.Any(s => s.Hotkey != null);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
139 ClearAllButton.Enabled = Shortcuts.Any(s => s.Hotkey != null);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
140 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
141
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
142 /// <summary>Sets and saves a shortcut's hotkey</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
143 private void SetShortcutHotkey(Shortcut shortcut, Hotkey hotkey)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
144 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
145 try
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
146 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
147 shortcut.Hotkey = hotkey;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
148 shortcut.Save();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
149 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
150 catch
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
151 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
152 MessageBox.Show("Error setting shortcut key", "Set Shortcut Key", MessageBoxButtons.OK, MessageBoxIcon.Error);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
153 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
154 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
155
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
156 /// <summary>Sets cell background color based on its shortcut's properties, and inserts the shortcut's icon next to its name</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
157 private void ShortcutGrid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
158 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
159 // Header row
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
160 if (e.RowIndex < 0)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
161 return;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
162
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
163 DataGridViewRow row = ShortcutGrid.Rows[e.RowIndex];
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
164 Shortcut shortcut = (Shortcut)row.DataBoundItem;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
165
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
166 // Paint duplicate shortcut keys red
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
167 if (shortcut.HasDuplicateHotkey)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
168 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
169 e.CellStyle.BackColor = Color.DarkRed;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
170 e.CellStyle.ForeColor = Color.White;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
171 e.CellStyle.SelectionBackColor = Color.OrangeRed;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
172 e.CellStyle.SelectionForeColor = Color.White;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
173 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
174 // Paint readonly shortcuts gray
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
175 else if (shortcut.ReadOnly)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
176 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
177 e.CellStyle.BackColor = Color.LightGray;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
178 e.CellStyle.ForeColor = Color.Black;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
179 e.CellStyle.SelectionBackColor = Color.SteelBlue;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
180 e.CellStyle.SelectionForeColor = Color.White;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
181 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
182
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
183 // Paint the shortcut's icon next to its name
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
184 if (e.ColumnIndex == ShortcutColumn.Index)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
185 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
186 Color textColor = row.Selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
187 if (_textBrush == null || _textBrush.Color != textColor)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
188 _textBrush = new SolidBrush(textColor);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
189 e.PaintBackground(e.ClipBounds, row.Selected);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
190 Rectangle textRect = new Rectangle(e.CellBounds.X + _iconSize + _iconMargin * 2, e.CellBounds.Y, e.CellBounds.Width - _iconSize - _iconMargin * 2, e.CellBounds.Height);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
191 e.Graphics.DrawImage(shortcut.Icon, _iconMargin, textRect.Y + ((textRect.Height - _iconSize) / 2));
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
192 e.Graphics.DrawString(e.FormattedValue.ToString(), e.CellStyle.Font, _textBrush, textRect, _cellFormat);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
193 e.Handled = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
194 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
195 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
196
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
197 /// <summary>Triggers direct hotkey editing if the hotkey column is double clicked, or opens the shortcut's Properties window for any other column</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
198 private void ShortcutGrid_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
199 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
200 if (e.ColumnIndex == HotkeyColumn.Index)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
201 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
202 ShortcutGrid.CurrentCell = ShortcutGrid.Rows[e.RowIndex].Cells[e.ColumnIndex];
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
203 ShortcutGrid.BeginEdit(true);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
204 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
205 else
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
206 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
207 ((Shortcut)ShortcutGrid.Rows[e.RowIndex].DataBoundItem).ShowExplorerPropertiesWindow(Handle);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
208 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
209 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
210
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
211 /// <summary>Opens the Properties window for the selected row on Enter, or activates the inline shortcut editor on F2</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
212 private void ShortcutGrid_KeyDown(object sender, KeyEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
213 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
214 if (e.KeyCode == Keys.Enter)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
215 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
216 e.Handled = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
217 if (SelectedShortcuts.Count == 1)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
218 SelectedShortcuts[0].ShowExplorerPropertiesWindow(Handle);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
219 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
220 else if (e.KeyCode == Keys.F2)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
221 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
222 if (ShortcutGrid.SelectedRows.Count == 1)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
223 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
224 ShortcutGrid.CurrentCell = ShortcutGrid.SelectedRows[0].Cells[HotkeyColumn.Index];
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
225 ShortcutGrid.BeginEdit(true);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
226 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
227 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
228 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
229
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
230 /// <summary>Prepares the inline editor by clearing the text and registering event handlers</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
231 private void ShortcutGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
232 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
233 (e.Control as TextBox).Text = "";
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
234 (e.Control as TextBox).KeyDown += CellEditor_KeyDown;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
235 (e.Control as TextBox).PreviewKeyDown += CellEditor_PreviewKeyDown;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
236 (e.Control as TextBox).Leave += CellEditor_Leave;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
237 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
238
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
239 /// <summary>Removes event handlers from inline editor when it loses focus</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
240 void CellEditor_Leave(object sender, EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
241 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
242 (sender as TextBox).KeyDown -= CellEditor_KeyDown;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
243 (sender as TextBox).PreviewKeyDown -= CellEditor_PreviewKeyDown;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
244 (sender as TextBox).Leave -= CellEditor_Leave;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
245 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
246
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
247 /// <summary>Finishes inline hotkey editing on Enter</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
248 private void CellEditor_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
249 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
250 if (e.KeyCode == Keys.Enter)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
251 ShortcutGrid.EndEdit();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
252 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
253
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
254 /// <summary>Listens for key events when the inline editor is active and converts them to a hotkey</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
255 void CellEditor_KeyDown(object sender, KeyEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
256 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
257 System.Diagnostics.Debug.WriteLine("keydown");
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
258 if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
259 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
260 _hotkey = null;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
261 (sender as TextBox).Clear();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
262 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
263 else if (e.KeyCode != Keys.Enter)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
264 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
265 _hotkey = new Hotkey()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
266 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
267 KeyCode = (byte)e.KeyCode,
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
268 Control = e.Control,
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
269 Alt = e.Alt,
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
270 Shift = e.Shift
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
271 };
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
272 (sender as TextBox).Text = _hotkey.ToString();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
273 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
274 e.Handled = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
275 e.SuppressKeyPress = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
276 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
277
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
278 /// <summary>Saves the new hotkey to the data source and the shortcut when inline editing is complete</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
279 private void ShortcutGrid_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
280 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
281 e.ParsingApplied = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
282 e.Value = _hotkey;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
283 SetShortcutHotkey((Shortcut)ShortcutGrid.Rows[e.RowIndex].DataBoundItem, _hotkey);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
284 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
285
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
286 /// <summary>Updates the list view to show all shorcuts or only shortcuts with hotkeys</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
287 private void ShowAllCheckBox_CheckedChanged(object sender, EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
288 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
289 _shortcutKeyFinder.ShowAll = ShowAllCheckBox.Checked;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
290 ShortcutGrid.ClearSelection();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
291 SavePreferences();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
292 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
293
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
294 /// <summary>Removes the hotkeys from the selected shortcuts when the Clear button is clicked</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
295 private void ClearButton_Click(object sender, EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
296 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
297 foreach (Shortcut shortcut in SelectedShortcuts.Where(s => !s.ReadOnly && s.Hotkey != null))
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
298 SetShortcutHotkey(shortcut, null);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
299 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
300
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
301 /// <summary>Clears shortcuts from all hotkeys when the Clear All button is clicked</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
302 private void ClearAllButton_Click(object sender, EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
303 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
304 _suspendUpdates = true;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
305 if (MessageBox.Show("Are you sure you want to clear all assigned shortcut keys?", "Clear Shortcut Keys", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
306 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
307 foreach (Shortcut shortcut in Shortcuts.Where(s => !s.ReadOnly && s.Hotkey != null))
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
308 SetShortcutHotkey(shortcut, null);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
309 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
310 _suspendUpdates = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
311 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
312
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
313 /// <summary>Prepares for inline shortcut editing, or prevents it if the shortcut is read only</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
314 private void ShortcutGrid_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
315 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
316 _hotkey = null;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
317 e.Cancel = ((Shortcut)ShortcutGrid.Rows[e.RowIndex].DataBoundItem).ReadOnly;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
318 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
319
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
320 /// <summary>Updates the button state when the grid selection changes</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
321 private void ShortcutGrid_SelectionChanged(object sender, EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
322 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
323 if (!_suspendUpdateButtons)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
324 UpdateButtons();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
325 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
326
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
327 /// <summary>Updates the button state since the hotkey of the current item may have changed</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
328 private void ShortcutGrid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
329 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
330 if (!_suspendUpdateButtons)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
331 UpdateButtons();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
332 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
333
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
334 /// <summary>Checks whether the program is running with elevated permissions</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
335 /// <remarks>http://stackoverflow.com/a/11660205</remarks>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
336 public static bool IsAdministrator()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
337 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
338 return (new WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
339 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
340
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
341 /// <summary>Shows or hides the button to elevate to administrator based on whether the program is already running as an administrator</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
342 private void SetupElevateButton()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
343 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
344 if (IsAdministrator())
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
345 ElevateButton.Visible = false;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
346 else
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
347 Win32Helpers.AddUacShield(ElevateButton);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
348 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
349
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
350 /// <summary>Restarts the program, requesting elevation</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
351 private void ElevateButton_Click(object sender, EventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
352 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
353 ProcessStartInfo info = new ProcessStartInfo() { UseShellExecute = true, WorkingDirectory = Environment.CurrentDirectory, FileName = Application.ExecutablePath, Verb = "runas" };
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
354 try
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
355 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
356 Process.Start(info);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
357 Application.Exit();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
358 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
359 catch { } // Do nothing if the user canceled the consent dialog
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
360 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
361
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
362 /// <summary>Saves checkbox state so it can be restored when the program is relaunched later</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
363 private void SavePreferences()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
364 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
365 try
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
366 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
367 RegistryKey key = Registry.CurrentUser.CreateSubKey(_registryKey);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
368 key.SetValue(_showAllPreference, ShowAllCheckBox.Checked, RegistryValueKind.DWord);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
369 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
370 catch { } // Silently fail if we can't save preferences
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
371 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
372
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
373 /// <summary>Restores the checkbox state to the same as when the program last exited</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
374 private void LoadPreferences()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
375 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
376 try
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
377 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
378 RegistryKey key = Registry.CurrentUser.OpenSubKey(_registryKey);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
379 ShowAllCheckBox.Checked = Convert.ToBoolean((int)key.GetValue(_showAllPreference, 0));
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
380 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
381 catch { } // Silently fail if we can't load preferences
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
382 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
383
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
384 private void ShortcutGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
385 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
386 string tooltip = null;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
387 Shortcut shortcut = (Shortcut)ShortcutGrid.Rows[e.RowIndex].DataBoundItem;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
388
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
389 if (shortcut.HasDuplicateHotkey)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
390 tooltip = "More than one shortcut has the same hotkey assigned";
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
391 else if (shortcut.ReadOnly)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
392 tooltip = "Administrative privileges are required to edit this shortcut." + Environment.NewLine + "To edit, click the \"Allow editing shortcuts shared by all users\" button.";
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
393
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
394 ShortcutGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = tooltip;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
395 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
396 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
397 }