TabNavigator.cs
上传用户:hbhltzc
上传日期:2022-06-04
资源大小:1925k
文件大小:3k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XmlNotepad {
  6.     // For some unexplainable reason the TabIndexes defined in the Form 
  7.     // are not being honored by the default TAB navigation provided by the base Form so
  8.     // we are implementing it ourselves here.
  9.     class TabNavigator {
  10.         Control owner;
  11.         public TabNavigator(Control c) {
  12.             owner = c;
  13.         }
  14.         internal class TabStopControl : IComparable {
  15.             Control c;
  16.             public TabStopControl(Control c) {
  17.                 this.c = c;
  18.             }
  19.             public int CompareTo(object obj) {
  20.                 TabStopControl t = (TabStopControl)obj;
  21.                 if (t != null) {
  22.                     return this.c.TabIndex - t.c.TabIndex;
  23.                 }
  24.                 return 0;
  25.             }
  26.             public Control Control { get { return c; } }
  27.         }
  28.         List<TabStopControl> tabStops;
  29.         void FindTabStops(Control.ControlCollection children, List<TabStopControl> list) {
  30.             foreach (Control c in children) {
  31.                 if (c.TabStop) {
  32.                     list.Add(new TabStopControl(c));
  33.                 }
  34.                 if (c.Controls != null) {
  35.                     FindTabStops(c.Controls, list);
  36.                 }
  37.             }
  38.         }
  39.         public void HandleTab(KeyEventArgs e) {
  40.             // Build list of TabStop controls in the form.
  41.             if (tabStops == null) {
  42.                 tabStops = new List<TabStopControl>();
  43.                 FindTabStops(owner.Controls, tabStops);
  44.                 tabStops.Sort();
  45.             }
  46.             // Find the current focussed control.
  47.             int i = 0;
  48.             for (int len = tabStops.Count - 1; i < len; i++) {
  49.                 TabStopControl t = tabStops[i];
  50.                 if (t.Control.Focused) {
  51.                     break;
  52.                 }
  53.             }
  54.             // Find the next in the specified direction, skipping currently invisible controls
  55.             bool forward = (e.Modifiers & Keys.Shift) == 0;
  56.             int dir = forward ? 1 : -1;
  57.             i += dir;
  58.             Control next = null;
  59.             bool wrapped = false;
  60.             while (next == null) {
  61.                 if (i < 0) {
  62.                     if (wrapped) break;
  63.                     i = tabStops.Count - 1;
  64.                     wrapped = true;
  65.                 }
  66.                 if (i >= tabStops.Count) {
  67.                     if (wrapped) break;
  68.                     i = 0;
  69.                     wrapped = true;
  70.                 }
  71.                 TabStopControl t = tabStops[i];
  72.                 if (t.Control.Visible) {
  73.                     next = t.Control;
  74.                     break;
  75.                 }
  76.                 i += dir;
  77.             }
  78.             // Now focus the next control.
  79.             if (next != null) {
  80.                 next.Focus();
  81.                 e.Handled = true;
  82.             }
  83.         }
  84.     }
  85. }