using System; using System.Configuration; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Net.NetworkInformation; using System.Windows.Forms; using AutoTypeSearch.Properties; using KeePass.Forms; using KeePass.Plugins; using KeePassLib; using KeePassLib.Native; namespace AutoTypeSearch { internal partial class Options : UserControl { private const string OptionsConfigRoot = "AutoTypeSearchExt."; private static int sRegisteredHotkeyId; // ReSharper disable once MemberCanBePrivate.Global - Public for forms designer public Options() { InitializeComponent(); // Must mach order and values of Actions enum var actions = new object[] { Resources.PerformAutoType, Resources.EditEntry, Resources.ShowEntry, Resources.OpenEntryUrl, Resources.CopyPassword }; mDefaultAction.Items.AddRange(actions); mAlternativeAction.Items.AddRange(actions); // Read options mShowOnFailedSearch.Checked = Settings.Default.ShowOnFailedAutoType; if (NativeLib.IsUnix()) { mShowOnHotKey.Enabled = false; mShowOnHotKey.Checked = false; mShowHotKeyControl.Clear(); } else { mShowOnHotKey.Checked = Settings.Default.ShowOnHotKey; ShowHotKey = Settings.Default.ShowHotKey; } mShowOnHotKey_CheckedChanged(null, EventArgs.Empty); mShowOnIPC.Checked = Settings.Default.ShowOnIPC; mSearchInTitle.Checked = Settings.Default.SearchTitle; mSearchInUserName.Checked = Settings.Default.SearchUserName; mSearchInUrl.Checked = Settings.Default.SearchUrl; mSearchInNotes.Checked = Settings.Default.SearchNotes; mSearchInTags.Checked = Settings.Default.SearchTags; mSearchInOtherFields.Checked = Settings.Default.SearchCustomFields; mCaseSensitive.Checked = Settings.Default.CaseSensitive; mExcludeExpired.Checked = Settings.Default.ExcludeExpired; mResolveReferences.Checked = Settings.Default.ResolveReferences; mDefaultAction.SelectedIndex = (int)Settings.Default.DefaultAction; mAlternativeAction.SelectedIndex = (int)Settings.Default.AlternativeAction; mAdditionalSequences.BeginUpdate(); mAdditionalSequences.Items.Clear(); if (Settings.Default.AdditionalCustomSequences != null) { foreach (string s in Settings.Default.AdditionalCustomSequences) { mAdditionalSequences.Items.Add(s); } } mAdditionalSequences.Items.Add("new sequence"); mAdditionalSequences.EndUpdate(); } private Keys ShowHotKey { get { return mShowHotKeyControl.HotKey; } set { mShowHotKeyControl.HotKey = value; } } private void mShowOnHotKey_CheckedChanged(object sender, EventArgs e) { mShowHotKeyControl.Enabled = mShowOnHotKey.Checked; } private void ApplySettings() { // Apply settings Settings.Default.ShowOnFailedAutoType = mShowOnFailedSearch.Checked; Settings.Default.ShowOnHotKey = mShowOnHotKey.Checked; Settings.Default.ShowOnIPC = mShowOnIPC.Checked; Settings.Default.SearchTitle = mSearchInTitle.Checked; Settings.Default.SearchUserName = mSearchInUserName.Checked; Settings.Default.SearchUrl = mSearchInUrl.Checked; Settings.Default.SearchNotes = mSearchInNotes.Checked; Settings.Default.SearchTags = mSearchInTags.Checked; Settings.Default.SearchCustomFields = mSearchInOtherFields.Checked; Settings.Default.CaseSensitive = mCaseSensitive.Checked; Settings.Default.ExcludeExpired = mExcludeExpired.Checked; Settings.Default.ResolveReferences = mResolveReferences.Checked; Settings.Default.DefaultAction = (Actions)mDefaultAction.SelectedIndex; Settings.Default.AlternativeAction = (Actions)mAlternativeAction.SelectedIndex; Settings.Default.ShowHotKey = ShowHotKey; ApplyHotKey(); } #region Settings persistence public static void SaveSettings(IPluginHost host) { if (host != null) { foreach (SettingsPropertyValue property in Settings.Default.PropertyValues) { if (property.IsDirty) { var value = property.SerializedValue as String; if (value != null) { host.CustomConfig.SetString(OptionsConfigRoot + property.Name, value); } else { Debug.Fail("Non-string serialized settings property"); } } } } } public static void LoadSettings(IPluginHost host) { if (host != null) { // ReSharper disable once UnusedVariable var ignored = Settings.Default.ShowOnFailedAutoType; //Access any property just to make it load settings. foreach (SettingsPropertyValue property in Settings.Default.PropertyValues) { var value = host.CustomConfig.GetString(OptionsConfigRoot + property.Name); if (value != null) { property.SerializedValue = value; property.Deserialized = false; property.IsDirty = false; } } ApplyHotKey(); } } #endregion #region Hotkey private static void ApplyHotKey() { UnregisterHotKey(); if (Settings.Default.ShowOnHotKey && Settings.Default.ShowHotKey != Keys.None) { sRegisteredHotkeyId = HotKeyManager.RegisterHotKey(Settings.Default.ShowHotKey); } } public static void UnregisterHotKey() { if (sRegisteredHotkeyId != 0) { var result = HotKeyManager.UnregisterHotKey(sRegisteredHotkeyId); Debug.Assert(result); sRegisteredHotkeyId = 0; } } #endregion public static void AddToWindow(OptionsForm optionsForm) { var tabControl = optionsForm.Controls.Find("m_tabMain", false).FirstOrDefault() as TabControl; var okButton = optionsForm.Controls.Find("m_btnOK", false).FirstOrDefault() as Button; if (tabControl == null || okButton == null) { Debug.Fail("Could not integrate with options form"); } var tabPage = new TabPage(Resources.AutoTypeSearch) { UseVisualStyleBackColor = true, AutoScroll = true, ImageIndex = (int)PwIcon.EMailSearch }; var options = new Options { Dock = DockStyle.Fill }; tabPage.Controls.Add(options); tabControl.TabPages.Add(tabPage); okButton.Click += delegate { options.ApplySettings(); }; } private void Options_Paint(object sender, PaintEventArgs e) { Rectangle r = new Rectangle(mPanel.Location, mPanel.ClientSize); //r.Offset(mPanel.Location); r.X -= 1; r.Y -= 1; r.Width += 2 + SystemInformation.VerticalScrollBarWidth; r.Height += 2; ControlPaint.DrawBorder(e.Graphics, r, SystemColors.GrayText, ButtonBorderStyle.Solid); } } }