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