1 /*
2   KeePass Password Safe - The Open-Source Password Manager
3   Copyright (C) 2003-2021 Dominik Reichl <dominik.reichl@t-online.de>
4 
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2 of the License, or
8   (at your option) any later version.
9 
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14 
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software
17   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19 
20 using System;
21 using System.Collections.Generic;
22 using System.ComponentModel;
23 using System.Diagnostics;
24 using System.Drawing;
25 using System.Text;
26 using System.Windows.Forms;
27 
28 using KeePass.App;
29 using KeePass.App.Configuration;
30 using KeePass.Resources;
31 using KeePass.UI;
32 using KeePass.UI.ToolStripRendering;
33 using KeePass.Util;
34 
35 using KeePassLib;
36 using KeePassLib.Delegates;
37 using KeePassLib.Serialization;
38 using KeePassLib.Utility;
39 
40 using NativeLib = KeePassLib.Native.NativeLib;
41 
42 namespace KeePass.Forms
43 {
44 	/// <summary>
45 	/// Options dialog. In this dialog, global program options can be configured.
46 	/// </summary>
47 	public partial class OptionsForm : Form
48 	{
49 		private ImageList m_ilIcons;
50 		private BannerStyle m_bsCurrent = BannerStyle.KeePassWin32;
51 		private bool m_bBlockUIUpdate = false;
52 		private bool m_bLoadingSettings = false;
53 
54 		private CheckedLVItemDXList m_cdxSecurityOptions = null;
55 		private CheckedLVItemDXList m_cdxPolicy = null;
56 		private CheckedLVItemDXList m_cdxGuiOptions = null;
57 		private CheckedLVItemDXList m_cdxAdvanced = null;
58 
59 		private Dictionary<int, string> m_dTsrUuids = new Dictionary<int, string>();
60 		private int m_argbAltItemBg = 0;
61 		private Image m_imgAltItemBg = null;
62 
63 		private Keys m_kPrevAT = Keys.None;
64 		private Keys m_kPrevATP = Keys.None;
65 		private Keys m_kPrevATS = Keys.None;
66 		private Keys m_kPrevSW = Keys.None;
67 
68 		private AceUrlSchemeOverrides m_aceUrlSchemeOverrides = null;
69 		private string m_strUrlOverrideAll = string.Empty;
70 
71 		private string m_strInitialTsRenderer = string.Empty;
72 		public bool RequiresUIReinitialize
73 		{
74 			get { return (Program.Config.UI.ToolStripRenderer != m_strInitialTsRenderer); }
75 		}
76 
OptionsForm()77 		public OptionsForm()
78 		{
79 			InitializeComponent();
80 			GlobalWindowManager.InitializeForm(this);
81 		}
82 
InitEx(ImageList ilIcons)83 		public void InitEx(ImageList ilIcons)
84 		{
85 			InitEx(ilIcons, false);
86 		}
87 
InitEx(ImageList ilIcons, bool bForceInTaskbar)88 		public void InitEx(ImageList ilIcons, bool bForceInTaskbar)
89 		{
90 			Debug.Assert(ilIcons != null);
91 			m_ilIcons = ilIcons;
92 
93 			// Set ShowInTaskbar immediately, not later, otherwise the form
94 			// can disappear:
95 			// https://sourceforge.net/p/keepass/discussion/329220/thread/c95b5644/
96 			if(bForceInTaskbar) this.ShowInTaskbar = true;
97 		}
98 
CreateDialogBanner(BannerStyle bs)99 		private void CreateDialogBanner(BannerStyle bs)
100 		{
101 			if(bs == m_bsCurrent) return;
102 			m_bsCurrent = bs;
103 
104 			BannerStyle bsPrev = Program.Config.UI.BannerStyle;
105 			if(bs != BannerStyle.Default) Program.Config.UI.BannerStyle = bs;
106 
107 			BannerFactory.CreateBannerEx(this, m_bannerImage,
108 				Properties.Resources.B48x48_KCMSystem, KPRes.Options,
109 				KPRes.OptionsDesc);
110 
111 			if(bs != BannerStyle.Default) Program.Config.UI.BannerStyle = bsPrev;
112 		}
113 
OnFormLoad(object sender, EventArgs e)114 		private void OnFormLoad(object sender, EventArgs e)
115 		{
116 			// Can be invoked by tray command; don't use CenterParent
117 			Debug.Assert(this.StartPosition == FormStartPosition.CenterScreen);
118 
119 			// When multiline is enabled, tabs added by plugins can result
120 			// in multiple tab rows, cropping the tab content at the bottom;
121 			// https://sourceforge.net/p/keepass/discussion/329220/thread/a17a2734/
122 			Debug.Assert(!m_tabMain.Multiline);
123 
124 			GlobalWindowManager.AddWindow(this);
125 
126 			this.Icon = AppIcons.Default;
127 
128 			Debug.Assert(m_ilIcons != null);
129 			if(m_ilIcons != null)
130 			{
131 				m_tabMain.ImageList = m_ilIcons;
132 
133 				m_tabSecurity.ImageIndex = (int)PwIcon.TerminalEncrypted;
134 				m_tabPolicy.ImageIndex = (int)PwIcon.List;
135 				m_tabGui.ImageIndex = (int)PwIcon.Screen;
136 				m_tabIntegration.ImageIndex = (int)PwIcon.Console;
137 				m_tabAdvanced.ImageIndex = (int)PwIcon.ClipboardReady;
138 			}
139 
140 			uint uTab = Program.Config.Defaults.OptionsTabIndex;
141 			if(uTab < (uint)m_tabMain.TabPages.Count)
142 				m_tabMain.SelectedTab = m_tabMain.TabPages[(int)uTab];
143 
144 			m_aceUrlSchemeOverrides = Program.Config.Integration.UrlSchemeOverrides.CloneDeep();
145 			m_strUrlOverrideAll = Program.Config.Integration.UrlOverride;
146 
147 			Debug.Assert(!m_cmbMenuStyle.Sorted);
148 			m_cmbMenuStyle.Items.Add(KPRes.Auto + " (" + KPRes.Recommended + ")");
149 			m_cmbMenuStyle.Items.Add(new string('-', 24));
150 			int nTsrs = 2, iTsrSel = 0, nSuffixes = 0;
151 			foreach(TsrFactory fTsr in TsrPool.Factories)
152 			{
153 				string strSuffix = string.Empty;
154 				if(!fTsr.IsSupported())
155 				{
156 					strSuffix = " (" + KPRes.IncompatibleEnv + ")";
157 					++nSuffixes;
158 				}
159 
160 				string strUuid = Convert.ToBase64String(fTsr.Uuid.UuidBytes);
161 				if(Program.Config.UI.ToolStripRenderer == strUuid)
162 					iTsrSel = nTsrs;
163 
164 				m_cmbMenuStyle.Items.Add((fTsr.Name ?? string.Empty) + strSuffix);
165 				m_dTsrUuids[nTsrs] = strUuid;
166 				++nTsrs;
167 			}
168 			Debug.Assert(m_cmbMenuStyle.Items.Count == nTsrs);
169 			m_cmbMenuStyle.SelectedIndex = iTsrSel;
170 			if(nSuffixes > 0) m_cmbMenuStyle.DropDownWidth = m_cmbMenuStyle.Width * 2;
171 			if(AppConfigEx.IsOptionEnforced(Program.Config.UI, "ToolStripRenderer"))
172 			{
173 				m_lblMenuStyle.Enabled = false;
174 				m_cmbMenuStyle.Enabled = false;
175 			}
176 
177 			GAction<BannerStyle, string> fAddBannerStyle = delegate(
178 				BannerStyle bs, string strDisplay)
179 			{
180 				Debug.Assert(m_cmbBannerStyle.Items.Count == (long)bs);
181 				m_cmbBannerStyle.Items.Add(strDisplay);
182 			};
183 
184 			Debug.Assert(!m_cmbBannerStyle.Sorted);
185 			fAddBannerStyle(BannerStyle.Default, KPRes.CurrentStyle);
186 			fAddBannerStyle(BannerStyle.WinXPLogin, "Windows XP Login");
187 			fAddBannerStyle(BannerStyle.WinVistaBlack, "Windows Vista Black");
188 			fAddBannerStyle(BannerStyle.KeePassWin32, "KeePass Win32");
189 			fAddBannerStyle(BannerStyle.BlueCarbon, "Blue Carbon");
190 
191 			CreateDialogBanner(BannerStyle.Default); // Default forces generation
192 			m_cmbBannerStyle.SelectedIndex = (int)BannerStyle.Default;
193 			if((BannerFactory.CustomGenerator != null) ||
194 				AppConfigEx.IsOptionEnforced(Program.Config.UI, "BannerStyle"))
195 			{
196 				m_lblBannerStyle.Enabled = false;
197 				m_cmbBannerStyle.Enabled = false;
198 			}
199 
200 			AceEscAction aEscCur = Program.Config.MainWindow.EscAction;
201 			int iEscSel = (int)AceEscAction.Lock;
202 			GAction<AceEscAction, string> fAddEscAction = delegate(
203 				AceEscAction aEsc, string strDisplay)
204 			{
205 				if(aEsc == aEscCur) iEscSel = m_cmbEscAction.Items.Count;
206 				Debug.Assert(m_cmbEscAction.Items.Count == (long)aEsc);
207 				m_cmbEscAction.Items.Add(strDisplay);
208 			};
209 
210 			Debug.Assert(!m_cmbEscAction.Sorted);
211 			fAddEscAction(AceEscAction.None, KPRes.Ignore);
212 			fAddEscAction(AceEscAction.Lock, KPRes.LockWorkspace);
213 			fAddEscAction(AceEscAction.Minimize, KPRes.Minimize);
214 			fAddEscAction(AceEscAction.MinimizeToTray, KPRes.MinimizeToTrayStc);
215 			fAddEscAction(AceEscAction.Exit, KPRes.Exit);
216 
217 			m_cmbEscAction.SelectedIndex = iEscSel;
218 
219 			int nWidth = m_lvPolicy.ClientSize.Width - UIUtil.GetVScrollBarWidth();
220 			m_lvPolicy.Columns.Add(KPRes.Feature, (nWidth * 10) / 29);
221 			m_lvPolicy.Columns.Add(KPRes.Description, (nWidth * 19) / 29);
222 
223 			UIUtil.ConfigureToolTip(m_ttRect);
224 			UIUtil.SetToolTip(m_ttRect, m_cbClipClearTime, KPRes.ClipboardClearDesc +
225 				MessageService.NewParagraph + KPRes.ClipboardOptionME, false);
226 
227 			UIUtil.AccSetName(m_numLockAfterTime, m_cbLockAfterTime);
228 			UIUtil.AccSetName(m_numLockAfterGlobalTime, m_cbLockAfterGlobalTime);
229 			UIUtil.AccSetName(m_numClipClearTime, m_cbClipClearTime);
230 			UIUtil.AccSetName(m_numDefaultExpireDays, m_cbDefaultExpireDays);
231 			UIUtil.AccSetName(m_btnCustomAltColor, KPRes.SelectColor);
232 
233 			if(!NativeLib.IsUnix())
234 			{
235 				UIUtil.SetShield(m_btnFileExtCreate, true);
236 				UIUtil.SetShield(m_btnFileExtRemove, true);
237 
238 				m_linkHotKeyHelp.Visible = false;
239 			}
240 			else // Unix
241 			{
242 				m_hkAutoType.TextNone = KPRes.External;
243 				m_hkAutoTypePassword.TextNone = KPRes.External;
244 				m_hkAutoTypeSelected.TextNone = KPRes.External;
245 				m_hkShowWindow.TextNone = KPRes.External;
246 
247 				m_hkAutoType.Enabled = m_hkAutoTypePassword.Enabled =
248 					m_hkAutoTypeSelected.Enabled = m_hkShowWindow.Enabled = false;
249 				m_btnFileExtCreate.Enabled = m_btnFileExtRemove.Enabled = false;
250 				m_cbAutoRun.Enabled = false;
251 			}
252 
253 			UIUtil.SetExplorerTheme(m_lvSecurityOptions, false);
254 			UIUtil.SetExplorerTheme(m_lvPolicy, false);
255 			UIUtil.SetExplorerTheme(m_lvGuiOptions, false);
256 			UIUtil.SetExplorerTheme(m_lvAdvanced, false);
257 
258 			AppConfigEx.ClearXmlPathCache();
259 
260 			LoadOptions();
261 
262 			// if(Program.Config.Meta.IsEnforcedConfiguration)
263 			//	m_lvPolicy.Enabled = false;
264 
265 			UpdateUIState();
266 		}
267 
LoadOptions()268 		private void LoadOptions()
269 		{
270 			m_bLoadingSettings = true;
271 
272 			LoadSecurityOptions();
273 			LoadPolicyOptions();
274 			LoadGuiOptions();
275 			LoadIntegrationOptions();
276 			LoadAdvancedOptions();
277 
278 			m_bLoadingSettings = false;
279 		}
280 
LoadSecurityOptions()281 		private void LoadSecurityOptions()
282 		{
283 			AceWorkspaceLocking aceWL = Program.Config.Security.WorkspaceLocking;
284 
285 			uint uLockTime = aceWL.LockAfterTime;
286 			bool bLockTime = (uLockTime > 0);
287 			m_numLockAfterTime.Value = (bLockTime ? uLockTime : 300);
288 			m_cbLockAfterTime.Checked = bLockTime;
289 			if(AppConfigEx.IsOptionEnforced(aceWL, "LockAfterTime"))
290 				m_cbLockAfterTime.Enabled = false;
291 
292 			uLockTime = aceWL.LockAfterGlobalTime;
293 			bLockTime = (uLockTime > 0);
294 			m_numLockAfterGlobalTime.Value = (bLockTime ? uLockTime : 240);
295 			m_cbLockAfterGlobalTime.Checked = bLockTime;
296 			if(AppConfigEx.IsOptionEnforced(aceWL, "LockAfterGlobalTime"))
297 				m_cbLockAfterGlobalTime.Enabled = false;
298 
299 			int nDefaultExpireDays = Program.Config.Defaults.NewEntryExpiresInDays;
300 			if(nDefaultExpireDays < 0)
301 				m_cbDefaultExpireDays.Checked = false;
302 			else
303 			{
304 				m_cbDefaultExpireDays.Checked = true;
305 				try { m_numDefaultExpireDays.Value = nDefaultExpireDays; }
306 				catch(Exception) { Debug.Assert(false); }
307 			}
308 			if(AppConfigEx.IsOptionEnforced(Program.Config.Defaults, "NewEntryExpiresInDays"))
309 				m_cbDefaultExpireDays.Enabled = false;
310 
311 			int nClipClear = Program.Config.Security.ClipboardClearAfterSeconds;
312 			if(nClipClear >= 0)
313 			{
314 				m_cbClipClearTime.Checked = true;
315 				m_numClipClearTime.Value = nClipClear;
316 			}
317 			else m_cbClipClearTime.Checked = false;
318 			if(AppConfigEx.IsOptionEnforced(Program.Config.Security, "ClipboardClearAfterSeconds"))
319 				m_cbClipClearTime.Enabled = false;
320 
321 			m_lvSecurityOptions.Columns.Add(string.Empty); // Resize below
322 
323 			ListViewGroup lvg = new ListViewGroup(KPRes.General);
324 			m_lvSecurityOptions.Groups.Add(lvg);
325 			Debug.Assert(lvg.ListView == m_lvSecurityOptions);
326 
327 			m_cdxSecurityOptions = new CheckedLVItemDXList(m_lvSecurityOptions, true);
328 
329 			bool? obNoSEv = null; // Allow read-only by enforced config
330 			string strSEvSuffix = string.Empty;
331 			if(MonoWorkarounds.IsRequired(1378))
332 			{
333 				obNoSEv = true;
334 				strSEvSuffix = " (" + KPRes.UnsupportedByMono + ")";
335 			}
336 
337 			bool? obNoWin = null; // Allow read-only by enforced config
338 			if(NativeLib.IsUnix()) obNoWin = true;
339 
340 			m_cdxSecurityOptions.CreateItem(aceWL, "LockOnWindowMinimize",
341 				lvg, KPRes.LockOnMinimizeTaskbar);
342 			m_cdxSecurityOptions.CreateItem(aceWL, "LockOnWindowMinimizeToTray",
343 				lvg, KPRes.LockOnMinimizeTray);
344 			m_cdxSecurityOptions.CreateItem(aceWL, "LockOnSessionSwitch",
345 				lvg, KPRes.LockOnSessionSwitch + strSEvSuffix, obNoSEv);
346 			m_cdxSecurityOptions.CreateItem(aceWL, "LockOnSuspend",
347 				lvg, KPRes.LockOnSuspend + strSEvSuffix, obNoSEv);
348 			m_cdxSecurityOptions.CreateItem(aceWL, "LockOnRemoteControlChange",
349 				lvg, KPRes.LockOnRemoteControlChange + strSEvSuffix, obNoSEv);
350 			m_cdxSecurityOptions.CreateItem(aceWL, "ExitInsteadOfLockingAfterTime",
351 				lvg, KPRes.ExitInsteadOfLockingAfterTime);
352 			m_cdxSecurityOptions.CreateItem(aceWL, "AlwaysExitInsteadOfLocking",
353 				lvg, KPRes.ExitInsteadOfLockingAlways);
354 
355 			lvg = new ListViewGroup(KPRes.ClipboardMain);
356 			m_lvSecurityOptions.Groups.Add(lvg);
357 
358 			Action<ListViewItem> fClipME = delegate(ListViewItem lvi)
359 			{
360 				if(lvi == null) { Debug.Assert(false); return; }
361 				string str = lvi.Text;
362 				if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return; }
363 				lvi.ToolTipText = str + "." + MessageService.NewParagraph +
364 					KPRes.ClipboardOptionME;
365 			};
366 
367 			fClipME(m_cdxSecurityOptions.CreateItem(Program.Config.Security,
368 				"ClipboardClearOnExit", lvg, KPRes.ClipboardClearOnExit));
369 			fClipME(m_cdxSecurityOptions.CreateItem(Program.Config.Security,
370 				"ClipboardNoPersist", lvg, KPRes.ClipboardNoPersist));
371 			fClipME(m_cdxSecurityOptions.CreateItem(Program.Config.Security,
372 				"UseClipboardViewerIgnoreFormat", lvg,
373 				KPRes.ClipboardViewerIgnoreFormat // + " " + KPRes.NotRecommended
374 				));
375 
376 			lvg = new ListViewGroup(KPRes.Advanced);
377 			m_lvSecurityOptions.Groups.Add(lvg);
378 
379 			if(NativeLib.IsLibraryInstalled())
380 				m_cdxSecurityOptions.CreateItem(Program.Config.Native, "NativeKeyTransformations",
381 					lvg, KPRes.NativeLibUse);
382 
383 			m_cdxSecurityOptions.CreateItem(Program.Config.Security, "MasterKeyOnSecureDesktop",
384 				lvg, KPRes.MasterKeyOnSecureDesktop, obNoWin);
385 			m_cdxSecurityOptions.CreateItem(Program.Config.Security, "ClearKeyCommandLineParams",
386 				lvg, KPRes.ClearKeyCmdLineParams);
387 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.MasterPassword,
388 				"RememberWhileOpen", lvg, KPRes.MasterPasswordRmbWhileOpen);
389 
390 			m_cdxSecurityOptions.UpdateData(false);
391 			UIUtil.ResizeColumns(m_lvSecurityOptions, true);
392 		}
393 
LoadPolicyOption(string strPropertyName, AppPolicyId p)394 		private void LoadPolicyOption(string strPropertyName, AppPolicyId p)
395 		{
396 			Debug.Assert(p.ToString() == strPropertyName);
397 
398 			ListViewItem lvi = m_cdxPolicy.CreateItem(Program.Config.Security.Policy,
399 				strPropertyName, null, AppPolicy.GetName(p) + " *");
400 			lvi.SubItems.Add(AppPolicy.GetDesc(p));
401 		}
402 
LoadPolicyOptions()403 		private void LoadPolicyOptions()
404 		{
405 			m_cdxPolicy = new CheckedLVItemDXList(m_lvPolicy, true);
406 
407 			LoadPolicyOption("Plugins", AppPolicyId.Plugins);
408 			LoadPolicyOption("Export", AppPolicyId.Export);
409 			LoadPolicyOption("ExportNoKey", AppPolicyId.ExportNoKey);
410 			LoadPolicyOption("Import", AppPolicyId.Import);
411 			LoadPolicyOption("Print", AppPolicyId.Print);
412 			LoadPolicyOption("PrintNoKey", AppPolicyId.PrintNoKey);
413 			LoadPolicyOption("NewFile", AppPolicyId.NewFile);
414 			LoadPolicyOption("SaveFile", AppPolicyId.SaveFile);
415 			LoadPolicyOption("AutoType", AppPolicyId.AutoType);
416 			LoadPolicyOption("AutoTypeWithoutContext", AppPolicyId.AutoTypeWithoutContext);
417 			LoadPolicyOption("CopyToClipboard", AppPolicyId.CopyToClipboard);
418 			LoadPolicyOption("CopyWholeEntries", AppPolicyId.CopyWholeEntries);
419 			LoadPolicyOption("DragDrop", AppPolicyId.DragDrop);
420 			LoadPolicyOption("UnhidePasswords", AppPolicyId.UnhidePasswords);
421 			LoadPolicyOption("ChangeMasterKey", AppPolicyId.ChangeMasterKey);
422 			LoadPolicyOption("ChangeMasterKeyNoKey", AppPolicyId.ChangeMasterKeyNoKey);
423 			LoadPolicyOption("EditTriggers", AppPolicyId.EditTriggers);
424 
425 			m_cdxPolicy.UpdateData(false);
426 		}
427 
LoadGuiOptions()428 		private void LoadGuiOptions()
429 		{
430 			m_strInitialTsRenderer = Program.Config.UI.ToolStripRenderer;
431 
432 			bool? obNoMin = null;
433 			if(MonoWorkarounds.IsRequired(1418)) obNoMin = true;
434 			bool? obNoFocus = null;
435 			if(MonoWorkarounds.IsRequired(1976)) obNoFocus = true;
436 
437 			m_lvGuiOptions.Columns.Add(KPRes.Options); // Resize below
438 
439 			ListViewGroup lvg = new ListViewGroup(KPRes.MainWindow);
440 			m_lvGuiOptions.Groups.Add(lvg);
441 			Debug.Assert(lvg.ListView == m_lvGuiOptions);
442 
443 			m_cdxGuiOptions = new CheckedLVItemDXList(m_lvGuiOptions, true);
444 
445 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeToTray",
446 				lvg, KPRes.MinimizeToTray);
447 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "DropToBackAfterClipboardCopy",
448 				lvg, KPRes.DropToBackOnCopy);
449 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterClipboardCopy",
450 				lvg, KPRes.MinimizeAfterCopy);
451 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterAutoType",
452 				lvg, KPRes.MinimizeAfterAutoType);
453 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterLocking",
454 				lvg, KPRes.MinimizeAfterLocking);
455 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterOpeningDatabase",
456 				lvg, KPRes.MinimizeAfterOpeningDatabase, obNoMin);
457 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CloseButtonMinimizesWindow",
458 				lvg, KPRes.CloseButtonMinimizes);
459 			// m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EscMinimizesToTray",
460 			//	lvg, KPRes.EscMinimizesToTray);
461 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowFullPathInTitle",
462 				lvg, KPRes.ShowFullPathInTitleBar);
463 			// m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowFullPathOnTab",
464 			//	lvg, KPRes.ShowFullPathOnFileTab);
465 			// m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowDatabaseNameOnTab",
466 			//	lvg, KPRes.ShowDatabaseNameOnFileTab);
467 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "DisableSaveIfNotModified",
468 				lvg, KPRes.DisableSaveIfNotModified);
469 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "HideCloseDatabaseButton",
470 				lvg, KPRes.HideCloseDatabaseTb);
471 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowAdvAutoTypeCommands",
472 				lvg, KPRes.ShowAdvAutoTypeCommands);
473 
474 			lvg = new ListViewGroup(KPRes.EntryList);
475 			m_lvGuiOptions.Groups.Add(lvg);
476 			// m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowGridLines",
477 			//	m_lvGuiOptions, lvg, KPRes.ShowGridLines);
478 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListAutoResizeColumns",
479 				lvg, KPRes.EntryListAutoResizeColumns);
480 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListAlternatingBgColors",
481 				lvg, KPRes.AlternatingBgColors);
482 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CopyUrlsInsteadOfOpening",
483 				lvg, KPRes.CopyUrlsInsteadOfOpening);
484 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntrySelGroupSel",
485 				lvg, KPRes.EntrySelGroupSel);
486 
487 			if(!Program.Config.MainWindow.EntryListShowDerefData)
488 			{
489 				Debug.Assert(!Program.Config.MainWindow.EntryListShowDerefDataAsync);
490 				Program.Config.MainWindow.EntryListShowDerefDataAsync = false;
491 			}
492 			ListViewItem lviDeref = m_cdxGuiOptions.CreateItem(
493 				Program.Config.MainWindow, "EntryListShowDerefData",
494 				lvg, KPRes.ShowDerefData + " (" + KPRes.Slow + ")");
495 			ListViewItem lviDerefAsync = m_cdxGuiOptions.CreateItem(
496 				Program.Config.MainWindow, "EntryListShowDerefDataAsync",
497 				lvg, KPRes.ShowDerefDataAsync + " (" + KPRes.IncompatibleWithSorting + ")");
498 			m_cdxGuiOptions.AddLink(lviDeref, lviDerefAsync, CheckItemLinkType.UncheckedUnchecked);
499 			m_cdxGuiOptions.AddLink(lviDerefAsync, lviDeref, CheckItemLinkType.CheckedChecked);
500 
501 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListShowDerefDataAndRefs",
502 				lvg, KPRes.ShowDerefDataAndRefs);
503 
504 			// lvg = new ListViewGroup(KPRes.EntryView);
505 			// m_lvGuiOptions.Groups.Add(lvg);
506 			// m_cdxGuiOptions.CreateItem(Program.Config.MainWindow.EntryView, "HideProtectedCustomStrings",
507 			//	lvg, KPRes.EntryViewHideProtectedCustomStrings);
508 
509 			lvg = new ListViewGroup(KPRes.QuickSearchTb);
510 			m_lvGuiOptions.Groups.Add(lvg);
511 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindSearchInPasswords",
512 				lvg, KPRes.QuickSearchInPwFields);
513 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindExcludeExpired",
514 				lvg, KPRes.QuickSearchExclExpired);
515 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindDerefData",
516 				lvg, KPRes.QuickSearchDerefData + " (" + KPRes.Slow + ")");
517 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusResultsAfterQuickFind",
518 				lvg, KPRes.FocusResultsAfterQuickSearch);
519 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnRestore",
520 				lvg, KPRes.FocusQuickFindOnRestore, obNoFocus);
521 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnUntray",
522 				lvg, KPRes.FocusQuickFindOnUntray, obNoFocus);
523 
524 			lvg = new ListViewGroup(KPRes.TrayIcon);
525 			m_lvGuiOptions.Groups.Add(lvg);
526 			// m_cdxGuiOptions.CreateItem(Program.Config.UI.TrayIcon, "ShowOnlyIfTrayedEx",
527 			//	lvg, KPRes.ShowTrayOnlyIfTrayed);
528 			m_cdxGuiOptions.CreateItem(Program.Config.UI.TrayIcon, "GrayIcon",
529 				lvg, KPRes.TrayIconGray);
530 			m_cdxGuiOptions.CreateItem(Program.Config.UI.TrayIcon, "SingleClickDefault",
531 				lvg, KPRes.TrayIconSingleClick);
532 
533 			lvg = new ListViewGroup(KPRes.Dialogs);
534 			m_lvGuiOptions.Groups.Add(lvg);
535 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowRecycleConfirmDialog",
536 				lvg, KPRes.RecycleShowConfirm);
537 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowDbMntncResultsDialog",
538 				lvg, KPRes.DbMntncResults);
539 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowEmSheetDialog",
540 				lvg, KPRes.EmergencySheetAsk);
541 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowDbOpenUnkVerDialog",
542 				lvg, KPRes.DatabaseOpenUnknownVersionAsk);
543 
544 			lvg = new ListViewGroup(KPRes.Advanced);
545 			m_lvGuiOptions.Groups.Add(lvg);
546 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "RepeatPasswordOnlyWhenHidden",
547 				lvg, KPRes.RepeatOnlyWhenHidden);
548 			// m_cdxGuiOptions.CreateItem(Program.Config.UI, "UseCustomToolStripRenderer",
549 			//	lvg, KPRes.UseCustomToolStripRenderer);
550 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "TreeViewShowLines",
551 				lvg, KPRes.TreeViewShowLines);
552 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ForceSystemFontUnix",
553 				lvg, KPRes.ForceSystemFontUnix);
554 
555 			m_cdxGuiOptions.UpdateData(false);
556 			UIUtil.ResizeColumns(m_lvGuiOptions, true);
557 
558 			try { m_numMruCount.Value = Program.Config.Application.MostRecentlyUsed.MaxItemCount; }
559 			catch(Exception) { Debug.Assert(false); m_numMruCount.Value = AceMru.DefaultMaxItemCount; }
560 			if(AppConfigEx.IsOptionEnforced(Program.Config.Application.MostRecentlyUsed, "MaxItemCount"))
561 			{
562 				m_lblMruCount.Enabled = false;
563 				m_numMruCount.Enabled = false;
564 			}
565 
566 			m_argbAltItemBg = Program.Config.MainWindow.EntryListAlternatingBgColor;
567 			m_cbCustomAltColor.Checked = (m_argbAltItemBg != 0);
568 			UpdateButtonImages();
569 
570 			if(AppConfigEx.IsOptionEnforced(Program.Config.UI, "StandardFont"))
571 				m_btnSelFont.Enabled = false;
572 			if(AppConfigEx.IsOptionEnforced(Program.Config.UI, "PasswordFont") ||
573 				MonoWorkarounds.IsRequired(5795))
574 				m_btnSelPwFont.Enabled = false;
575 		}
576 
LoadIntegrationOptions()577 		private void LoadIntegrationOptions()
578 		{
579 			Keys kAT = (Keys)Program.Config.Integration.HotKeyGlobalAutoType;
580 			m_hkAutoType.HotKey = kAT;
581 			m_kPrevAT = m_hkAutoType.HotKey; // Adjusted one
582 			if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeyGlobalAutoType"))
583 				m_hkAutoType.Enabled = false;
584 
585 			Keys kATP = (Keys)Program.Config.Integration.HotKeyGlobalAutoTypePassword;
586 			m_hkAutoTypePassword.HotKey = kATP;
587 			m_kPrevATP = m_hkAutoTypePassword.HotKey; // Adjusted one
588 			if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeyGlobalAutoTypePassword"))
589 				m_hkAutoTypePassword.Enabled = false;
590 
591 			Keys kATS = (Keys)Program.Config.Integration.HotKeySelectedAutoType;
592 			m_hkAutoTypeSelected.HotKey = kATS;
593 			m_kPrevATS = m_hkAutoTypeSelected.HotKey; // Adjusted one
594 			if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeySelectedAutoType"))
595 				m_hkAutoTypeSelected.Enabled = false;
596 
597 			Keys kSW = (Keys)Program.Config.Integration.HotKeyShowWindow;
598 			m_hkShowWindow.HotKey = kSW;
599 			m_kPrevSW = m_hkShowWindow.HotKey; // Adjusted one
600 			if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeyShowWindow"))
601 				m_hkShowWindow.Enabled = false;
602 
603 			m_cbAutoRun.Checked = ShellUtil.GetStartWithWindows(AppDefs.AutoRunName);
604 
605 			// m_cbSingleClickTrayAction.Checked = Program.Config.UI.TrayIcon.SingleClickDefault;
606 			// if(AppConfigEx.IsOptionEnforced(Program.Config.UI.TrayIcon, "SingleClickDefault"))
607 			//	m_cbSingleClickTrayAction.Enabled = false;
608 		}
609 
LoadAdvancedOptions()610 		private void LoadAdvancedOptions()
611 		{
612 			bool? obNoMin = null;
613 			if(MonoWorkarounds.IsRequired(1418)) obNoMin = true;
614 
615 			m_lvAdvanced.Columns.Add(string.Empty); // Resize below
616 
617 			m_cdxAdvanced = new CheckedLVItemDXList(m_lvAdvanced, true);
618 
619 			ListViewGroup lvg = new ListViewGroup(KPRes.StartAndExit);
620 			m_lvAdvanced.Groups.Add(lvg);
621 			m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "OpenLastFile",
622 				lvg, KPRes.AutoRememberOpenLastFile);
623 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "LimitToSingleInstance",
624 				lvg, KPRes.LimitSingleInstance);
625 			m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "CheckForUpdate",
626 				lvg, KPRes.CheckForUpdAtStart);
627 			m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "MinimizedAndLocked",
628 				lvg, KPRes.StartMinimizedAndLocked, obNoMin);
629 			m_cdxAdvanced.CreateItem(Program.Config.Application.FileClosing, "AutoSave",
630 				lvg, KPRes.AutoSaveAtExit);
631 			m_cdxAdvanced.CreateItem(Program.Config.Application, "AutoSaveAfterEntryEdit",
632 				lvg, KPRes.AutoSaveAfterEntryEdit);
633 
634 			lvg = new ListViewGroup(KPRes.AfterDatabaseOpen);
635 			m_lvAdvanced.Groups.Add(lvg);
636 			m_cdxAdvanced.CreateItem(Program.Config.Application.FileOpening, "ShowExpiredEntries",
637 				lvg, KPRes.AutoShowExpiredEntries);
638 			m_cdxAdvanced.CreateItem(Program.Config.Application.FileOpening, "ShowSoonToExpireEntries",
639 				lvg, KPRes.AutoShowSoonToExpireEntries);
640 
641 			lvg = new ListViewGroup(KPRes.AutoType);
642 			m_lvAdvanced.Groups.Add(lvg);
643 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByTitle",
644 				lvg, KPRes.AutoTypeMatchByTitle);
645 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByUrlInTitle",
646 				lvg, KPRes.AutoTypeMatchByUrlInTitle);
647 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByUrlHostInTitle",
648 				lvg, KPRes.AutoTypeMatchByUrlHostInTitle);
649 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByTagInTitle",
650 				lvg, KPRes.AutoTypeMatchByTagInTitle);
651 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchNormDashes",
652 				lvg, KPRes.ConsiderDashesEq + " (-, \u2010, \u2011, \u2012, \u2013, \u2014, \u2015, \u2212)");
653 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeExpiredCanMatch",
654 				lvg, KPRes.ExpiredEntriesCanMatch);
655 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeAlwaysShowSelDialog",
656 				lvg, KPRes.AutoTypeAlwaysShowSelDialog);
657 
658 			lvg = new ListViewGroup(KPRes.AutoType + " - " + KPRes.SendingNoun);
659 			m_lvAdvanced.Groups.Add(lvg);
660 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypePrependInitSequenceForIE",
661 				lvg, KPRes.AutoTypePrependInitSeqForIE);
662 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeReleaseAltWithKeyPress",
663 				lvg, KPRes.AutoTypeReleaseAltWithKeyPress);
664 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeAdjustKeyboardLayout",
665 				lvg, KPRes.SameKeybLayout);
666 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeAllowInterleaved",
667 				lvg, KPRes.InterleavedKeySending);
668 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeCancelOnWindowChange",
669 				lvg, KPRes.AutoTypeCancelOnWindowChange);
670 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeCancelOnTitleChange",
671 				lvg, KPRes.AutoTypeCancelOnTitleChange);
672 
673 			lvg = new ListViewGroup(KPRes.IOConnectionLong);
674 			m_lvAdvanced.Groups.Add(lvg);
675 			m_cdxAdvanced.CreateItem(Program.Config.Application, "VerifyWrittenFileAfterSaving",
676 				lvg, KPRes.VerifyWrittenFileAfterSave);
677 			m_cdxAdvanced.CreateItem(Program.Config.Application, "UseTransactedFileWrites",
678 				lvg, KPRes.UseTransactedDatabaseWrites);
679 			m_cdxAdvanced.CreateItem(Program.Config.Application, "UseTransactedConfigWrites",
680 				lvg, KPRes.UseTransactedConfigWrites);
681 			m_cdxAdvanced.CreateItem(Program.Config.Application, "FileTxExtra",
682 				lvg, KPRes.FileTxExtra + " (" + KPRes.Slow + ")");
683 			m_cdxAdvanced.CreateItem(Program.Config.Application, "UseFileLocks",
684 				lvg, KPRes.UseFileLocks + " " + KPRes.NotRecommended);
685 			m_cdxAdvanced.CreateItem(Program.Config.Application, "SaveForceSync",
686 				lvg, KPRes.SaveForceSync);
687 			m_cdxAdvanced.CreateItem(Program.Config.Security, "SslCertsAcceptInvalid",
688 				lvg, KPRes.SslCertsAcceptInvalid);
689 
690 			lvg = new ListViewGroup(KPRes.Advanced);
691 			m_lvAdvanced.Groups.Add(lvg);
692 
693 			if(!Program.Config.Integration.SearchKeyFiles)
694 				Program.Config.Integration.SearchKeyFilesOnRemovableMedia = false;
695 			ListViewItem lviSearch = m_cdxAdvanced.CreateItem(
696 				Program.Config.Integration, "SearchKeyFiles",
697 				lvg, KPRes.SearchKeyFiles);
698 			ListViewItem lviSearchRmv = m_cdxAdvanced.CreateItem(
699 				Program.Config.Integration, "SearchKeyFilesOnRemovableMedia",
700 				lvg, KPRes.SearchKeyFilesAlsoOnRemovable);
701 			m_cdxAdvanced.AddLink(lviSearch, lviSearchRmv, CheckItemLinkType.UncheckedUnchecked);
702 			m_cdxAdvanced.AddLink(lviSearchRmv, lviSearch, CheckItemLinkType.CheckedChecked);
703 
704 			m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RememberKeySources",
705 				lvg, KPRes.RememberKeySources);
706 			m_cdxAdvanced.CreateItem(Program.Config.Application, "RememberWorkingDirectories",
707 				lvg, KPRes.RememberWorkingDirectories);
708 			m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "RememberHidingPasswordsMain",
709 				lvg, KPRes.RememberHidingPasswordsMain);
710 			m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "SeparateHidingSettings",
711 				lvg, KPRes.RememberHidingPasswordsEntry);
712 			m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "UnhideButtonAlsoUnhidesSource",
713 				lvg, KPRes.UnhideSourceCharactersToo);
714 			m_cdxAdvanced.CreateItem(Program.Config.Defaults, "TanExpiresOnUse",
715 				lvg, KPRes.TanExpiresOnUse);
716 			m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RecycleBinCollapse",
717 				lvg, KPRes.RecycleBinCollapse);
718 			m_cdxAdvanced.CreateItem(Program.Config.UI, "SecureDesktopPlaySound",
719 				lvg, KPRes.SecDeskPlaySound);
720 			m_cdxAdvanced.CreateItem(Program.Config.UI, "OptimizeForScreenReader",
721 				lvg, KPRes.OptimizeForScreenReader);
722 
723 			m_cdxAdvanced.UpdateData(false);
724 			UIUtil.ResizeColumns(m_lvAdvanced, true);
725 
726 			if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "ProxyType") ||
727 				AppConfigEx.IsOptionEnforced(Program.Config.Integration, "ProxyAddress"))
728 				m_btnProxy.Enabled = false;
729 		}
730 
ValidateOptions()731 		private bool ValidateOptions()
732 		{
733 			GFunc<HotKeyControlEx, bool> fAltMod = delegate(HotKeyControlEx c)
734 			{
735 				Keys m = (c.HotKey & Keys.Modifiers);
736 				return ((m == Keys.Alt) || (m == (Keys.Alt | Keys.Shift)));
737 			};
738 
739 			if(fAltMod(m_hkAutoType) || fAltMod(m_hkAutoTypePassword) ||
740 				fAltMod(m_hkAutoTypeSelected) || fAltMod(m_hkShowWindow))
741 			{
742 				if(!MessageService.AskYesNo(KPRes.HotKeyAltOnly + MessageService.NewParagraph +
743 					KPRes.HotKeyAltOnlyHint + MessageService.NewParagraph +
744 					KPRes.HotKeyAltOnlyQuestion, null, false))
745 					return false;
746 			}
747 
748 			return true;
749 		}
750 
SaveOptions()751 		private void SaveOptions()
752 		{
753 			if(!m_cbLockAfterTime.Checked)
754 				Program.Config.Security.WorkspaceLocking.LockAfterTime = 0;
755 			else
756 				Program.Config.Security.WorkspaceLocking.LockAfterTime =
757 					(uint)m_numLockAfterTime.Value;
758 
759 			if(!m_cbLockAfterGlobalTime.Checked)
760 				Program.Config.Security.WorkspaceLocking.LockAfterGlobalTime = 0;
761 			else
762 				Program.Config.Security.WorkspaceLocking.LockAfterGlobalTime =
763 					(uint)m_numLockAfterGlobalTime.Value;
764 
765 			if(m_cbDefaultExpireDays.Checked)
766 				Program.Config.Defaults.NewEntryExpiresInDays =
767 					(int)m_numDefaultExpireDays.Value;
768 			else Program.Config.Defaults.NewEntryExpiresInDays = -1;
769 
770 			if(m_cbClipClearTime.Checked)
771 				Program.Config.Security.ClipboardClearAfterSeconds =
772 					(int)m_numClipClearTime.Value;
773 			else Program.Config.Security.ClipboardClearAfterSeconds = -1;
774 
775 			m_cdxSecurityOptions.UpdateData(true);
776 
777 			NativeLib.AllowNative = Program.Config.Native.NativeKeyTransformations;
778 
779 			m_cdxPolicy.UpdateData(true);
780 			m_cdxGuiOptions.UpdateData(true);
781 
782 			string strUuid;
783 			m_dTsrUuids.TryGetValue(m_cmbMenuStyle.SelectedIndex, out strUuid);
784 			Program.Config.UI.ToolStripRenderer = (strUuid ?? string.Empty);
785 
786 			if(m_cmbBannerStyle.SelectedIndex != (int)BannerStyle.Default)
787 				Program.Config.UI.BannerStyle = (BannerStyle)
788 					m_cmbBannerStyle.SelectedIndex;
789 
790 			Program.Config.MainWindow.EscAction =
791 				(AceEscAction)m_cmbEscAction.SelectedIndex;
792 
793 			Program.Config.Application.MostRecentlyUsed.MaxItemCount =
794 				(uint)m_numMruCount.Value;
795 
796 			Program.Config.MainWindow.EntryListAlternatingBgColor =
797 				(m_cbCustomAltColor.Checked ? m_argbAltItemBg : 0);
798 
799 			ChangeHotKey(ref m_kPrevAT, m_hkAutoType,
800 				AppDefs.GlobalHotKeyId.AutoType);
801 			ChangeHotKey(ref m_kPrevATP, m_hkAutoTypePassword,
802 				AppDefs.GlobalHotKeyId.AutoTypePassword);
803 			ChangeHotKey(ref m_kPrevATS, m_hkAutoTypeSelected,
804 				AppDefs.GlobalHotKeyId.AutoTypeSelected);
805 			ChangeHotKey(ref m_kPrevSW, m_hkShowWindow,
806 				AppDefs.GlobalHotKeyId.ShowWindow);
807 
808 			// Program.Config.UI.TrayIcon.SingleClickDefault = m_cbSingleClickTrayAction.Checked;
809 
810 			Program.Config.Integration.UrlSchemeOverrides = m_aceUrlSchemeOverrides;
811 			Program.Config.Integration.UrlOverride = m_strUrlOverrideAll;
812 
813 			m_cdxAdvanced.UpdateData(true);
814 
815 			Program.Config.Apply(AceApplyFlags.All);
816 		}
817 
CleanUpEx()818 		private void CleanUpEx()
819 		{
820 			int nTab = m_tabMain.SelectedIndex;
821 			if((nTab >= 0) && (nTab < m_tabMain.TabPages.Count))
822 				Program.Config.Defaults.OptionsTabIndex = (uint)nTab;
823 
824 			m_tabMain.ImageList = null; // Detach event handlers
825 
826 			UIUtil.DisposeButtonImage(m_btnCustomAltColor, ref m_imgAltItemBg);
827 
828 			m_cdxSecurityOptions.Release();
829 			m_cdxPolicy.Release();
830 			m_cdxGuiOptions.Release();
831 			m_cdxAdvanced.Release();
832 
833 			AppConfigEx.ClearXmlPathCache();
834 		}
835 
ChangeHotKey(ref Keys kPrev, HotKeyControlEx hkControl, int nHotKeyID)836 		private static void ChangeHotKey(ref Keys kPrev, HotKeyControlEx hkControl,
837 			int nHotKeyID)
838 		{
839 			Keys kNew = hkControl.HotKey;
840 			if(kNew == kPrev) return;
841 
842 			kPrev = kNew;
843 
844 			if(nHotKeyID == AppDefs.GlobalHotKeyId.AutoType)
845 				Program.Config.Integration.HotKeyGlobalAutoType = (long)kNew;
846 			else if(nHotKeyID == AppDefs.GlobalHotKeyId.AutoTypePassword)
847 				Program.Config.Integration.HotKeyGlobalAutoTypePassword = (long)kNew;
848 			else if(nHotKeyID == AppDefs.GlobalHotKeyId.AutoTypeSelected)
849 				Program.Config.Integration.HotKeySelectedAutoType = (long)kNew;
850 			else if(nHotKeyID == AppDefs.GlobalHotKeyId.ShowWindow)
851 				Program.Config.Integration.HotKeyShowWindow = (long)kNew;
852 			else { Debug.Assert(false); }
853 
854 			HotKeyManager.UnregisterHotKey(nHotKeyID);
855 			if(kNew != Keys.None)
856 				HotKeyManager.RegisterHotKey(nHotKeyID, kNew);
857 		}
858 
UpdateUIState()859 		private void UpdateUIState()
860 		{
861 			if(m_bBlockUIUpdate) return;
862 			m_bBlockUIUpdate = true;
863 
864 			m_numLockAfterTime.Enabled = (m_cbLockAfterTime.Checked &&
865 				m_cbLockAfterTime.Enabled);
866 
867 			if(WinUtil.IsWindows9x || NativeLib.IsUnix())
868 			{
869 				m_cbLockAfterGlobalTime.Checked = false;
870 				m_cbLockAfterGlobalTime.Enabled = false;
871 				m_numLockAfterGlobalTime.Enabled = false;
872 			}
873 			else
874 				m_numLockAfterGlobalTime.Enabled = (m_cbLockAfterGlobalTime.Checked &&
875 					m_cbLockAfterGlobalTime.Enabled);
876 
877 			m_numDefaultExpireDays.Enabled = (m_cbDefaultExpireDays.Checked &&
878 				m_cbDefaultExpireDays.Enabled);
879 			m_numClipClearTime.Enabled = (m_cbClipClearTime.Checked &&
880 				m_cbClipClearTime.Enabled);
881 
882 			m_btnCustomAltColor.Enabled = m_cbCustomAltColor.Checked;
883 
884 			m_bBlockUIUpdate = false;
885 		}
886 
OnBtnOK(object sender, EventArgs e)887 		private void OnBtnOK(object sender, EventArgs e)
888 		{
889 			if(!ValidateOptions()) { this.DialogResult = DialogResult.None; return; }
890 
891 			SaveOptions();
892 		}
893 
OnBtnCancel(object sender, EventArgs e)894 		private void OnBtnCancel(object sender, EventArgs e)
895 		{
896 		}
897 
OnBannerStyleSelectedChanged(object sender, EventArgs e)898 		private void OnBannerStyleSelectedChanged(object sender, EventArgs e)
899 		{
900 			CreateDialogBanner((BannerStyle)m_cmbBannerStyle.SelectedIndex);
901 		}
902 
OnLockAfterTimeCheckedChanged(object sender, EventArgs e)903 		private void OnLockAfterTimeCheckedChanged(object sender, EventArgs e)
904 		{
905 			UpdateUIState();
906 		}
907 
OnBtnSelListFont(object sender, EventArgs e)908 		private void OnBtnSelListFont(object sender, EventArgs e)
909 		{
910 			FontDialog dlg = UIUtil.CreateFontDialog(false);
911 
912 			AceFont fOld = Program.Config.UI.StandardFont;
913 			if(fOld.OverrideUIDefault) dlg.Font = fOld.ToFont();
914 			else
915 			{
916 				try { dlg.Font = m_lvSecurityOptions.Font; }
917 				catch(Exception) { Debug.Assert(false); }
918 			}
919 
920 			if(dlg.ShowDialog() == DialogResult.OK)
921 			{
922 				Program.Config.UI.StandardFont = new AceFont(dlg.Font);
923 				Program.Config.UI.StandardFont.OverrideUIDefault = true;
924 			}
925 			dlg.Dispose();
926 		}
927 
OnBtnSelPwFont(object sender, EventArgs e)928 		private void OnBtnSelPwFont(object sender, EventArgs e)
929 		{
930 			FontDialog dlg = UIUtil.CreateFontDialog(false);
931 
932 			AceFont fOld = Program.Config.UI.PasswordFont;
933 			if(fOld.OverrideUIDefault) dlg.Font = fOld.ToFont();
934 			else if(FontUtil.MonoFont != null) dlg.Font = FontUtil.MonoFont;
935 			else
936 			{
937 				try
938 				{
939 					dlg.Font = new Font(FontFamily.GenericMonospace,
940 						m_lvSecurityOptions.Font.SizeInPoints);
941 				}
942 				catch(Exception) { Debug.Assert(false); }
943 			}
944 
945 			if(dlg.ShowDialog() == DialogResult.OK)
946 			{
947 				Program.Config.UI.PasswordFont = new AceFont(dlg.Font);
948 				Program.Config.UI.PasswordFont.OverrideUIDefault = true;
949 			}
950 			dlg.Dispose();
951 		}
952 
OnDefaultExpireDaysCheckedChanged(object sender, EventArgs e)953 		private void OnDefaultExpireDaysCheckedChanged(object sender, EventArgs e)
954 		{
955 			UpdateUIState();
956 		}
957 
OnBtnFileExtCreate(object sender, EventArgs e)958 		private void OnBtnFileExtCreate(object sender, EventArgs e)
959 		{
960 			// ShellUtil.RegisterExtension(AppDefs.FileExtension.FileExt, AppDefs.FileExtension.FileExtId,
961 			//	KPRes.FileExtName2, WinUtil.GetExecutable(), PwDefs.ShortProductName, true);
962 			WinUtil.RunElevated(WinUtil.GetExecutable(), "-" +
963 				AppDefs.CommandLineOptions.FileExtRegister, false);
964 		}
965 
OnBtnFileExtRemove(object sender, EventArgs e)966 		private void OnBtnFileExtRemove(object sender, EventArgs e)
967 		{
968 			// ShellUtil.UnregisterExtension(AppDefs.FileExtension.FileExt,
969 			//	AppDefs.FileExtension.FileExtId);
970 			WinUtil.RunElevated(WinUtil.GetExecutable(), "-" +
971 				AppDefs.CommandLineOptions.FileExtUnregister, false);
972 		}
973 
OnCheckedChangedAutoRun(object sender, EventArgs e)974 		private void OnCheckedChangedAutoRun(object sender, EventArgs e)
975 		{
976 			if(m_bLoadingSettings) return;
977 
978 			bool bRequested = m_cbAutoRun.Checked;
979 			bool bCurrent = ShellUtil.GetStartWithWindows(AppDefs.AutoRunName);
980 
981 			if(bRequested != bCurrent)
982 			{
983 				string strPath = WinUtil.GetExecutable().Trim();
984 				if(strPath.StartsWith("\"") == false)
985 					strPath = "\"" + strPath + "\"";
986 				ShellUtil.SetStartWithWindows(AppDefs.AutoRunName, strPath,
987 					bRequested);
988 
989 				bool bNew = ShellUtil.GetStartWithWindows(AppDefs.AutoRunName);
990 
991 				if(bNew != bRequested)
992 					m_cbAutoRun.Checked = bNew;
993 			}
994 		}
995 
OnFormClosed(object sender, FormClosedEventArgs e)996 		private void OnFormClosed(object sender, FormClosedEventArgs e)
997 		{
998 			CleanUpEx();
999 			GlobalWindowManager.RemoveWindow(this);
1000 		}
1001 
OnPolicyInfoLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)1002 		private void OnPolicyInfoLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
1003 		{
1004 			AppHelp.ShowHelp(AppDefs.HelpTopics.AppPolicy, null);
1005 		}
1006 
OnClipboardClearTimeCheckedChanged(object sender, EventArgs e)1007 		private void OnClipboardClearTimeCheckedChanged(object sender, EventArgs e)
1008 		{
1009 			UpdateUIState();
1010 		}
1011 
OnBtnUrlOverrides(object sender, EventArgs e)1012 		private void OnBtnUrlOverrides(object sender, EventArgs e)
1013 		{
1014 			UrlOverridesForm dlg = new UrlOverridesForm();
1015 			dlg.InitEx(m_aceUrlSchemeOverrides, m_strUrlOverrideAll);
1016 
1017 			if(dlg.ShowDialog() == DialogResult.OK)
1018 				m_strUrlOverrideAll = dlg.UrlOverrideAll;
1019 
1020 			UIUtil.DestroyForm(dlg);
1021 		}
1022 
OnHotKeyHelpLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)1023 		private void OnHotKeyHelpLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
1024 		{
1025 			AppHelp.ShowHelp(AppDefs.HelpTopics.Setup, AppDefs.HelpTopics.SetupMono);
1026 		}
1027 
OnLockAfterGlobalTimeCheckedChanged(object sender, EventArgs e)1028 		private void OnLockAfterGlobalTimeCheckedChanged(object sender, EventArgs e)
1029 		{
1030 			UpdateUIState();
1031 		}
1032 
OnBtnProxy(object sender, EventArgs e)1033 		private void OnBtnProxy(object sender, EventArgs e)
1034 		{
1035 			ProxyForm dlg = new ProxyForm();
1036 			UIUtil.ShowDialogAndDestroy(dlg);
1037 		}
1038 
UpdateButtonImages()1039 		private void UpdateButtonImages()
1040 		{
1041 			if(m_argbAltItemBg != 0)
1042 			{
1043 				Color clr = Color.FromArgb(m_argbAltItemBg);
1044 				Image imgNew = UIUtil.CreateColorBitmap24(m_btnCustomAltColor, clr);
1045 				UIUtil.OverwriteButtonImage(m_btnCustomAltColor, ref m_imgAltItemBg,
1046 					imgNew);
1047 			}
1048 		}
1049 
OnCustomAltColorCheckedChanged(object sender, EventArgs e)1050 		private void OnCustomAltColorCheckedChanged(object sender, EventArgs e)
1051 		{
1052 			UpdateUIState();
1053 		}
1054 
OnBtnCustomAltColor(object sender, EventArgs e)1055 		private void OnBtnCustomAltColor(object sender, EventArgs e)
1056 		{
1057 			Color clrCur = UIUtil.GetAlternateColor(m_lvGuiOptions.BackColor);
1058 			if(m_argbAltItemBg != 0) clrCur = Color.FromArgb(m_argbAltItemBg);
1059 
1060 			Color? clr = UIUtil.ShowColorDialog(clrCur);
1061 			if(clr.HasValue)
1062 			{
1063 				m_argbAltItemBg = clr.Value.ToArgb();
1064 				UpdateButtonImages();
1065 			}
1066 		}
1067 
OnBtnHelpSource(object sender, EventArgs e)1068 		private void OnBtnHelpSource(object sender, EventArgs e)
1069 		{
1070 			HelpSourceForm hsf = new HelpSourceForm();
1071 			UIUtil.ShowDialogAndDestroy(hsf);
1072 		}
1073 
OnSecOptExLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)1074 		private void OnSecOptExLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
1075 		{
1076 			AppHelp.ShowHelp(AppDefs.HelpTopics.Security, AppDefs.HelpTopics.SecurityOptEx);
1077 		}
1078 
OnSecOptAdmLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)1079 		private void OnSecOptAdmLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
1080 		{
1081 			AppHelp.ShowHelp(AppDefs.HelpTopics.Security, AppDefs.HelpTopics.SecurityOptAdm);
1082 		}
1083 	}
1084 }
1085