using Common; /// /// Copyright (c) 2013-2015 Senus Slovensko a.s. /// using System; using System.Windows.Forms; using TBF.Resources; namespace TBF.UI.Shared { public partial class SharedSearchForListBox : UserControl { private System.Windows.Forms.ListBox listBoxEx; public System.Windows.Forms.ListBox ListBoxEx { get { return listBoxEx; } set { listBoxEx = value; } } /// /// Masks to specify the enabled state and the visibility of buttons. /// Unlock button is hard coded in this control, cannot be set from the parent. /// public enum Buttons { None = 0, Find = (1 << 0), /// optional FindNext = (1 << 1), /// optional FindBack = (1 << 2), /// optional JumpToTop = (1 << 3), /// optional JumpToBottom = (1 << 4), /// optional } readonly System.Windows.Forms.Button[] buttonCtrls; /// /// Optional buttons are Add, Remove, Up, Down, Edit and Copy. /// OK and Cancel buttons are always visible (after unlock), but not always enabled. /// public Buttons OptionalButtons; public enum LState { Locked, /// 'Unlock', 'Close' (=OK) are shown, all the othere are hidden Unlocked, /// Unlock, Ok, Cancel, Add,Remove and all optional buttons are shown } LState lockState; public LState LockState { get { return lockState; } } bool buttonsRepositionsed; public bool MoreActive; public int MoreButtonTop; /// /// Used by controls to indicate which item is selected /// and to appropriately update Remove, Up and Down Buttons. /// public enum SelectedItemPos { None, First, Last, FirstAndLast, Middle, } public Form ParentForm; /// Used as a current form reference when changing and restoring a user public GID[] RequiredGroupMembership; /// /// Default constructor /// public SharedSearchForListBox() { InitializeComponent(); lockState = LState.Locked; MoreActive = false; RequiredGroupMembership = null; buttonCtrls = new System.Windows.Forms.Button[] { findButton, findNextButton, findBackButton, jumpToTopButton, jumpToBottomButton, }; OptionalButtons = Buttons.None; buttonsRepositionsed = false; } void ShowOrHideButtons(Buttons selectedButtons, bool value) { for (int i = 0; i < buttonCtrls.Length; i++) { if ((selectedButtons & (Buttons)(1 << i)) != 0) buttonCtrls[i].Visible = value; } } public void EnableOrDisableButtons(Buttons selectedButtons, bool value) { for (int i = 0; i < buttonCtrls.Length; i++) { if ((selectedButtons & (Buttons)(1 << i)) != 0) buttonCtrls[i].Enabled = value; } } /// /// Initialize the buttons when the dialog is loaded /// /// /// private void SharedDlgSearchForListBox_Load(object sender, EventArgs e) { searchLabel.Text = "Search"; findButton.Text = "Find"; jumpToBottomButton.Text = "Jump down"; jumpToTopButton.Text = "Jump up"; ShowOrHideButtons((Buttons)0x1F, true); } // Stores the last search text private string _lastSearchText = string.Empty; // Stores the index of the last found item in the ListView private int _lastFoundIndex = -1; private void findButton_Click(object sender, EventArgs e) { string search = searchTextBox.Text.Trim(); if (string.IsNullOrEmpty(search)) return; _lastSearchText = search; _lastFoundIndex = -1; int index = FindItemIndex(search, 0, +1); if (index == -1) { MessageBox.Show("No results found."); return; } _lastFoundIndex = index; SelectItemAtIndex(index); } /// /// Finds an item in the ListView starting from given index and direction. /// /// Search text (lowercase). /// Index to start from. /// +1 = forward, -1 = backward. /// Index of found item or -1 if not found. private int FindItemIndex(string search, int startIndex, int direction) { // No items if (listBoxEx.Items.Count == 0) return -1; // Clamp bounds if (startIndex < 0) startIndex = 0; if (startIndex >= listBoxEx.Items.Count) startIndex = listBoxEx.Items.Count - 1; search = search.ToLower(); // Forward search if (direction > 0) { for (int i = startIndex; i < listBoxEx.Items.Count; i++) { string text = listBoxEx.Items[i].ToString().ToLower(); if (text.Contains(search)) return i; } } else // Backward search { for (int i = startIndex; i >= 0; i--) { string text = listBoxEx.Items[i].ToString().ToLower(); if (text.Contains(search)) return i; } } return -1; } /// /// Selects and scrolls to the item at given index. /// private void SelectItemAtIndex(int index) { if (index < 0 || index >= listBoxEx.Items.Count) return; listBoxEx.SelectedIndex = index; // selects item listBoxEx.TopIndex = index; // scrolls to item listBoxEx.Focus(); // ensures highlight is visible } private void findNextButton_Click(object sender, EventArgs e) { string search = searchTextBox.Text.Trim(); if (string.IsNullOrEmpty(search)) return; if (search != _lastSearchText) { _lastSearchText = search; _lastFoundIndex = -1; } int index = FindItemIndex(search, _lastFoundIndex + 1, +1); if (index == -1) { MessageBox.Show("No more results."); return; } _lastFoundIndex = index; SelectItemAtIndex(index); } private void findBackButton_Click(object sender, EventArgs e) { string search = searchTextBox.Text.Trim(); if (string.IsNullOrEmpty(search)) return; if (search != _lastSearchText) { _lastSearchText = search; _lastFoundIndex = listBoxEx.Items.Count; } int index = FindItemIndex(search, _lastFoundIndex - 1, -1); if (index == -1) { MessageBox.Show("No more results."); return; } _lastFoundIndex = index; SelectItemAtIndex(index); } private void jumpToBottomButton_Click(object sender, EventArgs e) { // Scroll to the bottom without selecting any item if (listBoxEx.Items.Count == 0) return; listBoxEx.TopIndex = listBoxEx.Items.Count - 1; // last item index } private void jumpToTopButton_Click(object sender, EventArgs e) { // Scroll to the top without selecting any item if (listBoxEx.Items.Count == 0) return; listBoxEx.TopIndex = 0; // first item index } private void searchTextBox_Enter(object sender, EventArgs e) { // When Search textbox has focus, Enter will trigger Find button var form = this.FindForm(); if (form != null) form.AcceptButton = findButton; } } /*/// /// Events invoked when buttons are clicked (and in case of Unlock kbutton also accepted) /// public event EventHandler Unlocked; public event EventHandler GoClicked; public event EventHandler FindClicked; public event EventHandler FindNextClicked; public event EventHandler FindBackClicked; public event EventHandler JumpToTopClicked; public event EventHandler JumpToBottomClicked; /// /// All remaining handlers: /// private void cancelBtn_Click(object s, EventArgs e) { if (CancelClicked != null) CancelClicked(s, e); } private void addBtn_Click(object s, EventArgs e) { if (AddClicked != null) AddClicked(s, e); } private void removeBtn_Click(object s, EventArgs e) { if (RemoveClicked != null) RemoveClicked(s, e); } private void upBtn_Click(object s, EventArgs e) { if (UpClicked != null) UpClicked(s, e); } private void downBtn_Click(object s, EventArgs e) { if (DownClicked != null) DownClicked(s, e); } private void editBtn_Click(object s, EventArgs e) { if (EditClicked != null) EditClicked(s, e); } private void copyBtn_Click(object s, EventArgs e) { if (CopyClicked != null) CopyClicked(s, e); } private void exportButton_Click(object s, EventArgs e) { if (ExportClicked != null) ExportClicked(s, e); } private void importButton_Click(object s, EventArgs e) { if (ImportClicked != null) ImportClicked(s, e); } private void compareButton_Click(object s, EventArgs e) { if (CompareClicked != null) CompareClicked(s, e); } private void newTabButton_Click(object s, EventArgs e) { if (NewTabClicked != null) NewTabClicked(s, e); } private void renameTabButton_Click(object s, EventArgs e) { if (RenameTabClicked != null) RenameTabClicked(s, e); } private void removeTabButton_Click(object s, EventArgs e) { if (RemoveTabClicked != null) RemoveTabClicked(s, e); } private void customButton1_Click(object s, EventArgs e) { if (Custom1Clicked != null) Custom1Clicked(s, e); } private void customButton2_Click(object s, EventArgs e) { if (Custom2Clicked != null) Custom2Clicked(s, e); } private void customButton3_Click(object s, EventArgs e) { if (Custom3Clicked != null) Custom3Clicked(s, e); } */ }